From b05168ba9d45b7aa1e4ce579d5f4799e6ee54c5a Mon Sep 17 00:00:00 2001 From: Alphaleonis Date: Fri, 13 Mar 2026 23:37:20 +0100 Subject: [PATCH 01/49] fix: dashboard nav links now include /dashboard base path prefix All sidebar links, mobile nav links, command palette navigation, logo link, and the graph page "Explore Connections" link now correctly use SvelteKit's base path. Also fixes favicon.svg and manifest.json paths in app.html. Fixes: https://github.com/samvallad33/vestige/issues/17 Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/dashboard/build/_app/env.js.gz | Bin 39 -> 39 bytes .../_app/immutable/assets/0.BChctYiF.css.gz | Bin 7790 -> 7822 bytes .../_app/immutable/assets/5.BBx09UGv.css.gz | Bin 138 -> 137 bytes .../_app/immutable/chunks/-jeO_JOJ.js.br | Bin 516 -> 0 bytes .../_app/immutable/chunks/-jeO_JOJ.js.gz | Bin 581 -> 0 bytes .../chunks/{C9Z4nxhR.js => BBD-8XME.js} | 2 +- .../_app/immutable/chunks/BBD-8XME.js.br | Bin 0 -> 8695 bytes .../_app/immutable/chunks/BBD-8XME.js.gz | Bin 0 -> 9711 bytes .../chunks/{ZesQ8l8p.js => BVZqxpRe.js} | 2 +- .../_app/immutable/chunks/BVZqxpRe.js.br | Bin 0 -> 498 bytes .../_app/immutable/chunks/BVZqxpRe.js.gz | Bin 0 -> 562 bytes .../_app/immutable/chunks/BcuCGYSa.js.gz | Bin 624 -> 629 bytes .../build/_app/immutable/chunks/BeSd-T80.js | 1 + .../_app/immutable/chunks/BeSd-T80.js.br | Bin 0 -> 2625 bytes .../_app/immutable/chunks/BeSd-T80.js.gz | Bin 0 -> 2969 bytes .../chunks/{DWr9YED7.js => BexJutgU.js} | 2 +- .../_app/immutable/chunks/BexJutgU.js.br | Bin 0 -> 360 bytes .../_app/immutable/chunks/BexJutgU.js.gz | Bin 0 -> 393 bytes .../_app/immutable/chunks/BkopTN9z.js.br | Bin 165 -> 0 bytes .../_app/immutable/chunks/BkopTN9z.js.gz | Bin 207 -> 0 bytes .../_app/immutable/chunks/BmeMLq0p.js.br | 7 - .../_app/immutable/chunks/BmeMLq0p.js.gz | Bin 684 -> 0 bytes .../chunks/{DnKV7_Y9.js => Br8WXJxx.js} | 2 +- .../_app/immutable/chunks/Br8WXJxx.js.br | Bin 0 -> 606 bytes .../_app/immutable/chunks/Br8WXJxx.js.gz | Bin 0 -> 655 bytes .../chunks/{P9ZHwQBL.js => BxfT1SOA.js} | 2 +- .../_app/immutable/chunks/BxfT1SOA.js.br | Bin 0 -> 413 bytes .../_app/immutable/chunks/BxfT1SOA.js.gz | Bin 0 -> 460 bytes .../_app/immutable/chunks/Bzak7iHL.js.gz | Bin 98 -> 96 bytes .../chunks/{-jeO_JOJ.js => C-QujEl6.js} | 2 +- .../_app/immutable/chunks/C-QujEl6.js.br | Bin 0 -> 511 bytes .../_app/immutable/chunks/C-QujEl6.js.gz | Bin 0 -> 585 bytes .../_app/immutable/chunks/C2oj68pw.js.br | Bin 306 -> 0 bytes .../_app/immutable/chunks/C2oj68pw.js.gz | Bin 319 -> 0 bytes .../chunks/{kH-DTQyy.js => C5a--lgk.js} | 2 +- .../_app/immutable/chunks/C5a--lgk.js.br | Bin 0 -> 1850 bytes .../_app/immutable/chunks/C5a--lgk.js.gz | Bin 0 -> 2010 bytes .../_app/immutable/chunks/C9Z4nxhR.js.br | Bin 8700 -> 0 bytes .../_app/immutable/chunks/C9Z4nxhR.js.gz | Bin 9637 -> 0 bytes .../chunks/{Co2v30Gm.js => CBWLjDtu.js} | 2 +- .../_app/immutable/chunks/CBWLjDtu.js.br | Bin 0 -> 172 bytes .../_app/immutable/chunks/CBWLjDtu.js.gz | Bin 0 -> 216 bytes .../chunks/{DPfxVJHQ.js => CKcqngaU.js} | 2 +- .../_app/immutable/chunks/CKcqngaU.js.br | 2 + .../_app/immutable/chunks/CKcqngaU.js.gz | Bin 0 -> 675 bytes .../_app/immutable/chunks/CR6HhlME.js.br | 1 - .../_app/immutable/chunks/CR6HhlME.js.gz | Bin 227 -> 0 bytes .../_app/immutable/chunks/CY4crMrT.js.br | Bin 886 -> 0 bytes .../_app/immutable/chunks/CY4crMrT.js.gz | Bin 998 -> 0 bytes .../_app/immutable/chunks/CZ45jJaw.js.gz | Bin 340 -> 338 bytes .../_app/immutable/chunks/CkyfbJUz.js.br | Bin 227 -> 0 bytes .../_app/immutable/chunks/CkyfbJUz.js.gz | Bin 268 -> 0 bytes .../_app/immutable/chunks/Co2v30Gm.js.br | Bin 173 -> 0 bytes .../_app/immutable/chunks/Co2v30Gm.js.gz | Bin 217 -> 0 bytes .../chunks/{BmeMLq0p.js => CruZBLYW.js} | 2 +- .../_app/immutable/chunks/CruZBLYW.js.br | Bin 0 -> 603 bytes .../_app/immutable/chunks/CruZBLYW.js.gz | Bin 0 -> 689 bytes .../chunks/{Do8TgQ-j.js => CzkEqL6J.js} | 2 +- .../_app/immutable/chunks/CzkEqL6J.js.br | Bin 0 -> 522 bytes .../_app/immutable/chunks/CzkEqL6J.js.gz | Bin 0 -> 565 bytes .../build/_app/immutable/chunks/D00YwZ1M.js | 1 - .../_app/immutable/chunks/D00YwZ1M.js.br | Bin 174 -> 0 bytes .../_app/immutable/chunks/D00YwZ1M.js.gz | Bin 170 -> 0 bytes .../chunks/{_Va07L2l.js => D1BK9eoQ.js} | 2 +- .../_app/immutable/chunks/D1BK9eoQ.js.br | Bin 0 -> 317 bytes .../_app/immutable/chunks/D1BK9eoQ.js.gz | Bin 0 -> 340 bytes .../chunks/{BkopTN9z.js => DBfx-YTU.js} | 2 +- .../_app/immutable/chunks/DBfx-YTU.js.br | Bin 0 -> 179 bytes .../_app/immutable/chunks/DBfx-YTU.js.gz | Bin 0 -> 202 bytes .../chunks/{DP9qWekZ.js => DNn3Nckx.js} | 2 +- .../_app/immutable/chunks/DNn3Nckx.js.br | Bin 0 -> 2987 bytes .../_app/immutable/chunks/DNn3Nckx.js.gz | Bin 0 -> 3349 bytes .../_app/immutable/chunks/DP9qWekZ.js.br | Bin 2985 -> 0 bytes .../_app/immutable/chunks/DP9qWekZ.js.gz | Bin 3341 -> 0 bytes .../_app/immutable/chunks/DPfxVJHQ.js.br | Bin 600 -> 0 bytes .../_app/immutable/chunks/DPfxVJHQ.js.gz | Bin 676 -> 0 bytes .../chunks/{CkyfbJUz.js => DUC-ssvh.js} | 2 +- .../_app/immutable/chunks/DUC-ssvh.js.br | Bin 0 -> 230 bytes .../_app/immutable/chunks/DUC-ssvh.js.gz | Bin 0 -> 265 bytes .../_app/immutable/chunks/DWr9YED7.js.br | 2 - .../_app/immutable/chunks/DWr9YED7.js.gz | Bin 397 -> 0 bytes .../build/_app/immutable/chunks/DZuEJlJ5.js | 1 + .../_app/immutable/chunks/DZuEJlJ5.js.br | Bin 0 -> 178 bytes .../_app/immutable/chunks/DZuEJlJ5.js.gz | Bin 0 -> 170 bytes .../_app/immutable/chunks/DnKV7_Y9.js.br | Bin 610 -> 0 bytes .../_app/immutable/chunks/DnKV7_Y9.js.gz | Bin 654 -> 0 bytes .../_app/immutable/chunks/Do8TgQ-j.js.br | 2 - .../_app/immutable/chunks/Do8TgQ-j.js.gz | Bin 566 -> 0 bytes .../chunks/{CR6HhlME.js => DtXypsxD.js} | 2 +- .../_app/immutable/chunks/DtXypsxD.js.br | 2 + .../_app/immutable/chunks/DtXypsxD.js.gz | Bin 0 -> 227 bytes .../build/_app/immutable/chunks/DunNqS1N.js | 1 - .../_app/immutable/chunks/DunNqS1N.js.br | Bin 9689 -> 0 bytes .../_app/immutable/chunks/DunNqS1N.js.gz | Bin 10701 -> 0 bytes .../_app/immutable/chunks/P9ZHwQBL.js.br | Bin 415 -> 0 bytes .../_app/immutable/chunks/P9ZHwQBL.js.gz | Bin 459 -> 0 bytes .../chunks/{C2oj68pw.js => RaRNNC-y.js} | 2 +- .../_app/immutable/chunks/RaRNNC-y.js.br | Bin 0 -> 287 bytes .../_app/immutable/chunks/RaRNNC-y.js.gz | Bin 0 -> 322 bytes .../_app/immutable/chunks/ZesQ8l8p.js.br | 2 - .../_app/immutable/chunks/ZesQ8l8p.js.gz | Bin 560 -> 0 bytes .../_app/immutable/chunks/_Va07L2l.js.br | 2 - .../_app/immutable/chunks/_Va07L2l.js.gz | Bin 341 -> 0 bytes .../build/_app/immutable/chunks/cIQD_rb4.js | 1 + .../_app/immutable/chunks/cIQD_rb4.js.br | Bin 0 -> 7674 bytes .../_app/immutable/chunks/cIQD_rb4.js.gz | Bin 0 -> 8455 bytes .../chunks/{CY4crMrT.js => gqVpgJ8U.js} | 2 +- .../_app/immutable/chunks/gqVpgJ8U.js.br | Bin 0 -> 883 bytes .../_app/immutable/chunks/gqVpgJ8U.js.gz | Bin 0 -> 1004 bytes .../_app/immutable/chunks/kH-DTQyy.js.br | Bin 1864 -> 0 bytes .../_app/immutable/chunks/kH-DTQyy.js.gz | Bin 2014 -> 0 bytes .../{app.Cznegg3r.js => app.C8-C7f17.js} | 4 +- .../_app/immutable/entry/app.C8-C7f17.js.br | Bin 0 -> 3160 bytes .../_app/immutable/entry/app.C8-C7f17.js.gz | Bin 0 -> 3583 bytes .../_app/immutable/entry/app.Cznegg3r.js.br | Bin 3141 -> 0 bytes .../_app/immutable/entry/app.Cznegg3r.js.gz | Bin 3566 -> 0 bytes .../_app/immutable/entry/start.B2d_kw0s.js | 1 - .../_app/immutable/entry/start.B2d_kw0s.js.br | Bin 85 -> 0 bytes .../_app/immutable/entry/start.B2d_kw0s.js.gz | Bin 93 -> 0 bytes .../_app/immutable/entry/start.DA6kJu-O.js | 1 + .../_app/immutable/entry/start.DA6kJu-O.js.br | Bin 0 -> 107 bytes .../_app/immutable/entry/start.DA6kJu-O.js.gz | Bin 0 -> 108 bytes .../build/_app/immutable/nodes/0.ChrQNylP.js | 3 - .../_app/immutable/nodes/0.ChrQNylP.js.br | Bin 2804 -> 0 bytes .../_app/immutable/nodes/0.ChrQNylP.js.gz | Bin 3227 -> 0 bytes .../build/_app/immutable/nodes/0.tUYz2cuZ.js | 3 + .../_app/immutable/nodes/0.tUYz2cuZ.js.br | Bin 0 -> 2832 bytes .../_app/immutable/nodes/0.tUYz2cuZ.js.gz | Bin 0 -> 3213 bytes .../build/_app/immutable/nodes/1.CUEJZ2Iu.js | 1 - .../_app/immutable/nodes/1.CUEJZ2Iu.js.br | 1 - .../_app/immutable/nodes/1.CUEJZ2Iu.js.gz | Bin 375 -> 0 bytes .../build/_app/immutable/nodes/1.CssKLfNx.js | 1 + .../_app/immutable/nodes/1.CssKLfNx.js.br | Bin 0 -> 339 bytes .../_app/immutable/nodes/1.CssKLfNx.js.gz | Bin 0 -> 385 bytes .../_app/immutable/nodes/10.CsJcFbdU.js.br | Bin 2026 -> 0 bytes .../_app/immutable/nodes/10.CsJcFbdU.js.gz | Bin 2289 -> 0 bytes .../nodes/{10.CsJcFbdU.js => 10.evd80og6.js} | 2 +- .../_app/immutable/nodes/10.evd80og6.js.br | Bin 0 -> 2025 bytes .../_app/immutable/nodes/10.evd80og6.js.gz | Bin 0 -> 2265 bytes .../_app/immutable/nodes/11.C5VMEnLV.js.br | Bin 1567 -> 0 bytes .../_app/immutable/nodes/11.C5VMEnLV.js.gz | Bin 1771 -> 0 bytes .../nodes/{11.C5VMEnLV.js => 11.gY7s4Ta3.js} | 2 +- .../_app/immutable/nodes/11.gY7s4Ta3.js.br | Bin 0 -> 1551 bytes .../_app/immutable/nodes/11.gY7s4Ta3.js.gz | Bin 0 -> 1755 bytes .../build/_app/immutable/nodes/2.1GJQ3fqu.js | 1 + .../_app/immutable/nodes/2.1GJQ3fqu.js.br | Bin 0 -> 143 bytes .../_app/immutable/nodes/2.1GJQ3fqu.js.gz | Bin 0 -> 184 bytes .../build/_app/immutable/nodes/2.Bv9w28KX.js | 1 - .../_app/immutable/nodes/2.Bv9w28KX.js.br | Bin 142 -> 0 bytes .../_app/immutable/nodes/2.Bv9w28KX.js.gz | Bin 187 -> 0 bytes .../build/_app/immutable/nodes/3.D_o4dH3z.js | 1 - .../_app/immutable/nodes/3.D_o4dH3z.js.br | Bin 166 -> 0 bytes .../_app/immutable/nodes/3.D_o4dH3z.js.gz | Bin 200 -> 0 bytes .../build/_app/immutable/nodes/3.qBGkDYYb.js | 1 + .../_app/immutable/nodes/3.qBGkDYYb.js.br | Bin 0 -> 166 bytes .../_app/immutable/nodes/3.qBGkDYYb.js.gz | Bin 0 -> 199 bytes .../nodes/{4.CeoFmj14.js => 4.BYgf5djd.js} | 2 +- .../_app/immutable/nodes/4.BYgf5djd.js.br | Bin 0 -> 3021 bytes .../_app/immutable/nodes/4.BYgf5djd.js.gz | Bin 0 -> 3491 bytes .../_app/immutable/nodes/4.CeoFmj14.js.br | Bin 3026 -> 0 bytes .../_app/immutable/nodes/4.CeoFmj14.js.gz | Bin 3519 -> 0 bytes .../_app/immutable/nodes/5.CgbdGsQS.js.br | Bin 2964 -> 0 bytes .../_app/immutable/nodes/5.CgbdGsQS.js.gz | Bin 3367 -> 0 bytes .../nodes/{5.CgbdGsQS.js => 5.DVWNDcwc.js} | 2 +- .../_app/immutable/nodes/5.DVWNDcwc.js.br | Bin 0 -> 2952 bytes .../_app/immutable/nodes/5.DVWNDcwc.js.gz | Bin 0 -> 3349 bytes .../nodes/{6.DXXEUSu1.js => 6.CBsTT29y.js} | 350 +++++++++--------- .../_app/immutable/nodes/6.CBsTT29y.js.br | Bin 0 -> 119649 bytes .../_app/immutable/nodes/6.CBsTT29y.js.gz | Bin 0 -> 144193 bytes .../_app/immutable/nodes/6.DXXEUSu1.js.br | Bin 119538 -> 0 bytes .../_app/immutable/nodes/6.DXXEUSu1.js.gz | Bin 144380 -> 0 bytes .../_app/immutable/nodes/7.BI22Pt_j.js.br | Bin 2211 -> 0 bytes .../_app/immutable/nodes/7.BI22Pt_j.js.gz | Bin 2505 -> 0 bytes .../nodes/{7.BI22Pt_j.js => 7.UPq6Ja2I.js} | 2 +- .../_app/immutable/nodes/7.UPq6Ja2I.js.br | Bin 0 -> 2199 bytes .../_app/immutable/nodes/7.UPq6Ja2I.js.gz | Bin 0 -> 2479 bytes .../nodes/{8.Cq7jwWnG.js => 8.B2QXJFjO.js} | 2 +- .../_app/immutable/nodes/8.B2QXJFjO.js.br | Bin 0 -> 2307 bytes .../_app/immutable/nodes/8.B2QXJFjO.js.gz | Bin 0 -> 2640 bytes .../_app/immutable/nodes/8.Cq7jwWnG.js.br | Bin 2308 -> 0 bytes .../_app/immutable/nodes/8.Cq7jwWnG.js.gz | Bin 2660 -> 0 bytes .../_app/immutable/nodes/9.19crbYuZ.js.br | Bin 3013 -> 0 bytes .../_app/immutable/nodes/9.19crbYuZ.js.gz | Bin 3428 -> 0 bytes .../nodes/{9.19crbYuZ.js => 9.B4Pp7ME7.js} | 2 +- .../_app/immutable/nodes/9.B4Pp7ME7.js.br | Bin 0 -> 3014 bytes .../_app/immutable/nodes/9.B4Pp7ME7.js.gz | Bin 0 -> 3404 bytes apps/dashboard/build/_app/version.json | 2 +- apps/dashboard/build/_app/version.json.br | Bin 29 -> 29 bytes apps/dashboard/build/_app/version.json.gz | Bin 47 -> 47 bytes apps/dashboard/build/favicon.svg.gz | Bin 462 -> 457 bytes apps/dashboard/build/index.html | 39 +- apps/dashboard/build/index.html.br | Bin 593 -> 606 bytes apps/dashboard/build/index.html.gz | Bin 787 -> 790 bytes apps/dashboard/build/manifest.json.gz | Bin 278 -> 278 bytes apps/dashboard/src/app.html | 6 +- .../src/routes/(app)/graph/+page.svelte | 3 +- apps/dashboard/src/routes/+layout.svelte | 8 +- 197 files changed, 246 insertions(+), 256 deletions(-) delete mode 100644 apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.gz rename apps/dashboard/build/_app/immutable/chunks/{C9Z4nxhR.js => BBD-8XME.js} (99%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz rename apps/dashboard/build/_app/immutable/chunks/{ZesQ8l8p.js => BVZqxpRe.js} (53%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.gz rename apps/dashboard/build/_app/immutable/chunks/{DWr9YED7.js => BexJutgU.js} (79%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.gz rename apps/dashboard/build/_app/immutable/chunks/{DnKV7_Y9.js => Br8WXJxx.js} (94%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.gz rename apps/dashboard/build/_app/immutable/chunks/{P9ZHwQBL.js => BxfT1SOA.js} (84%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.gz rename apps/dashboard/build/_app/immutable/chunks/{-jeO_JOJ.js => C-QujEl6.js} (93%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.gz rename apps/dashboard/build/_app/immutable/chunks/{kH-DTQyy.js => C5a--lgk.js} (98%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js.gz rename apps/dashboard/build/_app/immutable/chunks/{Co2v30Gm.js => CBWLjDtu.js} (76%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz rename apps/dashboard/build/_app/immutable/chunks/{DPfxVJHQ.js => CKcqngaU.js} (89%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CkyfbJUz.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CkyfbJUz.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.gz rename apps/dashboard/build/_app/immutable/chunks/{BmeMLq0p.js => CruZBLYW.js} (95%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz rename apps/dashboard/build/_app/immutable/chunks/{Do8TgQ-j.js => CzkEqL6J.js} (93%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.gz rename apps/dashboard/build/_app/immutable/chunks/{_Va07L2l.js => D1BK9eoQ.js} (87%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.gz rename apps/dashboard/build/_app/immutable/chunks/{BkopTN9z.js => DBfx-YTU.js} (74%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz rename apps/dashboard/build/_app/immutable/chunks/{DP9qWekZ.js => DNn3Nckx.js} (98%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.gz rename apps/dashboard/build/_app/immutable/chunks/{CkyfbJUz.js => DUC-ssvh.js} (83%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.gz rename apps/dashboard/build/_app/immutable/chunks/{CR6HhlME.js => DtXypsxD.js} (79%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.gz rename apps/dashboard/build/_app/immutable/chunks/{C2oj68pw.js => RaRNNC-y.js} (70%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.gz rename apps/dashboard/build/_app/immutable/chunks/{CY4crMrT.js => gqVpgJ8U.js} (97%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.gz rename apps/dashboard/build/_app/immutable/entry/{app.Cznegg3r.js => app.C8-C7f17.js} (61%) create mode 100644 apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js.gz create mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js create mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js.gz rename apps/dashboard/build/_app/immutable/nodes/{10.CsJcFbdU.js => 10.evd80og6.js} (92%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/11.C5VMEnLV.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/11.C5VMEnLV.js.gz rename apps/dashboard/build/_app/immutable/nodes/{11.C5VMEnLV.js => 11.gY7s4Ta3.js} (86%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.Bv9w28KX.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.Bv9w28KX.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.Bv9w28KX.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.gz rename apps/dashboard/build/_app/immutable/nodes/{4.CeoFmj14.js => 4.BYgf5djd.js} (95%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js.gz rename apps/dashboard/build/_app/immutable/nodes/{5.CgbdGsQS.js => 5.DVWNDcwc.js} (90%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.gz rename apps/dashboard/build/_app/immutable/nodes/{6.DXXEUSu1.js => 6.CBsTT29y.js} (85%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.BI22Pt_j.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.BI22Pt_j.js.gz rename apps/dashboard/build/_app/immutable/nodes/{7.BI22Pt_j.js => 7.UPq6Ja2I.js} (92%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.gz rename apps/dashboard/build/_app/immutable/nodes/{8.Cq7jwWnG.js => 8.B2QXJFjO.js} (90%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js.gz rename apps/dashboard/build/_app/immutable/nodes/{9.19crbYuZ.js => 9.B4Pp7ME7.js} (93%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz diff --git a/apps/dashboard/build/_app/env.js.gz b/apps/dashboard/build/_app/env.js.gz index e95cbd54bdfaef670fd0a5e539ab495db0c81e6d..e9f837d74fcbfca45088443ef27bb6122326fbb6 100644 GIT binary patch delta 16 UcmY#a=aTQ{U;qIo=80Ug01v(a$N&HU delta 16 UcmY#a=aTQ{U;qIo;fY+b01y5F*Z=?k diff --git a/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.gz b/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.gz index f5a8381d4d6723337fbe05d6bfa1737b747af24c..abec51e33f5ced84a4e4098446f2e043c56e1be8 100644 GIT binary patch literal 7822 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 literal 7790 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 OPKK-d0&eUBss{iKaugo` diff --git a/apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.br b/apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.br deleted file mode 100644 index b06137d5210c5f6c566ebac71b1d92a29b23590a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i_N;saoelzP#r&DGlKOK6+Y_bTFu zN;*gk@gt=XswXkut^FZ{gsvi+`@PwvG~ztCzCQQj+N)_&p`cet=@SwPVMd!Uq$}v? z##uU1FNNAZ+WEAL;iDSYLJNGJfuV|W_WQUVfzyP9_K!v66%>cDG zW@E3&J)?}uW322BxcYM%jSs{x3F<>b{eK*q?LxyP}yCN7Wh5>6At|R|G)B? zZ#&0(C?yz$)&Xzz(bPn?q1q`im z#60UY9{4?~+ayhyHUi+y$}QxS3BJUdZrvY;l*;K9kw{>Re#vnSjd_ewx?O=<;%JuOpq0)iADMicHz{F_FB}QiIe;*)mF4&i&RR z#9al{R>3l~JW_cfhZfP{!r?X&<-SA06cRgZBrI>p(=LdS^~@e?CNQd@yRBB-^(1{0 Gr#ArK4+~fT diff --git a/apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.gz b/apps/dashboard/build/_app/immutable/chunks/-jeO_JOJ.js.gz deleted file mode 100644 index f8623d9988a62a032181a2b48f2a68cdbed7a341..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmV-L0=oSliwFP!000026J=9fYuhjsec!Ke%rN(YrnRt_#i(J7jg74gR@k5+1X;eG zwa9X+53eQle;=~bwCkRZt~lp@=v?V;-@9=5lu4g?woA~n9|;t@PEfIJf{wjR(6TQH z26ma?ZfsoN<^1*gx7Tm%ZTp@7_IcSvtAg%rRs%7|8nHOXgKmI$7fsN6LsRI4u+bQF z6r!`GZeUS?!(*IvfMwG=7^KT&);AgPexK5Ml-!dc6{r@DYpYDG$%6)oSkCG(DW9nh zDN_)MmWs6ym_s}~Nwzq9kdLrv?(f|~h@sbYc7{a(bRvGXHQkC==Qy55y#bmFIAQ5e zb{T_A_unc{ZXgGM;^L6rgZOqkND~Q1EFJG>0uVc>R-5{(_F=g=V?I{F5v8LH!Raan z^8Z91wF%^w>wLgSFs}-xKu$8^ubVy@Hq3`YBeOL;ZwGc5GaXunTEA?odP75}7kRPeJwi&HX$|dm$N4lN9 T^z@gjv3&6tE}&JO;{yNy3I`ji diff --git a/apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js b/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js similarity index 99% rename from apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js rename to apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js index fe4513c..e2808a5 100644 --- a/apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js +++ b/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js @@ -1 +1 @@ -var cn=Object.defineProperty;var wt=e=>{throw TypeError(e)};var _n=(e,t,n)=>t in e?cn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var de=(e,t,n)=>_n(e,typeof t!="symbol"?t+"":t,n),Ke=(e,t,n)=>t.has(e)||wt("Cannot "+n);var p=(e,t,n)=>(Ke(e,t,"read from private field"),n?n.call(e):t.get(e)),F=(e,t,n)=>t.has(e)?wt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),z=(e,t,n,r)=>(Ke(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),K=(e,t,n)=>(Ke(e,t,"access private method"),n);var vn=Array.isArray,dn=Array.prototype.indexOf,Ee=Array.prototype.includes,ar=Array.from,lr=Object.defineProperty,Re=Object.getOwnPropertyDescriptor,pn=Object.getOwnPropertyDescriptors,hn=Object.prototype,wn=Array.prototype,kt=Object.getPrototypeOf,yt=Object.isExtensible;const yn=()=>{};function or(e){return e()}function En(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function ur(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}const A=2,De=4,Ie=8,Dt=1<<24,G=16,H=32,ve=64,mn=128,P=512,g=1024,R=2048,Y=4096,j=8192,$=16384,oe=32768,je=65536,Et=1<<17,It=1<<18,Pe=1<<19,Pt=1<<20,cr=1<<25,ue=65536,$e=1<<21,st=1<<22,Z=1<<23,ae=Symbol("$state"),_r=Symbol("legacy props"),vr=Symbol(""),ne=new class extends Error{constructor(){super(...arguments);de(this,"name","StaleReactionError");de(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Nt;const pr=!!((Nt=globalThis.document)!=null&&Nt.contentType)&&globalThis.document.contentType.includes("xml"),Ue=3,Ct=8;function gn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hr(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Tn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function bn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function An(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Sn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function wr(){throw new Error("https://svelte.dev/e/hydration_failed")}function yr(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Rn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function On(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Nn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Er(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const mr=1,gr=2,Tr=4,br=8,Ar=16,Sr=1,Rr=2,Or=4,Nr=8,kr=16,xr=1,Dr=2,kn="[",xn="[!",Ir="[?",Dn="]",ft={},T=Symbol(),In="http://www.w3.org/1999/xhtml";function it(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function Pr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Cr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let J=!1;function Fr(e){J=e}let m;function me(e){if(e===null)throw it(),ft;return m=e}function Mr(){return me(ee(m))}function Lr(e){if(J){if(ee(m)!==null)throw it(),ft;m=e}}function jr(e=1){if(J){for(var t=e,n=m;t--;)n=ee(n);m=n}}function Yr(e=!0){for(var t=0,n=m;;){if(n.nodeType===Ct){var r=n.data;if(r===Dn){if(t===0)return n;t-=1}else(r===kn||r===xn||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=ee(n);e&&n.remove(),n=s}}function Hr(e){if(!e||e.nodeType!==Ct)throw it(),ft;return e.data}function Ft(e){return e===this.v}function Pn(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Mt(e){return!Pn(e,this.v)}let Be=!1;function qr(){Be=!0}let S=null;function Ye(e){S=e}function Vr(e,t=!1,n){S={p:S,i:!1,c:null,e:null,s:e,x:null,l:Be&&!t?{s:null,u:null,$:[]}:null}}function Ur(e){var t=S,n=t.e;if(n!==null){t.e=null;for(var r of n)Jt(r)}return t.i=!0,S=t.p,{}}function Ce(){return!Be||S!==null&&S.l===null}let re=[];function Lt(){var e=re;re=[],En(e)}function mt(e){if(re.length===0&&!Oe){var t=re;queueMicrotask(()=>{t===re&&Lt()})}re.push(e)}function Cn(){for(;re.length>0;)Lt()}function Fn(e){var t=w;if(t===null)return _.f|=Z,e;if((t.f&oe)===0&&(t.f&De)===0)throw e;He(e,t)}function He(e,t){for(;t!==null;){if((t.f&mn)!==0){if((t.f&oe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const Mn=-7169;function E(e,t){e.f=e.f&Mn|t}function at(e){(e.f&P)!==0||e.deps===null?E(e,g):E(e,Y)}function jt(e){if(e!==null)for(const t of e)(t.f&A)===0||(t.f&ue)===0||(t.f^=ue,jt(t.deps))}function Ln(e,t,n){(e.f&R)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),jt(e.deps),E(e,g)}const Me=new Set;let d=null,gt=null,b=null,N=[],Ge=null,Ze=!1,Oe=!1;var pe,he,fe,we,ke,xe,ie,U,ye,D,We,Je,Qe,Yt;const dt=class dt{constructor(){F(this,D);de(this,"current",new Map);de(this,"previous",new Map);F(this,pe,new Set);F(this,he,new Set);F(this,fe,0);F(this,we,0);F(this,ke,null);F(this,xe,new Set);F(this,ie,new Set);F(this,U,new Map);de(this,"is_fork",!1);F(this,ye,!1)}skip_effect(t){p(this,U).has(t)||p(this,U).set(t,{d:[],m:[]})}unskip_effect(t){var n=p(this,U).get(t);if(n){p(this,U).delete(t);for(var r of n.d)E(r,R),B(r);for(r of n.m)E(r,Y),B(r)}}process(t){var s;N=[],this.apply();var n=[],r=[];for(const f of t)K(this,D,Je).call(this,f,n,r);if(K(this,D,We).call(this)){K(this,D,Qe).call(this,r),K(this,D,Qe).call(this,n);for(const[f,a]of p(this,U))Ut(f,a)}else{for(const f of p(this,pe))f();p(this,pe).clear(),p(this,fe)===0&&K(this,D,Yt).call(this),gt=this,d=null,Tt(r),Tt(n),gt=null,(s=p(this,ke))==null||s.resolve()}b=null}capture(t,n){n!==T&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&Z)===0&&(this.current.set(t,t.v),b==null||b.set(t,t.v))}activate(){d=this,this.apply()}deactivate(){d===this&&(d=null,b=null)}flush(){if(this.activate(),N.length>0){if(Ht(),d!==null&&d!==this)return}else p(this,fe)===0&&this.process([]);this.deactivate()}discard(){for(const t of p(this,he))t(this);p(this,he).clear()}increment(t){z(this,fe,p(this,fe)+1),t&&z(this,we,p(this,we)+1)}decrement(t){z(this,fe,p(this,fe)-1),t&&z(this,we,p(this,we)-1),!p(this,ye)&&(z(this,ye,!0),mt(()=>{z(this,ye,!1),K(this,D,We).call(this)?N.length>0&&this.flush():this.revive()}))}revive(){for(const t of p(this,xe))p(this,ie).delete(t),E(t,R),B(t);for(const t of p(this,ie))E(t,Y),B(t);this.flush()}oncommit(t){p(this,pe).add(t)}ondiscard(t){p(this,he).add(t)}settled(){return(p(this,ke)??z(this,ke,xt())).promise}static ensure(){if(d===null){const t=d=new dt;Me.add(d),Oe||mt(()=>{d===t&&t.flush()})}return d}apply(){}};pe=new WeakMap,he=new WeakMap,fe=new WeakMap,we=new WeakMap,ke=new WeakMap,xe=new WeakMap,ie=new WeakMap,U=new WeakMap,ye=new WeakMap,D=new WeakSet,We=function(){return this.is_fork||p(this,we)>0},Je=function(t,n,r){t.f^=g;for(var s=t.first;s!==null;){var f=s.f,a=(f&(H|ve))!==0,l=a&&(f&g)!==0,i=l||(f&j)!==0||p(this,U).has(s);if(!i&&s.fn!==null){a?s.f^=g:(f&De)!==0?n.push(s):Fe(s)&&((f&G)!==0&&p(this,ie).add(s),be(s));var o=s.first;if(o!==null){s=o;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}},Qe=function(t){for(var n=0;n1){this.previous.clear();var t=b,n=!0;for(const f of Me){if(f===this){n=!1;continue}const a=[];for(const[i,o]of this.current){if(f.current.has(i))if(n&&o!==f.current.get(i))f.current.set(i,o);else continue;a.push(i)}if(a.length===0)continue;const l=[...f.current.keys()].filter(i=>!this.current.has(i));if(l.length>0){var r=N;N=[];const i=new Set,o=new Map;for(const c of a)qt(c,l,i,o);if(N.length>0){d=f,f.apply();for(const c of N)K(s=f,D,Je).call(s,c,[],[]);f.deactivate()}N=r}}d=null,b=t}Me.delete(this)};let ge=dt;function jn(e){var t=Oe;Oe=!0;try{for(var n;;){if(Cn(),N.length===0&&(d==null||d.flush(),N.length===0))return Ge=null,n;Ht()}}finally{Oe=t}}function Ht(){Ze=!0;var e=null;try{for(var t=0;N.length>0;){var n=ge.ensure();if(t++>1e3){var r,s;Yn()}n.process(N),W.clear()}}finally{N=[],Ze=!1,Ge=null}}function Yn(){try{Sn()}catch(e){He(e,Ge)}}let M=null;function Tt(e){var t=e.length;if(t!==0){for(var n=0;n0)){W.clear();for(const s of M){if((s.f&($|j))!==0)continue;const f=[s];let a=s.parent;for(;a!==null;)M.has(a)&&(M.delete(a),f.push(a)),a=a.parent;for(let l=f.length-1;l>=0;l--){const i=f[l];(i.f&($|j))===0&&be(i)}}M.clear()}}M=null}}function qt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const f=s.f;(f&A)!==0?qt(s,t,n,r):(f&(st|G))!==0&&(f&R)===0&&Vt(s,t,r)&&(E(s,R),B(s))}}function Vt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(Ee.call(t,s))return!0;if((s.f&A)!==0&&Vt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function B(e){var t=Ge=e,n=t.b;if(n!=null&&n.is_pending&&(e.f&(De|Ie|Dt))!==0&&(e.f&oe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(Ze&&t===w&&(r&G)!==0&&(r&It)===0&&(r&oe)!==0)return;if((r&(ve|H))!==0){if((r&g)===0)return;t.f^=g}}N.push(t)}function Ut(e,t){if(!((e.f&H)!==0&&(e.f&g)!==0)){(e.f&R)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),E(e,g);for(var n=e.first;n!==null;)Ut(n,t),n=n.next}}function Hn(e,t,n,r){const s=Ce()?lt:Bn;var f=e.filter(u=>!u.settled);if(n.length===0&&f.length===0){r(t.map(s));return}var a=w,l=qn(),i=f.length===1?f[0].promise:f.length>1?Promise.all(f.map(u=>u.promise)):null;function o(u){l();try{r(u)}catch(v){(a.f&$)===0&&He(v,a)}et()}if(n.length===0){i.then(()=>o(t.map(s)));return}function c(){l(),Promise.all(n.map(u=>Un(u))).then(u=>o([...t.map(s),...u])).catch(u=>He(u,a))}i?i.then(c):c()}function qn(){var e=w,t=_,n=S,r=d;return function(f=!0){Te(e),Q(t),Ye(n),f&&(r==null||r.activate())}}function et(e=!0){Te(null),Q(null),Ye(null),e&&(d==null||d.deactivate())}function Vn(){var e=w.b,t=d,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function lt(e){var t=A|R,n=_!==null&&(_.f&A)!==0?_:null;return w!==null&&(w.f|=Pe),{ctx:S,deps:null,effects:null,equals:Ft,f:t,fn:e,reactions:null,rv:0,v:T,wv:0,parent:n??w,ac:null}}function Un(e,t,n){w===null&&gn();var s=void 0,f=ut(T),a=!_,l=new Map;return er(()=>{var v;var i=xt();s=i.promise;try{Promise.resolve(e()).then(i.resolve,i.reject).finally(et)}catch(y){i.reject(y),et()}var o=d;if(a){var c=Vn();(v=l.get(o))==null||v.reject(ne),l.delete(o),l.set(o,i)}const u=(y,h=void 0)=>{if(o.activate(),h)h!==ne&&(f.f|=Z,nt(f,h));else{(f.f&Z)!==0&&(f.f^=Z),nt(f,y);for(const[V,O]of l){if(l.delete(V),V===o)break;O.reject(ne)}}c&&c()};i.promise.then(u,y=>u(null,y||"unknown"))}),Qn(()=>{for(const i of l.values())i.reject(ne)}),new Promise(i=>{function o(c){function u(){c===s?i(f):o(s)}c.then(u,u)}o(s)})}function Br(e){const t=lt(e);return rn(t),t}function Bn(e){const t=lt(e);return t.equals=Mt,t}function Gn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!zt&&Xn()}return t}function Xn(){zt=!1;for(const e of tt)(e.f&g)!==0&&E(e,Y),Fe(e)&&be(e);tt.clear()}function Xe(e){te(e,e.v+1)}function Kt(e,t){var n=e.reactions;if(n!==null)for(var r=Ce(),s=n.length,f=0;f{if(le===f)return l();var i=_,o=le;Q(null),Ot(f);var c=l();return Q(i),Ot(o),c};return r&&n.set("length",X(e.length)),new Proxy(e,{defineProperty(l,i,o){(!("value"in o)||o.configurable===!1||o.enumerable===!1||o.writable===!1)&&Rn();var c=n.get(i);return c===void 0?a(()=>{var u=X(o.value);return n.set(i,u),u}):te(c,o.value,!0),!0},deleteProperty(l,i){var o=n.get(i);if(o===void 0){if(i in l){const c=a(()=>X(T));n.set(i,c),Xe(s)}}else te(o,T),Xe(s);return!0},get(l,i,o){var y;if(i===ae)return e;var c=n.get(i),u=i in l;if(c===void 0&&(!u||(y=Re(l,i))!=null&&y.writable)&&(c=a(()=>{var h=Ae(u?l[i]:T),V=X(h);return V}),n.set(i,c)),c!==void 0){var v=Se(c);return v===T?void 0:v}return Reflect.get(l,i,o)},getOwnPropertyDescriptor(l,i){var o=Reflect.getOwnPropertyDescriptor(l,i);if(o&&"value"in o){var c=n.get(i);c&&(o.value=Se(c))}else if(o===void 0){var u=n.get(i),v=u==null?void 0:u.v;if(u!==void 0&&v!==T)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return o},has(l,i){var v;if(i===ae)return!0;var o=n.get(i),c=o!==void 0&&o.v!==T||Reflect.has(l,i);if(o!==void 0||w!==null&&(!c||(v=Re(l,i))!=null&&v.writable)){o===void 0&&(o=a(()=>{var y=c?Ae(l[i]):T,h=X(y);return h}),n.set(i,o));var u=Se(o);if(u===T)return!1}return c},set(l,i,o,c){var ht;var u=n.get(i),v=i in l;if(r&&i==="length")for(var y=o;yX(T)),n.set(y+"",h))}if(u===void 0)(!v||(ht=Re(l,i))!=null&&ht.writable)&&(u=a(()=>X(void 0)),te(u,Ae(o)),n.set(i,u));else{v=u.v!==T;var V=a(()=>Ae(o));te(u,V)}var O=Reflect.getOwnPropertyDescriptor(l,i);if(O!=null&&O.set&&O.set.call(c,o),!v){if(r&&typeof i=="string"){var pt=n.get("length"),ze=Number(i);Number.isInteger(ze)&&ze>=pt.v&&te(pt,ze+1)}Xe(s)}return!0},ownKeys(l){Se(s);var i=Reflect.ownKeys(l).filter(u=>{var v=n.get(u);return v===void 0||v.v!==T});for(var[o,c]of n)c.v!==T&&!(o in l)&&i.push(o);return i},setPrototypeOf(){On()}})}function bt(e){try{if(e!==null&&typeof e=="object"&&ae in e)return e[ae]}catch{}return e}function zr(e,t){return Object.is(bt(e),bt(t))}var At,$n,Xt,$t;function Kr(){if(At===void 0){At=window,$n=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Xt=Re(t,"firstChild").get,$t=Re(t,"nextSibling").get,yt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),yt(n)&&(n.__t=void 0)}}function qe(e=""){return document.createTextNode(e)}function Ve(e){return Xt.call(e)}function ee(e){return $t.call(e)}function Xr(e,t){if(!J)return Ve(e);var n=Ve(m);if(n===null)n=m.appendChild(qe());else if(t&&n.nodeType!==Ue){var r=qe();return n==null||n.before(r),me(r),r}return t&&ct(n),me(n),n}function $r(e,t=!1){if(!J){var n=Ve(e);return n instanceof Comment&&n.data===""?ee(n):n}if(t){if((m==null?void 0:m.nodeType)!==Ue){var r=qe();return m==null||m.before(r),me(r),r}ct(m)}return m}function Zr(e,t=1,n=!1){let r=J?m:e;for(var s;t--;)s=r,r=ee(r);if(!J)return r;if(n){if((r==null?void 0:r.nodeType)!==Ue){var f=qe();return r===null?s==null||s.after(f):r.before(f),me(f),f}ct(r)}return me(r),r}function Zn(e){e.textContent=""}function Wr(){return!1}function Jr(e,t,n){return document.createElementNS(In,e,void 0)}function ct(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ue;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Qr(e){J&&Ve(e)!==null&&Zn(e)}let St=!1;function Wn(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const n of e.target.elements)(t=n.__on_r)==null||t.call(n)})},{capture:!0}))}function _t(e){var t=_,n=w;Q(null),Te(null);try{return e()}finally{Q(t),Te(n)}}function es(e,t,n,r=n){e.addEventListener(t,()=>_t(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),Wn()}function Zt(e){w===null&&(_===null&&An(),bn()),_e&&Tn()}function Jn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function q(e,t,n){var r=w;r!==null&&(r.f&j)!==0&&(e|=j);var s={ctx:S,deps:null,nodes:null,f:e|R|P,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{be(s)}catch(l){throw ce(s),l}else t!==null&&B(s);var f=s;if(n&&f.deps===null&&f.teardown===null&&f.nodes===null&&f.first===f.last&&(f.f&Pe)===0&&(f=f.first,(e&G)!==0&&(e&je)!==0&&f!==null&&(f.f|=je)),f!==null&&(f.parent=r,r!==null&&Jn(f,r),_!==null&&(_.f&A)!==0&&(e&ve)===0)){var a=_;(a.effects??(a.effects=[])).push(f)}return s}function Wt(){return _!==null&&!L}function Qn(e){const t=q(Ie,null,!1);return E(t,g),t.teardown=e,t}function ts(e){Zt();var t=w.f,n=!_&&(t&H)!==0&&(t&oe)===0;if(n){var r=S;(r.e??(r.e=[])).push(e)}else return Jt(e)}function Jt(e){return q(De|Pt,e,!1)}function ns(e){return Zt(),q(Ie|Pt,e,!0)}function rs(e){ge.ensure();const t=q(ve|Pe,e,!0);return(n={})=>new Promise(r=>{n.outro?rr(t,()=>{ce(t),r(void 0)}):(ce(t),r(void 0))})}function ss(e){return q(De,e,!1)}function er(e){return q(st|Pe,e,!0)}function fs(e,t=0){return q(Ie|t,e,!0)}function is(e,t=[],n=[],r=[]){Hn(r,t,n,s=>{q(Ie,()=>e(...s.map(Se)),!0)})}function as(e,t=0){var n=q(G|t,e,!0);return n}function ls(e){return q(H|Pe,e,!0)}function Qt(e){var t=e.teardown;if(t!==null){const n=_e,r=_;Rt(!0),Q(null);try{t.call(null)}finally{Rt(n),Q(r)}}}function vt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&_t(()=>{s.abort(ne)});var r=n.next;(n.f&ve)!==0?n.parent=null:ce(n,t),n=r}}function tr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&H)===0&&ce(t),t=n}}function ce(e,t=!0){var n=!1;(t||(e.f&It)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(nr(e.nodes.start,e.nodes.end),n=!0),vt(e,t&&!n),Ne(e,0),E(e,$);var r=e.nodes&&e.nodes.t;if(r!==null)for(const f of r)f.stop();Qt(e);var s=e.parent;s!==null&&s.first!==null&&en(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function nr(e,t){for(;e!==null;){var n=e===t?null:ee(e);e.remove(),e=n}}function en(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function rr(e,t,n=!0){var r=[];tn(e,r,!0);var s=()=>{n&&ce(e),t&&t()},f=r.length;if(f>0){var a=()=>--f||s();for(var l of r)l.out(a)}else s()}function tn(e,t,n){if((e.f&j)===0){e.f^=j;var r=e.nodes&&e.nodes.t;if(r!==null)for(const l of r)(l.is_global||n)&&t.push(l);for(var s=e.first;s!==null;){var f=s.next,a=(s.f&je)!==0||(s.f&H)!==0&&(e.f&G)!==0;tn(s,t,a?n:!1),s=f}}}function os(e){nn(e,!0)}function nn(e,t){if((e.f&j)!==0){e.f^=j,(e.f&g)===0&&(E(e,R),B(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&je)!==0||(n.f&H)!==0;nn(n,s?t:!1),n=r}var f=e.nodes&&e.nodes.t;if(f!==null)for(const a of f)(a.is_global||t)&&a.in()}}function us(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:ee(n);t.append(n),n=s}}let Le=!1,_e=!1;function Rt(e){_e=e}let _=null,L=!1;function Q(e){_=e}let w=null;function Te(e){w=e}let C=null;function rn(e){_!==null&&(C===null?C=[e]:C.push(e))}let k=null,x=0,I=null;function sr(e){I=e}let sn=1,se=0,le=se;function Ot(e){le=e}function fn(){return++sn}function Fe(e){var t=e.f;if((t&R)!==0)return!0;if(t&A&&(e.f&=~ue),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&P)!==0&&b===null&&E(e,g)}return!1}function an(e,t,n=!0){var r=e.reactions;if(r!==null&&!(C!==null&&Ee.call(C,e)))for(var s=0;s{e.ac.abort(ne)}),e.ac=null);try{e.f|=$e;var c=e.fn,u=c();e.f|=oe;var v=e.deps,y=d==null?void 0:d.is_fork;if(k!==null){var h;if(y||Ne(e,x),v!==null&&x>0)for(v.length=x+k.length,h=0;h{throw TypeError(e)};var _n=(e,t,n)=>t in e?cn(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var de=(e,t,n)=>_n(e,typeof t!="symbol"?t+"":t,n),Ke=(e,t,n)=>t.has(e)||wt("Cannot "+n);var p=(e,t,n)=>(Ke(e,t,"read from private field"),n?n.call(e):t.get(e)),F=(e,t,n)=>t.has(e)?wt("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),z=(e,t,n,r)=>(Ke(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),K=(e,t,n)=>(Ke(e,t,"access private method"),n);var vn=Array.isArray,dn=Array.prototype.indexOf,Ee=Array.prototype.includes,ar=Array.from,lr=Object.defineProperty,Re=Object.getOwnPropertyDescriptor,pn=Object.getOwnPropertyDescriptors,hn=Object.prototype,wn=Array.prototype,kt=Object.getPrototypeOf,yt=Object.isExtensible;const yn=()=>{};function or(e){return e()}function En(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}function ur(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);const n=[];for(const r of e)if(n.push(r),n.length===t)break;return n}const A=2,De=4,Ie=8,Dt=1<<24,G=16,H=32,ve=64,mn=128,P=512,g=1024,R=2048,Y=4096,j=8192,$=16384,oe=32768,je=65536,Et=1<<17,It=1<<18,Pe=1<<19,Pt=1<<20,cr=1<<25,ue=65536,$e=1<<21,st=1<<22,Z=1<<23,ae=Symbol("$state"),_r=Symbol("legacy props"),vr=Symbol(""),ne=new class extends Error{constructor(){super(...arguments);de(this,"name","StaleReactionError");de(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};var Nt;const pr=!!((Nt=globalThis.document)!=null&&Nt.contentType)&&globalThis.document.contentType.includes("xml"),Ue=3,Ct=8;function gn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function hr(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Tn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function bn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function An(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Sn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function wr(){throw new Error("https://svelte.dev/e/hydration_failed")}function yr(e){throw new Error("https://svelte.dev/e/props_invalid_value")}function Rn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function On(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Nn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Er(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const mr=1,gr=2,Tr=4,br=8,Ar=16,Sr=1,Rr=2,Or=4,Nr=8,kr=16,xr=1,Dr=2,kn="[",xn="[!",Ir="[?",Dn="]",ft={},T=Symbol(),In="http://www.w3.org/1999/xhtml";function it(e){console.warn("https://svelte.dev/e/hydration_mismatch")}function Pr(){console.warn("https://svelte.dev/e/select_multiple_invalid_value")}function Cr(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}let J=!1;function Fr(e){J=e}let m;function me(e){if(e===null)throw it(),ft;return m=e}function Mr(){return me(ee(m))}function Lr(e){if(J){if(ee(m)!==null)throw it(),ft;m=e}}function jr(e=1){if(J){for(var t=e,n=m;t--;)n=ee(n);m=n}}function Yr(e=!0){for(var t=0,n=m;;){if(n.nodeType===Ct){var r=n.data;if(r===Dn){if(t===0)return n;t-=1}else(r===kn||r===xn||r[0]==="["&&!isNaN(Number(r.slice(1))))&&(t+=1)}var s=ee(n);e&&n.remove(),n=s}}function Hr(e){if(!e||e.nodeType!==Ct)throw it(),ft;return e.data}function Ft(e){return e===this.v}function Pn(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Mt(e){return!Pn(e,this.v)}let Be=!1;function qr(){Be=!0}let S=null;function Ye(e){S=e}function Vr(e,t=!1,n){S={p:S,i:!1,c:null,e:null,s:e,x:null,l:Be&&!t?{s:null,u:null,$:[]}:null}}function Ur(e){var t=S,n=t.e;if(n!==null){t.e=null;for(var r of n)Jt(r)}return t.i=!0,S=t.p,{}}function Ce(){return!Be||S!==null&&S.l===null}let re=[];function Lt(){var e=re;re=[],En(e)}function mt(e){if(re.length===0&&!Oe){var t=re;queueMicrotask(()=>{t===re&&Lt()})}re.push(e)}function Cn(){for(;re.length>0;)Lt()}function Fn(e){var t=w;if(t===null)return _.f|=Z,e;if((t.f&oe)===0&&(t.f&De)===0)throw e;He(e,t)}function He(e,t){for(;t!==null;){if((t.f&mn)!==0){if((t.f&oe)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const Mn=-7169;function E(e,t){e.f=e.f&Mn|t}function at(e){(e.f&P)!==0||e.deps===null?E(e,g):E(e,Y)}function jt(e){if(e!==null)for(const t of e)(t.f&A)===0||(t.f&ue)===0||(t.f^=ue,jt(t.deps))}function Ln(e,t,n){(e.f&R)!==0?t.add(e):(e.f&Y)!==0&&n.add(e),jt(e.deps),E(e,g)}const Me=new Set;let d=null,gt=null,b=null,N=[],Ge=null,Ze=!1,Oe=!1;var pe,he,fe,we,ke,xe,ie,U,ye,D,We,Je,Qe,Yt;const dt=class dt{constructor(){F(this,D);de(this,"current",new Map);de(this,"previous",new Map);F(this,pe,new Set);F(this,he,new Set);F(this,fe,0);F(this,we,0);F(this,ke,null);F(this,xe,new Set);F(this,ie,new Set);F(this,U,new Map);de(this,"is_fork",!1);F(this,ye,!1)}skip_effect(t){p(this,U).has(t)||p(this,U).set(t,{d:[],m:[]})}unskip_effect(t){var n=p(this,U).get(t);if(n){p(this,U).delete(t);for(var r of n.d)E(r,R),B(r);for(r of n.m)E(r,Y),B(r)}}process(t){var s;N=[],this.apply();var n=[],r=[];for(const f of t)K(this,D,Je).call(this,f,n,r);if(K(this,D,We).call(this)){K(this,D,Qe).call(this,r),K(this,D,Qe).call(this,n);for(const[f,a]of p(this,U))Ut(f,a)}else{for(const f of p(this,pe))f();p(this,pe).clear(),p(this,fe)===0&&K(this,D,Yt).call(this),gt=this,d=null,Tt(r),Tt(n),gt=null,(s=p(this,ke))==null||s.resolve()}b=null}capture(t,n){n!==T&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&Z)===0&&(this.current.set(t,t.v),b==null||b.set(t,t.v))}activate(){d=this,this.apply()}deactivate(){d===this&&(d=null,b=null)}flush(){if(this.activate(),N.length>0){if(Ht(),d!==null&&d!==this)return}else p(this,fe)===0&&this.process([]);this.deactivate()}discard(){for(const t of p(this,he))t(this);p(this,he).clear()}increment(t){z(this,fe,p(this,fe)+1),t&&z(this,we,p(this,we)+1)}decrement(t){z(this,fe,p(this,fe)-1),t&&z(this,we,p(this,we)-1),!p(this,ye)&&(z(this,ye,!0),mt(()=>{z(this,ye,!1),K(this,D,We).call(this)?N.length>0&&this.flush():this.revive()}))}revive(){for(const t of p(this,xe))p(this,ie).delete(t),E(t,R),B(t);for(const t of p(this,ie))E(t,Y),B(t);this.flush()}oncommit(t){p(this,pe).add(t)}ondiscard(t){p(this,he).add(t)}settled(){return(p(this,ke)??z(this,ke,xt())).promise}static ensure(){if(d===null){const t=d=new dt;Me.add(d),Oe||mt(()=>{d===t&&t.flush()})}return d}apply(){}};pe=new WeakMap,he=new WeakMap,fe=new WeakMap,we=new WeakMap,ke=new WeakMap,xe=new WeakMap,ie=new WeakMap,U=new WeakMap,ye=new WeakMap,D=new WeakSet,We=function(){return this.is_fork||p(this,we)>0},Je=function(t,n,r){t.f^=g;for(var s=t.first;s!==null;){var f=s.f,a=(f&(H|ve))!==0,l=a&&(f&g)!==0,i=l||(f&j)!==0||p(this,U).has(s);if(!i&&s.fn!==null){a?s.f^=g:(f&De)!==0?n.push(s):Fe(s)&&((f&G)!==0&&p(this,ie).add(s),be(s));var o=s.first;if(o!==null){s=o;continue}}for(;s!==null;){var c=s.next;if(c!==null){s=c;break}s=s.parent}}},Qe=function(t){for(var n=0;n1){this.previous.clear();var t=b,n=!0;for(const f of Me){if(f===this){n=!1;continue}const a=[];for(const[i,o]of this.current){if(f.current.has(i))if(n&&o!==f.current.get(i))f.current.set(i,o);else continue;a.push(i)}if(a.length===0)continue;const l=[...f.current.keys()].filter(i=>!this.current.has(i));if(l.length>0){var r=N;N=[];const i=new Set,o=new Map;for(const c of a)qt(c,l,i,o);if(N.length>0){d=f,f.apply();for(const c of N)K(s=f,D,Je).call(s,c,[],[]);f.deactivate()}N=r}}d=null,b=t}Me.delete(this)};let ge=dt;function jn(e){var t=Oe;Oe=!0;try{for(var n;;){if(Cn(),N.length===0&&(d==null||d.flush(),N.length===0))return Ge=null,n;Ht()}}finally{Oe=t}}function Ht(){Ze=!0;var e=null;try{for(var t=0;N.length>0;){var n=ge.ensure();if(t++>1e3){var r,s;Yn()}n.process(N),W.clear()}}finally{N=[],Ze=!1,Ge=null}}function Yn(){try{Sn()}catch(e){He(e,Ge)}}let M=null;function Tt(e){var t=e.length;if(t!==0){for(var n=0;n0)){W.clear();for(const s of M){if((s.f&($|j))!==0)continue;const f=[s];let a=s.parent;for(;a!==null;)M.has(a)&&(M.delete(a),f.push(a)),a=a.parent;for(let l=f.length-1;l>=0;l--){const i=f[l];(i.f&($|j))===0&&be(i)}}M.clear()}}M=null}}function qt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const f=s.f;(f&A)!==0?qt(s,t,n,r):(f&(st|G))!==0&&(f&R)===0&&Vt(s,t,r)&&(E(s,R),B(s))}}function Vt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if(Ee.call(t,s))return!0;if((s.f&A)!==0&&Vt(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function B(e){var t=Ge=e,n=t.b;if(n!=null&&n.is_pending&&(e.f&(De|Ie|Dt))!==0&&(e.f&oe)===0){n.defer_effect(e);return}for(;t.parent!==null;){t=t.parent;var r=t.f;if(Ze&&t===w&&(r&G)!==0&&(r&It)===0&&(r&oe)!==0)return;if((r&(ve|H))!==0){if((r&g)===0)return;t.f^=g}}N.push(t)}function Ut(e,t){if(!((e.f&H)!==0&&(e.f&g)!==0)){(e.f&R)!==0?t.d.push(e):(e.f&Y)!==0&&t.m.push(e),E(e,g);for(var n=e.first;n!==null;)Ut(n,t),n=n.next}}function Hn(e,t,n,r){const s=Ce()?lt:Bn;var f=e.filter(u=>!u.settled);if(n.length===0&&f.length===0){r(t.map(s));return}var a=w,l=qn(),i=f.length===1?f[0].promise:f.length>1?Promise.all(f.map(u=>u.promise)):null;function o(u){l();try{r(u)}catch(v){(a.f&$)===0&&He(v,a)}et()}if(n.length===0){i.then(()=>o(t.map(s)));return}function c(){l(),Promise.all(n.map(u=>Un(u))).then(u=>o([...t.map(s),...u])).catch(u=>He(u,a))}i?i.then(c):c()}function qn(){var e=w,t=_,n=S,r=d;return function(f=!0){Te(e),Q(t),Ye(n),f&&(r==null||r.activate())}}function et(e=!0){Te(null),Q(null),Ye(null),e&&(d==null||d.deactivate())}function Vn(){var e=w.b,t=d,n=e.is_rendered();return e.update_pending_count(1),t.increment(n),()=>{e.update_pending_count(-1),t.decrement(n)}}function lt(e){var t=A|R,n=_!==null&&(_.f&A)!==0?_:null;return w!==null&&(w.f|=Pe),{ctx:S,deps:null,effects:null,equals:Ft,f:t,fn:e,reactions:null,rv:0,v:T,wv:0,parent:n??w,ac:null}}function Un(e,t,n){w===null&&gn();var s=void 0,f=ut(T),a=!_,l=new Map;return er(()=>{var v;var i=xt();s=i.promise;try{Promise.resolve(e()).then(i.resolve,i.reject).finally(et)}catch(y){i.reject(y),et()}var o=d;if(a){var c=Vn();(v=l.get(o))==null||v.reject(ne),l.delete(o),l.set(o,i)}const u=(y,h=void 0)=>{if(o.activate(),h)h!==ne&&(f.f|=Z,nt(f,h));else{(f.f&Z)!==0&&(f.f^=Z),nt(f,y);for(const[V,O]of l){if(l.delete(V),V===o)break;O.reject(ne)}}c&&c()};i.promise.then(u,y=>u(null,y||"unknown"))}),Qn(()=>{for(const i of l.values())i.reject(ne)}),new Promise(i=>{function o(c){function u(){c===s?i(f):o(s)}c.then(u,u)}o(s)})}function Br(e){const t=lt(e);return rn(t),t}function Bn(e){const t=lt(e);return t.equals=Mt,t}function Gn(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!zt&&Xn()}return t}function Xn(){zt=!1;for(const e of tt)(e.f&g)!==0&&E(e,Y),Fe(e)&&be(e);tt.clear()}function Xe(e){te(e,e.v+1)}function Kt(e,t){var n=e.reactions;if(n!==null)for(var r=Ce(),s=n.length,f=0;f{if(le===f)return l();var i=_,o=le;Q(null),Ot(f);var c=l();return Q(i),Ot(o),c};return r&&n.set("length",X(e.length)),new Proxy(e,{defineProperty(l,i,o){(!("value"in o)||o.configurable===!1||o.enumerable===!1||o.writable===!1)&&Rn();var c=n.get(i);return c===void 0?a(()=>{var u=X(o.value);return n.set(i,u),u}):te(c,o.value,!0),!0},deleteProperty(l,i){var o=n.get(i);if(o===void 0){if(i in l){const c=a(()=>X(T));n.set(i,c),Xe(s)}}else te(o,T),Xe(s);return!0},get(l,i,o){var y;if(i===ae)return e;var c=n.get(i),u=i in l;if(c===void 0&&(!u||(y=Re(l,i))!=null&&y.writable)&&(c=a(()=>{var h=Ae(u?l[i]:T),V=X(h);return V}),n.set(i,c)),c!==void 0){var v=Se(c);return v===T?void 0:v}return Reflect.get(l,i,o)},getOwnPropertyDescriptor(l,i){var o=Reflect.getOwnPropertyDescriptor(l,i);if(o&&"value"in o){var c=n.get(i);c&&(o.value=Se(c))}else if(o===void 0){var u=n.get(i),v=u==null?void 0:u.v;if(u!==void 0&&v!==T)return{enumerable:!0,configurable:!0,value:v,writable:!0}}return o},has(l,i){var v;if(i===ae)return!0;var o=n.get(i),c=o!==void 0&&o.v!==T||Reflect.has(l,i);if(o!==void 0||w!==null&&(!c||(v=Re(l,i))!=null&&v.writable)){o===void 0&&(o=a(()=>{var y=c?Ae(l[i]):T,h=X(y);return h}),n.set(i,o));var u=Se(o);if(u===T)return!1}return c},set(l,i,o,c){var ht;var u=n.get(i),v=i in l;if(r&&i==="length")for(var y=o;yX(T)),n.set(y+"",h))}if(u===void 0)(!v||(ht=Re(l,i))!=null&&ht.writable)&&(u=a(()=>X(void 0)),te(u,Ae(o)),n.set(i,u));else{v=u.v!==T;var V=a(()=>Ae(o));te(u,V)}var O=Reflect.getOwnPropertyDescriptor(l,i);if(O!=null&&O.set&&O.set.call(c,o),!v){if(r&&typeof i=="string"){var pt=n.get("length"),ze=Number(i);Number.isInteger(ze)&&ze>=pt.v&&te(pt,ze+1)}Xe(s)}return!0},ownKeys(l){Se(s);var i=Reflect.ownKeys(l).filter(u=>{var v=n.get(u);return v===void 0||v.v!==T});for(var[o,c]of n)c.v!==T&&!(o in l)&&i.push(o);return i},setPrototypeOf(){On()}})}function bt(e){try{if(e!==null&&typeof e=="object"&&ae in e)return e[ae]}catch{}return e}function zr(e,t){return Object.is(bt(e),bt(t))}var At,$n,Xt,$t;function Kr(){if(At===void 0){At=window,$n=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;Xt=Re(t,"firstChild").get,$t=Re(t,"nextSibling").get,yt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),yt(n)&&(n.__t=void 0)}}function qe(e=""){return document.createTextNode(e)}function Ve(e){return Xt.call(e)}function ee(e){return $t.call(e)}function Xr(e,t){if(!J)return Ve(e);var n=Ve(m);if(n===null)n=m.appendChild(qe());else if(t&&n.nodeType!==Ue){var r=qe();return n==null||n.before(r),me(r),r}return t&&ct(n),me(n),n}function $r(e,t=!1){if(!J){var n=Ve(e);return n instanceof Comment&&n.data===""?ee(n):n}if(t){if((m==null?void 0:m.nodeType)!==Ue){var r=qe();return m==null||m.before(r),me(r),r}ct(m)}return m}function Zr(e,t=1,n=!1){let r=J?m:e;for(var s;t--;)s=r,r=ee(r);if(!J)return r;if(n){if((r==null?void 0:r.nodeType)!==Ue){var f=qe();return r===null?s==null||s.after(f):r.before(f),me(f),f}ct(r)}return me(r),r}function Zn(e){e.textContent=""}function Wr(){return!1}function Jr(e,t,n){return document.createElementNS(In,e,void 0)}function ct(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===Ue;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function Qr(e){J&&Ve(e)!==null&&Zn(e)}let St=!1;function Wn(){St||(St=!0,document.addEventListener("reset",e=>{Promise.resolve().then(()=>{var t;if(!e.defaultPrevented)for(const n of e.target.elements)(t=n.__on_r)==null||t.call(n)})},{capture:!0}))}function _t(e){var t=_,n=w;Q(null),Te(null);try{return e()}finally{Q(t),Te(n)}}function es(e,t,n,r=n){e.addEventListener(t,()=>_t(n));const s=e.__on_r;s?e.__on_r=()=>{s(),r(!0)}:e.__on_r=()=>r(!0),Wn()}function Zt(e){w===null&&(_===null&&An(),bn()),_e&&Tn()}function Jn(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function q(e,t,n){var r=w;r!==null&&(r.f&j)!==0&&(e|=j);var s={ctx:S,deps:null,nodes:null,f:e|R|P,first:null,fn:t,last:null,next:null,parent:r,b:r&&r.b,prev:null,teardown:null,wv:0,ac:null};if(n)try{be(s)}catch(l){throw ce(s),l}else t!==null&&B(s);var f=s;if(n&&f.deps===null&&f.teardown===null&&f.nodes===null&&f.first===f.last&&(f.f&Pe)===0&&(f=f.first,(e&G)!==0&&(e&je)!==0&&f!==null&&(f.f|=je)),f!==null&&(f.parent=r,r!==null&&Jn(f,r),_!==null&&(_.f&A)!==0&&(e&ve)===0)){var a=_;(a.effects??(a.effects=[])).push(f)}return s}function Wt(){return _!==null&&!L}function Qn(e){const t=q(Ie,null,!1);return E(t,g),t.teardown=e,t}function ts(e){Zt();var t=w.f,n=!_&&(t&H)!==0&&(t&oe)===0;if(n){var r=S;(r.e??(r.e=[])).push(e)}else return Jt(e)}function Jt(e){return q(De|Pt,e,!1)}function ns(e){return Zt(),q(Ie|Pt,e,!0)}function rs(e){ge.ensure();const t=q(ve|Pe,e,!0);return(n={})=>new Promise(r=>{n.outro?rr(t,()=>{ce(t),r(void 0)}):(ce(t),r(void 0))})}function ss(e){return q(De,e,!1)}function er(e){return q(st|Pe,e,!0)}function fs(e,t=0){return q(Ie|t,e,!0)}function is(e,t=[],n=[],r=[]){Hn(r,t,n,s=>{q(Ie,()=>e(...s.map(Se)),!0)})}function as(e,t=0){var n=q(G|t,e,!0);return n}function ls(e){return q(H|Pe,e,!0)}function Qt(e){var t=e.teardown;if(t!==null){const n=_e,r=_;Rt(!0),Q(null);try{t.call(null)}finally{Rt(n),Q(r)}}}function vt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&_t(()=>{s.abort(ne)});var r=n.next;(n.f&ve)!==0?n.parent=null:ce(n,t),n=r}}function tr(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&H)===0&&ce(t),t=n}}function ce(e,t=!0){var n=!1;(t||(e.f&It)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(nr(e.nodes.start,e.nodes.end),n=!0),vt(e,t&&!n),Ne(e,0),E(e,$);var r=e.nodes&&e.nodes.t;if(r!==null)for(const f of r)f.stop();Qt(e);var s=e.parent;s!==null&&s.first!==null&&en(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function nr(e,t){for(;e!==null;){var n=e===t?null:ee(e);e.remove(),e=n}}function en(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function rr(e,t,n=!0){var r=[];tn(e,r,!0);var s=()=>{n&&ce(e),t&&t()},f=r.length;if(f>0){var a=()=>--f||s();for(var l of r)l.out(a)}else s()}function tn(e,t,n){if((e.f&j)===0){e.f^=j;var r=e.nodes&&e.nodes.t;if(r!==null)for(const l of r)(l.is_global||n)&&t.push(l);for(var s=e.first;s!==null;){var f=s.next,a=(s.f&je)!==0||(s.f&H)!==0&&(e.f&G)!==0;tn(s,t,a?n:!1),s=f}}}function os(e){nn(e,!0)}function nn(e,t){if((e.f&j)!==0){e.f^=j,(e.f&g)===0&&(E(e,R),B(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&je)!==0||(n.f&H)!==0;nn(n,s?t:!1),n=r}var f=e.nodes&&e.nodes.t;if(f!==null)for(const a of f)(a.is_global||t)&&a.in()}}function us(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:ee(n);t.append(n),n=s}}let Le=!1,_e=!1;function Rt(e){_e=e}let _=null,L=!1;function Q(e){_=e}let w=null;function Te(e){w=e}let C=null;function rn(e){_!==null&&(C===null?C=[e]:C.push(e))}let k=null,x=0,I=null;function sr(e){I=e}let sn=1,se=0,le=se;function Ot(e){le=e}function fn(){return++sn}function Fe(e){var t=e.f;if((t&R)!==0)return!0;if(t&A&&(e.f&=~ue),(t&Y)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&P)!==0&&b===null&&E(e,g)}return!1}function an(e,t,n=!0){var r=e.reactions;if(r!==null&&!(C!==null&&Ee.call(C,e)))for(var s=0;s{e.ac.abort(ne)}),e.ac=null);try{e.f|=$e;var c=e.fn,u=c();e.f|=oe;var v=e.deps,y=d==null?void 0:d.is_fork;if(k!==null){var h;if(y||Ne(e,x),v!==null&&x>0)for(v.length=x+k.length,h=0;hOh|d+e_03(ed0#n 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 V`l)Ig!@1UQ?Rx0jTHF2epBooS#d!b# literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz b/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d0c256e56bb1fb9466a307b1a40138d6895132db GIT binary patch literal 9711 zcmV99ds3MYQ?dj?1eKd=UjeZ^-U44^%)f&ho&E;`1p2$MY zJ2O$g)mh;ioINR*1 zt-l|~pMV#kjwXwOChdl12Y8bqe{JvSpc(9QaXNN2H< z8%Zj&!DcA(Zr)tEM?mF5F^ca(@d`9M`an+{|t z;=PWjNaKyF10 zNLI1 z<17gOXX7?5(e`mMC7K7X21w(%1ix5mxp1fq5lo7x(FlS=65z{PGva0}_Y58#(U{rjsn~ z^WImZoiQu;#gUQ(r?;2pJtgB}Futw9b@l5@tOlCq7zN8T%k{_G{qG^WkF3-G8mQ@H z02BeBi5m9gU0=#U9j@ErmxmnA2VhU=)Jx(ts}D0Tetmg-E`cuSCh4HZ8j3&E$*(Vx z&psCCq*5yLA?BwYEG!;h-wb0=7wwTsOBZr+~m>b#iqEU zM`Kg$7kG9z#Y_CY+!Tq57AtXP*=Q*CQBJS|)Z5$J*6r`DadG|I&cFZu``g`6fo)X0 zA|<_!S?f5Ht=qWB|08)p(2io&ANu$@CVc(ED5cDZ?nl#1rISqloXlSQ>VOYoKOc`L z7%h`(<89Q~sh0bS55n6>a^0w^7)h#th?bDZ#F|6B`@l~K1Y6-eLQmJ{fMB#0=r4m& z=q=%WVTOFG2d3)AgM-tkRljfO7wy=dmEr^)HX3!*EMTWzKC$0ot}IPL4^Vot4a>fl-^Ae7U6O z9X&6$FYyZMY&IKdc^DrChf~t`gQ8VJ0?1$|#J^@UP+M5kismd0^s?E^TZJ5rXHXac zXz8uxjYVEVE|=0l-eAZd+#1R2s783De2tX!ERv}+k7jeN4B94*NOrMq)uve#W;L7D zY#IX$gKUmjDc)Qzy)rxErbimyWA`$R0f;a^C1ZW_)E! zKgL8MS&?=J${7YxAv;_t*t)2O9w|dMg{&0pZ7lrAEeKt|Pvuk|qT>71`w#?ryCu!B{hB>9vw&^i?oM1Jz2JV;O27 z`PWPR%h0&&ykRTVo4^!kK$Jn9KH)sTC?_tnT@{SiMpVTd8+g@{#-Cvh(5g>N9p@6( z6}XC`ZHo)2oh#GPNV0=Gdi?j!U;kG7vZn!(tt7(#=0Uzx6}U0)NI(_G3>Y0}C_JS> zOP6|Ihi!U%@s|0`?xa12VP#M$ZBX&*c6o8jCI6U8@7Mp0rcz)S#naU|b8fX-hUq8^H((xBZ%mmmm zBgIgP1O_?`a-3KxQYk))xfCzOCn?@a@d3E8cEvzN+BzDjHIwL-Hf&ycHco$9&=zhA z0`VZ8cvX`^&eHL;^yLK?YX`L8*Q&fpCq1o32Oz$Q86;${l!6PaDj^3D+;Ri3Ix!-C7p|cC)%(*v@a1paEK?9 zY#wN*6L}CsQFkLGG@uIKnOz25gxb%gw}bs-1h8xH$!`#b3s>=>))U@{pVZ`GHT^{* z;!6PFa1nk~0m?$w3l?i&PAnybVS*)9KU@6_<{Sj~#8Q!Aeh!2$%7>Z`5?7dWbw(0~ z{^p@OV?k**?gsN|Zn0dJE#nFTch;v69Bu+mhwY=IPtxp+L?Yqd9tJ}_5c#!IO+lEF zxy)C`uc?taVy2CPjK`rjFkE@1;ffp#S0w4%2jY9I8`mE&RDnm!*P1@ z)`nrrIAB*~S*QIC_>1YFF&Pf50<OXJmKX2+k@9IC(`p=KGU-Nq9OZN-H3=|SsEu*pxc~6We zb8-pP_-uOxCSG;WA&v#BF4s=Llu*Qyv?x`ltdu>fNFwaCh@&8B25*)#5CUl|B8y_s zb<(`nKhp?&2tU6W<*P0zOO_aowAsX1m3|+0O9rAHutLh}k?~!ZVf&TDU(A8Z*G5b7 zsFyYreEW(TX<;@dKzRk2YwRW|qcN#8D$S>4{*pSow!%I-=5PX2zrNS6-(ipWszklf zQCBO-E)SKJ5u799kUv#6;*gUW3I$MIp4f5JOYE65;!8?~SY3?SDs{UM+2kZ;JB z4~DmOwAz0Klc}-2F1Zi1I-3~A4go~^pF@Cd8P`PqMJmQ5bA36Z2XRt|HZcu3w$N-6 zZmTL%VNjLSBos!3;Z2<1&fJOh#-?D+Nf3KxQ|Ov#;Iilf{`P7-_<749yu{wZ1yclR z^sG^nhz2&oT;@q8?RGe1&Bu(KS`}K1Bcla+=<5^u;_$l)`XUp&0u1R3yFrwQ#3@i~ zJrAKWm1y8;Or_`xC|D%llDcp^jEdFDNnEu$kd7VGrma}Vzm^f0S7oYrCf||lkYc~h zR+b|{-Wtlcxty^2qcI5A7w?x_b0@zo%Qw9^HSBCQ`485dA7`qocJLDZpUGgH|+PY*DyMV?PJX(GW zjfMm6RS@?&a5Q&CC8F@H(q^;JEX(^%J}AH5#wEO>xbJ?*oCd`#+RD|@#P$I*5O98| z;|_lw!IsP^wC!Fxz#9)7#w5BZFPR!+#|3$yPVAWI0UyDbS8K^QhR;kN_!#m0IEwwg zG+YK2qVfEAr;|McVzbAOt?W*trP2kYDaUAZVe`}J~@KLFsI zjV)U?3}+=l7_K45Yhr<7LD&h%7r>GVGnHm05@128maju2r~)$gHO%L_856@EURlv1 zKY{0GQ`S*nBDwIE>Qo5!mo{va*dEe?inW*EzSqKl&n^VQz@9Y9Bx2fT0GwL8^ScIM z17+?QLC$=jJ%QvCt=PID?crNRX)}dCbLrvOtJG>!xb7Mn zSa)FEJEU48TVcFHor)z%qxIwt6_`86+?3V8ijB{>^XhmQdWpzU+Raq^xlRmX_nMZq zQ^?wB%c$tuO;Hmoi7!GH1BbNTkcy(FES7mmz5f1Rv@F(i9*8oUWO_ zAGZ6xqxXC6ywSJt#rLqOr*PQ}Y&^m#kO{|R&d7@|K9E)Sg`yuKA@a7uzwpd>p8?UC zw%wVXUj_m`DX7kzby z;0G~P6Z&ALWPg00##z~Zr9^^kxg_VTAR|3=i(=MB8eaQM+|rBYQtiCky%ll)URcDr zjc=Wpr(BDUHq*2y5J@yu!5N9xMi0l!sijQNRNDQ_UHh)4|czco%%Mv@tdyb`e_(iwL6=%%Y41+qm+d&1~-+ zXwIzqFs64BHDi%l5BM|+=3;0?Ar?nwp6{0$hC|vqqSQo3KXURN4nu8>dz4hKSeF2juiv!ht;nsg|q=_*-e8aY>&Zs zR(%T(m?IZ>XZCqvWAo%R$vjEBQILr%yfDl2{HJXZtm9)49VoxY>)h9@&9SknwYIcf zaXr}gkVTC^FIm+7A^)+K_$RFr@IcUN*O%U0qGdx@X%65;qpZS1XR|_d#ZbUZZaZL? zJiQh@B(bCaMKp-l4Ca^VsG+f1h__ZzOAn_Wml|88uOSUO*-Z>(;C2=zBtoH046IHy zuJQBPY}s9tq^0rtY0OyE!;V zou2G|s_6eymFvxi%$OT%t_{i#*Kr_j$@=`Ru_dhLEjyn2567A!B{8PItLntRqq$%; zYGl;46Jtl1AI3jxjGBEL`Ywy$LSBaLeQQI&b}Q`BhH;^^yOHu2e!wCAnfxaA*%TEo z3>mwlAvsv6LeHjYHg$|$ypn8oU(ut3NvzFYjmQ}%Ob);!1zjqZQac}>Fcb`m6hFSHSoUnH00wbn*qBWM)OW=v+G+37S2GGnw;gOt`0lNE(x zyKh>vi9258tx{OfZt8L@vgR@V#-xUzkoIs4oaiX#MoOn8bEfEl+tLH}P{iaRAfv#O za=SKh%q9diyd)v%4niz-+PKRyx1##S3Ko)zLmXmyg1fqg8qiLv_Gd-*K~o90YW#HuVN> z3NSUZnW58s?x1-hz+St_5NKEJ0z0~?)BAvcF{IeIh8yrkp0 zIhg=b+F=*v>PH%m&#(o;j-9k0iq8}nS!sGB`V?oTtYdvZD?xJ@^wG3)rhCj5%Q{_D zco5S_&(E>jDiDpCm-W1qIhKH1Ep zK8bW9n-B)|5M(oVbTIVDW^CeuQ^LIt=1ijsZE#=OL%kBEr4SICCQjA4w=EUrgIy7p zEVFWgXpUIp{3-3%oU9c?=6Z-Z?$U*wp+iX*r*eo>*`D*TSmw|_%VrtWi!9icf!@$e z(3k;-Lv;^{LsdI)Q#YjP2(yG-PP>GW3RP2UB7^qyhVtsqO>f=0!#&TneSh@phvdk@ zc0{w8hgR3X62S>)I+fBTzyh_K$Tx$NXH%naq6`il!o?36nFL@=qTis=?BfEET4O?%+-Dk% zE9a=a0BK!v_G({OLE8$(nwNu`v}!hXW2H=!-c>m$Uv!IMRpL=DKI5+!seD)Hl#E^FaXI|B z#RbOkEjmQMy-Ew2jPHJfEmgvDi)ZOIU3zOxOIhq*Qvlio7WXoC?0J_7Rdk3DnOBfU zXK->?1)a})E^z0P9pf*CDP7p4%>tCBhTP((xNFEn##M8rqeQaR>-CXReq%jtx&Wz= zhq&(L7sd)idNsugw2et+rJ858M)pTY6XZG!)$1u+>PN1i;zi&Q7VFi$ENH(<(i&;u zwOrwI>1CgPR`x2b=h^ieJbIwP=jyIvMu|J91>I!OS(nuw6((zx<5G37iwD6@YG4=6I;=7o7XTR23(BHWwd<$YQLtJt4SzI?PP z=(7Rq?)$I`Vrhq*@g>4$ig6k07@0&E3bDM(gwM5iOW}em#In=~hi8stZVwmCdd0d6 zE+_XfLL%C|LHeZcQR{i`%pQA5twCsmOFB;H-QhM4QjS__FR91CN*l0@=+3}>bSRDw z^@vf}i_vhb7|=Uq*S_kz{hq&`Sf>tP&5a+?G%+lO}QuE zTy%LEeY3Hmdtob1F43<^TP{zQ$AZByMLEJ(G_z?8sPvl&SQX-`T~Gqbl^{TMoppxl zUmV}EF)huZXty~{&xDLJd*!iDg(5RHs$0%;tA!!qqN6j;l6uliaz801S<9PATwYDW zxYPlk=CO0oB#~(X&s>!hAe-N$c~2_*ay021`ORvD8Y{$~T`9Icp-lG&-!RX$-#7_l-_F!pgMd? zKX#)iac1#Vxs*dV8A)RGC@H4ep{E^k9%D)P>n%na8`wbbR@JnTxBhLq z@01{Nj2H&r#HjqWrPqdl6SOwd&=(E`H}u`I6*7?7aV&KQgAC|5ixoJ5A7v}RG4j@U zip%%i!m^r0pOdBwYf{0x6RZ{0;%jBOwx;z3$)eT(PHqcY)h1y!$XOP)9oBqr$*FFJ z^f-651F3Jw5n~ow0(hnaT85;r8kC%waLO*>?Hbgvn^3c{@4;(3-2)+rtiHxK53Jxr zEyd0fTs;zKLl`}H=y5Vm6m#Vdp4hM=NZ(N~g5!j>#1DM)rJ8W2oRU~ilp)zCE&J7+ zmZN`F0*!OfBec|a>B7xs&!mo*Rm5o(cI*XL&LIXjPw0@_WM<7HsCyekV$yO74@_08 z$1gRMs-C1wf<#ZCIG0GXF->=>c0ac-^}5~GLCpwAu^=D)zKgABm8M#o`HjO;-Q@`K zBCzF9r3)pzR-uj{35{p)9_+y(&AqLYlpa~km_F4M%BHog1==`)xj-s$sm2o=S0))F z%3N5tg4m>cH@sX(PVUpvRLfH7v9=bZVPpcLz(sBW!_$NbJtk9l*B|BjR`5OFE^jIu zSRLu9inYyEJ-OE-~L-FGBYA`10gQ`ofDXublFNvpe*z*J;T*X|w_yqH;ZxPwNhZJW8O9yLp?EBasR2^P(~H$DCGLV~Tn1tZ%dOhPQHI z!fHlk+0${r=bUix|I7bd_#6qKFi)zMkh>*xFh9fs(jN$B;!8FG@F83$_i-H)u9FaI zi-&8@LtEz~1=~ik64gDqfJjU%cahdgHfhW@yYIpc>c~BW|1Um`ndOw+0?>RlZ zSHA*(!ZHYj`oj!8?YDVfYx9Adm=?F|dE!!=1iJRcT5Z9H-P8SSgu448LIk$`!UbTt z`;DId4%cV)*G4K?DD0bgN_>0??m)VABO@ekRo^w?^<>h&w4YR0g0{9wPeyY**0G{Q zUko>~=UQU0YVI1^rfe3vjc5{4{X}@pN69L)G1n6GR6d2tWn-=hVy-1;$G;*U0yKNY zt^`E3pHX<*O}fGi$L363IThYqf4=WDi1T~gYb`=tan45Y!oAm$1j333FxZx*dC(UG zJ(~?CPcSC!UXk+FX3K)OH7=GXIF)T~S4F@ReN`^0rCDZ97@Ql0`Ub1G0}}Uvy&gF0 z3ox8hM5*7?g(``7Ds9v~IuX4Hp(iie-!)%i&;&_In=I@?CT$`bPy(5kao@8`j4nf^ zzB(hEG;~=_%jl5}1d`lD5D>|39j+MbikYQ{c{Hf|qFfFU?aPhR^f)p?MM#Tdr2)Xs z9B_9KD!e~7L-%g$#**0(`!#%Oe|Co0ui3@j*6=dAxfot*H>45rvxsLUQ^^ptrZOHI zgJPVSKTZ&wM>7l(R@4Oh<-GcJ-;Qa_buiAr?Z(4=Zdq;-?7`D%9Q&Th=8vEg<9C-| zmM3~^4Xm{0eIHiP;yyqXI;!s}MR?OLu~KeriSphp0b(de81Lw5-Z`Qum2PrzblECq z#9e%iyyEmn`davrX|(U@CYH&8jNv(C?7+0x5AE6IHGTDDCg)vFjXU7T*$w!n#Zjfy zbGt|QQ~|Qs?%)&IhoRkzO3-*h1RfJ{XGGhncft~*w$UO%T;=9t8_xW{xu3Cg18_sjag=5^$F&?) zxM&@s>326@P1Pqq2seYcAs3I8__>oTcJh&2QH$E0>DrHE6jj%HB8F>X-o+C#k7* zDqzWX$T*K(J#p)iYfOnqKh0&c)Yx;I$quDQ=DG?NGkaP}K304%#ZBaM0`qopM_*5p z-Mg)=wr$Y8VV&g0=_DpeTF(T&r(bF;&)pBH&Q)TElRlg5UAFBq64668j=2ohBMY4n z1duHT3h^;w|I|V+OO%jWz(x?R^%@HLDP$$-3e3Pov=XFq?`JQbQ5*Xr93pz zsuZtE`9|fm0%qptS!`Fg)#~3Us$~-TAd<{>A6TiuG37bk!1r~-Sy>&-_kN(^Jq1<# zXv6#3h1Nl7KLqw*h8=$%%#SB>4C0JqCL#B80e0R+8w_pS`~IsH!TMv)mCK7hPunq5 z=YHfqx50b76#9aTXUJ)#E=N>RG@K z@~^nWM$ex3$j=yGgq z82>H$y6PWM=&FCk8-DKM+m!tBTzu8zLEP!KxInL~_K+#UFR$>8N`85b?^N>38+>1w zU-t23T7G#e`iz_So%p0*-Xq_UUk>o~VtzTqCoTEq2x)-)axC`v`9YlU^F%!7=c)L@ z&ol8}cm0UKB)^=C5B&TDC6r%2i&whI7t!PASMf&I^u%}l0*RyXaV19l?2D-`7>G|A zA}LP!2~|SZTnnXNhWPj#zaTqJxBVsty6Q%J*Cm-a)@?@k?kB(G;#|)?##ej!1>X?S zZNB5m6TcMr+%mu5gDm<5{ww`56(jvJ!{~Y1_ zws@gmcEmgV@&q4H3~IUyx?_uKpH1U4>7V@*4W$D|Z@*&-{dI znV*R`<$9ospF{D1%aPB<&u^mSfo?>?&rHntIl|Y^>6wc;w;PLdeopXV9(sNk@A-Ej xKGOqV>)>umJm=ymyh`*$N+mv{N^f_#89`5cR-J$USatr-{{!@(Okw$70019#_dWms literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js similarity index 53% rename from apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js rename to apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js index e888155..1a3227d 100644 --- a/apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js +++ b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js @@ -1 +1 @@ -import{J as i,q as d,N as n,O as v,Q as u,R as h,T as g,U as A}from"./C9Z4nxhR.js";const N=Symbol("is custom element"),T=Symbol("is html"),l=h?"link":"LINK";function S(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var a=r.value;t(r,"value",null),r.value=a}if(r.hasAttribute("checked")){var o=r.checked;t(r,"checked",null),r.checked=o}}};r.__on_r=e,d(e),n()}}function t(r,s,e,a){var o=p(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===l)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[v]=e),e==null?r.removeAttribute(s):typeof e!="string"&&L(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function p(r){return r.__attributes??(r.__attributes={[N]:r.nodeName.includes("-"),[T]:r.namespaceURI===u})}var c=new Map;function L(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var a,o=r,f=Element.prototype;f!==o;){a=A(o);for(var _ in a)a[_].set&&e.push(_);o=g(o)}return e}export{S as r,t as s}; +import{J as i,N as d,O as n,Q as v,q as u,R as h,T as g,U as A}from"./BBD-8XME.js";const N=Symbol("is custom element"),T=Symbol("is html"),l=n?"link":"LINK";function S(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var a=r.value;t(r,"value",null),r.value=a}if(r.hasAttribute("checked")){var o=r.checked;t(r,"checked",null),r.checked=o}}};r.__on_r=e,u(e),h()}}function t(r,s,e,a){var o=p(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===l)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[g]=e),e==null?r.removeAttribute(s):typeof e!="string"&&L(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function p(r){return r.__attributes??(r.__attributes={[N]:r.nodeName.includes("-"),[T]:r.namespaceURI===d})}var c=new Map;function L(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var a,o=r,f=Element.prototype;f!==o;){a=A(o);for(var _ in a)a[_].set&&e.push(_);o=v(o)}return e}export{S as r,t as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br new file mode 100644 index 0000000000000000000000000000000000000000..fa8002a320657e5feeee80ca64a7492825a45372 GIT binary patch literal 498 zcmV{KRn@=GW%DpdfLUJ=fgNi(OGuQ&8C6PlEdAf9njD2cnBBk3-MwiJ zEf#CFVqU3y&jVW1_Bl778ZFO2K@iNR=9Epi`*)Ig%PPJA81W^%@-=+&8+`B$O!*Eb zd>?KnS-DVe?Ck8-)}PMz>oWuQtMh7hA-_MWB2-^1Ds6uP;yXIJ+71veBiyYklf%`@N4N1eIf;njJ4%N6p+jDpO7N z_=Na)Q+%q%$VVB$)KiQKl4Y%glC}FAi76$g^?pCT_EiFZU?83%rKFwkzQV?VJ@#!+VjPGx7gp*U8*OwE zsSh?c5tSi-j zWkCP`vf3PESSUgpHIqP1_Jbo3Tjd~Smt5c;d5)qymNjE)k@3vv@@`;g>%t{L1!Afp>%J13w@XN`q0l{+iY5)KL literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..83e86b17958ec3067ed1ce9df8d3d864e79c423a GIT binary patch literal 562 zcmV-20?qv&iwFP!0000216@VpmLukZZ2)S5? zuow3sEZWSPibfwVFTY)U`F(p8{c$u-jCP(ZrM&jKXl@@qgRt|JlsBy5x` zxA5K;4~+*#52|c{@^hV%HtK-bGb?&d=%y^W=ozV6lzOj{7ldIz`tnq zfHZB}#x~mRjNVxZqG7;A&Uo9tcnbnffKY>Wjb`IwI%Q_#w%BP8ejLSd;iQz**@T`> z!>0p3{N)xhI-S}`n-rF+0t8EbIt8(blxI=kDBq=*Mx}+`V+FIDePD30GT4~g$U{XFDDndBDte=-9&l?y0WA%d^6V;M(}ZGn@YB#liys03}xx A+yDRo literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BcuCGYSa.js.gz b/apps/dashboard/build/_app/immutable/chunks/BcuCGYSa.js.gz index 54fb9165a3c29a21f0399890f46d0cbc062b8746..4a66d09f776958f504399f2f7f699430f2aee509 100644 GIT binary patch literal 629 zcmV-*0*d_~iwFP!000021C3PgYuhjo{l34#6=7IRwYz;8IA~$C`Os0;(xjh8SycN{ zUuR36q_hpj|NA7_PD6i;g2Cv{@7}w6C+A8U8%a)5(IA-$vz2+Y-pJgdl97#pDca`Y zBjn;ippDjG^Drn=vJ&PK@^}(){EJ+g8 z(J8Lu15DH(YD=viA_))CTx+G{)%T0jXwqV0tgsu?WqXGuJlbwWryA@=%Lo%+Gp1dy z&+xW}T4@BQq(Wme;NJ%Aio=Y|$S2Qpb$PY`q4V-WXi=LOXkyjEYLvGz%?KIG+jy0Z z1t+a?#2veZP<20*h9OW^Km`_F&oZaXma53e$^2}-oRf~SMyp!A0Z51B9`NFPvGlM4 z-bVGgm!OWB&~WDMIPe zX*dzeocEP2cj5l%;udSDP=e#+Ujyq%J7#8u*c#9MjOSL1rhKP&=Qnqd+r;VhQ}9-< zv9h4!_!q-#M~DZU-zzMlBbwBradBkYC)|7RT+?g%pA`slM*j;9qTV$dPUNLW@YqyJ zLqBdJj8Qp;OJE3d^!)SDP+<7*c?ou-if#5|asJaSz88h-ZQQQiPW;9q117@l%oMZA z2atvNW!gFI_X-Nk?M~!yenloatF;v}AJ&PaPm%XY%KPh{L16ZFsR|3>_H$(4i@l=2 zjoHCnFDK}$-fTi&BX*ZPEcViFw@?lV;D?Ozo6aJP1|+Xnn<{( Pn|}BQ*RNk1`~(01UB5`Y literal 624 zcmV-$0+0P4iwFP!000026OB~gPunmMe&1gatZK3~ld!!^auuox`oM$+qU8yp)g)JP zEU`1&g;tUO_sLFLDt=5n-hKJ*zPs<7LM!VMm6J@iNXF7`RFN!Ks&J@P;wW&1Y<=P?Iv>>$7>+ zK%)(U6 z_6z3uJ;bW}P!^ZKcnLK)cpK$i1Fq7gAg9yw>3m8&#MU9-LzVPauk^VTw{YS?}z8X11o4GlPpGr z@d{+^s$IGd3F8hMs8NBSkbjR|w{5q`q?8*QdcWv%Z)972(7TJf2Pj+$%7rZiE0#xgl#X(L-oZ;+b++#nx3H|&=E=LDjht^cI~+3bdm5qa$qtlL@} z=+{l8wYtFg2rS{qP5$+0C@_5ZvIM`={throw TypeError(t)};var B=(t,e,n)=>e.has(t)||x("Cannot "+n);var a=(t,e,n)=>(B(t,e,"read from private field"),n?n.call(t):e.get(t)),c=(t,e,n)=>e.has(t)?x("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{o as I}from"./DUC-ssvh.js";import{s as u,g as f,h as d}from"./BBD-8XME.js";import{w as G}from"./Br8WXJxx.js";new URL("sveltekit-internal://");function ae(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function oe(t){return t.split("%25").map(decodeURI).join("%25")}function ie(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function le({href:t}){return t.split("#")[0]}function W(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let s=r.length;for(;s;)e=e*33^r[--s]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function X(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&b.delete(U(t)),z(t,e));const b=new Map;function ce(t,e){const n=U(t,e),r=document.querySelector(n);if(r!=null&&r.textContent){r.remove();let{body:s,...l}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&b.set(n,{body:s,init:l,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(s=X(s)),Promise.resolve(new Response(s,l))}return window.fetch(t,e)}function ue(t,e,n){if(b.size>0){const r=U(t,n),s=b.get(r);if(s){if(performance.now()o)}function s(o){n=!1,e.set(o)}function l(o){let i;return e.subscribe(h=>{(i===void 0||n&&h!==i)&&o(i=h)})}return{notify:r,set:s,subscribe:l}}const D={v:()=>{}};function Re(){const{set:t,subscribe:e}=G(!1);let n;async function r(){clearTimeout(n);try{const s=await fetch(`${M}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!s.ok)return!1;const o=(await s.json()).version!==F;return o&&(t(!0),D.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function Q(t,e,n){return t.origin!==Y||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function Se(t){}const H=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...H];const Z=new Set([...H]);[...Z];let E,O,T;const ee=I.toString().includes("$$")||/function \w+\(\) \{\}/.test(I.toString());var _,m,w,p,v,y,A,R,C,S,P,k,V;ee?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},O={current:null},T={current:!1}):(E=new(C=class{constructor(){c(this,_,u({}));c(this,m,u(null));c(this,w,u(null));c(this,p,u({}));c(this,v,u({id:null}));c(this,y,u({}));c(this,A,u(-1));c(this,R,u(new URL("https://example.com")))}get data(){return f(a(this,_))}set data(e){d(a(this,_),e)}get form(){return f(a(this,m))}set form(e){d(a(this,m),e)}get error(){return f(a(this,w))}set error(e){d(a(this,w),e)}get params(){return f(a(this,p))}set params(e){d(a(this,p),e)}get route(){return f(a(this,v))}set route(e){d(a(this,v),e)}get state(){return f(a(this,y))}set state(e){d(a(this,y),e)}get status(){return f(a(this,A))}set status(e){d(a(this,A),e)}get url(){return f(a(this,R))}set url(e){d(a(this,R),e)}},_=new WeakMap,m=new WeakMap,w=new WeakMap,p=new WeakMap,v=new WeakMap,y=new WeakMap,A=new WeakMap,R=new WeakMap,C),O=new(P=class{constructor(){c(this,S,u(null))}get current(){return f(a(this,S))}set current(e){d(a(this,S),e)}},S=new WeakMap,P),T=new(V=class{constructor(){c(this,k,u(!1))}get current(){return f(a(this,k))}set current(e){d(a(this,k),e)}},k=new WeakMap,V),D.v=()=>T.current=!0);function Ue(t){Object.assign(E,t)}export{be as H,_e as N,ge as P,he as S,ye as a,J as b,Re as c,le as d,ie as e,pe as f,ve as g,ae as h,Q as i,N as j,oe as k,fe as l,ue as m,O as n,Y as o,E as p,ce as q,me as r,we as s,de as t,Ae as u,Ue as v,Se as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br b/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br new file mode 100644 index 0000000000000000000000000000000000000000..73f5d6f42e75e3b3cae6fb19ae11178f31743e14 GIT binary patch literal 2625 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 P`^SF(G-7^Gju`*|>9ELQ literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js similarity index 79% rename from apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js rename to apps/dashboard/build/_app/immutable/chunks/BexJutgU.js index 103d488..d76449b 100644 --- a/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js +++ b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js @@ -1 +1 @@ -import{s as c,g as l}from"./DnKV7_Y9.js";import{V as o,W as a,X as b,g as p,h as d,Y as g}from"./C9Z4nxhR.js";let s=!1,i=Symbol();function y(e,n,r){const u=r[n]??(r[n]={store:null,source:b(void 0),unsubscribe:a});if(u.store!==e&&!(i in r))if(u.unsubscribe(),u.store=e??null,e==null)u.source.v=void 0,u.unsubscribe=a;else{var t=!0;u.unsubscribe=c(e,f=>{t?u.source.v=f:d(u.source,f)}),t=!1}return e&&i in r?l(e):p(u.source)}function m(){const e={};function n(){o(()=>{for(var r in e)e[r].unsubscribe();g(e,i,{enumerable:!1,value:!0})})}return[e,n]}function N(e){var n=s;try{return s=!1,[e(),s]}finally{s=n}}export{y as a,N as c,m as s}; +import{s as c,g as l}from"./Br8WXJxx.js";import{V as o,W as a,X as b,g as p,h as d,Y as g}from"./BBD-8XME.js";let s=!1,i=Symbol();function y(e,n,r){const u=r[n]??(r[n]={store:null,source:b(void 0),unsubscribe:a});if(u.store!==e&&!(i in r))if(u.unsubscribe(),u.store=e??null,e==null)u.source.v=void 0,u.unsubscribe=a;else{var t=!0;u.unsubscribe=c(e,f=>{t?u.source.v=f:d(u.source,f)}),t=!1}return e&&i in r?l(e):p(u.source)}function m(){const e={};function n(){o(()=>{for(var r in e)e[r].unsubscribe();g(e,i,{enumerable:!1,value:!0})})}return[e,n]}function N(e){var n=s;try{return s=!1,[e(),s]}finally{s=n}}export{y as a,N as c,m as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br new file mode 100644 index 0000000000000000000000000000000000000000..76f54267f5429dc39d175dcbe1d8a9af5e6e0827 GIT binary patch literal 360 zcmV-u0hj(8dIDf%O=o+TDe03fIkcf4X)Li@zBEbsbn|~rKd=%z0Ey@ybfMRa)`<=G zh6A2OAx$?G=~d|4p{AN;?A$Yn!Bt&a!_pelYzAus@U-fB&qY{oe4kG4vaBYNM2*U* z4u;e)Ym^7JG&gEOO?QUEetvbr#^2kmwd|~t?SK~iZ^WgT)c5llgcKF1$C)a3)}D*D z>OMSxg{)~ZW6eq3fOrJ&gvLkOtFB-?H1ZDjZpK}kS#ED_SXc{X6^O3Gg#jtFV0n0e z2g1BTxOWd?+yfs|D&S!v3`2|M!j5e}asN36p()?%-2+fPjVEy3p(z@q5eG(}NN#WI zoPSt@V7!e@(U6pEfS(g#ZOGG=V>SaozSj~m3a~2#rCoGe-cDv9v>+{?8XAt)659bu zV;bAOL4zfowS`poaP$xIuxuzUlU;GvVbUEn+FatYYxKFMOIF6nNi@Wn8qz;GrVW<_ GOi}^tj;kF2 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..a1c063eb27a0643f8d3a48de44b18ddcd95ef333 GIT binary patch literal 393 zcmV;40e1c$iwFP!00002165MXPQx$|yz><<2V_g8lp9K9A|bdS!37D5sveSbQ;ZzD zTH944%m0p@Kub^K$L#FvL-sp^E?81q((-Kv6+1Nj<^1LW?>?5#hr|5aUY2qqzGsHv z9~o-C%+O3>JN}hn!#^`@k0K9`*LTa8r%^l@pmY@nzkD`iLhd<>Wg0asTu zDv8tt85@88(P;{vm;$P5R0kn4vh+UYneWAvho41?x&&n*>}w=W%ogSOZ<~tg#C>qp zKb@}F(7!A1SY$j!-bMuHQIlkJvRNq#tk@l?EFOE*)4%qB2=UZAo!$+lEM@Er(rgN| z7BE=h`n=+Do4iRLK>HrBZWI)0BKunTbXde>>(|jL&0~Ga{hC~jRPEGSfOKt!?-iUv@EaFj`bOAEH8clxVh_2djbFeX9v9u literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js.br b/apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js.br deleted file mode 100644 index 86cbc00b4ea3f4a73388182d707c57de066aeff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmV;W09yYW{s2H^V4i&?(FfF&gaKN2*B_2@*Z&eHZDBxBUt16b7DAfd@Hw|-q+Ck0 zgrWR^pAgJz=@;e&bH}YN$2{ka5FT>qz=2ryuPrCjPVNjQGGb*`VfCtZ);Qu{F9Xk^ zu8=`hSiluLiP|OaFr!XYmO4qp=3+&)Wx{roT`=O za(50Ew*PymP1_;c!TTPMbIo^4GE}N!6{nioCbgTd*N2zl7^D51@;1LvcGM>iBLKU%1zk+zspm;x&gU@ JGK2pB003=7V9x*m diff --git a/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.br b/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.br deleted file mode 100644 index 7892120..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.br +++ /dev/null @@ -1,7 +0,0 @@ -@v<ᥱ ;fNҌUv@iZvv=IXfI jr@mIbyLFccKؚ~0̉5g(&J edDK)UO.5EeOn2C"DBڒ ']KG8úKU7u? -J+ -7o#Em'Kng ]2z^)U2sjx?GѨO[ ʘ ;+~ W٣?t5|̒ yeK - g6 T|A)UvmxLR. \Qc RtF#Yw)#hdS4Tm'QokM  sź#]mE:0 s, -]d.nq#:*.tBG6L&ʶƽ(dhVɜo®aI٤-5)t&X4$jD@8 -㩬8 뎺sB[]zL3fjmn4F@!OϬj$\TjCT|)ne=CjPy`aj 鶢ܙvkb1'Wʻe2zr - L1Uf \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.gz b/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js.gz deleted file mode 100644 index d737d1c512c9f509b97e174e595d6cc2d8be2160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmV;d0#p4TiwFP!000026SY)bYuhjsec!L}!YEQJl(g9>wNdi2LfKe5NZA;rw2FL_ zYPF>xUB?TK|ND^be03iWgFRjQ`W~Ho&poov7uI2wM$$(aD?^ynGiUQ2@4q)6znnjO zyWrn_FHzQbj8@`oFi2*FQK+qnt_ZD~50x*bUO7F5*f0+mD^@I0i4a3ACL|OYPzY)K z`jo*E4Ep%)o@LVG6-b9ukQkdH%NRIkUGrGeBm<04G4XRN^MeG z^2{n33V4`J2+@0YdOqxpA4?zi`){h3RZrHVkvY`y@Z#*eU;4-RZ>4pppoyLlf}-ha zytF!v1~GC6GF?qjBGA`De1+-6s%Joc^ZD|cqFYrc43yFK11Ts&ZjD`l5rm3Sm5Koa zV#SD5oO8?elp7p~L+b{agZFX{!irH92wFM3_%OM-<_qaO5X)1Ek|sc=VpQoF@f=qR z2*PZ|?@I1@;xFZSZ=Zu<*y=UFJ=?F#R?&$I$EU@MyJYCO{qI#<8wp*21 z5AC3T81l5Hl+8%djn_>4E1(skx79J~P6)1;Nu5F33ktR5#L^0g@4&tTPta*ICzdva zTTjh`r{vL*%0RkXor5iqNSbVH_DSLs&$S_^Fg!jxK2F&X-qIvJIbl+Gzzrm{9Q?@& zx;wlizdM_CHd?QdHv*B6YV5B5_3G?6mn2N@y6N5Sh%k4zwEf%L@x?hywcosytm*l( z#V+f*l|zdwLfNy(h-OBN4Bs|O+3hadQqp9bIB0&O?R*2MmeNIvL1!sKKoBKfq7JW~ zYCV3K1fD}~-ReQv!XO=w2Q_7v|A9s>=MN4LOi;Y#N#IBGXT1!+RLO2b0QMY$X7dno Srb8&}e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const f=[];function z(e,t){return{subscribe:A(e,t).subscribe}}function A(e,t=a){let n=null;const r=new Set;function i(u){if(q(e,u)&&(e=u,n)){const o=!f.length;for(const s of r)s[1](),f.push(s,e);if(o){for(let s=0;s{r.delete(s),r.size===0&&n&&(n(),n=null)}}return{set:i,update:b,subscribe:l}}function B(e,t,n){const r=!Array.isArray(e),i=r?[e]:e;if(!i.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const b=t.length<2;return z(n,(l,u)=>{let o=!1;const s=[];let d=0,p=a;const y=()=>{if(d)return;p();const c=t(r?s[0]:s,l,u);b?l(c):p=typeof c=="function"?c:a},h=i.map((c,g)=>_(c,m=>{s[g]=m,d&=~(1<{d|=1<t=n)(),t}export{B as d,E as g,_ as s,A as w}; +import{W as a,m as w,am as q,ai as x}from"./BBD-8XME.js";function _(e,t,n){if(e==null)return t(void 0),n&&n(void 0),a;const r=w(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const f=[];function z(e,t){return{subscribe:A(e,t).subscribe}}function A(e,t=a){let n=null;const r=new Set;function i(u){if(q(e,u)&&(e=u,n)){const o=!f.length;for(const s of r)s[1](),f.push(s,e);if(o){for(let s=0;s{r.delete(s),r.size===0&&n&&(n(),n=null)}}return{set:i,update:b,subscribe:l}}function B(e,t,n){const r=!Array.isArray(e),i=r?[e]:e;if(!i.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const b=t.length<2;return z(n,(l,u)=>{let o=!1;const s=[];let d=0,p=a;const y=()=>{if(d)return;p();const c=t(r?s[0]:s,l,u);b?l(c):p=typeof c=="function"?c:a},h=i.map((c,g)=>_(c,m=>{s[g]=m,d&=~(1<{d|=1<t=n)(),t}export{B as d,E as g,_ as s,A as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br b/apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br new file mode 100644 index 0000000000000000000000000000000000000000..7ef5f6f64488699f8b435859cfe24ce1a4434dc0 GIT binary patch literal 606 zcmV-k0-^mIW&}Xw(rNYARQkm1&aGqhgtc?|RY+VCATSORhlI2KY)*T5AuF6>8UQ;& z*SX5c30YwWKpN%^ewT-IG7Vwp?YEFtNILZ46UiFhQEi?*#j79tgT-Ri`}*hGy1%s_ zW4ec4L6IYkx4HzyJpL#Mx#?iG-8@9nL7=VIWt9__{;b-XNcNpIx6@QTM+z+KL;X)Z4lRt?E2$CPrZp##PShW-oA~%c0AhgR@qQjF z{)RerRqWErI3YzT_x2)gi|4_(jb`ld^(AARI>TZuiLbG<^vT0|A$eMR7fTWE`UDKLdBikH9uLA(i=kxVyDGU=NUFg4IruJ s^nUz_tU*l`szZaE;*V&aIMxVA&a3l01TCrLFM>1Y+Me#!tQroTW{Y@6LEy#-3xT~NB|e)2TrZ{7NSDjAL# z$F3HRs9}nUr4lFdOSl`pgmxJB#TT_0MSku!@a`@Zn%z}#E!58K(@Gn-WG&GZF=)4o z43JiF)7m{)Dlqj(8oO{aG`DP?+T{db@7V)ZTbpg?8Tfd=$S@sG*}VTSLq5=g76jrg zTSH5AnCwb}ZT)w4lbDw!SfnPl^3D6l7JeSZ97vku`#VP(@MsXfGjSd`h7Dr*u zu-3X3+{^CvMxRJ%5;;^%fj0mJ-FfI|9}m8R-R?4Wpk>7V z!D6}GA=OcI2JA1EmG3NM``e@P+~@QhR`7}s*uBCYspm(-V155#dp2JGVPrSfhxe}7 pqhktvf$P1*;SaJ7;+Aw1!j3+NVCmEFKk3si{{ho>xPNB^000=)N4)?5 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js b/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js similarity index 84% rename from apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js rename to apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js index 52b89bd..e56bc99 100644 --- a/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js +++ b/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js @@ -1 +1 @@ -import{H as m,I as _,m as b,l as i,J as y,K as v,M as h}from"./C9Z4nxhR.js";function E(e,l,u=l){var f=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=t(e)?o(a):a,u(a),v!==null&&f.add(v),await _(),a!==(a=l())){var d=e.selectionStart,s=e.selectionEnd,n=e.value.length;if(e.value=a??"",s!==null){var c=e.value.length;d===s&&s===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(s,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(t(e)?o(e.value):e.value),v!==null&&f.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=h??v;if(f.has(a))return}t(e)&&r===o(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function t(e){var l=e.type;return l==="number"||l==="range"}function o(e){return e===""?null:+e}export{E as b}; +import{H as m,I as _,m as b,l as i,J as y,K as v,M as h}from"./BBD-8XME.js";function E(e,l,u=l){var f=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=t(e)?o(a):a,u(a),v!==null&&f.add(v),await _(),a!==(a=l())){var d=e.selectionStart,s=e.selectionEnd,n=e.value.length;if(e.value=a??"",s!==null){var c=e.value.length;d===s&&s===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(s,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(t(e)?o(e.value):e.value),v!==null&&f.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=h??v;if(f.has(a))return}t(e)&&r===o(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function t(e){var l=e.type;return l==="number"||l==="range"}function o(e){return e===""?null:+e}export{E as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br b/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br new file mode 100644 index 0000000000000000000000000000000000000000..dfe66fb6bad6f835035d67fa0e01e07542e1ffe7 GIT binary patch literal 413 zcmV;O0b>3eGXo%u(NbOOFduUHMa(SA|Z)jOn08!ekIWyjvik+T6PLwPZ)Cn69dfo z4fei6%1>jj@9rM1y8oY#c2Syvt;t999JrQ1ZznJMc5~+OFJBD`^lZRchSPGi zZKT?zvUT3#qJAF7@)qvXv!zEvH@N9Ff*Y z+%}4pOhh7y_B19q*=)1z0X;mPnfLt0?)v>;{p)Q8F6+fzf+x`@*a@AW6ZZ)Y;vvB(wh7v~ zu|rSf=bM|apT7Lqmhz_~c@s?KyTN27L!m`bn!k=4A{a`mYg4dGR#l1jtg7Ohf3xb#tS$If_MKr)RGiQA%mq78`rfgqZdEi*JEr-` zpf$)TWr3|mo?<7L|7R!{9bD(XMY!=`!gna^+cE;V2HwK{gp zkF0SWTbt1D(2{9dRu;@Nl5_2lYS;8d2`Q2jn~yl-@8yk@%d4344}Sm>BQBdX0{{TH CG~Ues literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/Bzak7iHL.js.gz b/apps/dashboard/build/_app/immutable/chunks/Bzak7iHL.js.gz index f429ed1039a6cb41bb4c0947aa34a32b7011d313..df094a80bb79ac49f3caa2241b9e86645b6f8ec6 100644 GIT binary patch delta 51 zcmYdF;F9m=U;qIo=80S;N)19Qt5UaBu6)XMaHXol#3NHgcvXW{eY5o#q&{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function k(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=y??v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),q(e)}function i(e){return"__value"in e?e.__value:e.value}export{k as b}; +import{H as s,k as o,V as c,Z as b,_ as m,$ as h,K as v,M as y}from"./BBD-8XME.js";function d(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function q(e){var r=new MutationObserver(()=>{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function k(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=y??v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),q(e)}function i(e){return"__value"in e?e.__value:e.value}export{k as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br b/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br new file mode 100644 index 0000000000000000000000000000000000000000..17877abbf9a5e57a55a612c2ba38f6dbd29db41f GIT binary patch literal 511 zcmV^Chmt7XyqvONDMR7beta;K-6+DSo+Zvust~W8*iY++_f#Gjk%{+UDXMPo}aRY#SvUf;Tt0YP2UcjzVX;uMEdmJ&(dX0DD z23en{Dbq#(yji)0oHCssv8G%1FCZ0idPbE)3qA}`HT7{sG@~q;G0)7kU$i6VfUX5i z0woV0XreltV}`R4_wY#jtuTWu~&SgcSy)IRM(y z@oWHfE->>TdlbJar!2qTLThg B@4x^6 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz b/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..e8fab48753e9c2caee31ed7e859b0b5f1834655d GIT binary patch literal 585 zcmV-P0=E4hiwFP!0000217%a+Z__Xke&?@9EEL(2XVy2=$W%-WfuQ1H(m+&Ge!usgjHSsckHC?#(28i`MbOCySvD4XRJSb%7n`t-6mt`Z8A0enM_63$#nE}G8_6O znVv3_*$=HX9b#{;u0CA6{jt1eza1*upldIU&KeBV(w65la*!GDh+WTXOWX4wJGq7WcwtA~S6U%J*3PR zS%*}~^8`!HHrUhH?eMHvetAkCaNa&X+MM&=$R@iaMG@(rfS+{(5By?AhO^Xr3{wNk zHT=nz!HX3CRynXeSd0mOcS!R9wqEx_1t3Et%gh9b4~KdqRr6IkKhH0z3zfG3=~H-b zWfeTQf4q-Ud9d>p8mpnZfzWztV_73zZM2SLacuL%a(i5eow$mT>vs^_8}QU8{VpO< zy%G8sAR1z^gi|~$(CVcA4$aZL-ax&D2GMbG&o-<1>W+0{$7-Qee7Fx__cvpzvF~F@ z5h_Uu%E4HB&0k<5V6k`^L(>xH+IYN*>O`d?5rRmm`MM}1UPqN!6WZs~RTYI`qG@m+ z^;0v=CAACO;&J`JId4oII?$epIG!G^6(o-wHSZUTJ|P9$2p3r$4|9m2w8%g`p}r^r zKOf1MsQ(l6G_6SY%nyfniji@P10lotEO&LE?68f;{yNy>Es&y literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.br b/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.br deleted file mode 100644 index a1d46d57f2f0f8cb4e57e1a825f344113135d837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306 zcmV-20nPp!wE+mM3T$Ih=%1BtE@oPkE)O3W8$`BM=j*$BRWg%f!4$#^gvZ$14t?{P zOx?$_x3d+(#@wXVm|N2P-1+~Udwsir6CD6WSz#o09G?y~X`lUDI|q{}lgo+xAiQBE z1F4hC??jBRqD@5`A8BkDc0w6i!PHI;7A4@O3_R3?mzMBZyT6Q|3Y7}-Yt>|~irXQn zKS=ICmrC2J-0v3L=uShHCjRJjPC$QuIPhVm4!Y z6Wl78*KoqgoS74ijZlQil+p}cc^3Qm7`7&Yl+0I+R2JL>4Et<>ttqL=3)+D+fwcaj z5FzNsVaV~1X=?)@M+={iS(@QHz=f`CKprFpt>Ma_Ao=^PL7KFYJw%}=8o{?EKKQr) E1IECZ6#xJL diff --git a/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.gz b/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js.gz deleted file mode 100644 index 80b662321bccadbdb943ea82a9038656a775e4a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmV-F0l@wriwFP!000026IGBwOT$1Ah421~q=zyKLrk;^HjJf84+>stFM27HuxVD( zP1xPkLYn_B(}LpZ8{WJ(GmP1HtqVgDv5z+RDrk{YVSy__jhqQPo(b2; zcfuX=y|5W8*X}3D_4C8$%pU7?^5rMFx$Joo$KluUF)Q7h+ngO$Z_8j>8@)ro9=8-{ zYG|j^0#trr7g@6UJ32s6SkiV;&(pt%0Y;|=Q$eeSvb8=$nmP!Vq|Z$SnuwMQPw8B$ z)xuMp%{_JOyne9(bmIHM2WRXKGNq7XBCiI?SF{F|@1Rm>6SigDI;yaNI1@oz-#dLi zK(tilPKVyvas1aCHvozr&jXp_EbjpvdP+rPic>V;#ix)@Cj)VYwr?6WVyQ-bJb&+9 RzGue#>IatI;wH8M006StmX!bi diff --git a/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js similarity index 98% rename from apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js rename to apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js index 4447ab5..512c677 100644 --- a/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js +++ b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js @@ -1 +1 @@ -import{aa as F,b as fe,an as ne,J as D,a5 as q,ao as ie,a0 as le,g as Q,a1 as ue,a3 as se,a4 as W,a6 as L,ac as z,ap as oe,aq as te,ar as $,K as ve,as as C,ab as y,at as de,ae as ce,C as pe,Z as _e,au as X,av as he,aw as ge,X as Ee,ax as j,ay as me,a7 as re,a9 as ae,az as B,q as Ce,aA as Te,aB as Ae,aC as we,a8 as Se,aD as Ie}from"./C9Z4nxhR.js";function De(e,r){return r}function Ne(e,r,l){for(var t=[],g=r.length,s,u=r.length,c=0;c{if(s){if(s.pending.delete(E),s.done.add(E),s.pending.size===0){var o=e.outrogroups;V(X(s.done)),o.delete(s),o.size===0&&(e.outrogroups=null)}}else u-=1},!1)}if(u===0){var i=t.length===0&&l!==null;if(i){var v=l,a=v.parentNode;we(a),a.append(v),e.items.clear()}V(r,!i)}else s={pending:new Set(r),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(s)}function V(e,r=!0){for(var l=0;l{var f=l();return _e(f)?f:f==null?[]:X(f)}),o,d=!0;function A(){n.fallback=a,xe(n,o,u,r,t),a!==null&&(o.length===0?(a.f&C)===0?re(a):(a.f^=C,M(a,null,u)):ae(a,()=>{a=null}))}var I=fe(()=>{o=Q(E);var f=o.length;let N=!1;if(D){var x=ue(u)===se;x!==(f===0)&&(u=W(),q(u),L(!1),N=!0)}for(var _=new Set,w=ve,b=ce(),p=0;ps(u)):(a=y(()=>s(ee??(ee=F()))),a.f|=C)),f>_.size&&de(),D&&f>0&&q(W()),!d)if(b){for(const[k,O]of c)_.has(k)||w.skip_effect(O.e);w.oncommit(A),w.ondiscard(()=>{})}else A();N&&L(!0),Q(E)}),n={effect:I,items:c,outrogroups:null,fallback:a};d=!1,D&&(u=z)}function H(e){for(;e!==null&&(e.f&Te)===0;)e=e.next;return e}function xe(e,r,l,t,g){var h,k,O,Y,J,K,U,Z,G;var s=(t&Ae)!==0,u=r.length,c=e.items,i=H(e.effect.first),v,a=null,E,o=[],d=[],A,I,n,f;if(s)for(f=0;f0){var R=(t&ne)!==0&&u===0?l:null;if(s){for(f=0;f{var m,P;if(E!==void 0)for(n of E)(P=(m=n.nodes)==null?void 0:m.a)==null||P.apply()})}function be(e,r,l,t,g,s,u,c){var i=(u&he)!==0?(u&ge)===0?Ee(l,!1,!1):j(l):null,v=(u&me)!==0?j(g):null;return{v:i,i:v,e:y(()=>(s(r,i??l,v??g,c),()=>{e.delete(t)}))}}function M(e,r,l){if(e.nodes)for(var t=e.nodes.start,g=e.nodes.end,s=r&&(r.f&C)===0?r.nodes.start:l;t!==null;){var u=Ie(t);if(s.before(t),t===g)return;t=u}}function T(e,r,l){r===null?e.effect.first=l:r.next=l,l===null?e.effect.last=r:l.prev=r}function Me(e,r,l){var t=e==null?"":""+e;return t===""?null:t}function ke(e,r){return e==null?null:String(e)}export{ke as a,He as e,De as i,Me as t}; +import{aa as F,b as fe,an as ne,J as D,a5 as q,ao as ie,a0 as le,g as Q,a1 as ue,a3 as se,a4 as W,a6 as L,ac as z,ap as oe,aq as te,ar as $,K as ve,as as C,ab as y,at as de,ae as ce,C as pe,Z as _e,au as X,av as he,aw as ge,X as Ee,ax as j,ay as me,a7 as re,a9 as ae,az as B,q as Ce,aA as Te,aB as Ae,aC as we,a8 as Se,aD as Ie}from"./BBD-8XME.js";function De(e,r){return r}function Ne(e,r,l){for(var t=[],g=r.length,s,u=r.length,c=0;c{if(s){if(s.pending.delete(E),s.done.add(E),s.pending.size===0){var o=e.outrogroups;V(X(s.done)),o.delete(s),o.size===0&&(e.outrogroups=null)}}else u-=1},!1)}if(u===0){var i=t.length===0&&l!==null;if(i){var v=l,a=v.parentNode;we(a),a.append(v),e.items.clear()}V(r,!i)}else s={pending:new Set(r),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(s)}function V(e,r=!0){for(var l=0;l{var f=l();return _e(f)?f:f==null?[]:X(f)}),o,d=!0;function A(){n.fallback=a,xe(n,o,u,r,t),a!==null&&(o.length===0?(a.f&C)===0?re(a):(a.f^=C,M(a,null,u)):ae(a,()=>{a=null}))}var I=fe(()=>{o=Q(E);var f=o.length;let N=!1;if(D){var x=ue(u)===se;x!==(f===0)&&(u=W(),q(u),L(!1),N=!0)}for(var _=new Set,w=ve,b=ce(),p=0;ps(u)):(a=y(()=>s(ee??(ee=F()))),a.f|=C)),f>_.size&&de(),D&&f>0&&q(W()),!d)if(b){for(const[k,O]of c)_.has(k)||w.skip_effect(O.e);w.oncommit(A),w.ondiscard(()=>{})}else A();N&&L(!0),Q(E)}),n={effect:I,items:c,outrogroups:null,fallback:a};d=!1,D&&(u=z)}function H(e){for(;e!==null&&(e.f&Te)===0;)e=e.next;return e}function xe(e,r,l,t,g){var h,k,O,Y,J,K,U,Z,G;var s=(t&Ae)!==0,u=r.length,c=e.items,i=H(e.effect.first),v,a=null,E,o=[],d=[],A,I,n,f;if(s)for(f=0;f0){var R=(t&ne)!==0&&u===0?l:null;if(s){for(f=0;f{var m,P;if(E!==void 0)for(n of E)(P=(m=n.nodes)==null?void 0:m.a)==null||P.apply()})}function be(e,r,l,t,g,s,u,c){var i=(u&he)!==0?(u&ge)===0?Ee(l,!1,!1):j(l):null,v=(u&me)!==0?j(g):null;return{v:i,i:v,e:y(()=>(s(r,i??l,v??g,c),()=>{e.delete(t)}))}}function M(e,r,l){if(e.nodes)for(var t=e.nodes.start,g=e.nodes.end,s=r&&(r.f&C)===0?r.nodes.start:l;t!==null;){var u=Ie(t);if(s.before(t),t===g)return;t=u}}function T(e,r,l){r===null?e.effect.first=l:r.next=l,l===null?e.effect.last=r:l.prev=r}function Me(e,r,l){var t=e==null?"":""+e;return t===""?null:t}function ke(e,r){return e==null?null:String(e)}export{ke as a,He as e,De as i,Me as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br new file mode 100644 index 0000000000000000000000000000000000000000..ee6947961380d926e3f4e74e53e79da3ca9103a0 GIT binary patch literal 1850 zcmV-A2gUds&=3HO!g23|OKY2W#2z8ZtY7&~s}@x3>>HkLgq?4BI?17Q6%q<*mC{E} zaQAEG-*dV7EBxx7Q<`om%{K}tSsbx|rd>@_dbf5*cG3k{2y>&rzS1P?OPAcM+?tfy z&_8n);juXQo-R>Q#m)DuO+&##Q z6Jr&b=@3hr8A~I%5zXTLmy-!ys$7hG74v8}Al)aS+FZ(0FL6#6jUV=pt1;t)WdY`B zfs>OtaxKbieYe^OhuxWY$(|OEcW9f7wQs%k1i-9IRK~JfsTpZ!#3LSh&z_es>zZ~t zE%b|1H)HinRl2cmd^J{E9acxK_F*eUkPW6iQKth4IcSAjke8UDzy6Nhw14x0j)VaH zrQS6yTQUEP7P;^OR7lKwPpACvZA~AxZVE8oTO~Yb)`ucF?slz`8*0Y4Uko*w(9h|7 zu69|Vuk{vBY}9mDQ?X)9!!g}wjX0yhuRJ=urxYpdHZi`{hJmik!^mq7F4HYgZE#m= zJ4OFsrqapVhCu@KrPJ|3JDLP$2D5n700Ohm=VSWe4OwO*i+NjIbJ95R}*j@5ES=Ib6Pp`mxo@0;4#UN%hw&r6K*oQXUpU#lI~_&X|CbyN ze!=RaE}G(r3ObkFe$9^&e+1`vCl^EdW$@_zjQ;YEPGf8~bjJk|v#Nur_ul;4BXJbh zh~aKm6bfWlsL+GSY0>j#IQUVQ$^O>!NM+lhf1gCaS#LF^y3UJMc1htjLWH%coJmZ>RmEcs%0Xt@ zjk?tZJ~{G}rx5U>ew!T&+M%1hDq~&g3{t(7nvr>)u#~uI@OhsZInqv2!bck1_nDDB zT}!rJy>w0>?plyzBAXcpbrA?1PLaW+%OXlvx2uWXF>l(1IZWwSwCl>G?c{TJ#oV4= z{5?r??f{5m>B61bKGv6SW}`ZVSSUz4Gh-8iug_s~cbCC6s8O7Tf>$eBqQkFf>#t9D z0fd8WaI;TFfTL zqZ`?$gN^}7UB!BCi{nU;o$nLA?^YP!M%RX%Nc53I=R#5sojOxcx2+KyXk!v&FXp5q zpiwJnA;BeyVU%dJJ6T({r|oMI_XmgK>sTJcbt9=R>(f%wS2Kw{w{PL2DG;kYQVmK} zb;n(W5Xlf{v@N4ZrEFqQ{)|Py)X3Eap{SA$P~mJV$)Z@+MY3ho{GteOH74ifsV_FA zGIP?ez4gsZrIfv{Wicv4q*=ST*H3OM zXLO)k*UME6y?n>#((lSA$M_WFw z3>qDdN=Cl=l6Vt5Dm`BUhBS&abW2m7VZ1hzQrsv1<3J os)y%XUO?tIwkm&>@GM8qzptxkzN8QAKEKZCjY^L4^$A{&D?hWGcK`qY literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..fe9fcb797b2bf42e8e61d34d72d7ff40c101b873 GIT binary patch literal 2010 zcmV<02POC)iwFP!000021C3a1bK5o&{(iqg_H;PFWW%$k?Ol&FqVbEGIH{e~b`mEZ zodzO7i7`dee3NXM|NV9WlA;`^y)W7YxB&L$*~LQPB2BVlE#*MwgWq9FBv2q@Vqyhv ziJpM`mFOMFglLEYd&EQvW<>u4xlgpj4?h!=Bl8O}pF#eM=pP_Gq7NWbq6rGz5mO+O z5%UwgBU0fwC*~NW*5)2$LDa_&iWpD9G0{}PSE3XAP!e+uvLZUii6t>J1=mDJII$w; z8_0X23!L~jF&Q%dAx0weK+F+nwT^LoNX!*7N5mW=qt9I;^BXaj$ea*!s_Gz17Q6O8 zkB&}W{&syfvcKiKZcxTv5hn5AL@@;!UuUW)vv`oz-IsIy1tPuag_0=1 zA-DY`R<`tgGioLB@IeV7_V}7KNQAPJvdEHImXvAkeqz_mtmGV$cDtPTcA;gltu-Pp zqlnkFigGn5UyA)2cJ_IVYL%OFLQyn!nJuCnq1U-678;RCL?A_Fr!rG9x4lTojPd#t%U~zu=I~ss8!MeyEiq&T%Q%oR?YM?*-G{@cwir3i zwc~QWiQXp)p4i#jL@&YsMF*;}%Z)Hjml)!kXpHf%NkXX&F5WcJhXQ8MI8EDK3Wc$z zgU@6Np#kt(LK zLX&}r@N)yqiDCgC22NlCF}xW&*EmySsKG}&H<}+ZzK-ocM$uGyw?e{7u^6RFG^fDu zG@(RXB)u39nY07zm}@?xKsq$@UvUg)OoCRgL_-kH(!km1Tyx{QQxP<(C*n_puxl(x zI(K76oQs`(a?*)$(n^$ym2_gR+!d+HpBi&oN`ld%prI+(G|k7d~zK+D|m%F-m%Z5(vHvZl&Q%bFNyQw z<`&+MlVITSi9MG&yXB9MOS^C7d$iJB+DYssi$z$lLk=|Z!`zdZZ=g{(nU4^4&n*l6 zzQ=*kf-sK7+U(?xJF<2W_4}ka#j%(8ZhOLbKaDRDhd6;o-?;)GxPX(YcG_{%Z%dAMhK75lQJ4(E_|m5-CKXD%vND; zJkLA)3>E`K&z1~dJiP{E4hwS)b`#{5#!T`x!7?^gDMqtHeukw@yENi1K}*N%T*#r+ zA$CHSAAEkY4AM z&=~Pvun84LGwz~aiZCu!-I{o$O~fNI?TVaY`bDt!KZxo3UQEAW$qB;Ma}n)aiFqCG zkk2TT6>?@D%c^unqX2zq3-*EEFm0{&Z}!G8aiv&kqjefAv0CEn6iK`8<^EWMXM*6F z9CYP>LKr$@$<1U8D+<;|#@~{uT7`WSggbggHiD|?mIi& zy=}d_z?!io@^}3wnYq($vq7UlTdMuoN2#tPG3j3MCRxnpY3mG)sLuK5^{^*J)2i!< zx>ZkHZyJEK#UmuSVWF{E#(3}kiMg5{5s<7gJ6pv6q`lw zm=Dy;M)!D7@7kSi^~>07dhJVsmDb!iZiwv6+`_|=Vi7((=Cp;Li!Onbv}d`^VJA+8$^XLzD%OuOp?GXlHQjgDvSgHGp(F>~{_Yi8`c zkQo}$jWIXy0gzE$?sdq0VJC8n4tLEX;gpWo*s!Mx51}CxxOT>kHEtowo^DsIZrSrC zNJLI%ZX~?xz7x^+Sms3LTIxMw&$>r!V`Q^(ch}k7eWBVGh!or1HJxs;S$(_xIBpkf svCAUEl7Y=utycPfid+2;fP^=iDmc+JgfmTx+Wp7>0Fxgy#L*A{0I(F(&;S4c literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js.br b/apps/dashboard/build/_app/immutable/chunks/C9Z4nxhR.js.br deleted file mode 100644 index c6e63467f67b30cec5fd41e50e0982ce440e29ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8700 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 bmE6D+Dp|q@`u@4;|DXQ{4@=t^`CkA416}YB diff --git a/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js similarity index 76% rename from apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js rename to apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js index 532ec36..0a9ca52 100644 --- a/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js +++ b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js @@ -1 +1 @@ -import{t as l}from"./kH-DTQyy.js";import{J as e}from"./C9Z4nxhR.js";function u(s,c,r,f,p,i){var a=s.__className;if(e||a!==r||a===void 0){var t=l(r);(!e||t!==s.getAttribute("class"))&&(t==null?s.removeAttribute("class"):s.className=t),s.__className=r}return i}export{u as s}; +import{t as l}from"./C5a--lgk.js";import{J as e}from"./BBD-8XME.js";function u(s,c,r,f,p,i){var a=s.__className;if(e||a!==r||a===void 0){var t=l(r);(!e||t!==s.getAttribute("class"))&&(t==null?s.removeAttribute("class"):s.className=t),s.__className=r}return i}export{u as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br new file mode 100644 index 0000000000000000000000000000000000000000..c2bbca92d83d6bdb2c8815999c55f081195a30e1 GIT binary patch literal 172 zcmV;d08{@P5&>YugthfANgeS+rPJKD2VZykAC7XjuPrFOw6!3C)-_5n!nQO$S%}Z) zm{Corp!>2oBk}mR{K|gNNY6a)xH#Xo6z;=S$VUlah&m0x}U literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..a07511334865cc245134152580184303d66f0cba GIT binary patch literal 216 zcmV;}04M(+iwFP!0000217*)KYr`-Q1>n8ELh%qJkku}QQgei)?Gk9`Zb5au;E!0XUdyM? z_qRzjxvM3lPG!xuwqzT7w85NvPs#(k&8Ci?`NOwZg+}A$;%5Lf1_1OaY}LaJ3q(z( z(zB7sNZ9RAmLe3svY;-en!=d*Tnj*#V_dK!Y*UZ_)ib-_vmnO)`2%PmluVrp1D>XV S`8tq?>h2r#x*B^E0RR9P5NgB# literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js similarity index 89% rename from apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js rename to apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js index a27f404..7d2ed73 100644 --- a/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js +++ b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js @@ -1 +1 @@ -import{aE as h,aa as d,ao as l,aF as p,w as _,aG as E,aH as g,J as u,ac as s,aI as y,a0 as M,aJ as N,a5 as x,aK as A}from"./C9Z4nxhR.js";var f;const i=((f=globalThis==null?void 0:globalThis.window)==null?void 0:f.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function b(t){return(i==null?void 0:i.createHTML(t))??t}function w(t){var r=h("template");return r.innerHTML=b(t.replaceAll("","")),r.content}function a(t,r){var e=_;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function H(t,r){var e=(r&E)!==0,c=(r&g)!==0,n,m=!t.startsWith("");return()=>{if(u)return a(s,null),s;n===void 0&&(n=w(m?t:""+t),e||(n=l(n)));var o=c||p?document.importNode(n,!0):n.cloneNode(!0);if(e){var v=l(o),T=o.lastChild;a(v,T)}else a(o,o);return o}}function O(t=""){if(!u){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==N?(e.before(e=d()),x(e)):A(e),a(e,e),e}function P(){if(u)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function R(t,r){if(u){var e=_;((e.f&y)===0||e.nodes.end===null)&&(e.nodes.end=s),M();return}t!==null&&t.before(r)}export{R as a,a as b,P as c,H as f,O as t}; +import{aE as h,aa as d,ao as l,aF as p,w as _,aG as E,aH as g,J as u,ac as s,aI as y,a0 as M,aJ as N,a5 as x,aK as A}from"./BBD-8XME.js";var f;const i=((f=globalThis==null?void 0:globalThis.window)==null?void 0:f.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function b(t){return(i==null?void 0:i.createHTML(t))??t}function w(t){var r=h("template");return r.innerHTML=b(t.replaceAll("","")),r.content}function a(t,r){var e=_;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function H(t,r){var e=(r&E)!==0,c=(r&g)!==0,n,m=!t.startsWith("");return()=>{if(u)return a(s,null),s;n===void 0&&(n=w(m?t:""+t),e||(n=l(n)));var o=c||p?document.importNode(n,!0):n.cloneNode(!0);if(e){var v=l(o),T=o.lastChild;a(v,T)}else a(o,o);return o}}function O(t=""){if(!u){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==N?(e.before(e=d()),x(e)):A(e),a(e,e),e}function P(){if(u)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function R(t,r){if(u){var e=_;((e.f&y)===0||e.nodes.end===null)&&(e.nodes.end=s),M();return}t!==null&&t.before(r)}export{R as a,a as b,P as c,H as f,O as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br new file mode 100644 index 0000000..b6e08e0 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br @@ -0,0 +1,2 @@ +@dS,A\`ԗ)o9ZI9l<¶ +^UIB'1$L/eȘ`W?F .cx X a0Mx;x=4AQ鍳URG c6CJ,ұX,JM1XLtH͂A4c@q*LdOhO(&,iA5Ѓe[Z@D<> ]PѕH d1,gNCP#E!DH^3o0.RVsȒr$.J % )k͘Af )!A7{5T2gWtb'bmBVHpRnsLjMkbqHhj2EIfIz[,,x{T \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..98846dfbd1ae3d863085d5955458e84d72a554e6 GIT binary patch literal 675 zcmV;U0$lwciwFP!0000219eneZ`v>zec!KuJRn>B@OYUtC38_PY~6*ns*tv~$|MeC za%^NfPz3q!`|NOOH;sp!#QrYlJ3hFoSH}9CnDm6}EkTHY1qc&Rf%qJ71)BiRAie~g zfVc~|fNudB5P3ic;%mSyh*7{Ph`4_b;zPg}5Z?n{wWT$6!rotB-wr?inoihnmt<>U zdu5gz?R>A|gp_=t%v`A1vT~g3Myc`IR7G!;p4Zu?(uLX3xBDgYwsBq-v+YVcIvD(u z@FsxeRthg4jjHl3N!(g0FNcSS;nLSCfn67KH=F)QJ-_rV&B{jSzB0NuC!X%C^o`Y| zdds9@=RAy}IxUh3xSf6^3x=1aEH0*!cZPjs z$9|1<422mtObO?2mX#_pLDn#%tyE4TEd%Cs4yHY8@IX9I5*mi+H^RLnLve>X}%r&<;3BWE0_)wVpaFL_#Nn5uB(TZ1K;?NBjN3 zT@0%nEJx3ti>r>p^whHT{i8AcQ5TEH@e*&Rr*Lfuhhh0{Aw2_XiSg JZFI^60023`P)q;- literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.br b/apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.br deleted file mode 100644 index 9432dd8..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.br +++ /dev/null @@ -1 +0,0 @@ -7 ,o*̢踯hS+|hvyOߙ8;$z3 q lq*;m(V{K5TLyQ=NWe\)h Ndb (`/֬PM ɤXv$xNkdGsKo$Drqw`; \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.gz b/apps/dashboard/build/_app/immutable/chunks/CR6HhlME.js.gz deleted file mode 100644 index 7d20542cb445c2b0028605754c122ab574e692a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmV<90381xiwFP!000026J1cdZo@DP-1`-327v?!wL_QIV2dDsP-kk8!A&Dr@hhR^ zAb_KPFC-TpI`Mc9f;iWm2MJT7Dz5^yX_VBZQPYLW1h&!2(5=kV=Jo5Pztx}SCKXPgBzFWSZ zaa4h@+dogm^YlvAaHJh6chLOboZ27OV`r1TJzuB)T`mPCHBc?90ifF)pl;=W9@6zj z7-~8Jy&HHl8ys~nvG$2<5kK^5#vW3h9kxsG6q&1VaYH}<=fhwG657K!&?cCxdtm5* zp0}fOuAhshhBnU*q$3KpC$1WG7H7|V!H&Fl7{EQRyYc9yG}EMI3N->&G}>jq7GKvX&S0qV&I2y5ka z=VqO~*V|($@pneCf+i(3nq$5f{!FRZ$n6M_SkYu!;&VW1^xP7RJ+ONekC*V@Pe;>i zItbHDJh8vrXb4Uah*(Wq&G4T#_3JnuY zC-90%2Qg4~?!bM;ouA{$9}{x*-6HHtrN-MP~k>{mNMMs#BU_#T+FY)8|#lom+ybDl~>Usdmfd$ z2k7W5I1E-=5GbmBh>2)P)QCCBL0EE>-_sIvMu#AJCy~w=4oe35kAVrHmk#PBNO%F7 zBWE{M@3Neq7sAmaVh>mj4bCTUMywMR*`a99V8p|U@uYz71p(^D5s}oVj5?>xjHB1X z$4Mq8g!&B

xB==3WD^Z4|R=SM&O`DN;H9ob&(;>`@)KrfAUY0@D{WZy*k0IBo`< z!W^G#NIhbsxs+wt5oRilW54I;J}+BManpPU0X4cGEE&dp?e| Mo|Hd*=29__C*|j@XaE2J diff --git a/apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js.gz b/apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js.gz deleted file mode 100644 index 58fd1c4004cdb98c0d97ceb28b5ed41a88974999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 998 zcmVA#Pdj6Q$@8^YwjtMipo3&baR&oUY3l*jFKnvj00f# zHr0I0#PdAz1x1cmGz6@uT9S<_V=3|l*OAeJVweTGoab7E#{MC`dL%!mgy;Dor3)!T zdk@E)s7?wG1XAS9o4VCp9qUGS7REuUs@hn;yN|ewUXcG5>^1V=gIyv280;N#9_$tJ zWw4*{E|`1dBG^add9csODcJ9AU@uO7zW(^{ull9%m$sH1kn9-*@y@A2~hQrK0tv{$rM~O1$g|`K$25Qp2A-$9d*G( zzq1&2is_V%;etvIMM6@N@I$oXBpQlDTK-g#_DRW|zb;gnCzdL+CI%SRCkF4AL+ap&D(r0FH3AjvnU6an)6@$}mf>;uFhc;&hdzNR*7TTbBv!?*=}AX56p9ly z3II29r(nNlEB1r&Q~)icCo`B4KJ=&0K}*^-mcofYsGzbJ6xnyyogg=zPDWx5hj4_7 z;an=o#9_Pqe-Y7SR}50wYiM38NP~i(SQsW3#>C_FA4FQo?@qNwWZOevyQg3JFla zZlpNJ>U`kyaH{4iX|!9ZdT}U+RWMV@Igq{=qXkn^K`M&T400uNy zPH>y|@EVRx+=nacMB>MR(ghseoZvv)+ALhb;Z1wsHR?03IP;n_uRik@XWshMOX;P1 U$v$^4RGa?vA5;Q~cf|+*0F31AlmGw# diff --git a/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.gz b/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.gz index 6bc8ce33deeb8c882e1ca1c225306e33fcd63bbb..0a36621b758f559f3788a941a3f28c5a9f50e040 100644 GIT binary patch literal 338 zcmV-Y0j>TYiwFP!00002167etZo)7Sh4(!LO1D`Uk$@>;kvLfGq7^FY0bDb*k%%X< zEmVZKd&hA?U=_{x@}B2Mqj7!$>&roD|B^g2R&XhkRHM<*2C}Re3j|JJLM>&<8B5X@ ztV7dTq^za{j!HvUS6MI^^r7VCGB0wHmG@vxmoO8BNYXv%+SM3Qw#XOBHI?hjJ2Ys| z!h-U!zsryOtKHvtY&G%4|a0klj-!0e!+NM+ZlnY6Y zikfM5UfF0ER?=a5;Kzb<#LFxzZd_o~4lN1BGf5K*+BP0*nt;Y0^M;i^$oGCJmwEW% zlWG&h3bZ;uOiNw^y3=Z>@dUP?IUb`R=@g%BskM{)mi$0X1SY>&}xYOPP*)Cx&bIEuGrfzGDC|zbtcH?S$eTN3= zA_=sI>LEY!FIU}pY&G%{P7ryY)$=`JgJX~oqha7mEsA-@_yIJT-#yR~sp%9k6H*Dr zO9I^-yryUvzNEu@!XJXRU9)MCrum&qY~0Y2Ohl?A;}UI)r@GRHJ>E9(7w%uxM7NV2hj4t{HZT7V>(uy40ssKFp`N|~ diff --git a/apps/dashboard/build/_app/immutable/chunks/CkyfbJUz.js.br b/apps/dashboard/build/_app/immutable/chunks/CkyfbJUz.js.br deleted file mode 100644 index d45b208201079a9680c20dc02a41337593d9cff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmV<90381tcmV*6l4 zD$0@r{D#!=38AnZ!&H=&Bp@Yda&gPm0zjcp6l#aFm~#?J$!Y0G8ISux%uO>BfQ-AX dWA$!FW;+;t=XzfUfXOh^89S9#3B^?n-34tObK~+}RMP3GjFS(v>YnMybfs-ps+KIN8ngJ#20s?Eet-RX!E661e`3+v zgoXx>%y1AZ^}$~l!i9Z=-~%suqA50Y9cOR^@(gngwHqv$#W*d2uOw4 z{)lcTDy1+vSC)p0DwQQk_k6QD%Sp&lPAT>rM58$u>TNY1BQaE-gJ=iKX_>%VhDsH8 zbRhyz3dnGK=!^gR+>XqbX%AVOv$GBi6-d|KaWZusN14>Bo5QjC&TniE$4zW--4~9x Sf!%G<_URWb_j65o0RR92*Lx2D diff --git a/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.br b/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.br deleted file mode 100644 index 3f77d57de2ca278722766d080214820edf90d0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmV;e08;-O5&>Yu1UvU%Cb7g-+B5-7zV*7(|8SJMeQiPMrL6@Cw60Nt5w@l2$wGWS z$Bb%11>Kj$8HvZg(W*M7hKdy+F0YVk^xQ~l`qwe3WOw`Y>OaPRKgy}G-? z4l|H{G70^f*{#jh?>CcxI{-S@bC5kVj^^FUm=XthqX%as*^iekOV>>X8rAZ&-4p%MGOB{_l#u`>$RZnkU}dUj7*YcEww! diff --git a/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.gz b/apps/dashboard/build/_app/immutable/chunks/Co2v30Gm.js.gz deleted file mode 100644 index 6ae10dbb8ed4067da405e0366e984432a58ab51f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmV;~04Dz*iwFP!000026J^g$O9L?w2H?BDBD;r@K#U%|=rR=1gLn`WPhLvg&T49Q zQ)VVhOSAu7x^69NCm*|1LanP!h06f^&C?hvsh>W7;=nDc7%Nz@xQuZ_gf2M?4KP#6QN`pRG4r# TAI!&tJT+(E1~TI769E7Ksuo_o diff --git a/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js similarity index 95% rename from apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js rename to apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js index f806b0e..6d8a62b 100644 --- a/apps/dashboard/build/_app/immutable/chunks/BmeMLq0p.js +++ b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js @@ -1 +1 @@ -import{d as l,w as S}from"./DnKV7_Y9.js";const y=200;function H(){const{subscribe:n,set:c,update:e}=S({connected:!1,events:[],lastHeartbeat:null,error:null});let t=null,a=null,d=0;function m(r){const u=r||(window.location.port==="5173"?`ws://${window.location.hostname}:3927/ws`:`ws://${window.location.host}/ws`);if((t==null?void 0:t.readyState)!==WebSocket.OPEN)try{t=new WebSocket(u),t.onopen=()=>{d=0,e(o=>({...o,connected:!0,error:null}))},t.onmessage=o=>{try{const s=JSON.parse(o.data);e(b=>{if(s.type==="Heartbeat")return{...b,lastHeartbeat:s};const p=[s,...b.events].slice(0,y);return{...b,events:p}})}catch{}},t.onclose=()=>{e(o=>({...o,connected:!1})),f(u)},t.onerror=()=>{e(o=>({...o,error:"WebSocket connection failed"}))}}catch(o){e(s=>({...s,error:String(o)}))}}function f(r){a&&clearTimeout(a);const u=Math.min(1e3*2**d,3e4);d++,a=setTimeout(()=>m(r),u)}function w(){a&&clearTimeout(a),t==null||t.close(),t=null,c({connected:!1,events:[],lastHeartbeat:null,error:null})}function v(){e(r=>({...r,events:[]}))}return{subscribe:n,connect:m,disconnect:w,clearEvents:v}}const i=H(),k=l(i,n=>n.connected),T=l(i,n=>n.events);l(i,n=>n.lastHeartbeat);const g=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.memory_count)??0}),E=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.avg_retention)??0});export{E as a,T as e,k as i,g as m,i as w}; +import{d as l,w as S}from"./Br8WXJxx.js";const y=200;function H(){const{subscribe:n,set:c,update:e}=S({connected:!1,events:[],lastHeartbeat:null,error:null});let t=null,a=null,d=0;function m(r){const u=r||(window.location.port==="5173"?`ws://${window.location.hostname}:3927/ws`:`ws://${window.location.host}/ws`);if((t==null?void 0:t.readyState)!==WebSocket.OPEN)try{t=new WebSocket(u),t.onopen=()=>{d=0,e(o=>({...o,connected:!0,error:null}))},t.onmessage=o=>{try{const s=JSON.parse(o.data);e(b=>{if(s.type==="Heartbeat")return{...b,lastHeartbeat:s};const p=[s,...b.events].slice(0,y);return{...b,events:p}})}catch{}},t.onclose=()=>{e(o=>({...o,connected:!1})),f(u)},t.onerror=()=>{e(o=>({...o,error:"WebSocket connection failed"}))}}catch(o){e(s=>({...s,error:String(o)}))}}function f(r){a&&clearTimeout(a);const u=Math.min(1e3*2**d,3e4);d++,a=setTimeout(()=>m(r),u)}function w(){a&&clearTimeout(a),t==null||t.close(),t=null,c({connected:!1,events:[],lastHeartbeat:null,error:null})}function v(){e(r=>({...r,events:[]}))}return{subscribe:n,connect:m,disconnect:w,clearEvents:v}}const i=H(),k=l(i,n=>n.connected),T=l(i,n=>n.events);l(i,n=>n.lastHeartbeat);const g=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.memory_count)??0}),E=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.avg_retention)??0});export{E as a,T as e,k as i,g as m,i as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br new file mode 100644 index 0000000000000000000000000000000000000000..24c2b1456be6c5f4188b81e200e4fbf093ea55da GIT binary patch literal 603 zcmV-h0;K&Lg#|!lGpGN3UTH>Br}KdA(}=#r0ks_OVi#Ti|M$)tAYUlK6uWOU_B=lJ zur&REtqBoe1j5`c7Ypc>QuXd2GpGC8hr8+N-^BE1u7q@m3xuO+)Vs$! zhnoxk>BP#I1{;wJJhw}EIy>!bX|K%s0XCRlC4aOyBLB&M{&bW?t$sZM{+mPgwrGZ?1j=#hKSqpWhB?IcV%?Fh zHqyX3moqr7$vkRTj(S;3@#iTM-@mgEi+S<4m zg$#|*sy{lJ^I^AwZP{(^G@B*u${w0>V}mlbIMisQ&qcG z<0y=$vR305`Y)_I>OxS@32oK(OKWuLAhl1)RPjlr znkxwxdm@$E&;(UCUy81_okbZ&U{66JDz*T^P;kB)#-}b+UL)8nYM3Uo+F!%d)2)bf pT~Tf}ZvWQerNW$CT}Gy3EAN`g=*cP6cQ9RQM~2i*epi7rnkCatD$4)> literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..41facb8b073fa8d7c3a78a37d74b1773cf0117a6 GIT binary patch literal 689 zcmV;i0#5xOiwFP!000021GQA|Yuhjo{l34#4Wme{P|{|jn~fS61WIA;AcYP}X%+dB zYPF>x$#H|@|9z6}q)GSV!(g8-k?-Bzd-o)nFSK!08gUzCqzqwF&y3D{wEx9?y8V9n z@TTAOwodUJ>UjA1^sHan$M|olb;!VpoFU|k zhp9$OEz@WaJ8FQZtBLc(@d0DEFr8@e431uZ8((2(R+VQ1WwiZ(3QQc;N-sb$gxPuJ z2@*h>oui6Us>zOWgFSI@-5_(Ymd}BCL=_sea#(gbxxS(cZmcgx{U$h008M?8pW9Nm zT0jtHD}E0faD`E!>GaKBY~5{t!R{;x3AA0|J++w>fCglRlU;nb;YD5J+AAlXs=A$4 zWZFVY^baIYJTo%$y0n0X@vneZh~8GmsH+fMG2=3Wv=u#wWEzdC>%9*7yo*7UVAQ4U~fA1=CwrN-7RhR_ICZ^oTSoj{*_(@QS4mN?XZ~Kyq>l#{dL|P>5+b4mS=4Bm+CzX?%5P&>~ XAjv$0oX8N$I(hdKvES4mh6Mls$>mg! literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js similarity index 93% rename from apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js rename to apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js index 3c92625..bca8b90 100644 --- a/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js +++ b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js @@ -1 +1 @@ -import{n as L,o as D,P as T,g as P,c as B,h as b,v as Y,w as h,D as x,x as M,m as N,y as U,z as w,A as z,B as C,C as $,F as q,S as y,L as F}from"./C9Z4nxhR.js";import{c as G}from"./DWr9YED7.js";function H(r,a,t,s){var o;var f=!U||(t&w)!==0,v=(t&M)!==0,E=(t&q)!==0,n=s,c=!0,g=()=>(c&&(c=!1,n=E?N(s):s),n),u;if(v){var O=y in r||F in r;u=((o=L(r,a))==null?void 0:o.set)??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=G(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&D(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(c=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&T)===0)return i;if(u){var R=r.$$legacy;return(function(e,S){return arguments.length>0?((!f||!S||R||I)&&u(S?i():e),e):i()})}var l=!1,d=((t&z)!==0?C:$)(()=>(l=!1,i()));v&&P(d);var m=h;return(function(e,S){if(arguments.length>0){const A=S?P(d):f&&v?B(e):e;return b(d,A),l=!0,n!==void 0&&(n=A),e}return Y&&l||(m.f&x)!==0?d.v:P(d)})}export{H as p}; +import{n as L,o as D,P as T,g as P,c as B,h as b,v as Y,w as h,D as x,x as M,m as N,y as U,z as w,A as z,B as C,C as $,F as q,S as y,L as F}from"./BBD-8XME.js";import{c as G}from"./BexJutgU.js";function H(r,a,t,s){var o;var f=!U||(t&w)!==0,v=(t&M)!==0,E=(t&q)!==0,n=s,c=!0,g=()=>(c&&(c=!1,n=E?N(s):s),n),u;if(v){var O=y in r||F in r;u=((o=L(r,a))==null?void 0:o.set)??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=G(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&D(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(c=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&T)===0)return i;if(u){var R=r.$$legacy;return(function(e,S){return arguments.length>0?((!f||!S||R||I)&&u(S?i():e),e):i()})}var l=!1,d=((t&z)!==0?C:$)(()=>(l=!1,i()));v&&P(d);var m=h;return(function(e,S){if(arguments.length>0){const A=S?P(d):f&&v?B(e):e;return b(d,A),l=!0,n!==void 0&&(n=A),e}return Y&&l||(m.f&x)!==0?d.v:P(d)})}export{H as p}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br new file mode 100644 index 0000000000000000000000000000000000000000..712779c7b84f8db243de0df2558c199b82005dee GIT binary patch literal 522 zcmV+l0`>hHz5^hP!g23pSz5a+5k++O)A@UsO?gMZZ%W1eNT?7~`1F^F=-&gDM|xMV zR})Kt;iba8@K(Ohb1vT-$iC150HZD?I@slvxck0<&Bm=VIGgpe{SRFI(#g9!q<&iX|Dc6azF zUsm6~?|QZO+uLr1NL*|UCGO^5Irhu79AR%WO-|TY57nvt4gTOx&i-St!_&gpC$2@Z zN7P8eU}=kslbU>^;z{SZgq-)(zOJxZuoK>9Doup;pUuIEyHJvn zSuSZ^xt@KNcCa>EU4TK5lfkJ*=U*RB&&E=7YWm%CpylM(>h?ycd3Ga#swPzj)^i*f zV@4}MtVL{t15=XXv?LEwJ<@rgN?c7q5AhZO@&TC8p|lv-&~H^MNek%M5jD$bY<7#3 z^ukw}ESzu!x*b!QG0~dGV|I9~8QVN$GI=9zBMU+lnUr<;jTTF`K^Lb6Nb>(UIr)#r z|8Yw}oSd{sS}0H@l1^UR9!`F7HC$AvCEJzCP5;*(GRglMj49^1(A8zt`a0^;?YHr^d Mp>K{~%LvXj0qr*ZDF6Tf literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..1b84b069abfb4187031bc8b9d4a6677f12f784e7 GIT binary patch literal 565 zcmV-50?Pd#iwFP!0000219g*KPunmQhVS<)QdC*Cbe45@Q=)^_Phg^eD3yi~szU3e znNkPxMN5 z53htZj0juU5~i>rT)~bohd072^a*b;APiwh=)#2X0yDx6E(wz+%+k$?`(-c~eg5`i zI(C2NCw|=evmVZVRjBRvvWVukA}sZ?h*RyH^9%wgAQ$^8$eh%tXNaA7UGsvyiVk8A zDl~f9>M`k;R%^^*iJcxq$OWGAC1c!-znTwYdBt<#E zFOl;UFUf}xh`LM?S*7vH>3OM}t3pW0uNez$wN!YTJp_-aytYO()N}zCW?8?I4@N!W z87DhbC%gp`VS$M4494=#Z_O7NapTaakg*X-z7Rs#9Afev%GmDCx>vTFpQ)nEv>6>6 zNz=sRHVY*h@BcGCF0Btzz=uZKQwLxVN#Gqs zg1y=EmP4;AY_!~dGo=(1V>f)&2DZWVzwH?7e_IjzWvcVS>EldN3(su3k^^pBsAFJH zdul49~n)&7tg`vBdnb8#iRz*6YfxJZfq-qqg=soYQr9Zv0R0QJi2vzXJdO Dr$H8_ literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js b/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js deleted file mode 100644 index a2e2d55..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js +++ /dev/null @@ -1 +0,0 @@ -import{b as p,E as t}from"./C9Z4nxhR.js";import{B as c}from"./CY4crMrT.js";function E(r,s,...a){var e=new c(r);p(()=>{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.br b/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.br deleted file mode 100644 index c92f939adcbe576e543edd8a6b135e44607d58fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmV;f08#%Nxd4DH3hajCJ5DUA!WQ1Dh3(&pN|)PG1^=IM-6VRXi6y-41`avD(5dAZ z)N(FVcss`@OHI?b&E0u=9z`C2wuNmiYRi+hIOp^rcN^P2w<1WtMqJ>QlQw?Z%}Us> z{7*x8IRod9zCXhkLZ-8V#;h{QIm%)m6GDvL{;r|x+6*uH1He!@Uw*%Kh5^R$yt%)A ckH$RN=>#s+2^SN@5nHjNS|E|K^eXmHKB|US1ONa4 diff --git a/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.gz b/apps/dashboard/build/_app/immutable/chunks/D00YwZ1M.js.gz deleted file mode 100644 index 69185467389d215846b9d2d07a8c55dc468ee315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmV;b09F4ViwFP!000026Fttc3c@fHh2h<&2p!4|gt&B(kP1pi7je<8h7>F9O}RJK zLdm;JTW~td$Kh}LAyAy3qGmCuYMGcC3Vo*c=fk7G>2=j_&P=<((<0no+zUq+x~-xa z(Zx2PsDKnJt#vKuPffyG^k3nCq!|FDEoT>yqd?0bk4GH4&Uo#SNAiFQ^BjUL5yJK% YWl~WlKdk|4A}6!^0Tr=eh`Im(08D;NhX4Qo diff --git a/apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js b/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js similarity index 87% rename from apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js rename to apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js index 03ef2ab..5cd86b3 100644 --- a/apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js +++ b/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js @@ -1 +1 @@ -import{af as g,ag as d,ah as c,m,ai as i,aj as b,g as p,ak as h,B as k,al as v}from"./C9Z4nxhR.js";function x(t=!1){const a=g,e=a.l.u;if(!e)return;let o=()=>h(a.s);if(t){let n=0,s={};const _=k(()=>{let l=!1;const r=a.s;for(const f in r)r[f]!==s[f]&&(s[f]=r[f],l=!0);return l&&n++,n});o=()=>p(_)}e.b.length&&d(()=>{u(a,o),i(e.b)}),c(()=>{const n=m(()=>e.m.map(b));return()=>{for(const s of n)typeof s=="function"&&s()}}),e.a.length&&c(()=>{u(a,o),i(e.a)})}function u(t,a){if(t.l.s)for(const e of t.l.s)p(e);a()}v();export{x as i}; +import{af as g,ag as d,ah as c,m,ai as i,aj as b,g as p,ak as h,B as k,al as v}from"./BBD-8XME.js";function x(t=!1){const a=g,e=a.l.u;if(!e)return;let o=()=>h(a.s);if(t){let n=0,s={};const _=k(()=>{let l=!1;const r=a.s;for(const f in r)r[f]!==s[f]&&(s[f]=r[f],l=!0);return l&&n++,n});o=()=>p(_)}e.b.length&&d(()=>{u(a,o),i(e.b)}),c(()=>{const n=m(()=>e.m.map(b));return()=>{for(const s of n)typeof s=="function"&&s()}}),e.a.length&&c(()=>{u(a,o),i(e.a)})}function u(t,a){if(t.l.s)for(const e of t.l.s)p(e);a()}v();export{x as i}; diff --git a/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br b/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br new file mode 100644 index 0000000000000000000000000000000000000000..f2a4f7bd67d146a060ac4c6dbad35169ef43d2f4 GIT binary patch literal 317 zcmV-D0mA+p5duJ*2X;)D7~)a8u*L{Rp23sF&% z@dJe#{8B4tVA{g{NaHV z5z1_9hASzx;H+P-xi>gB79;(^GC#g3C*zNOZL>_2}9u}&4;Akw~IwPgbgU&Z%I zYZrub5k*G}!^sV(L}v}>cD+VBgG!g^#SUg8_p&jz^cCla#2f`-2Uv?xgBdVSb|PBc zE?Xm8*-|g|a0M()_p3S970iPF=}lNTt+VU6GR~cVIV2lNH+cRJP60mOW;_ay1XCPY mn5=_4$wX2zdtpFP2tNx@=Cb^N%ks>#diVuq2v{T%0ssJs^qzqL literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js similarity index 74% rename from apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js rename to apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js index 7fa8036..0260b51 100644 --- a/apps/dashboard/build/_app/immutable/chunks/BkopTN9z.js +++ b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js @@ -1 +1 @@ -import{a as y}from"./kH-DTQyy.js";import{J as r}from"./C9Z4nxhR.js";function a(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{a as s}; +import{a as y}from"./C5a--lgk.js";import{J as r}from"./BBD-8XME.js";function a(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{a as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br new file mode 100644 index 0000000000000000000000000000000000000000..8351992c9ca820571aa68e0d3b28177b7ad1ff75 GIT binary patch literal 179 zcmV;k08IZI{r~_Rhq2pa&6Q}nkMKqd^ZH978qr>goW31`4LHPgNqn84ZXqgavhJ=w z9OZ7`OX8$0Y|W#-ED9`yG`-<-*)mcdN-T-)t;h<8 zi`rljQSH=To$@-Ypk5Rbp5D}p+xM+h5OjbUxW!KLM9PG4;6F1GP4%=S@w^B@P?tHv hX0}0IF6!GLI_A^^kW~LQ=>8&T)8Abohx6Kt9sxFBS{MKT literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d531b34cbc6ce682dacbd4c512ca385801fea99c GIT binary patch literal 202 zcmV;*05$&~iwFP!0000217**#3c^4P2H@SNI6KH4wC5y<2R?&37UH2lb ziW9rC5LR*sVH!I1xLFk5us$4!YY(wYB{q#88UybonOcI1<*{throw TypeError(t)};var Ie=(t,e,r)=>e in t?ke(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var $=(t,e,r)=>Ie(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||ce("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),l=(t,e,r)=>e.has(t)?ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),a=(t,e,r,n)=>(re(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{aL as Me,g as Ee,l as Ce,m as Pe,aM as ue,q as U,ax as Te,ac as k,J as I,w as q,aN as _e,b as Ve,a0 as qe,a3 as xe,aO as pe,ab as F,aa as we,aP as se,a9 as ie,ad as Be,aQ as ge,aR as He,aS as ve,aT as Le,aU as We,aV as X,aW as Z,aX as ye,aY as $e,aZ as Re,af as Se,ar as je,a8 as ae,a5 as K,G as ze,a4 as Je,a_ as j,E as Ue,a$ as Ge,b0 as Qe,b1 as Xe,Y as Ze,b2 as ne,ao as Ke,ap as De,a2 as et,aD as tt,b3 as fe,a6 as z,b4 as rt,aC as st,b5 as it,au as at,p as nt,aq as ft,b6 as ht,a as ot}from"./C9Z4nxhR.js";import{b as lt}from"./DPfxVJHQ.js";function dt(t){let e=0,r=Te(0),n;return()=>{Me()&&(Ee(r),Ce(()=>(e===0&&(n=Pe(()=>t(()=>ue(r)))),e+=1,()=>{U(()=>{e-=1,e===0&&(n==null||n(),n=void 0,ue(r))})})))}}var ct=Ue|Ge;function ut(t,e,r,n){new _t(t,e,r,n)}var m,W,w,C,g,R,E,T,S,P,A,x,B,H,D,ee,h,Ne,Ae,Oe,he,G,Q,oe;class _t{constructor(e,r,n,c){l(this,h);$(this,"parent");$(this,"is_pending",!1);$(this,"transform_error");l(this,m);l(this,W,I?k:null);l(this,w);l(this,C);l(this,g);l(this,R,null);l(this,E,null);l(this,T,null);l(this,S,null);l(this,P,0);l(this,A,0);l(this,x,!1);l(this,B,new Set);l(this,H,new Set);l(this,D,null);l(this,ee,dt(()=>(a(this,D,Te(s(this,P))),()=>{a(this,D,null)})));var i;a(this,m,e),a(this,w,r),a(this,C,f=>{var u=q;u.b=this,u.f|=_e,n(f)}),this.parent=q.b,this.transform_error=c??((i=this.parent)==null?void 0:i.transform_error)??(f=>f),a(this,g,Ve(()=>{if(I){const f=s(this,W);qe();const u=f.data===xe;if(f.data.startsWith(pe)){const d=JSON.parse(f.data.slice(pe.length));p(this,h,Ae).call(this,d)}else u?p(this,h,Oe).call(this):p(this,h,Ne).call(this)}else p(this,h,he).call(this)},ct)),I&&a(this,m,k)}defer_effect(e){We(e,s(this,B),s(this,H))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,w).pending}update_pending_count(e){p(this,h,oe).call(this,e),a(this,P,s(this,P)+e),!(!s(this,D)||s(this,x))&&(a(this,x,!0),U(()=>{a(this,x,!1),s(this,D)&&je(s(this,D),s(this,P))}))}get_effect_pending(){return s(this,ee).call(this),Ee(s(this,D))}error(e){var r=s(this,w).onerror;let n=s(this,w).failed;if(!r&&!n)throw e;s(this,R)&&(ae(s(this,R)),a(this,R,null)),s(this,E)&&(ae(s(this,E)),a(this,E,null)),s(this,T)&&(ae(s(this,T)),a(this,T,null)),I&&(K(s(this,W)),ze(),K(Je()));var c=!1,i=!1;const f=()=>{if(c){Xe();return}c=!0,i&&Qe(),s(this,T)!==null&&ie(s(this,T),()=>{a(this,T,null)}),p(this,h,Q).call(this,()=>{se.ensure(),p(this,h,he).call(this)})},u=o=>{try{i=!0,r==null||r(o,f),i=!1}catch(d){j(d,s(this,g)&&s(this,g).parent)}n&&a(this,T,p(this,h,Q).call(this,()=>{se.ensure();try{return F(()=>{var d=q;d.b=this,d.f|=_e,n(s(this,m),()=>o,()=>f)})}catch(d){return j(d,s(this,g).parent),null}}))};U(()=>{var o;try{o=this.transform_error(e)}catch(d){j(d,s(this,g)&&s(this,g).parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(u,d=>j(d,s(this,g)&&s(this,g).parent)):u(o)})}}m=new WeakMap,W=new WeakMap,w=new WeakMap,C=new WeakMap,g=new WeakMap,R=new WeakMap,E=new WeakMap,T=new WeakMap,S=new WeakMap,P=new WeakMap,A=new WeakMap,x=new WeakMap,B=new WeakMap,H=new WeakMap,D=new WeakMap,ee=new WeakMap,h=new WeakSet,Ne=function(){try{a(this,R,F(()=>s(this,C).call(this,s(this,m))))}catch(e){this.error(e)}},Ae=function(e){const r=s(this,w).failed;r&&a(this,T,F(()=>{r(s(this,m),()=>e,()=>()=>{})}))},Oe=function(){const e=s(this,w).pending;e&&(this.is_pending=!0,a(this,E,F(()=>e(s(this,m)))),U(()=>{var r=a(this,S,document.createDocumentFragment()),n=we();r.append(n),a(this,R,p(this,h,Q).call(this,()=>(se.ensure(),F(()=>s(this,C).call(this,n))))),s(this,A)===0&&(s(this,m).before(r),a(this,S,null),ie(s(this,E),()=>{a(this,E,null)}),p(this,h,G).call(this))}))},he=function(){try{if(this.is_pending=this.has_pending_snippet(),a(this,A,0),a(this,P,0),a(this,R,F(()=>{s(this,C).call(this,s(this,m))})),s(this,A)>0){var e=a(this,S,document.createDocumentFragment());Be(s(this,R),e);const r=s(this,w).pending;a(this,E,F(()=>r(s(this,m))))}else p(this,h,G).call(this)}catch(r){this.error(r)}},G=function(){this.is_pending=!1;for(const e of s(this,B))ge(e,He),ve(e);for(const e of s(this,H))ge(e,Le),ve(e);s(this,B).clear(),s(this,H).clear()},Q=function(e){var r=q,n=Re,c=Se;X(s(this,g)),Z(s(this,g)),ye(s(this,g).ctx);try{return e()}catch(i){return $e(i),null}finally{X(r),Z(n),ye(c)}},oe=function(e){var r;if(!this.has_pending_snippet()){this.parent&&p(r=this.parent,h,oe).call(r,e);return}a(this,A,s(this,A)+e),s(this,A)===0&&(p(this,h,G).call(this),s(this,E)&&ie(s(this,E),()=>{a(this,E,null)}),s(this,S)&&(s(this,m).before(s(this,S)),a(this,S,null)))};const pt=["touchstart","touchmove"];function gt(t){return pt.includes(t)}const M=Symbol("events"),Ye=new Set,le=new Set;function Et(t,e,r){(e[M]??(e[M]={}))[t]=r}function Tt(t){for(var e=0;e{throw Y});throw N}}finally{t[M]=e,delete t.currentTarget,Z(V),X(L)}}}function wt(t,e){var r=e==null?"":typeof e=="object"?e+"":e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=r+"")}function vt(t,e){return Fe(t,e)}function Rt(t,e){ne(),e.intro=e.intro??!1;const r=e.target,n=I,c=k;try{for(var i=Ke(r);i&&(i.nodeType!==De||i.data!==et);)i=tt(i);if(!i)throw fe;z(!0),K(i);const f=Fe(t,{...e,anchor:i});return z(!1),f}catch(f){if(f instanceof Error&&f.message.split(` +var ke=Object.defineProperty;var ce=t=>{throw TypeError(t)};var Ie=(t,e,r)=>e in t?ke(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var $=(t,e,r)=>Ie(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||ce("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),l=(t,e,r)=>e.has(t)?ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),a=(t,e,r,n)=>(re(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{aL as Me,g as Ee,l as Ce,m as Pe,aM as ue,q as U,ax as Te,ac as k,J as I,w as q,aN as _e,b as Ve,a0 as qe,a3 as xe,aO as pe,ab as F,aa as we,aP as se,a9 as ie,ad as Be,aQ as ge,aR as He,aS as ve,aT as Le,aU as We,aV as X,aW as Z,aX as ye,aY as $e,aZ as Re,af as Se,ar as je,a8 as ae,a5 as K,G as ze,a4 as Je,a_ as j,E as Ue,a$ as Ge,b0 as Qe,b1 as Xe,Y as Ze,b2 as ne,ao as Ke,ap as De,a2 as et,aD as tt,b3 as fe,a6 as z,b4 as rt,aC as st,b5 as it,au as at,p as nt,aq as ft,b6 as ht,a as ot}from"./BBD-8XME.js";import{b as lt}from"./CKcqngaU.js";function dt(t){let e=0,r=Te(0),n;return()=>{Me()&&(Ee(r),Ce(()=>(e===0&&(n=Pe(()=>t(()=>ue(r)))),e+=1,()=>{U(()=>{e-=1,e===0&&(n==null||n(),n=void 0,ue(r))})})))}}var ct=Ue|Ge;function ut(t,e,r,n){new _t(t,e,r,n)}var m,W,w,C,g,R,E,T,S,P,A,x,B,H,D,ee,h,Ne,Ae,Oe,he,G,Q,oe;class _t{constructor(e,r,n,c){l(this,h);$(this,"parent");$(this,"is_pending",!1);$(this,"transform_error");l(this,m);l(this,W,I?k:null);l(this,w);l(this,C);l(this,g);l(this,R,null);l(this,E,null);l(this,T,null);l(this,S,null);l(this,P,0);l(this,A,0);l(this,x,!1);l(this,B,new Set);l(this,H,new Set);l(this,D,null);l(this,ee,dt(()=>(a(this,D,Te(s(this,P))),()=>{a(this,D,null)})));var i;a(this,m,e),a(this,w,r),a(this,C,f=>{var u=q;u.b=this,u.f|=_e,n(f)}),this.parent=q.b,this.transform_error=c??((i=this.parent)==null?void 0:i.transform_error)??(f=>f),a(this,g,Ve(()=>{if(I){const f=s(this,W);qe();const u=f.data===xe;if(f.data.startsWith(pe)){const d=JSON.parse(f.data.slice(pe.length));p(this,h,Ae).call(this,d)}else u?p(this,h,Oe).call(this):p(this,h,Ne).call(this)}else p(this,h,he).call(this)},ct)),I&&a(this,m,k)}defer_effect(e){We(e,s(this,B),s(this,H))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,w).pending}update_pending_count(e){p(this,h,oe).call(this,e),a(this,P,s(this,P)+e),!(!s(this,D)||s(this,x))&&(a(this,x,!0),U(()=>{a(this,x,!1),s(this,D)&&je(s(this,D),s(this,P))}))}get_effect_pending(){return s(this,ee).call(this),Ee(s(this,D))}error(e){var r=s(this,w).onerror;let n=s(this,w).failed;if(!r&&!n)throw e;s(this,R)&&(ae(s(this,R)),a(this,R,null)),s(this,E)&&(ae(s(this,E)),a(this,E,null)),s(this,T)&&(ae(s(this,T)),a(this,T,null)),I&&(K(s(this,W)),ze(),K(Je()));var c=!1,i=!1;const f=()=>{if(c){Xe();return}c=!0,i&&Qe(),s(this,T)!==null&&ie(s(this,T),()=>{a(this,T,null)}),p(this,h,Q).call(this,()=>{se.ensure(),p(this,h,he).call(this)})},u=o=>{try{i=!0,r==null||r(o,f),i=!1}catch(d){j(d,s(this,g)&&s(this,g).parent)}n&&a(this,T,p(this,h,Q).call(this,()=>{se.ensure();try{return F(()=>{var d=q;d.b=this,d.f|=_e,n(s(this,m),()=>o,()=>f)})}catch(d){return j(d,s(this,g).parent),null}}))};U(()=>{var o;try{o=this.transform_error(e)}catch(d){j(d,s(this,g)&&s(this,g).parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(u,d=>j(d,s(this,g)&&s(this,g).parent)):u(o)})}}m=new WeakMap,W=new WeakMap,w=new WeakMap,C=new WeakMap,g=new WeakMap,R=new WeakMap,E=new WeakMap,T=new WeakMap,S=new WeakMap,P=new WeakMap,A=new WeakMap,x=new WeakMap,B=new WeakMap,H=new WeakMap,D=new WeakMap,ee=new WeakMap,h=new WeakSet,Ne=function(){try{a(this,R,F(()=>s(this,C).call(this,s(this,m))))}catch(e){this.error(e)}},Ae=function(e){const r=s(this,w).failed;r&&a(this,T,F(()=>{r(s(this,m),()=>e,()=>()=>{})}))},Oe=function(){const e=s(this,w).pending;e&&(this.is_pending=!0,a(this,E,F(()=>e(s(this,m)))),U(()=>{var r=a(this,S,document.createDocumentFragment()),n=we();r.append(n),a(this,R,p(this,h,Q).call(this,()=>(se.ensure(),F(()=>s(this,C).call(this,n))))),s(this,A)===0&&(s(this,m).before(r),a(this,S,null),ie(s(this,E),()=>{a(this,E,null)}),p(this,h,G).call(this))}))},he=function(){try{if(this.is_pending=this.has_pending_snippet(),a(this,A,0),a(this,P,0),a(this,R,F(()=>{s(this,C).call(this,s(this,m))})),s(this,A)>0){var e=a(this,S,document.createDocumentFragment());Be(s(this,R),e);const r=s(this,w).pending;a(this,E,F(()=>r(s(this,m))))}else p(this,h,G).call(this)}catch(r){this.error(r)}},G=function(){this.is_pending=!1;for(const e of s(this,B))ge(e,He),ve(e);for(const e of s(this,H))ge(e,Le),ve(e);s(this,B).clear(),s(this,H).clear()},Q=function(e){var r=q,n=Re,c=Se;X(s(this,g)),Z(s(this,g)),ye(s(this,g).ctx);try{return e()}catch(i){return $e(i),null}finally{X(r),Z(n),ye(c)}},oe=function(e){var r;if(!this.has_pending_snippet()){this.parent&&p(r=this.parent,h,oe).call(r,e);return}a(this,A,s(this,A)+e),s(this,A)===0&&(p(this,h,G).call(this),s(this,E)&&ie(s(this,E),()=>{a(this,E,null)}),s(this,S)&&(s(this,m).before(s(this,S)),a(this,S,null)))};const pt=["touchstart","touchmove"];function gt(t){return pt.includes(t)}const M=Symbol("events"),Ye=new Set,le=new Set;function Et(t,e,r){(e[M]??(e[M]={}))[t]=r}function Tt(t){for(var e=0;e{throw Y});throw N}}finally{t[M]=e,delete t.currentTarget,Z(V),X(L)}}}function wt(t,e){var r=e==null?"":typeof e=="object"?e+"":e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=r+"")}function vt(t,e){return Fe(t,e)}function Rt(t,e){ne(),e.intro=e.intro??!1;const r=e.target,n=I,c=k;try{for(var i=Ke(r);i&&(i.nodeType!==De||i.data!==et);)i=tt(i);if(!i)throw fe;z(!0),K(i);const f=Fe(t,{...e,anchor:i});return z(!1),f}catch(f){if(f instanceof Error&&f.message.split(` `).some(u=>u.startsWith("https://svelte.dev/e/")))throw f;return f!==fe&&console.warn("Failed to hydrate: ",f),e.recover===!1&&rt(),ne(),st(r),z(!1),vt(t,e)}finally{z(n),K(c)}}const J=new Map;function Fe(t,{target:e,anchor:r,props:n={},events:c,context:i,intro:f=!0,transformError:u}){ne();var o=void 0,d=it(()=>{var V=r??e.appendChild(we());ut(V,{pending:()=>{}},v=>{nt({});var _=Se;if(i&&(_.c=i),c&&(n.$$events=c),I&<(v,null),o=t(v,n)||{},I&&(q.nodes.end=k,k===null||k.nodeType!==De||k.data!==ft))throw ht(),fe;ot()},u);var L=new Set,N=v=>{for(var _=0;_{var O;for(var v of L)for(const b of[e,document]){var _=J.get(b),y=_.get(v);--y==0?(b.removeEventListener(v,me),_.delete(v),_.size===0&&J.delete(b)):_.set(v,y)}le.delete(N),V!==r&&((O=V.parentNode)==null||O.removeChild(V))}});return de.set(o,d),o}let de=new WeakMap;function St(t,e){const r=de.get(t);return r?(de.delete(t),r(e)):Promise.resolve()}export{Et as a,Tt as d,Rt as h,vt as m,wt as s,St as u}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br b/apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br new file mode 100644 index 0000000000000000000000000000000000000000..6a034f795b11faa441fe7b160588e18044152f16 GIT binary patch literal 2987 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.br b/apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.br deleted file mode 100644 index b9527e5f37c6e0e548e5c1ec0aa2be6457ec564e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2985 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 diff --git a/apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.gz b/apps/dashboard/build/_app/immutable/chunks/DP9qWekZ.js.gz deleted file mode 100644 index 972b700e0515f2dd1c50e6978131e0e13fc5b6e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3341 zcmV+o4f66IiwFP!000026O}n@bK5$u-}hJ8nvRB?;Hb&ob9Z*F!+6>xr)`>7lQe0P z$#`iAven3vLs3p#TmStINJ*BG_U_p)B0z#52;xO*Ayw}I#p(Dv2HFcTic>sO*&LN# z`U|Og0SYa4S9+?lr{3jqjt5F*ifLY&;ZG=-1_Z^$F81QIr-u({dRCYgGgNY%;Gn+^ zL6%1Gq-gLb73&&a$fUr5D)~U);k{6X^P3IhPsC9#=a@x3>hMt<=0DMa3bK7o)R!ekcQ?@kdoRb1bIe4jv)UWu-yx83kz=8`)wFvM|zWFziwd(wtMIVQeN( zH5lz?x+Gt4ytjM*y8S(Uo}PQ(bEmcfa}Y^GvVRsmUmbq@Vo0JQ4RoBPy^#E5m7wmS z*ajsok!^EGeTBMEDdS>yb&QO=E;~S`IP4*#PKH8=ZP#U~II}(4dJmCU#&mOQc1Ttk)^ykcveXhrMmElS^K5&dbt-G%dd3`U7s{Ep+2ss}!GlqYZ9m z%-|ZHU=Jp64hL`v7jOpe;2GY-N7x5Mn8FFdJA_k&DZ&T%0vY;2BJ;dA(yJg#bFGR% zXNnoF5b#yP^fb<4%KbMMa^_NDs+~&2SLEoWh4g7Kz=ck!Au{*63Gp z#6EFrHN8kw+r8%gBQoyW?m|RfD76$qJfj~+%%WbdrPBFztfy>_yk-)L!;8}s5-i7t zGKm9ZbMz8SCwj`cKd&qj-XX7Y2jL+vG0Cx43>$*eHUS?r{U@D%JFOXjR2VY8vVo;<)W7i>*Jb_IiLBQx z#OpBN*ckhwT}i4TFiK9 ztd+J#j-tdy6FYeD#gI&+4rV zM1LD%*Zo2)nl<~@Vg-a^_dl)02L;P$;g5Mpr|#*xUt*D>#h0Zb#>A*y2fm% zdb8(=d}R*2Ipz}HwOC`F^wjH+q*_K^nXGzYnP|Rd$kdD_oOa~4yivT$2tK+ldy#<1 zFPng67evYJBsd2wT|5S29E#p+*KACvr$vG{?(pC`twg0kq zZ27g;Q*MN-hTie2z-}b>#u#PFl**^SiKACaHTX~S zbuA4Qp__cW-BL|;>i@r~mF>OnZrjX<|IP9E?_22&u&&zFPt4|peW;FoyeOeM8mrtv zb=*ObJACLU@uf-b_)(@NWKhpHR8=5jiZ7A^!#4$BOQ#p=%g;L4s1TR-sn+ zl<=kFqSoLaAr?h#wHt+qPp*;Z~gp?+lA0y zaII?mg8$4}o57b(OIg((^IVHNM`uMaHTMVyEHcX$=-h9v%M)|GuarI4UYrI=5hA^V zm6p-5xG-;Y%)tewI(InS*xW#wAZfr2&x7j9%~uTXj_-#<(}-2c`JKKOs%$7P&FW;E z)-AVv{6kl_7$3K`_)YbEc8B-YhRxZM1t-YO(GFLBf$)bFVUXD*tfimnv_5< zdrDE&jt;5N9#sPn2*yr@_JV9S&vFdUq@KRG_?^}dhtwf3}B6V(0~ zg*K~2VjBuErq>MZy87<;p3JeZB4r}*;xxqPQ|h7ts#Sj5ab5FhQb(lqny{xh4YMaQ zS5hI?hG?s^4IeaoLP31ErSY>rMCiIK5*aV!h>^5WOInEgLLgt=(yO5p6p9T0(hNDU zdilmXY2BfE@p`Sw($?8m45(Z6LjZG5w>aqRlUPGBMK?)|u`$$YDbk%&E+=kX-P z@FL0ddL38(canuj*fh)adTpip!Z;`C!_Ah3 z5HWY%r9H+NbRBPQ`08Z1@a9EM@Zdz;kjAtZ&|_}$z8H@aT(3t$h^jGL94nL$ek?{r zd}8gG%<+cobHN`AEburERHkMAV3U=-KHZeux6n!1gf)A>5MqM#4D5AI1a8?CsrHDM z<;H!UjHA^N7%PQ1&Y*r^-;})71G}&KLNM)(MtV53tJkLXrX)w*yATI0p z-uuDmE*@1@5pgP6qV}u4`D5a`kvGFUmlO2zc@k^(@4x+wVvmL zw{P!$UB0|?CIkN=4C#h2A{Ar3^`YAA7hDvH2^c=boqNgy( z7N~>}{Tp=|WWCsxy$<5`>=xR`u)(m_b`l^@QP{evuE?)^Xq#q@w{N0kEEgn{{by(-OP!lN;-+`}{!5AY!B3;4rJvwNt`F4FZ8PD%F>`kAKMsIWpEH5u|m zki4}`kHoe=`eRY&xY5=Yufp2mZe+4V|H%A@T5`TRGRbdgIi8A%CU{fHX)5LJu&H71 zEvvCOw7<8I`(q(0mAft**QX7K_8$_$xOy$Q5o0rF$^DyV%8+T3eh)~CM{%w(Ma7md zLs-oza4&FhT5=d0ZcEtVd{DzTTRRl0%G$h7nAGeB>5rRD=_gg;W46|$_63E`Bfi<= z_@`SORa+c$Sc;JW7u^5tx1|ub3PcE zO)OwZ;| diff --git a/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.br b/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.br deleted file mode 100644 index 647c6e36696de7f35ba11895802f189cc761c418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmV-e0;l~O$pk=TQ`Pn?lf^*?To9&oDM;^A`9e#uJDDSCciwY9hqrq}n2o3QGZtOg zR>5nsDgfAGoj2)KDDfnQgqIfPs$oK-L&n6QMh64D4*b$2BK*t18{sO3w}Cd@&tQa= z5N3D>Gu(hDyoYDpg(*Hb&Ju(lm0rI%{Mxb8&b#gfRZ{&&tE`+2vC(CK7DGzi`^mv9 zmC}h1SlTE`6itdTSi{-UOms-ig3|%>yvg7}(KKWJKye)^jAamIZ6&Qe4W5e@8;YYn zMdag{u%v6G2~qOaKo^#!u5M`o5%J_CCY(@sS3Gw>aYk1nHS8Z2ljSDF$FQ6^8w@}l zWygv_O1p`88IinZXx|86T;w+m!v9LqTI~u9V7sZnZSzENUI3?xn`S${}?JkdGJL7K{+dgn>WWj;}ZYkTq!s=?^tn7(3ZSxd?|I(NT z;E+DqX*HvbbgVQmo;xr(`>Fv)juT5RQ2|~OtQ4Z*$wvGW>TKhxUZU0N$s_qhD=m~T z6sLr)HDi800r_`u{6V+|M4Eyi7H1$x280AjhTiNIkapBaQ^j-3oMld2d()1c1SDUJ zb+<)O3JDAjST*{02l$g>BK^XJ?+i$NB4!34x|Po`%^S<*Hm$|hLZ{=3$M@$`m~&nc64meF=tI2AcG`3{-TxJZ{lT<{DH_KB diff --git a/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.gz b/apps/dashboard/build/_app/immutable/chunks/DPfxVJHQ.js.gz deleted file mode 100644 index 3ee52cd5c9fbafc3ff86c683cfb2560efc3ea607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$cqbiwFP!000026Lpl!ZreH#hWF)~bj*6uv#3?Z2-37Um!v^ppg=bT zEsbIoG-;4yJAtitFDUtvwCL)SW;j>=V6$BLAUktCFmbRTV-hPeKGBl-l(?d8!gn&C z6R*kKBtFu=32QQCVkGlV;xn0X;w_oZe@Eu;#3wTUC0@35@XK7iy?X!coqJk5s2?#e zHYN<}qVz7xpwR%eezbmW>}=6Qt=-z%>BcwJU_3e7)wXe!-{Nb3tt70Ya5Z~gam3;9 zw}4j%R2kR^-+SAX&ydFrTj9~+#AqQ)o71j8b2GdBearql7AuNWLC|8TdR)v8L&9G$~d0@bkKiz|G&pY@6qVpWn5ZU^8dlkr={CsZ) z0tKYd_M3`Fd%y1_xlHT3DX^Mz?E?er3J~cD7;$n5jAVd`k@#Hr9`KKwOLat_HqlG& z{const n=o(e);if(typeof n=="function")return n})}function s(e){t===null&&c(),l(()=>()=>o(e))}function f(e){var n=e.l;return n.u??(n.u={a:[],b:[],m:[]})}export{s as a,l as o}; +import{ah as a,af as t,y as u,m as o}from"./BBD-8XME.js";function c(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function l(e){t===null&&c(),u&&t.l!==null?f(t).m.push(e):a(()=>{const n=o(e);if(typeof n=="function")return n})}function s(e){t===null&&c(),l(()=>()=>o(e))}function f(e){var n=e.l;return n.u??(n.u={a:[],b:[],m:[]})}export{s as a,l as o}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br b/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br new file mode 100644 index 0000000000000000000000000000000000000000..9e56a494c3aa28ac4d1d99bc5ac97f53dc204968 GIT binary patch literal 230 zcmVg;|JM9m^QV5?%VOF_SxyB)_2;}an0GkH{CMn}8!Kij zBn9j%iS?_)7BRkd>dq_V1+oY$551gBJpJ&A_b9)X(LXEZzW_j%oI6fP=(Kd4f^mI$ zyp2ggnK;02NS8h#6gGXRWL{_z6hV`VTdtM>27O{sJDlY|Cn1-dmX4J1xF5vaG&2dv g_^NfR+-}Ki2fe?%+@=Ab82w5%+6cr!2z-@xmK(Ro~CM`R$fk~%w9bGBFw+1#qV8z`@j$JeLl_qP-O4z$tH zD(sylib1(x=iQZ9xRR6i&NJE}j^R+(VFH7|FEG_mn_h#Om4UO182SsGl}q~;EYfoQ zBbtpUgs{<=qEM`?Vo@MBk9*W=h9w{P7(w?bpyPqf literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.br b/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.br deleted file mode 100644 index 268d8ef..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.br +++ /dev/null @@ -1,2 +0,0 @@ -z`Vmwr}%&n9Es3+st׋։ E!M7Uۡe3Րt+xN㯗qw]$H~٬<̨zq(+no09G#ZvSSO WbIcjbIgoBpt lx]!L8P}4!Z.?ZsI@] \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.gz b/apps/dashboard/build/_app/immutable/chunks/DWr9YED7.js.gz deleted file mode 100644 index 75550324e1ef4c71d7f1d007cbbb2d51c3d31812..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 zcmV;80doEyiwFP!000026ID`8Yuqppz4uqhIV=(k?k*HcY$iUmw?Galq)nG4*xvC* zMV1zQEHOg=y~y58vZsfbH*elNjU120`si5eSPzE`Dh<|*H|5u#`u^$r%kypd&)w8= zAwFe>f!`Tg_>-Yq+K%v=VGqw44i}Lhw|~Fsx7Wv6M3H9>iw#KpHI1E7T+~C*y_ZI_ zi4$nBBKAf*&jQ-5-Zc%+fYEtlsnS6ya3-xIdbAkcy zqHjLw4Aq`ro-l|cz+Rk2PYiL;|Ef!=-0e&8hLbv3%$+bN!X r&mX$YQMz3kq;8d(qC=e$z0Ef>Eywb(+}N1GrTWW%z9+HudjbFe!b!ys diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js new file mode 100644 index 0000000..9024538 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js @@ -0,0 +1 @@ +import{b as p,E as t}from"./BBD-8XME.js";import{B as c}from"./gqVpgJ8U.js";function E(r,s,...a){var e=new c(r);p(()=>{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br new file mode 100644 index 0000000000000000000000000000000000000000..f7a2906b559913812ceee3215699f01eeb634854 GIT binary patch literal 178 zcmV;j08RfJxd4DH3T*cjYX&E!$;I3cABtGq+XlMamMZv9LqWaL@wQ=YH$7RZlCfF0 zeTr5zfgov@u$`B!fCERTeX6k3JUx#x&$TTJTGW;&ZE?=&LGCuTeQrgNevP=mtyW`M zP4@R2B3eL6 gGH)In-=i@F6&`~`36RE#X=^(A1rn($x{5tC0GDG`@c;k- literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..741bb0f3ce1bd99bc9e6a80f615214495caa303f GIT binary patch literal 170 zcmV;b09F4ViwFP!0000212xXE3c@fHh2h<&2oB|5h;c21v{39KI4Z6+q@~i{#3WUr z%y$h~6GM`_AA5i&Ai4km073jsPyhe` literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.br b/apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.br deleted file mode 100644 index 818be5e460e5e0df0ca667151c1fa7eb5596accc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmV-o0-gOEW&}Wt!nWD-#0y!=C0S!6bxddbFB8ezv5~&|u&98ias;cGzD|2Yiy~X+ zTQsRv1af=-G2hvo_VPkjIK?yoc7(2Tm6H>)!VZ8m%p3eJ59wqY!p_AT;ctX%)Q2bH zH3W1tr$O;*Js94deD34aJr4SBb)kFc4_aBszjg=O7vqmYAvZH-+s%x^l+b#e7kS5& zN%RCjeYyQ986+(Z)qEV3o2Pgcc-*Z5G{+z|WBm0a6q>W6gSLoao!C7SAq9}YiK&vqAfOZj*e{u5OmAT9(W9|`#Q>pPg68Tn}DX7fI z7f#ZXW61L_EXlqpnU&O%n4fy?aaYr{vMEfp-gwI5KYhVM3rPs(f&xvt!!RdrE?zMC z%f&VYxtnhkBq|Q(ZjW4CG${c(qm|(Ql2a5#!5{gHgK1zq1~3u(2&j;Y(Fp7-+kDz; zgo~dFHO|vvuHKG8EZ|c02mY+~%|x>AY#qC*r&)t#Rqa3ZICSg%P;;bwKSVzv=|uhU zx{3OS0K|YckN5K=@;B6}t74bhdnUXw%VC<4+v0gx+Nf~G*LU8-sbdZl3{_yThTAmu zHw96=BVFs2nL6{{ni;c7y8}fsv9k_LKrTS+-YT2sB*JTo=q`}Vomb3q(iim&|NiJ? z<{{^HFj{s1QkK4)gVbnvJykpPNGf>^P1{<^r!)hNL<^~ZyK6C7k<{9 diff --git a/apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.gz b/apps/dashboard/build/_app/immutable/chunks/DnKV7_Y9.js.gz deleted file mode 100644 index 6c1fdbea1c0866f61ffe31ce11cf8757af724564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmV;90&)ExiwFP!000026IE2fZsSG_z4t4|J_sb1Q0+x8wZa%lksoLe1u6)EEK&9p z@{D$7l-N$aL zkRK)W{mxfT?*t+eX4ia|_U87qjiEnz05@*DKsB5fcS;|T5)K!X;TFGnn*8@_<9JJ% zp18!Jm7vVj#f_zrclDQqJHCc~YWD{S^_V0e+(+KSCByQfNn0`daL5|#;NtblHp-#T z*99OoY1jJ$coNKX0~UuE8H;;fW&Ys?;J@*AY;s@Zs{)$be_I!r&9A%~zx1%1Xh9Ex zc=xu@lZ~BSX>i_?E$$MRbqyZLrCxssGp~~b3RlwO>(4wkhz{U$Y_l2a#D@X814#K&#crt1T#y$z~VP1*XhdMn#r zmUx}_j>A>mhwrmWA7BVt>Z1s8MwS=r?51atMPJP;>UiGmGf#@?2I}iIWF5>UDh}Yb zK3^3ZPZ2iTZCj{t({VU=VjER4FK308+iFvebYPtx%MPHTJ@Vr#RCMIW!RPyek5ni8 zAFLl9_DD8K&Vb`(Wc4RU?|45d%ZnAA;|gB!0f!SDkUBt$jg8}%?Rf#Y+(el31q0(jM*>$1H--mGG_z;0LJM-q5uE@ diff --git a/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.br b/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.br deleted file mode 100644 index 40fa331..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.br +++ /dev/null @@ -1,2 +0,0 @@ - ¶rYk$IteSޱPq?*J[,Tyo?p -/4cuRD"I2g3IyqvqFD!(rAg\RO 0#G !eT Ctftw{۬PbTV#m : vxZZ${D4,8C1P.N ]~Z*KH)IZlj}ر:܅rI,Wz9jt`,5=ZNno7jRu`=ǁ1fZ680%)NK #Uo ~ZIZ@ǎYFcR2 _epvLexkX3dF(2)͗lN qr㖂89iPJ$=|jPK+y%\a^9ihfu|ssZFp \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.gz b/apps/dashboard/build/_app/immutable/chunks/Do8TgQ-j.js.gz deleted file mode 100644 index e29dd4df6d11ae69d19637dfaca110a29fd7f9f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 566 zcmV-60?GX!iwFP!000026LphYYui8&h2Q%tq+pgA7*q!eB{CD?*ttP�e!0!8r0t zR*_eUZnk6Tzn57#ZA#l0eFHml_UH_oEMKy`+!|+AI2V)&#&jdNqgZf5q2P!Xf@i7) z53~|2Xe?OMT5w5A!4+);_w*)M(NOS4M}iTJ1U)(tywXIlp$oxD8|B$@&-*+&`2NML z7q{MzVsDUi{;Y@7_m1(m{NUku{MB|ul?lrvGtL?0G^3IV+}5+)$p-R`*u8HWDAfvG z=04R7rMm3uW2s-e+HgT3yM2lokPjhL3PN`G$?$P-1qJ#Al0m8lNd$Fw!!>W5#5j4= zoLCMj2FUnAd>}HLDoukrOXg1B&%8pH7zA*w)Xa7Vnh*2G*%NEO>%mq;r*zKl{-6#X zr*!_rryzEu5B(_%Y0Avqgi?k3yM`&pfK(|3ky2wRVTy=0heUiwL1O>Ty4O~1kn6I_ zjiY~w1~H%yHVcid|Nn`PSDRgl^g+n@x}``dDAgS@b02r3)=brfc+0uh>!muLg`1r; zyss2AO>ny#n&ok|)TS)FRGYY59QFeMH){$XfD5Y*--UYVg#lP(&5&Ufhw_#?A(i!q35D7n0st%4oqp#ls zdxkj;ky1(4{2AU5Nw>SU2c^=cfu$Fzb?0^N)xL{var f,s;return S(()=>{f=s,s=[],h(()=>{r!==a(...s)&&(i(r,...s),f&&k(a(...f),r)&&i(null,...f))})}),()=>{q(()=>{s&&k(a(...s),r)&&i(null,...s)})}}),r}export{A as b}; +import{k as t,l as S,m as h,q,S as T}from"./BBD-8XME.js";function k(r,i){return r===i||(r==null?void 0:r[T])===i}function A(r={},i,a,c){return t(()=>{var f,s;return S(()=>{f=s,s=[],h(()=>{r!==a(...s)&&(i(r,...s),f&&k(a(...f),r)&&i(null,...f))})}),()=>{q(()=>{s&&k(a(...s),r)&&i(null,...s)})}}),r}export{A as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br new file mode 100644 index 0000000..6dbfbe3 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br @@ -0,0 +1,2 @@ +7 ,o*̾XK*QIk8*oc}CK!4 -nhشۈU7խ׼F@ 3r6JAF͑Q-3,vaA߉ PYkV(Fئ~HyFI$hGD@Z6Hv4<FrZATN-z +: \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..bc7dfd2ffc66324c562b1a6d678a1fb325f2adba GIT binary patch literal 227 zcmV<90381xiwFP!0000216@!%kHRnv-tSlB7^*}v;YLIi5C}%5GMt1MdO$?z3+xmj zmHc;-6m>Xx`0VdtSvJ+JLE9B9CuX4xkUyM)VzD- z$TU#;VY8mqih$Jq0GEEoZ>4fBr6iFg-1s|U4?0N-9tAA`y=Hj01tKAwFNpbjzlH`o d{kKzadpo-GGyZ8A9`fhXuQ%lvH#Il`0091RX1o9Z literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js b/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js deleted file mode 100644 index f86de56..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js +++ /dev/null @@ -1 +0,0 @@ -var Xt=t=>{throw TypeError(t)};var Pe=(t,e,n)=>e.has(t)||Xt("Cannot "+n);var w=(t,e,n)=>(Pe(t,e,"read from private field"),n?n.call(t):e.get(t)),A=(t,e,n)=>e.has(t)?Xt("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{s as T,g as I,h as P,I as pt,b8 as Oe}from"./C9Z4nxhR.js";import{w as jt}from"./DnKV7_Y9.js";import{o as Qt}from"./CkyfbJUz.js";class Nt{constructor(e,n){this.status=e,typeof n=="string"?this.body={message:n}:n?this.body=n:this.body={message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}}class qt{constructor(e,n){this.status=e,this.location=n}}class Dt extends Error{constructor(e,n,r){super(r),this.status=e,this.text=n}}new URL("sveltekit-internal://");function $e(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function Ce(t){return t.split("%25").map(decodeURI).join("%25")}function je(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function Lt({href:t}){return t.split("#")[0]}function Ne(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let a=r.length;for(;a;)e=e*33^r[--a]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function qe(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&W.delete(Vt(t)),De(t,e));const W=new Map;function Ve(t,e){const n=Vt(t,e),r=document.querySelector(n);if(r!=null&&r.textContent){r.remove();let{body:a,...s}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&W.set(n,{body:a,init:s,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(a=qe(a)),Promise.resolve(new Response(a,s))}return window.fetch(t,e)}function ze(t,e,n){if(W.size>0){const r=Vt(t,n),a=W.get(r);if(a){if(performance.now(){const a=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(a)return e.push({name:a[1],matcher:a[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const s=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(s)return e.push({name:s[1],matcher:s[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const o=r.split(/\[(.+?)\](?!\])/);return"/"+o.map((l,c)=>{if(c%2){if(l.startsWith("x+"))return Ut(String.fromCharCode(parseInt(l.slice(2),16)));if(l.startsWith("u+"))return Ut(String.fromCharCode(...l.slice(2).split("-").map(_=>parseInt(_,16))));const d=Be.exec(l),[,u,v,f,h]=d;return e.push({name:f,matcher:h,optional:!!u,rest:!!v,chained:v?c===1&&o[0]==="":!1}),v?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return Ut(l)}).join("")}).join("")}/?$`),params:e}}function Me(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function Fe(t){return t.slice(1).split("/").filter(Me)}function Ge(t,e,n){const r={},a=t.slice(1),s=a.filter(i=>i!==void 0);let o=0;for(let i=0;id).join("/"),o=0),c===void 0)if(l.rest)c="";else continue;if(!l.matcher||n[l.matcher](c)){r[l.name]=c;const d=e[i+1],u=a[i+1];d&&!d.rest&&d.optional&&u&&l.chained&&(o=0),!d&&!u&&Object.keys(r).length===s.length&&(o=0);continue}if(l.optional&&l.chained){o++;continue}return}if(!o)return r}function Ut(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function We({nodes:t,server_loads:e,dictionary:n,matchers:r}){const a=new Set(e);return Object.entries(n).map(([i,[l,c,d]])=>{const{pattern:u,params:v}=Ke(i),f={id:i,exec:h=>{const _=u.exec(h);if(_)return Ge(_,v,r)},errors:[1,...d||[]].map(h=>t[h]),layouts:[0,...c||[]].map(o),leaf:s(l)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function s(i){const l=i<0;return l&&(i=~i),[l,t[i]]}function o(i){return i===void 0?i:[a.has(i),t[i]]}}function ue(t,e=JSON.parse){try{return e(sessionStorage[t])}catch{}}function Zt(t,e,n=JSON.stringify){const r=n(e);try{sessionStorage[t]=r}catch{}}var se;const U=((se=globalThis.__sveltekit_1bqbquz)==null?void 0:se.base)??"/dashboard";var ie;const Ye=((ie=globalThis.__sveltekit_1bqbquz)==null?void 0:ie.assets)??U??"",He="1772569216424",de="sveltekit:snapshot",he="sveltekit:scroll",pe="sveltekit:states",Je="sveltekit:pageurl",M="sveltekit:history",H="sveltekit:navigation",q={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},Et=location.origin;function zt(t){if(t instanceof URL)return t;let e=document.baseURI;if(!e){const n=document.getElementsByTagName("base");e=n.length?n[0].href:document.URL}return new URL(t,e)}function V(){return{x:pageXOffset,y:pageYOffset}}function K(t,e){return t.getAttribute(`data-sveltekit-${e}`)}const te={...q,"":q.hover};function ge(t){let e=t.assignedSlot??t.parentNode;return(e==null?void 0:e.nodeType)===11&&(e=e.host),e}function me(t,e){for(;t&&t!==e;){if(t.nodeName.toUpperCase()==="A"&&t.hasAttribute("href"))return t;t=ge(t)}}function It(t,e,n){let r;try{if(r=new URL(t instanceof SVGAElement?t.href.baseVal:t.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){const i=location.hash.split("#")[1]||"/";r.hash=`#${i}${r.hash}`}}catch{}const a=t instanceof SVGAElement?t.target.baseVal:t.target,s=!r||!!a||St(r,e,n)||(t.getAttribute("rel")||"").split(/\s+/).includes("external"),o=(r==null?void 0:r.origin)===Et&&t.hasAttribute("download");return{url:r,external:s,target:a,download:o}}function gt(t){let e=null,n=null,r=null,a=null,s=null,o=null,i=t;for(;i&&i!==document.documentElement;)r===null&&(r=K(i,"preload-code")),a===null&&(a=K(i,"preload-data")),e===null&&(e=K(i,"keepfocus")),n===null&&(n=K(i,"noscroll")),s===null&&(s=K(i,"reload")),o===null&&(o=K(i,"replacestate")),i=ge(i);function l(c){switch(c){case"":case"true":return!0;case"off":case"false":return!1;default:return}}return{preload_code:te[r??"off"],preload_data:te[a??"off"],keepfocus:l(e),noscroll:l(n),reload:l(s),replace_state:l(o)}}function ee(t){const e=jt(t);let n=!0;function r(){n=!0,e.update(o=>o)}function a(o){n=!1,e.set(o)}function s(o){let i;return e.subscribe(l=>{(i===void 0||n&&l!==i)&&o(i=l)})}return{notify:r,set:a,subscribe:s}}const _e={v:()=>{}};function Xe(){const{set:t,subscribe:e}=jt(!1);let n;async function r(){clearTimeout(n);try{const a=await fetch(`${Ye}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!a.ok)return!1;const o=(await a.json()).version!==He;return o&&(t(!0),_e.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function St(t,e,n){return t.origin!==Et||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function Ln(t){}const we=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...we];const Qe=new Set([...we]);[...Qe];function Ze(t){return t.filter(e=>e!=null)}function Bt(t){return t instanceof Nt||t instanceof Dt?t.status:500}function tn(t){return t instanceof Dt?t.text:"Internal Error"}let R,J,At;const en=Qt.toString().includes("$$")||/function \w+\(\) \{\}/.test(Qt.toString());var et,nt,at,rt,ot,st,it,lt,le,ct,ce,ft,fe;en?(R={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},J={current:null},At={current:!1}):(R=new(le=class{constructor(){A(this,et,T({}));A(this,nt,T(null));A(this,at,T(null));A(this,rt,T({}));A(this,ot,T({id:null}));A(this,st,T({}));A(this,it,T(-1));A(this,lt,T(new URL("https://example.com")))}get data(){return I(w(this,et))}set data(e){P(w(this,et),e)}get form(){return I(w(this,nt))}set form(e){P(w(this,nt),e)}get error(){return I(w(this,at))}set error(e){P(w(this,at),e)}get params(){return I(w(this,rt))}set params(e){P(w(this,rt),e)}get route(){return I(w(this,ot))}set route(e){P(w(this,ot),e)}get state(){return I(w(this,st))}set state(e){P(w(this,st),e)}get status(){return I(w(this,it))}set status(e){P(w(this,it),e)}get url(){return I(w(this,lt))}set url(e){P(w(this,lt),e)}},et=new WeakMap,nt=new WeakMap,at=new WeakMap,rt=new WeakMap,ot=new WeakMap,st=new WeakMap,it=new WeakMap,lt=new WeakMap,le),J=new(ce=class{constructor(){A(this,ct,T(null))}get current(){return I(w(this,ct))}set current(e){P(w(this,ct),e)}},ct=new WeakMap,ce),At=new(fe=class{constructor(){A(this,ft,T(!1))}get current(){return I(w(this,ft))}set current(e){P(w(this,ft),e)}},ft=new WeakMap,fe),_e.v=()=>At.current=!0);function nn(t){Object.assign(R,t)}const an=new Set(["icon","shortcut icon","apple-touch-icon"]),j=ue(he)??{},X=ue(de)??{},C={url:ee({}),page:ee({}),navigating:jt(null),updated:Xe()};function Kt(t){j[t]=V()}function rn(t,e){let n=t+1;for(;j[n];)delete j[n],n+=1;for(n=e+1;X[n];)delete X[n],n+=1}function Q(t,e=!1){return e?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function ve(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(U||"/");t&&await t.update()}}function ne(){}let Mt,Pt,mt,O,Ot,E;const _t=[],wt=[];let y=null;function $t(){var t;(t=y==null?void 0:y.fork)==null||t.then(e=>e==null?void 0:e.discard()),y=null}const ht=new Map,ye=new Set,on=new Set,Y=new Set;let m={branch:[],error:null,url:null},be=!1,vt=!1,ae=!0,Z=!1,G=!1,ke=!1,Ft=!1,Ee,k,L,D;const yt=new Set,re=new Map;async function In(t,e,n){var s,o,i,l,c;(s=globalThis.__sveltekit_1bqbquz)!=null&&s.data&&globalThis.__sveltekit_1bqbquz.data,document.URL!==location.href&&(location.href=location.href),E=t,await((i=(o=t.hooks).init)==null?void 0:i.call(o)),Mt=We(t),O=document.documentElement,Ot=e,Pt=t.nodes[0],mt=t.nodes[1],Pt(),mt(),k=(l=history.state)==null?void 0:l[M],L=(c=history.state)==null?void 0:c[H],k||(k=L=Date.now(),history.replaceState({...history.state,[M]:k,[H]:L},""));const r=j[k];function a(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}n?(a(),await vn(Ot,n)):(await F({type:"enter",url:zt(E.hash?kn(new URL(location.href)):location.href),replace_state:!0}),a()),wn()}function sn(){_t.length=0,Ft=!1}function Se(t){wt.some(e=>e==null?void 0:e.snapshot)&&(X[t]=wt.map(e=>{var n;return(n=e==null?void 0:e.snapshot)==null?void 0:n.capture()}))}function Re(t){var e;(e=X[t])==null||e.forEach((n,r)=>{var a,s;(s=(a=wt[r])==null?void 0:a.snapshot)==null||s.restore(n)})}function oe(){Kt(k),Zt(he,j),Se(L),Zt(de,X)}async function xe(t,e,n,r){let a;e.invalidateAll&&$t(),await F({type:"goto",url:zt(t),keepfocus:e.keepFocus,noscroll:e.noScroll,replace_state:e.replaceState,state:e.state,redirect_count:n,nav_token:r,accept:()=>{e.invalidateAll&&(Ft=!0,a=[...re.keys()]),e.invalidate&&e.invalidate.forEach(_n)}}),e.invalidateAll&&pt().then(pt).then(()=>{re.forEach(({resource:s},o)=>{var i;a!=null&&a.includes(o)&&((i=s.refresh)==null||i.call(s))})})}async function ln(t){if(t.id!==(y==null?void 0:y.id)){$t();const e={};yt.add(e),y={id:t.id,token:e,promise:Ue({...t,preload:e}).then(n=>(yt.delete(e),n.type==="loaded"&&n.state.error&&$t(),n)),fork:null}}return y.promise}async function Tt(t){var n;const e=(n=await Rt(t,!1))==null?void 0:n.route;e&&await Promise.all([...e.layouts,e.leaf].filter(Boolean).map(r=>r[1]()))}async function Le(t,e,n){var a;m=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(R,t.props.page),Ee=new E.root({target:e,props:{...t.props,stores:C,components:wt},hydrate:n,sync:!1}),await Promise.resolve(),Re(L),n){const s={from:null,to:{params:m.params,route:{id:((a=m.route)==null?void 0:a.id)??null},url:new URL(location.href),scroll:j[k]??V()},willUnload:!1,type:"enter",complete:Promise.resolve()};Y.forEach(o=>o(s))}vt=!0}function bt({url:t,params:e,branch:n,status:r,error:a,route:s,form:o}){let i="never";if(U&&(t.pathname===U||t.pathname===U+"/"))i="always";else for(const f of n)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=$e(t.pathname,i),t.search=t.search;const l={type:"loaded",state:{url:t,params:e,branch:n,error:a,route:s},props:{constructors:Ze(n).map(f=>f.node.component),page:Jt(R)}};o!==void 0&&(l.props.form=o);let c={},d=!R,u=0;for(let f=0;fi(new URL(o))))return!0;return!1}function Wt(t,e){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?e??null:null}function un(t,e){if(!t)return new Set(e.searchParams.keys());const n=new Set([...t.searchParams.keys(),...e.searchParams.keys()]);for(const r of n){const a=t.searchParams.getAll(r),s=e.searchParams.getAll(r);a.every(o=>s.includes(o))&&s.every(o=>a.includes(o))&&n.delete(r)}return n}function dn({error:t,url:e,route:n,params:r}){return{type:"loaded",state:{error:t,url:e,route:n,params:r,branch:[]},props:{page:Jt(R),constructors:[]}}}async function Ue({id:t,invalidating:e,url:n,params:r,route:a,preload:s}){if((y==null?void 0:y.id)===t)return yt.delete(y.token),y.promise;const{errors:o,layouts:i,leaf:l}=a,c=[...i,l];o.forEach(g=>g==null?void 0:g().catch(()=>{})),c.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));const d=m.url?t!==kt(m.url):!1,u=m.route?a.id!==m.route.id:!1,v=un(m.url,n);let f=!1;const h=c.map(async(g,p)=>{var $;if(!g)return;const b=m.branch[p];return g[1]===(b==null?void 0:b.loader)&&!fn(f,u,d,v,($=b.universal)==null?void 0:$.uses,r)?b:(f=!0,Gt({loader:g[1],url:n,params:r,route:a,parent:async()=>{var ut;const N={};for(let z=0;z{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:Wt(s)}),i={node:await mt(),loader:mt,universal:null,server:null,data:null};return bt({url:n,params:a,branch:[o,i],status:t,error:e,route:null})}catch(o){if(o instanceof qt)return xe(new URL(o.location,location.href),{},0);throw o}}async function pn(t){const e=t.href;if(ht.has(e))return ht.get(e);let n;try{const r=(async()=>{let a=await E.hooks.reroute({url:new URL(t),fetch:async(s,o)=>cn(s,o,t).promise})??t;if(typeof a=="string"){const s=new URL(t);E.hash?s.hash=a:s.pathname=a,a=s}return a})();ht.set(e,r),n=await r}catch{ht.delete(e);return}return n}async function Rt(t,e){if(t&&!St(t,U,E.hash)){const n=await pn(t);if(!n)return;const r=gn(n);for(const a of Mt){const s=a.exec(r);if(s)return{id:kt(t),invalidating:e,route:a,params:je(s),url:t}}}}function gn(t){return Ce(E.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(U.length))||"/"}function kt(t){return(E.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Ae({url:t,type:e,intent:n,delta:r,event:a,scroll:s}){let o=!1;const i=Ht(m,n,t,e,s??null);r!==void 0&&(i.navigation.delta=r),a!==void 0&&(i.navigation.event=a);const l={...i.navigation,cancel:()=>{o=!0,i.reject(new Error("navigation cancelled"))}};return Z||ye.forEach(c=>c(l)),o?null:i}async function F({type:t,url:e,popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o={},redirect_count:i=0,nav_token:l={},accept:c=ne,block:d=ne,event:u}){var z;const v=D;D=l;const f=await Rt(e,!1),h=t==="enter"?Ht(m,f,e,t):Ae({url:e,type:t,delta:n==null?void 0:n.delta,intent:f,scroll:n==null?void 0:n.scroll,event:u});if(!h){d(),D===l&&(D=v);return}const _=k,g=L;c(),Z=!0,vt&&h.navigation.type!=="enter"&&C.navigating.set(J.current=h.navigation);let p=f&&await Ue(f);if(!p){if(St(e,U,E.hash))return await Q(e,s);p=await Te(e,{id:null},await tt(new Dt(404,"Not Found",`Not found: ${e.pathname}`),{url:e,params:{},route:{id:null}}),404,s)}if(e=(f==null?void 0:f.url)||e,D!==l)return h.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await F({type:t,url:new URL(p.location,e),popped:n,keepfocus:r,noscroll:a,replace_state:s,state:o,redirect_count:i+1,nav_token:l}),h.fulfil(void 0);return}p=await Yt({status:500,error:await tt(new Error("Redirect loop"),{url:e,params:{},route:{id:null}}),url:e,route:{id:null}})}else p.props.page.status>=400&&await C.updated.check()&&(await ve(),await Q(e,s));if(sn(),Kt(_),Se(g),p.props.page.url.pathname!==e.pathname&&(e.pathname=p.props.page.url.pathname),o=n?n.state:o,!n){const S=s?0:1,dt={[M]:k+=S,[H]:L+=S,[pe]:o};(s?history.replaceState:history.pushState).call(history,dt,"",e),s||rn(k,L)}const b=f&&(y==null?void 0:y.id)===f.id?y.fork:null;y=null,p.props.page.state=o;let x;if(vt){const S=(await Promise.all(Array.from(on,B=>B(h.navigation)))).filter(B=>typeof B=="function");if(S.length>0){let B=function(){S.forEach(xt=>{Y.delete(xt)})};S.push(B),S.forEach(xt=>{Y.add(xt)})}m=p.state,p.props.page&&(p.props.page.url=e);const dt=b&&await b;dt?x=dt.commit():(Ee.$set(p.props),nn(p.props.page),x=(z=Oe)==null?void 0:z()),ke=!0}else await Le(p,Ot,!1);const{activeElement:$}=document;await x,await pt(),await pt();let N=null;if(ae){const S=n?n.scroll:a?V():null;S?scrollTo(S.x,S.y):(N=e.hash&&document.getElementById(Ie(e)))?N.scrollIntoView():scrollTo(0,0)}const ut=document.activeElement!==$&&document.activeElement!==document.body;!r&&!ut&&bn(e,!N),ae=!0,p.props.page&&Object.assign(R,p.props.page),Z=!1,t==="popstate"&&Re(L),h.fulfil(void 0),h.navigation.to&&(h.navigation.to.scroll=V()),Y.forEach(S=>S(h.navigation)),C.navigating.set(J.current=null)}async function Te(t,e,n,r,a){return t.origin===Et&&t.pathname===location.pathname&&!be?await Yt({status:r,error:n,url:t,route:e}):await Q(t,a)}function mn(){let t,e={element:void 0,href:void 0},n;O.addEventListener("mousemove",i=>{const l=i.target;clearTimeout(t),t=setTimeout(()=>{s(l,q.hover)},20)});function r(i){i.defaultPrevented||s(i.composedPath()[0],q.tap)}O.addEventListener("mousedown",r),O.addEventListener("touchstart",r,{passive:!0});const a=new IntersectionObserver(i=>{for(const l of i)l.isIntersecting&&(Tt(new URL(l.target.href)),a.unobserve(l.target))},{threshold:0});async function s(i,l){const c=me(i,O),d=c===e.element&&(c==null?void 0:c.href)===e.href&&l>=n;if(!c||d)return;const{url:u,external:v,download:f}=It(c,U,E.hash);if(v||f)return;const h=gt(c),_=u&&kt(m.url)===kt(u);if(!(h.reload||_))if(l<=h.preload_data){e={element:c,href:c.href},n=q.tap;const g=await Rt(u,!1);if(!g)return;ln(g)}else l<=h.preload_code&&(e={element:c,href:c.href},n=l,Tt(u))}function o(){a.disconnect();for(const i of O.querySelectorAll("a")){const{url:l,external:c,download:d}=It(i,U,E.hash);if(c||d)continue;const u=gt(i);u.reload||(u.preload_code===q.viewport&&a.observe(i),u.preload_code===q.eager&&Tt(l))}}Y.add(o),o()}function tt(t,e){if(t instanceof Nt)return t.body;const n=Bt(t),r=tn(t);return E.hooks.handleError({error:t,event:e,status:n,message:r})??{message:r}}function Pn(t,e={}){return t=new URL(zt(t)),t.origin!==Et?Promise.reject(new Error("goto: invalid URL")):xe(t,e,0)}function _n(t){if(typeof t=="function")_t.push(t);else{const{href:e}=new URL(t,location.href);_t.push(n=>n.href===e)}}function wn(){var e;history.scrollRestoration="manual",addEventListener("beforeunload",n=>{let r=!1;if(oe(),!Z){const a=Ht(m,void 0,null,"leave"),s={...a.navigation,cancel:()=>{r=!0,a.reject(new Error("navigation cancelled"))}};ye.forEach(o=>o(s))}r?(n.preventDefault(),n.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&oe()}),(e=navigator.connection)!=null&&e.saveData||mn(),O.addEventListener("click",async n=>{if(n.button||n.which!==1||n.metaKey||n.ctrlKey||n.shiftKey||n.altKey||n.defaultPrevented)return;const r=me(n.composedPath()[0],O);if(!r)return;const{url:a,external:s,target:o,download:i}=It(r,U,E.hash);if(!a)return;if(o==="_parent"||o==="_top"){if(window.parent!==window)return}else if(o&&o!=="_self")return;const l=gt(r);if(!(r instanceof SVGAElement)&&a.protocol!==location.protocol&&!(a.protocol==="https:"||a.protocol==="http:")||i)return;const[d,u]=(E.hash?a.hash.replace(/^#/,""):a.href).split("#"),v=d===Lt(location);if(s||l.reload&&(!v||!u)){Ae({url:a,type:"link",event:n})?Z=!0:n.preventDefault();return}if(u!==void 0&&v){const[,f]=m.url.href.split("#");if(f===u){if(n.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const h=r.ownerDocument.getElementById(decodeURIComponent(u));h&&(h.scrollIntoView(),h.focus())}return}if(G=!0,Kt(k),t(a),!l.replace_state)return;G=!1}n.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await F({type:"link",url:a,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??a.href===location.href,event:n})}),O.addEventListener("submit",n=>{if(n.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(n.target),a=n.submitter;if(((a==null?void 0:a.formTarget)||r.target)==="_blank"||((a==null?void 0:a.formMethod)||r.method)!=="get")return;const i=new URL((a==null?void 0:a.hasAttribute("formaction"))&&(a==null?void 0:a.formAction)||r.action);if(St(i,U,!1))return;const l=n.target,c=gt(l);if(c.reload)return;n.preventDefault(),n.stopPropagation();const d=new FormData(l,a);i.search=new URLSearchParams(d).toString(),F({type:"form",url:i,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??i.href===location.href,event:n})}),addEventListener("popstate",async n=>{var r;if(!Ct){if((r=n.state)!=null&&r[M]){const a=n.state[M];if(D={},a===k)return;const s=j[a],o=n.state[pe]??{},i=new URL(n.state[Je]??location.href),l=n.state[H],c=m.url?Lt(location)===Lt(m.url):!1;if(l===L&&(ke||c)){o!==R.state&&(R.state=o),t(i),j[k]=V(),s&&scrollTo(s.x,s.y),k=a;return}const u=a-k;await F({type:"popstate",url:i,popped:{state:o,scroll:s,delta:u},accept:()=>{k=a,L=l},block:()=>{history.go(-u)},nav_token:D,event:n})}else if(!G){const a=new URL(location.href);t(a),E.hash&&location.reload()}}}),addEventListener("hashchange",()=>{G&&(G=!1,history.replaceState({...history.state,[M]:++k,[H]:L},"",location.href))});for(const n of document.querySelectorAll("link"))an.has(n.rel)&&(n.href=n.href);addEventListener("pageshow",n=>{n.persisted&&C.navigating.set(J.current=null)});function t(n){m.url=R.url=n,C.page.set(Jt(R)),C.page.notify()}}async function vn(t,{status:e=200,error:n,node_ids:r,params:a,route:s,server_route:o,data:i,form:l}){be=!0;const c=new URL(location.href);let d;({params:a={},route:s={id:null}}=await Rt(c,!1)||{}),d=Mt.find(({id:f})=>f===s.id);let u,v=!0;try{const f=r.map(async(_,g)=>{const p=i[g];return p!=null&&p.uses&&(p.uses=yn(p.uses)),Gt({loader:E.nodes[_],url:c,params:a,route:s,parent:async()=>{const b={};for(let x=0;x{const i=history.state;Ct=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(i,"",t),e&&scrollTo(s,o),Ct=!1})}else{const s=document.body,o=s.getAttribute("tabindex");s.tabIndex=-1,s.focus({preventScroll:!0,focusVisible:!1}),o!==null?s.setAttribute("tabindex",o):s.removeAttribute("tabindex")}const a=getSelection();if(a&&a.type!=="None"){const s=[];for(let o=0;o{if(a.rangeCount===s.length){for(let o=0;o{s=u,o=v});return i.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((c=t.route)==null?void 0:c.id)??null},url:t.url,scroll:V()},to:n&&{params:(e==null?void 0:e.params)??null,route:{id:((d=e==null?void 0:e.route)==null?void 0:d.id)??null},url:n,scroll:a},willUnload:!e,type:r,complete:i},fulfil:s,reject:o}}function Jt(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function kn(t){const e=new URL(t);return e.hash=decodeURIComponent(t.hash),e}function Ie(t){let e;if(E.hash){const[,,n]=t.hash.split("#",3);e=n??""}else e=t.hash.slice(1);return decodeURIComponent(e)}export{In as a,U as b,Pn as g,Ln as l,R as p,C as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.br b/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.br deleted file mode 100644 index 2eab214dd207ae64b678770d9537d6473e4e2de6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9689 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 bAD%W=oH;cLjy@B|`K4R&{MpH8N=Ez#-)P$l diff --git a/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.gz b/apps/dashboard/build/_app/immutable/chunks/DunNqS1N.js.gz deleted file mode 100644 index 8720c6850b6788913d141f548525ba2d4c507a4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10701 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 diff --git a/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.br b/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.br deleted file mode 100644 index 4ab9609b567b2e05d335b9637fe887443523fe04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415 zcmV;Q0bu?cGXo$T2X+iS+KAn8t5sG1K3A-RAW=fSGZ=M`ubZ*uELj;I*`31D(K5qPfU^vz z|D4XiUFgor1ylIqx3akUu9nF{?$eYHIQSTi4!|o;4 J?kX_CyGO`z&`kgU diff --git a/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.gz b/apps/dashboard/build/_app/immutable/chunks/P9ZHwQBL.js.gz deleted file mode 100644 index 90c838cee81684b8b52ff67715ce63fbcc7f807f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 459 zcmV;+0W|&}iwFP!000026Kzw=Zrd;ry!R_)9taX$u$NwHW1~Z0pbzBI04>lDNd1Qhzs3z1URI6`|=|wp9!kB3k`Akk2Y~{G9z{`hCw~(<%nhxP1%) zs6V(O^LR7!2z}0`_`Qbn}{d8(aK{$HRP8m08IAfM8lBSFNnD`Lwo7%D1C63o)3vxnVNb< zT6+%ByD3>q=@IebKaOm|VV^`rNr8owD=+2hJcz$cCFOY^KJ7zKdOE+mBtH9FJSuLE zu9;2JF19=NVjSm_C-=zWa<@x&7y8_Z$Ws#Q_dM~-{71I)ub4LP{s1u4j$1SX003Wm B+@$~j diff --git a/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js b/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js similarity index 70% rename from apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js rename to apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js index 658f7b1..7cac585 100644 --- a/apps/dashboard/build/_app/immutable/chunks/C2oj68pw.js +++ b/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js @@ -1 +1 @@ -import{b as T,J as o,a0 as b,E as h,a1 as p,a2 as A,a3 as E,a4 as R,a5 as g,a6 as l}from"./C9Z4nxhR.js";import{B as v}from"./CY4crMrT.js";function S(t,u,_=!1){o&&b();var n=new v(t),c=_?h:0;function i(a,r){if(o){const e=p(t);var s;if(e===A?s=0:e===E?s=!1:s=parseInt(e.substring(1)),a!==s){var f=R();g(f),n.anchor=f,l(!1),n.ensure(a,r),l(!0);return}}n.ensure(a,r)}T(()=>{var a=!1;u((r,s=0)=>{a=!0,i(s,r)}),a||i(!1,null)},c)}export{S as i}; +import{b as T,J as o,a0 as b,E as h,a1 as p,a2 as A,a3 as E,a4 as R,a5 as g,a6 as l}from"./BBD-8XME.js";import{B as v}from"./gqVpgJ8U.js";function S(t,u,_=!1){o&&b();var n=new v(t),c=_?h:0;function i(a,r){if(o){const e=p(t);var s;if(e===A?s=0:e===E?s=!1:s=parseInt(e.substring(1)),a!==s){var f=R();g(f),n.anchor=f,l(!1),n.ensure(a,r),l(!0);return}}n.ensure(a,r)}T(()=>{var a=!1;u((r,s=0)=>{a=!0,i(s,r)}),a||i(!1,null)},c)}export{S as i}; diff --git a/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.br b/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.br new file mode 100644 index 0000000000000000000000000000000000000000..3beee39a64794fa8c9521e6cee2a9b5d9b5d96f5 GIT binary patch literal 287 zcmV+)0pR`{wE+l>lr9g{ZT07$uDfM2lM<=*d8_f@RtOt&W5sEDS-_CSsWhrsD)urS z4QhM(XMbzwU=n3=IguZPH>_kJb#m=c&GG_c8&)^Wpbs7)s%w3kDY>PS%=X<8sd zM`Z1rC*!9t8f!FKk^KL-9la>NQadzso#Y(fzpvvU|D($N{sk&&v}Bn;=NSrZK!1OD z@MCWX9aN-vSv?iwxu4IlrVl#j13b~WxZV?cet}xSQc4LIduFaz6^<7pOuLeaqQbK{ z?#HlCAd-?<(MavU3&4`k4@gIq)aC=-Kqi2+{-O{e81ci9v*$5g?;8NQQuun!GEve1 lKBRCQ@*s`V85I5kN!LAtOwdLS(4)|Mq7gb@;)8$3D*;KDi6a02 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.gz b/apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..51ba4d89aec3c4b65ac93ae37f341c941e65a2b1 GIT binary patch literal 322 zcmV-I0loeoiwFP!00002167bsOT$1AhVTB0w1=__V@&*_B&?;y94vTgt9UD$ut`_a z-MAlBNb}#_iHLZ5hIihXc^P@^v~hhIaU1PmjnKdoWC;c006ax@z^{=@;5Wzu_$_h+ z{0`Xwzel!1ZS-*(U#(V;m-DyhB7V2iT>jiyq2u)HXg*%MW<7ry9ko}LlUhYv;=se6 zO;XzH*{mcqKXDT&ro?A-B921E_KQQ7{EbM$!O&jTMAN>~%DPCfE?CD&n}>#Aj4cx~!#pq9|w2S(Ԝ w[V?O`K5|MMrZ>/_Wl"?"_+*mk:ȼ +C5sm?BC9òx&y I vt\gνu}!x*j斨L5M!eSO1*HJo$VߛJ H)i',W8\YEt7rDLp<>-, Ekx@쪹I -7Qh>i'T$iJӜ8,\Z?B-쐌;Mu@PhH}n#*COROdJbϹ,"Dɢ6/zdZ(B5@M#[ O/s噬S,^޲/^XV"JFHIf%m2[~9 \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js.gz b/apps/dashboard/build/_app/immutable/chunks/ZesQ8l8p.js.gz deleted file mode 100644 index 30a577261f8d0fb98c401d27f03a7174d6b15d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmV-00?+*)iwFP!000026J1lmZrd;nz3(d=9SjlBybai8F}R=@cIeh+SlV6|1cB<% zu~u91C^>79_}>RPN!|AJY(DalkDyG`Iu849iS~(6eGwzbP%W}QUgU+dJ|uIzer)bsErsz((fQz-glcNY1_A2kIa`IM z7NBaZW}-IsUQET+<@~$I%gz?TIGbEchP^4Jf&ET%;&Jjp5lX<%F*@-B>2dO2aaL)6 z5dxdLE|3&EU3VnlSf`P*A&>{j>clDA)itOSgSt1Re63PcRNT|%tmBZgQ|PF4=AX1q z0d#%e=bWwA&aN3rZ6txR68iqhTNLn$ls;>>k|8%~D&5krkh3j?aTE{ABckwJh{NIh z=_#E5DyCATDQDJgXs#PV#2OBVC^kVniV~!$9MWs2H^y#7no3^oBBKZ~+L&?1)VLiz zZ$1r=Ex9tG2?`(hSa~HGGGmLn+mM$YW<2zma^_!*t_WcC9c}KJLdQ0V8`9@QKby&y z0o*U=tLbQIY$o0cP|KTv)D8Jo7j(P0M8vL#KJK$XOaGD|x*e}6&U?C}SKAfF3pgCc zPKvOIDbho3N=a}UnDQc;i=J?~g1mGrhYM2&f;`퇇 zD- ^vpkwB.H8P^N \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js.gz b/apps/dashboard/build/_app/immutable/chunks/_Va07L2l.js.gz deleted file mode 100644 index 9e03ee6c9136469d4ccf12eb2ec16b996c692c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmBViwFP!000026J?T3YQr!Ph4(#$oQ2VlK~15XBBqP>23Y2wX!fUnmCP4 zcP0u?66m>+tODe2ggM)eb{J?*dcERE7n$dlUPr~lw?7iApsgR}T3gXNF~YdFhk_{V z?V&7X7RnZORO~>nbkUWi+iuY%(CZR|JVG++q&nm3*p%hR%A6#l2W+KLCrE(RYOh2` z{Zbm$tDXmWf*-&#^tW0N-UeDK(zUZYg3j%LP~%}@h`mk2WLo-elwnAM20y> nraBeik7P1wH3w-xvxIb&pv`Uh0k`FulfL@`6c0UU5&{4KABUku diff --git a/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js b/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js new file mode 100644 index 0000000..cbeecd4 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js @@ -0,0 +1 @@ +import{I as J,b8 as ee}from"./BBD-8XME.js";import{w as ae}from"./Br8WXJxx.js";import{c as ne,H as N,N as B,r as gt,i as _t,b as L,s as j,p as x,n as ft,f as $t,g as ut,a as X,d as it,S as Nt,P as re,e as oe,h as se,o as Dt,j as q,k as ie,l as qt,m as ce,q as le,t as Kt,u as Pt,v as fe}from"./BeSd-T80.js";class wt{constructor(a,e){this.status=a,typeof e=="string"?this.body={message:e}:e?this.body=e:this.body={message:`Error: ${a}`}}toString(){return JSON.stringify(this.body)}}class vt{constructor(a,e){this.status=a,this.location=e}}class yt extends Error{constructor(a,e,r){super(r),this.status=a,this.text=e}}const ue=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function he(t){const a=[];return{pattern:t==="/"?/^\/$/:new RegExp(`^${pe(t).map(r=>{const n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(n)return a.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return a.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const s=r.split(/\[(.+?)\](?!\])/);return"/"+s.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ct(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ct(String.fromCharCode(...c.slice(2).split("-").map(_=>parseInt(_,16))));const h=ue.exec(c),[,u,w,f,d]=h;return a.push({name:f,matcher:d,optional:!!u,rest:!!w,chained:w?l===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ct(c)}).join("")}).join("")}/?$`),params:a}}function de(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function pe(t){return t.slice(1).split("/").filter(de)}function me(t,a,e){const r={},n=t.slice(1),o=n.filter(i=>i!==void 0);let s=0;for(let i=0;ih).join("/"),s=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||e[c.matcher](l)){r[c.name]=l;const h=a[i+1],u=n[i+1];h&&!h.rest&&h.optional&&u&&c.chained&&(s=0),!h&&!u&&Object.keys(r).length===o.length&&(s=0);continue}if(c.optional&&c.chained){s++;continue}return}if(!s)return r}function ct(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function ge({nodes:t,server_loads:a,dictionary:e,matchers:r}){const n=new Set(a);return Object.entries(e).map(([i,[c,l,h]])=>{const{pattern:u,params:w}=he(i),f={id:i,exec:d=>{const _=u.exec(d);if(_)return me(_,w,r)},errors:[1,...h||[]].map(d=>t[d]),layouts:[0,...l||[]].map(s),leaf:o(c)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function o(i){const c=i<0;return c&&(i=~i),[c,t[i]]}function s(i){return i===void 0?i:[n.has(i),t[i]]}}function Ft(t,a=JSON.parse){try{return a(sessionStorage[t])}catch{}}function It(t,a,e=JSON.stringify){const r=e(a);try{sessionStorage[t]=r}catch{}}function _e(t){return t.filter(a=>a!=null)}function Et(t){return t instanceof wt||t instanceof yt?t.status:500}function we(t){return t instanceof yt?t.text:"Internal Error"}const ve=new Set(["icon","shortcut icon","apple-touch-icon"]),I=Ft(Kt)??{},M=Ft(qt)??{},P={url:Pt({}),page:Pt({}),navigating:ae(null),updated:ne()};function bt(t){I[t]=j()}function ye(t,a){let e=t+1;for(;I[e];)delete I[e],e+=1;for(e=a+1;M[e];)delete M[e],e+=1}function V(t,a=!1){return a?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Bt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}function Tt(){}let kt,ht,Q,U,dt,b;const Z=[],tt=[];let v=null;function pt(){var t;(t=v==null?void 0:v.fork)==null||t.then(a=>a==null?void 0:a.discard()),v=null}const G=new Map,Mt=new Set,Ee=new Set,F=new Set;let g={branch:[],error:null,url:null},Vt=!1,et=!1,Ot=!0,H=!1,K=!1,Ht=!1,St=!1,Yt,E,R,O;const at=new Set,jt=new Map;async function Fe(t,a,e){var o,s,i,c,l;(o=globalThis.__sveltekit_6jo0pm)!=null&&o.data&&globalThis.__sveltekit_6jo0pm.data,document.URL!==location.href&&(location.href=location.href),b=t,await((i=(s=t.hooks).init)==null?void 0:i.call(s)),kt=ge(t),U=document.documentElement,dt=a,ht=t.nodes[0],Q=t.nodes[1],ht(),Q(),E=(c=history.state)==null?void 0:c[N],R=(l=history.state)==null?void 0:l[B],E||(E=R=Date.now(),history.replaceState({...history.state,[N]:E,[B]:R},""));const r=I[E];function n(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}e?(n(),await je(dt,e)):(await D({type:"enter",url:gt(b.hash?Ne(new URL(location.href)):location.href),replace_state:!0}),n()),Oe()}function be(){Z.length=0,St=!1}function zt(t){tt.some(a=>a==null?void 0:a.snapshot)&&(M[t]=tt.map(a=>{var e;return(e=a==null?void 0:a.snapshot)==null?void 0:e.capture()}))}function Wt(t){var a;(a=M[t])==null||a.forEach((e,r)=>{var n,o;(o=(n=tt[r])==null?void 0:n.snapshot)==null||o.restore(e)})}function Ct(){bt(E),It(Kt,I),zt(R),It(qt,M)}async function Gt(t,a,e,r){let n;a.invalidateAll&&pt(),await D({type:"goto",url:gt(t),keepfocus:a.keepFocus,noscroll:a.noScroll,replace_state:a.replaceState,state:a.state,redirect_count:e,nav_token:r,accept:()=>{a.invalidateAll&&(St=!0,n=[...jt.keys()]),a.invalidate&&a.invalidate.forEach(Te)}}),a.invalidateAll&&J().then(J).then(()=>{jt.forEach(({resource:o},s)=>{var i;n!=null&&n.includes(s)&&((i=o.refresh)==null||i.call(o))})})}async function ke(t){if(t.id!==(v==null?void 0:v.id)){pt();const a={};at.add(a),v={id:t.id,token:a,promise:Xt({...t,preload:a}).then(e=>(at.delete(a),e.type==="loaded"&&e.state.error&&pt(),e)),fork:null}}return v.promise}async function lt(t){var e;const a=(e=await ot(t,!1))==null?void 0:e.route;a&&await Promise.all([...a.layouts,a.leaf].filter(Boolean).map(r=>r[1]()))}async function Jt(t,a,e){var n;g=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(x,t.props.page),Yt=new b.root({target:a,props:{...t.props,stores:P,components:tt},hydrate:e,sync:!1}),await Promise.resolve(),Wt(R),e){const o={from:null,to:{params:g.params,route:{id:((n=g.route)==null?void 0:n.id)??null},url:new URL(location.href),scroll:I[E]??j()},willUnload:!1,type:"enter",complete:Promise.resolve()};F.forEach(s=>s(o))}et=!0}function nt({url:t,params:a,branch:e,status:r,error:n,route:o,form:s}){let i="never";if(L&&(t.pathname===L||t.pathname===L+"/"))i="always";else for(const f of e)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=se(t.pathname,i),t.search=t.search;const c={type:"loaded",state:{url:t,params:a,branch:e,error:n,route:o},props:{constructors:_e(e).map(f=>f.node.component),page:At(x)}};s!==void 0&&(c.props.form=s);let l={},h=!x,u=0;for(let f=0;fi(new URL(s))))return!0;return!1}function xt(t,a){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?a??null:null}function xe(t,a){if(!t)return new Set(a.searchParams.keys());const e=new Set([...t.searchParams.keys(),...a.searchParams.keys()]);for(const r of e){const n=t.searchParams.getAll(r),o=a.searchParams.getAll(r);n.every(s=>o.includes(s))&&o.every(s=>n.includes(s))&&e.delete(r)}return e}function Le({error:t,url:a,route:e,params:r}){return{type:"loaded",state:{error:t,url:a,route:e,params:r,branch:[]},props:{page:At(x),constructors:[]}}}async function Xt({id:t,invalidating:a,url:e,params:r,route:n,preload:o}){if((v==null?void 0:v.id)===t)return at.delete(v.token),v.promise;const{errors:s,layouts:i,leaf:c}=n,l=[...i,c];s.forEach(m=>m==null?void 0:m().catch(()=>{})),l.forEach(m=>m==null?void 0:m[1]().catch(()=>{}));const h=g.url?t!==rt(g.url):!1,u=g.route?n.id!==g.route.id:!1,w=xe(g.url,e);let f=!1;const d=l.map(async(m,p)=>{var A;if(!m)return;const y=g.branch[p];return m[1]===(y==null?void 0:y.loader)&&!Re(f,u,h,w,(A=y.universal)==null?void 0:A.uses,r)?y:(f=!0,Rt({loader:m[1],url:e,params:r,route:n,parent:async()=>{var z;const T={};for(let C=0;C{});const _=[];for(let m=0;mPromise.resolve({}),server_data_node:xt(o)}),i={node:await Q(),loader:Q,universal:null,server:null,data:null};return nt({url:e,params:n,branch:[s,i],status:t,error:a,route:null})}catch(s){if(s instanceof vt)return Gt(new URL(s.location,location.href),{},0);throw s}}async function Ae(t){const a=t.href;if(G.has(a))return G.get(a);let e;try{const r=(async()=>{let n=await b.hooks.reroute({url:new URL(t),fetch:async(o,s)=>Se(o,s,t).promise})??t;if(typeof n=="string"){const o=new URL(t);b.hash?o.hash=n:o.pathname=n,n=o}return n})();G.set(a,r),e=await r}catch{G.delete(a);return}return e}async function ot(t,a){if(t&&!_t(t,L,b.hash)){const e=await Ae(t);if(!e)return;const r=Pe(e);for(const n of kt){const o=n.exec(r);if(o)return{id:rt(t),invalidating:a,route:n,params:oe(o),url:t}}}}function Pe(t){return ie(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function rt(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Qt({url:t,type:a,intent:e,delta:r,event:n,scroll:o}){let s=!1;const i=Ut(g,e,t,a,o??null);r!==void 0&&(i.navigation.delta=r),n!==void 0&&(i.navigation.event=n);const c={...i.navigation,cancel:()=>{s=!0,i.reject(new Error("navigation cancelled"))}};return H||Mt.forEach(l=>l(c)),s?null:i}async function D({type:t,url:a,popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s={},redirect_count:i=0,nav_token:c={},accept:l=Tt,block:h=Tt,event:u}){var C;const w=O;O=c;const f=await ot(a,!1),d=t==="enter"?Ut(g,f,a,t):Qt({url:a,type:t,delta:e==null?void 0:e.delta,intent:f,scroll:e==null?void 0:e.scroll,event:u});if(!d){h(),O===c&&(O=w);return}const _=E,m=R;l(),H=!0,et&&d.navigation.type!=="enter"&&P.navigating.set(ft.current=d.navigation);let p=f&&await Xt(f);if(!p){if(_t(a,L,b.hash))return await V(a,o);p=await Zt(a,{id:null},await Y(new yt(404,"Not Found",`Not found: ${a.pathname}`),{url:a,params:{},route:{id:null}}),404,o)}if(a=(f==null?void 0:f.url)||a,O!==c)return d.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await D({type:t,url:new URL(p.location,a),popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s,redirect_count:i+1,nav_token:c}),d.fulfil(void 0);return}p=await Lt({status:500,error:await Y(new Error("Redirect loop"),{url:a,params:{},route:{id:null}}),url:a,route:{id:null}})}else p.props.page.status>=400&&await P.updated.check()&&(await Bt(),await V(a,o));if(be(),bt(_),zt(m),p.props.page.url.pathname!==a.pathname&&(a.pathname=p.props.page.url.pathname),s=e?e.state:s,!e){const k=o?0:1,W={[N]:E+=k,[B]:R+=k,[Nt]:s};(o?history.replaceState:history.pushState).call(history,W,"",a),o||ye(E,R)}const y=f&&(v==null?void 0:v.id)===f.id?v.fork:null;v=null,p.props.page.state=s;let S;if(et){const k=(await Promise.all(Array.from(Ee,$=>$(d.navigation)))).filter($=>typeof $=="function");if(k.length>0){let $=function(){k.forEach(st=>{F.delete(st)})};k.push($),k.forEach(st=>{F.add(st)})}g=p.state,p.props.page&&(p.props.page.url=a);const W=y&&await y;W?S=W.commit():(Yt.$set(p.props),fe(p.props.page),S=(C=ee)==null?void 0:C()),Ht=!0}else await Jt(p,dt,!1);const{activeElement:A}=document;await S,await J(),await J();let T=null;if(Ot){const k=e?e.scroll:n?j():null;k?scrollTo(k.x,k.y):(T=a.hash&&document.getElementById(te(a)))?T.scrollIntoView():scrollTo(0,0)}const z=document.activeElement!==A&&document.activeElement!==document.body;!r&&!z&&$e(a,!T),Ot=!0,p.props.page&&Object.assign(x,p.props.page),H=!1,t==="popstate"&&Wt(R),d.fulfil(void 0),d.navigation.to&&(d.navigation.to.scroll=j()),F.forEach(k=>k(d.navigation)),P.navigating.set(ft.current=null)}async function Zt(t,a,e,r,n){return t.origin===Dt&&t.pathname===location.pathname&&!Vt?await Lt({status:r,error:e,url:t,route:a}):await V(t,n)}function Ie(){let t,a={element:void 0,href:void 0},e;U.addEventListener("mousemove",i=>{const c=i.target;clearTimeout(t),t=setTimeout(()=>{o(c,q.hover)},20)});function r(i){i.defaultPrevented||o(i.composedPath()[0],q.tap)}U.addEventListener("mousedown",r),U.addEventListener("touchstart",r,{passive:!0});const n=new IntersectionObserver(i=>{for(const c of i)c.isIntersecting&&(lt(new URL(c.target.href)),n.unobserve(c.target))},{threshold:0});async function o(i,c){const l=$t(i,U),h=l===a.element&&(l==null?void 0:l.href)===a.href&&c>=e;if(!l||h)return;const{url:u,external:w,download:f}=ut(l,L,b.hash);if(w||f)return;const d=X(l),_=u&&rt(g.url)===rt(u);if(!(d.reload||_))if(c<=d.preload_data){a={element:l,href:l.href},e=q.tap;const m=await ot(u,!1);if(!m)return;ke(m)}else c<=d.preload_code&&(a={element:l,href:l.href},e=c,lt(u))}function s(){n.disconnect();for(const i of U.querySelectorAll("a")){const{url:c,external:l,download:h}=ut(i,L,b.hash);if(l||h)continue;const u=X(i);u.reload||(u.preload_code===q.viewport&&n.observe(i),u.preload_code===q.eager&<(c))}}F.add(s),s()}function Y(t,a){if(t instanceof wt)return t.body;const e=Et(t),r=we(t);return b.hooks.handleError({error:t,event:a,status:e,message:r})??{message:r}}function Be(t,a={}){return t=new URL(gt(t)),t.origin!==Dt?Promise.reject(new Error("goto: invalid URL")):Gt(t,a,0)}function Te(t){if(typeof t=="function")Z.push(t);else{const{href:a}=new URL(t,location.href);Z.push(e=>e.href===a)}}function Oe(){var a;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let r=!1;if(Ct(),!H){const n=Ut(g,void 0,null,"leave"),o={...n.navigation,cancel:()=>{r=!0,n.reject(new Error("navigation cancelled"))}};Mt.forEach(s=>s(o))}r?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&Ct()}),(a=navigator.connection)!=null&&a.saveData||Ie(),U.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const r=$t(e.composedPath()[0],U);if(!r)return;const{url:n,external:o,target:s,download:i}=ut(r,L,b.hash);if(!n)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=X(r);if(!(r instanceof SVGAElement)&&n.protocol!==location.protocol&&!(n.protocol==="https:"||n.protocol==="http:")||i)return;const[h,u]=(b.hash?n.hash.replace(/^#/,""):n.href).split("#"),w=h===it(location);if(o||c.reload&&(!w||!u)){Qt({url:n,type:"link",event:e})?H=!0:e.preventDefault();return}if(u!==void 0&&w){const[,f]=g.url.href.split("#");if(f===u){if(e.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const d=r.ownerDocument.getElementById(decodeURIComponent(u));d&&(d.scrollIntoView(),d.focus())}return}if(K=!0,bt(E),t(n),!c.replace_state)return;K=!1}e.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await D({type:"link",url:n,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??n.href===location.href,event:e})}),U.addEventListener("submit",e=>{if(e.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if(((n==null?void 0:n.formTarget)||r.target)==="_blank"||((n==null?void 0:n.formMethod)||r.method)!=="get")return;const i=new URL((n==null?void 0:n.hasAttribute("formaction"))&&(n==null?void 0:n.formAction)||r.action);if(_t(i,L,!1))return;const c=e.target,l=X(c);if(l.reload)return;e.preventDefault(),e.stopPropagation();const h=new FormData(c,n);i.search=new URLSearchParams(h).toString(),D({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var r;if(!mt){if((r=e.state)!=null&&r[N]){const n=e.state[N];if(O={},n===E)return;const o=I[n],s=e.state[Nt]??{},i=new URL(e.state[re]??location.href),c=e.state[B],l=g.url?it(location)===it(g.url):!1;if(c===R&&(Ht||l)){s!==x.state&&(x.state=s),t(i),I[E]=j(),o&&scrollTo(o.x,o.y),E=n;return}const u=n-E;await D({type:"popstate",url:i,popped:{state:s,scroll:o,delta:u},accept:()=>{E=n,R=c},block:()=>{history.go(-u)},nav_token:O,event:e})}else if(!K){const n=new URL(location.href);t(n),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{K&&(K=!1,history.replaceState({...history.state,[N]:++E,[B]:R},"",location.href))});for(const e of document.querySelectorAll("link"))ve.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&P.navigating.set(ft.current=null)});function t(e){g.url=x.url=e,P.page.set(At(x)),P.page.notify()}}async function je(t,{status:a=200,error:e,node_ids:r,params:n,route:o,server_route:s,data:i,form:c}){Vt=!0;const l=new URL(location.href);let h;({params:n={},route:o={id:null}}=await ot(l,!1)||{}),h=kt.find(({id:f})=>f===o.id);let u,w=!0;try{const f=r.map(async(_,m)=>{const p=i[m];return p!=null&&p.uses&&(p.uses=Ce(p.uses)),Rt({loader:b.nodes[_],url:l,params:n,route:o,parent:async()=>{const y={};for(let S=0;S{const i=history.state;mt=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(i,"",t),a&&scrollTo(o,s),mt=!1})}else{const o=document.body,s=o.getAttribute("tabindex");o.tabIndex=-1,o.focus({preventScroll:!0,focusVisible:!1}),s!==null?o.setAttribute("tabindex",s):o.removeAttribute("tabindex")}const n=getSelection();if(n&&n.type!=="None"){const o=[];for(let s=0;s{if(n.rangeCount===o.length){for(let s=0;s{o=u,s=w});return i.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((l=t.route)==null?void 0:l.id)??null},url:t.url,scroll:j()},to:e&&{params:(a==null?void 0:a.params)??null,route:{id:((h=a==null?void 0:a.route)==null?void 0:h.id)??null},url:e,scroll:n},willUnload:!a,type:r,complete:i},fulfil:o,reject:s}}function At(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ne(t){const a=new URL(t);return a.hash=decodeURIComponent(t.hash),a}function te(t){let a;if(b.hash){const[,,e]=t.hash.split("#",3);a=e??""}else a=t.hash.slice(1);return decodeURIComponent(a)}export{Fe as a,Be as g,P as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.br b/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.br new file mode 100644 index 0000000000000000000000000000000000000000..a4b3fb9907ce5e02b8389e0ba37e4e6f4a4ccaee GIT binary patch literal 7674 zcmVk~jal6L z264h8H14yRR+0PBPAQVdrwCNL#c(v5-isWlU6FKW$lmx(0W~ zdNnDw+o+Joe_3`Q`3M|>8b}0AZvgbKwXoAY(3(<8BL~P|mM@0@b^v(S^Wb}s(`gSb z;7`HVdIPsk0etqV_Exoy1P7Y`+!{-b1-K|fI)cT9cb8WVb6Nb$RNwY+RQj$sD(zhV z%0)*}lw;|lbmgKW-rM(1yuH1%5XZm)@BjojCY3=^iC^5?qdbcvJp)Se7^LVKQcj8F z|G5ewb*)oq?c9*SNsRx&Qt$i2)aPzX(&G%q+!jLma;Wzh>i2)NeQRhUA|lIU&?Dd}?m-nw`@%~+vcel5|+jsi*;qmEw`{K&BO+H;} z*S!Am_#vrXoAp1ZbXT=Y`sMgLyW?Bhwlb^58M(C+T&O*$GMH; zUH9of=J)ys*P9+sHqM9JI@0}cjLV-B>E056|DL@b6_q8s6%??2;vn@Moh%OI~mnkBe z>&~yZ#*~~3<5SyUjwilCELAj}Eko+IO*&n%oTn!SGWeYMZu#aHG^@;6!yW{(en*?W{<|O0UMCtVmJQXB&ki z`~OtJB?tCYtj6dy@<-~~uAa-m{ag*6&(Gg)Bjv=VxsP{-eE}s&8o1vQJh5O&Nl2fL z>lj&anK^jY*4nm2=tz)kOjUAGZ1?{YE8RJPnZYww5tITyuKW_MgZNnN#Z(>&+Q-U% zh*9vwj!1cQFBc0XGKwlca&3=59IShh;>K1$dOF$CmupSB$6(XXk13OEciFhqJ|Ugc zExp1mC3|`yK=(;O*Q3-jBir@Ea490*SgNXPTrkVIiB_Yzg0czCdeU3ab*IL5WH- z4=;H)IuV<05p%jO-IH4U4wlale&Qy7Nk>-Tf?5*jMS?k1X|rYe2ij9aDi=iqEy@l~4kzn*u!S7&wy+m&6lL;h(E&NuCoi=pvV zk#vF*4+aXEV$Oz{ys%8~gZS>Ia{@(E4@ZW+j|{V4f5$T&8yBW&mz`G`hd*BDRxy0* z<<^Kh^gZ~bJ^FCp*a{?Qq4b&d5Sz%tK5|7F|BS@LgGwq~_0$gyyGW(p7Tg5mf}7O)`?c?w=V~knOL+?iqjI~VI{oomtX&>fV6(+Vg-aa7 z9Y)5P{u~K^N4~dMn;Y{T7p%-H^|bs&%U9WEsafTQTeWU+I^iPsa}%tMRtfAFUDh|D z_UVxp)K>dVnQ6N6_TO z9X&NAO%qN|HQwIp!<47_FV}nb*!k1>hilReBmrt#*RAfkcdZh*Uc^y~eHU*o6JWs2 zTF5i3(MPVtz4O#NzCNfp@8p4Nn>xX8Aq+S{A+YD;$_Cij za41(WX{+94ID6l3j7+_yX3iv};y@UFFjan$?AOEl4!JW4r8W!-MT5?-DhN$ z?={OPRxZ8Nfj-z4MN{ThW@8R z9K>ao9Y5FZ{(7o03=HB<`V}D3?pHC}owf4D^mXiaQ=bn4yDMHmtga~XCxW*HLA5JS zdq`L!22iDFC^Onc6ms%PtL4v#U)_sc*^X;((8}>T=iu|C1mVWt)l3(t^WU-hp?CLc z7Y@MikpD~BN1&~!=^ZG`t zeq%lGMvA)vM{sKZaAT|kgn-Fe2FA7P@??1vn_XDBAuyYJ8gc9Z!s-A>61O8PΠ2 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.gz b/apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d5427a242b5682079314f44ba1849cd8e5c930bf GIT binary patch literal 8455 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js b/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js similarity index 97% rename from apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js rename to apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js index 1d1d6f4..76395b7 100644 --- a/apps/dashboard/build/_app/immutable/chunks/CY4crMrT.js +++ b/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js @@ -1 +1 @@ -var D=Object.defineProperty;var g=a=>{throw TypeError(a)};var F=(a,e,s)=>e in a?D(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var w=(a,e,s)=>F(a,typeof e!="symbol"?e+"":e,s),y=(a,e,s)=>e.has(a)||g("Cannot "+s);var t=(a,e,s)=>(y(a,e,"read from private field"),s?s.call(a):e.get(a)),l=(a,e,s)=>e.has(a)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,s),M=(a,e,s,i)=>(y(a,e,"write to private field"),i?i.call(a,s):e.set(a,s),s);import{K as x,a7 as C,a8 as k,a9 as J,aa as A,ab as B,J as K,ac as S,ad as j,ae as q}from"./C9Z4nxhR.js";var r,n,h,u,p,_,v;class G{constructor(e,s=!0){w(this,"anchor");l(this,r,new Map);l(this,n,new Map);l(this,h,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,()=>{var e=x;if(t(this,r).has(e)){var s=t(this,r).get(e),i=t(this,n).get(s);if(i)C(i),t(this,u).delete(s);else{var c=t(this,h).get(s);c&&(t(this,n).set(s,c.effect),t(this,h).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),i=c.effect)}for(const[f,o]of t(this,r)){if(t(this,r).delete(f),f===e)break;const d=t(this,h).get(o);d&&(k(d.effect),t(this,h).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,r).values()).includes(f)){var b=document.createDocumentFragment();j(o,b),b.append(A()),t(this,h).set(f,{effect:o,fragment:b})}else k(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!i?(t(this,u).add(f),J(o,d,!1)):d()}}});l(this,v,e=>{t(this,r).delete(e);const s=Array.from(t(this,r).values());for(const[i,c]of t(this,h))s.includes(i)||(k(c.effect),t(this,h).delete(i))});this.anchor=e,M(this,p,s)}ensure(e,s){var i=x,c=q();if(s&&!t(this,n).has(e)&&!t(this,h).has(e))if(c){var f=document.createDocumentFragment(),o=A();f.append(o),t(this,h).set(e,{effect:B(()=>s(o)),fragment:f})}else t(this,n).set(e,B(()=>s(this.anchor)));if(t(this,r).set(i,e),c){for(const[d,m]of t(this,n))d===e?i.unskip_effect(m):i.skip_effect(m);for(const[d,m]of t(this,h))d===e?i.unskip_effect(m.effect):i.skip_effect(m.effect);i.oncommit(t(this,_)),i.ondiscard(t(this,v))}else K&&(this.anchor=S),t(this,_).call(this)}}r=new WeakMap,n=new WeakMap,h=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{G as B}; +var D=Object.defineProperty;var g=a=>{throw TypeError(a)};var F=(a,e,s)=>e in a?D(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var w=(a,e,s)=>F(a,typeof e!="symbol"?e+"":e,s),y=(a,e,s)=>e.has(a)||g("Cannot "+s);var t=(a,e,s)=>(y(a,e,"read from private field"),s?s.call(a):e.get(a)),l=(a,e,s)=>e.has(a)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,s),M=(a,e,s,i)=>(y(a,e,"write to private field"),i?i.call(a,s):e.set(a,s),s);import{K as x,a7 as C,a8 as k,a9 as J,aa as A,ab as B,J as K,ac as S,ad as j,ae as q}from"./BBD-8XME.js";var r,n,h,u,p,_,v;class G{constructor(e,s=!0){w(this,"anchor");l(this,r,new Map);l(this,n,new Map);l(this,h,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,()=>{var e=x;if(t(this,r).has(e)){var s=t(this,r).get(e),i=t(this,n).get(s);if(i)C(i),t(this,u).delete(s);else{var c=t(this,h).get(s);c&&(t(this,n).set(s,c.effect),t(this,h).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),i=c.effect)}for(const[f,o]of t(this,r)){if(t(this,r).delete(f),f===e)break;const d=t(this,h).get(o);d&&(k(d.effect),t(this,h).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,r).values()).includes(f)){var b=document.createDocumentFragment();j(o,b),b.append(A()),t(this,h).set(f,{effect:o,fragment:b})}else k(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!i?(t(this,u).add(f),J(o,d,!1)):d()}}});l(this,v,e=>{t(this,r).delete(e);const s=Array.from(t(this,r).values());for(const[i,c]of t(this,h))s.includes(i)||(k(c.effect),t(this,h).delete(i))});this.anchor=e,M(this,p,s)}ensure(e,s){var i=x,c=q();if(s&&!t(this,n).has(e)&&!t(this,h).has(e))if(c){var f=document.createDocumentFragment(),o=A();f.append(o),t(this,h).set(e,{effect:B(()=>s(o)),fragment:f})}else t(this,n).set(e,B(()=>s(this.anchor)));if(t(this,r).set(i,e),c){for(const[d,m]of t(this,n))d===e?i.unskip_effect(m):i.skip_effect(m);for(const[d,m]of t(this,h))d===e?i.unskip_effect(m.effect):i.skip_effect(m.effect);i.oncommit(t(this,_)),i.ondiscard(t(this,v))}else K&&(this.anchor=S),t(this,_).call(this)}}r=new WeakMap,n=new WeakMap,h=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{G as B}; diff --git a/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.br b/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.br new file mode 100644 index 0000000000000000000000000000000000000000..33b04145a60f27fc83db22bd8abb6c0f7956ee04 GIT binary patch literal 883 zcmV-(1C0C|#0UV4!nWn}5;Yg5N|_Hc%`AWWsy!ZGvcqDPWrA2o^-WPP@3KFazjxVW zl3{KCc}~9F7a=L}2-M*He{*VoSdX1e`u2RC{&%?)nAAYEtOkH?bAY;)1A0i;8)2yF z1oUp;&1`U#yu{ikvMGM()xaKNUSCg3@D!P=aB+a2|MOu2L@MlI5%?IOJphId?0Gvn z=lZ#*aA@=FKsused*Z55XLU5;3x7<_RxQPmOqgF4FlR=pbF=oMkeM^pR&MV2Zz)Vv z04c4+yiVkJ%E1(FFjtlRvi-H0k*U&4Q$#>>GEm#M8LkllG@oPFMLq@Wty|JQq+vd9 zw8spkVah1TqS8wSO>B_mi!|Ws)+fyEMG59}Yk5U4O8;BQjwgMg8F-lD_GUZPsDwh} z%aHgR;1*Uw?Kiygb?Ep8{O}Wa=BKe2{v0g7Abw`4cKjS#e&M^h1mDX_E?#S;D}>1bL^2Vt72 z7P*{QQ~+~pmewAkE8Eak<)vgB?NDkQ0fH@RxUtnDhsa=2dtyg}ZoZnb=b)($$WmhY8(pSYUMm zyXd0pix_`S%i!B>h%#aJHxo#9e~(D4?8?4V@ZN&R`7?InJ+j9L2Z(}}r8Omq61@Pi zl-F>9*?*z0(jT&Bcg&Wbomw`*#uD_9=p9LdWfkG57K8?Y(nT$5*kk5FL= z;&DhdBPCsHHV!W?+B%U84i#=PXsN(mPW(nfO1Vv2cw>|K{PO*eoak9pfu{rJ5wQm>hXyuFaYn3@6xqRO&jO{xit(hN??nRCjhjS3pEBv3vM`Qb4<84R zm=NkWmUo9ENeC_ra5(T0S+DV(VwPtqe@TC0l JGnb0Fo&d%?tkM7g literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.gz b/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d30defefd353c393a1ab470f7fdb2ce6b8ecacf5 GIT binary patch literal 1004 zcmV}=}y3ImP1quL&-fq z-?Q*iG>x)B_|9Q*5~F*x^uwWg z9cnd25_ulj5(6V@939qJr>KKkX{1fj1ggm}B&P(Iv4R9D>>m`HJG3i|$j2e1aUorK zx5tLmq1i}PQApUUcC5R7h-GKPhtv4WqThBqH zZoPmTw|oJSx%CbRFj^l#pj&_R4!tn??c(C<*AM^Reu^GU=+V~DKnWeRu!e1%Rl=Cy z^PU>PSlwlodWdRD7Vr7~k=arj2nmZ)>5#|OK|vnyF}M}&sA*nl%2%4sYY5Cy(*i{q zgf%dNaqlw3;G; zvuv;|N6YN&j7{zwO9rwCi-NA<=&hW2quoM_`x+Y?5t#O}lvN&Stko77S`&dJ2ero%D1XORrfwHCX`HQ_9AKT-_iJd#aTbvb$;o{BWd zRn~bFGb+d8)ls}YV#Rp;z!an$(nz!|HaR;dPqS(qSp`ivU*=N5fbuf!dG9z6HV%$g z9Z`%c;bl- z3E7N|l5;a*Cn+;x_9yKriCL<6>cIrzcDQ|pP-#p@9qA^gXF(=UkR?Buzd`2gY%u|I zxP+6c9PcF^%?{?p|C0zRA==_%;849}5Jv_tm}@5E+H>Nv7`QyWqzJ?5S+Sh+(?Q}+ zN}!QJ`A!h$P@gt@?rs&$>#i{y*{%=iu$nJrbgGEoa#FtOWZ>$huR$Nnh#n$U*U}D& zuc>~g&85kN&Ik3DACdUtM%IktyAjegKfF0kpa#{68^P{PqrnW#iBz6Q-HFtmNb3`6 aJC|a7@-NwE|3dZgFaH6xA;t~G2mk>55$=@$ literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.br b/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.br deleted file mode 100644 index 09fc4f13f49a60588cf24b047fffd1fcd2a2c18a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 zcmV-O2eu<&itHbOrw4 z04YSzS+eJT&A0nrZf=FG{&Ut;{iQVDD4;|fD`;A>(3BBP&g}NUNt9VqSJRZJopxZXA$)@sdOJJJ>j zfiq!7EVG3D5e%a)gX@e)!u1)U86GT`@DvqrqooNpkb(#;V5+qUk97rjqIQ61Xbgww z6>fC~xYKpQz4z5MrvhQoAajF*1-&5;!VWcuM9b!d2V`(Tm!dbNcax$Sym5Y(*l=E;qAl)OO z+FZ(GuW(M696#(IS7XKls{+i?0!K%4E*7x3e0$|o9 zs$$u#)R1;YJmR7E?0E^ju4$*$K|ecoJyyR|tsCpcS7Wu+VRhtcA2w11nPA!zO*(*( zgI2f!d5IbN>+jf2`wuT^NeIwi=}ptJ74z3|kLSo)~I^}CN`9MgSPi!&Vj%9H(^Qlzx& z#Mse>fv(I$%WdZ}-2l}DccrdV^mj(3leZ0n1n4PG#|!OfQb;+E?e=$pCaQ48<=XsG z_b$-Ej7*j-ec*x6B^Kr*OtM_SHXWUNG)vYXxbv_X$^5*d1&Xk@m^SZBQ|Ip3(OXU& zDB`pRD##4dOzw1t{rU%v5Px;1g?k7s#4skJVq_|-W2jm;&`PK4QFjg*?O1Yw!auX` zL~G}ig==u^RtKEAv%b5&^ZyAOnPi|aoidjl`AkGU(G*M9ycWDUO1__wqnn&b=yg_( z7CDgp+BbVJsnP1o^L(32)xKg5#$rv?KdE7fa^Xuv+&nJE?CaAzT!D_9V`QUXVAd3U zor#^@l+sgoI8e(fNDs-{L*p7KZ@u|-K;kH_A;aCSC=|%9P@xBt)uHRlaPXr(ll`q5j`kog!oDRv1cIh` zNy;L;p5h%m-9|nG>epi?obkXRN8Iqp9#mFUBDK8^{re;W&U&jU)puUBvP(Lj01ab3 z$t;~1_GHHc2Skd<5JdKi3fUoMI>ba%yjD3E+Z-tJ2MQ1c#*G6MPJ&^3jv*uwiG{e& z44?|~(%HOSae=x0t5x!k400w);?2KGNX6&y4KpTC(-(wQ~Y-*Mgi9*~~Pki$LgbiVP-Q7E!XgT}||cdDAY< zVJg3(Lsw>PXPFw3H0h zOk&R+TKH%R#A=UJgA!HUaaSQkGQ^qOmQkcqHZdrF#vov7M?HgSwWw(~as0xv0?do3Nh>Vm!ID*@bp4zbT3!*R7 z>*BHPG1V(PVE30^s?51W?}OP>S?Q&m%lsnGw#YlpTqGr&wy8b;t=YUyd+L2QsF}y8 z86H+i5pAc&)9pkjpyiW9(dw*KsL!sDjo$r=@ENKR*Rpj_9>RSms-$LG@T$|uL@6y(=OtWA z%s>Q+5B9%?vbzRrIXZzxhohF3uYUa!B@K;A)$)8)ifT2P%lxvc^V=%bcJs&;<*oB; zYjtHOybL13b#tuReX8!^Imrvi{Ki)0uM(c+==u9~70pTd!2a{=obIUPBwwH4_4ov% CoXI}` diff --git a/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.gz b/apps/dashboard/build/_app/immutable/chunks/kH-DTQyy.js.gz deleted file mode 100644 index 7de25f7a9b751565828889de45349a51b88b0eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2014 zcmV<42O;<$iwFP!000026OCBwbK5u$|9*dko!QY46IAES?LAfs>&YhGHf@u3lfFGZ z4=q8q8kth{id#qj`wd9RmixH7F9t|~BpyG2pyPFx=H*tYfhq=n;DSj+s5CR0@EOw! zRDWms8CA+OCR8J462c|ZKT(}9tq9fMm?;R=ugttd^$(^mPz6lCqRN=2gz7UhC85fh z`30XdsR>oV%sDEf%@bB4n0b$?X1XF&_slE_-!q*Mstq%r zP<>&#CRG1qCMQ(CF{238S7v@kqt-d0I%DQFq57SfGeTv~y(d)vV&;}mT`+S=O_ZnW zBloZ8zkU2wZ&o+%r{c(uDjk$@ss|S&2y@uxR93kjBJ*i5^A(8+3XqStaU=>bzivi4jP=qDDWQ_Y z1h8`DMkyX^|*yM>M;4%SFr zB?&YQB?S$tNAje>;R!TxB&z*6u`FA=>=wyTnst60iP(zNGC?J4H&Z$3@;VL4zbByp zm8&w=Ueti(#wD!_H%Lh30-CoX$6*Zi@Ir1|D?Ls3gIg*^4#>uI;|33PACJGa#mWH~ z#}%-T-dhfy9FF$UOXSE;PN}uaPmYh_mIO_c8RpQi1koNBPuu8YiA!vqX6&vcVPFov zQW?fl-w@5>U0F zbR3cPVmubgjhu5Ze9nRNc;?^o9Iu2zqh1BzDH6)U+3MVY_1&e6TGdnero zP37QP4o}!g7uHD|S&^vt#De_IP)ZRQ1UinWD~>w|1OgnBXno%8l(P<^>DKxpymF+{M|PqKJZ0tXu-{ z#7Ztm1Q?DhkBE^>l5v2yc!L=(O{u}~;eqAd=s}(X25!NJ;tBxg2I4m+QzM&|h2spB zN*|PLS%N zoZjKfSsD!jn7b=gh&yzd=L|1VW8|CLf%T5$$d67dKVlf4$$T2k@KP?t8Aj|S3&cxs35DLJ ztm6oAC&fx?gZTp5GEt{-I2d^=SG6+_4|ndGR8i#|cQF}{#pIhZssa4(6yba8zbbQ3 zm|M@o4nKqSAdLnGGO+&k8q|PmdkyX;*e$J@>}!UlwpB?>DPy=2+SaB7e1?{Z*|k(- zWkT%5KFjR_k*K0HaOjPtcC(ynKuaA*SjKF?{-jOGADNnu%ovH?%GZKWp|*_1Ye3fP zniE<{-3vCO!fFP7km@ql6*ZlSzZ(-BN94v81;_M*6fb`g)0e%NesC)t#hV{RbmvL{ z)I;_ehq4|@Y4>rQ+GMl_^Pwx)r(w%~<4!r^p21D_pwZw|yo8wu;|d&?|v0~pHvb*Zut{VAnFg`v^T~8gHtxZ_>0c2Zt$NKTE>=@1mQIE%> z{wB#{z|hUAV#OT8B5q;9O+>2&>`pky^wh4iT9~!15saiCrs4Mg%)?&K$erc7>nz2y z!@hHeyJwwu*8u*3$p7j;+00?L%^r;wZJF_7AEl;}Xx6=kHd*ZES?3IcsGakD5OGh6 zr)k#{?N)u`dfNbG9UkLI+&*qKy5WM~_IZwDI^}WVbuDpWJ!}i+tu2`1jTFyiHjQRK z%--j{?0vJZ$o}{HJdxt#&-eM*+vkaEYCvONE*aiH(-e+#-fJn>_=@$N{J^gh5U-?I z|D@Qgd&j)uUN-q6py^$^i-Ud{D-61qgs7aAb=+7~&eGn(;|YlbhbR2@@IHwI?EPM| z^tzS)B$jr%y{Naf7h~+zNS=*v52seU!l6>0ZaH?m=hr#G1K( z+qE-pQL4Peiqf2iSV}3EV6E{>S@m># z-RYM9xCF_>%k7PnVDg=axyN!ZvDZ@X5qq_J#I{DZE02!6qoZT$S|C>J=*V`u<$m?u w;p4blY{YKMJl0D=(9p*GPjP4d0Z{nVP{IpCW4to7Z2Z6c2cN61@6iwd0K{1H;{X5v diff --git a/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js b/apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js similarity index 61% rename from apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js rename to apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js index 427a1ea..d5aa667 100644 --- a/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js +++ b/apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.ChrQNylP.js","../chunks/Bzak7iHL.js","../chunks/CkyfbJUz.js","../chunks/C9Z4nxhR.js","../chunks/DP9qWekZ.js","../chunks/DPfxVJHQ.js","../chunks/C2oj68pw.js","../chunks/CY4crMrT.js","../chunks/kH-DTQyy.js","../chunks/D00YwZ1M.js","../chunks/ZesQ8l8p.js","../chunks/Co2v30Gm.js","../chunks/P9ZHwQBL.js","../chunks/CR6HhlME.js","../chunks/DWr9YED7.js","../chunks/DnKV7_Y9.js","../chunks/DunNqS1N.js","../chunks/BmeMLq0p.js","../assets/0.BChctYiF.css","../nodes/1.CUEJZ2Iu.js","../chunks/_Va07L2l.js","../nodes/2.Bv9w28KX.js","../nodes/3.D_o4dH3z.js","../nodes/4.CeoFmj14.js","../chunks/BkopTN9z.js","../chunks/BcuCGYSa.js","../nodes/5.CgbdGsQS.js","../chunks/CZ45jJaw.js","../chunks/Do8TgQ-j.js","../assets/5.BBx09UGv.css","../nodes/6.DXXEUSu1.js","../chunks/-jeO_JOJ.js","../nodes/7.BI22Pt_j.js","../nodes/8.Cq7jwWnG.js","../nodes/9.19crbYuZ.js","../nodes/10.CsJcFbdU.js","../nodes/11.C5VMEnLV.js"])))=>i.map(i=>d[i]); -var M=r=>{throw TypeError(r)};var Q=(r,t,e)=>t.has(r)||M("Cannot "+e);var m=(r,t,e)=>(Q(r,t,"read from private field"),e?e.call(r):t.get(r)),H=(r,t,e)=>t.has(r)?M("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),J=(r,t,e,n)=>(Q(r,t,"write to private field"),n?n.call(r,e):t.set(r,e),e);import{J as Z,a0 as ut,b as lt,E as mt,a1 as _t,a4 as dt,a5 as ft,a6 as $,a2 as ht,ac as vt,h as q,L as gt,g as v,b7 as Et,Y as yt,X as pt,p as Pt,ag as Rt,ah as bt,I as Ot,f as L,d as At,a as Tt,s as W,e as Lt,r as wt,t as It,u as V}from"../chunks/C9Z4nxhR.js";import{h as kt,m as Dt,u as xt,s as Vt}from"../chunks/DP9qWekZ.js";import"../chunks/Bzak7iHL.js";import{o as St}from"../chunks/CkyfbJUz.js";import{i as B}from"../chunks/C2oj68pw.js";import{a as y,c as k,f as et,t as jt}from"../chunks/DPfxVJHQ.js";import{B as Ct}from"../chunks/CY4crMrT.js";import{b as S}from"../chunks/CR6HhlME.js";import{p as Y}from"../chunks/Do8TgQ-j.js";function j(r,t,e){var n;Z&&(n=vt,ut());var o=new Ct(r);lt(()=>{var l=t()??null;if(Z){var s=_t(n),a=s===ht,i=l!==null;if(a!==i){var P=dt();ft(P),o.anchor=P,$(!1),o.ensure(l,l&&(c=>e(c,l))),$(!0);return}}o.ensure(l,l&&(c=>e(c,l)))},mt)}function Bt(r){return class extends Yt{constructor(t){super({component:r,...t})}}}var p,d;class Yt{constructor(t){H(this,p);H(this,d);var l;var e=new Map,n=(s,a)=>{var i=pt(a,!1,!1);return e.set(s,i),i};const o=new Proxy({...t.props||{},$$events:{}},{get(s,a){return v(e.get(a)??n(a,Reflect.get(s,a)))},has(s,a){return a===gt?!0:(v(e.get(a)??n(a,Reflect.get(s,a))),Reflect.has(s,a))},set(s,a,i){return q(e.get(a)??n(a,i),i),Reflect.set(s,a,i)}});J(this,d,(t.hydrate?kt:Dt)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((l=t==null?void 0:t.props)!=null&&l.$$host)||t.sync===!1)&&Et(),J(this,p,o.$$events);for(const s of Object.keys(m(this,d)))s==="$set"||s==="$destroy"||s==="$on"||yt(this,s,{get(){return m(this,d)[s]},set(a){m(this,d)[s]=a},enumerable:!0});m(this,d).$set=s=>{Object.assign(o,s)},m(this,d).$destroy=()=>{xt(m(this,d))}}$set(t){m(this,d).$set(t)}$on(t,e){m(this,p)[t]=m(this,p)[t]||[];const n=(...o)=>e.call(this,...o);return m(this,p)[t].push(n),()=>{m(this,p)[t]=m(this,p)[t].filter(o=>o!==n)}}$destroy(){m(this,d).$destroy()}}p=new WeakMap,d=new WeakMap;const qt="modulepreload",Ft=function(r,t){return new URL(r,t).href},tt={},_=function(t,e,n){let o=Promise.resolve();if(e&&e.length>0){let s=function(c){return Promise.all(c.map(g=>Promise.resolve(g).then(R=>({status:"fulfilled",value:R}),R=>({status:"rejected",reason:R}))))};const a=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),P=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=s(e.map(c=>{if(c=Ft(c,n),c in tt)return;tt[c]=!0;const g=c.endsWith(".css"),R=g?'[rel="stylesheet"]':"";if(!!n)for(let b=a.length-1;b>=0;b--){const u=a[b];if(u.href===c&&(!g||u.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${R}`))return;const E=document.createElement("link");if(E.rel=g?"stylesheet":qt,g||(E.as="script"),E.crossOrigin="",E.href=c,P&&E.setAttribute("nonce",P),document.head.appendChild(E),g)return new Promise((b,u)=>{E.addEventListener("load",b),E.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${c}`)))})}))}function l(s){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=s,window.dispatchEvent(a),!a.defaultPrevented)throw s}return o.then(s=>{for(const a of s||[])a.status==="rejected"&&l(a.reason);return t().catch(l)})},ae={};var Nt=et('

'),Ut=et(" ",1);function Gt(r,t){Pt(t,!0);let e=Y(t,"components",23,()=>[]),n=Y(t,"data_0",3,null),o=Y(t,"data_1",3,null),l=Y(t,"data_2",3,null);Rt(()=>t.stores.page.set(t.page)),bt(()=>{t.stores,t.page,t.constructors,e(),t.form,n(),o(),l(),t.stores.page.notify()});let s=W(!1),a=W(!1),i=W(null);St(()=>{const u=t.stores.page.subscribe(()=>{v(s)&&(q(a,!0),Ot().then(()=>{q(i,document.title||"untitled page",!0)}))});return q(s,!0),u});const P=V(()=>t.constructors[2]);var c=Ut(),g=L(c);{var R=u=>{const O=V(()=>t.constructors[0]);var A=k(),D=L(A);j(D,()=>v(O),(T,w)=>{S(w(T,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(f,Jt)=>{var z=k(),at=L(z);{var st=I=>{const F=V(()=>t.constructors[1]);var x=k(),N=L(x);j(N,()=>v(F),(U,G)=>{S(G(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params},children:(h,Wt)=>{var K=k(),ot=L(K);j(ot,()=>v(P),(it,ct)=>{S(ct(it,{get data(){return l()},get form(){return t.form},get params(){return t.page.params}}),C=>e()[2]=C,()=>{var C;return(C=e())==null?void 0:C[2]})}),y(h,K)},$$slots:{default:!0}}),h=>e()[1]=h,()=>{var h;return(h=e())==null?void 0:h[1]})}),y(I,x)},nt=I=>{const F=V(()=>t.constructors[1]);var x=k(),N=L(x);j(N,()=>v(F),(U,G)=>{S(G(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),h=>e()[1]=h,()=>{var h;return(h=e())==null?void 0:h[1]})}),y(I,x)};B(at,I=>{t.constructors[2]?I(st):I(nt,!1)})}y(f,z)},$$slots:{default:!0}}),f=>e()[0]=f,()=>{var f;return(f=e())==null?void 0:f[0]})}),y(u,A)},X=u=>{const O=V(()=>t.constructors[0]);var A=k(),D=L(A);j(D,()=>v(O),(T,w)=>{S(w(T,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),f=>e()[0]=f,()=>{var f;return(f=e())==null?void 0:f[0]})}),y(u,A)};B(g,u=>{t.constructors[1]?u(R):u(X,!1)})}var E=At(g,2);{var b=u=>{var O=Nt(),A=Lt(O);{var D=T=>{var w=jt();It(()=>Vt(w,v(i))),y(T,w)};B(A,T=>{v(a)&&T(D)})}wt(O),y(u,O)};B(E,u=>{v(s)&&u(b)})}y(r,c),Tt()}const se=Bt(Gt),ne=[()=>_(()=>import("../nodes/0.ChrQNylP.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]),import.meta.url),()=>_(()=>import("../nodes/1.CUEJZ2Iu.js"),__vite__mapDeps([19,1,20,3,4,5,16,15,2]),import.meta.url),()=>_(()=>import("../nodes/2.Bv9w28KX.js"),__vite__mapDeps([21,1,3,5,9,7]),import.meta.url),()=>_(()=>import("../nodes/3.D_o4dH3z.js"),__vite__mapDeps([22,1,20,3,2,16,15]),import.meta.url),()=>_(()=>import("../nodes/4.CeoFmj14.js"),__vite__mapDeps([23,1,3,4,5,6,7,8,10,11,24,12,25]),import.meta.url),()=>_(()=>import("../nodes/5.CgbdGsQS.js"),__vite__mapDeps([26,1,20,3,4,5,6,7,8,24,14,15,17,27,10,11,28,29]),import.meta.url),()=>_(()=>import("../nodes/6.DXXEUSu1.js"),__vite__mapDeps([30,1,2,3,4,5,6,7,8,10,11,24,12,31,14,15,13,28,27,25,17]),import.meta.url),()=>_(()=>import("../nodes/7.BI22Pt_j.js"),__vite__mapDeps([32,1,2,3,4,5,6,7,8,11,25]),import.meta.url),()=>_(()=>import("../nodes/8.Cq7jwWnG.js"),__vite__mapDeps([33,1,2,3,4,5,6,7,8,10,11,24,12,31,25,27]),import.meta.url),()=>_(()=>import("../nodes/9.19crbYuZ.js"),__vite__mapDeps([34,1,2,3,4,5,6,7,8,11,24,14,15,25,17]),import.meta.url),()=>_(()=>import("../nodes/10.CsJcFbdU.js"),__vite__mapDeps([35,1,2,3,4,5,6,7,8,24,25]),import.meta.url),()=>_(()=>import("../nodes/11.C5VMEnLV.js"),__vite__mapDeps([36,1,2,3,4,5,6,7,8,24,31,25,27]),import.meta.url)],oe=[],ie={"/":[3],"/(app)/explore":[4,[2]],"/(app)/feed":[5,[2]],"/(app)/graph":[6,[2]],"/(app)/intentions":[7,[2]],"/(app)/memories":[8,[2]],"/(app)/settings":[9,[2]],"/(app)/stats":[10,[2]],"/(app)/timeline":[11,[2]]},rt={handleError:(({error:r})=>{console.error(r)}),reroute:(()=>{}),transport:{}},Ht=Object.fromEntries(Object.entries(rt.transport).map(([r,t])=>[r,t.decode])),ce=Object.fromEntries(Object.entries(rt.transport).map(([r,t])=>[r,t.encode])),ue=!1,le=(r,t)=>Ht[r](t);export{le as decode,Ht as decoders,ie as dictionary,ce as encoders,ue as hash,rt as hooks,ae as matchers,ne as nodes,se as root,oe as server_loads}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.tUYz2cuZ.js","../chunks/Bzak7iHL.js","../chunks/DUC-ssvh.js","../chunks/BBD-8XME.js","../chunks/DNn3Nckx.js","../chunks/CKcqngaU.js","../chunks/RaRNNC-y.js","../chunks/gqVpgJ8U.js","../chunks/C5a--lgk.js","../chunks/DZuEJlJ5.js","../chunks/BVZqxpRe.js","../chunks/CBWLjDtu.js","../chunks/BxfT1SOA.js","../chunks/DtXypsxD.js","../chunks/BexJutgU.js","../chunks/Br8WXJxx.js","../chunks/cIQD_rb4.js","../chunks/BeSd-T80.js","../chunks/CruZBLYW.js","../assets/0.BChctYiF.css","../nodes/1.CssKLfNx.js","../chunks/D1BK9eoQ.js","../nodes/2.1GJQ3fqu.js","../nodes/3.qBGkDYYb.js","../nodes/4.BYgf5djd.js","../chunks/DBfx-YTU.js","../chunks/BcuCGYSa.js","../nodes/5.DVWNDcwc.js","../chunks/CZ45jJaw.js","../chunks/CzkEqL6J.js","../assets/5.BBx09UGv.css","../nodes/6.CBsTT29y.js","../chunks/C-QujEl6.js","../nodes/7.UPq6Ja2I.js","../nodes/8.B2QXJFjO.js","../nodes/9.B4Pp7ME7.js","../nodes/10.evd80og6.js","../nodes/11.gY7s4Ta3.js"])))=>i.map(i=>d[i]); +var M=r=>{throw TypeError(r)};var Q=(r,t,e)=>t.has(r)||M("Cannot "+e);var m=(r,t,e)=>(Q(r,t,"read from private field"),e?e.call(r):t.get(r)),H=(r,t,e)=>t.has(r)?M("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(r):t.set(r,e),J=(r,t,e,n)=>(Q(r,t,"write to private field"),n?n.call(r,e):t.set(r,e),e);import{J as Z,a0 as ut,b as lt,E as mt,a1 as _t,a4 as dt,a5 as ft,a6 as $,a2 as ht,ac as vt,h as q,L as gt,g as v,b7 as Et,Y as yt,X as pt,p as Pt,ag as Rt,ah as bt,I as Ot,f as L,d as At,a as Tt,s as W,e as Lt,r as wt,t as It,u as V}from"../chunks/BBD-8XME.js";import{h as kt,m as Dt,u as xt,s as Vt}from"../chunks/DNn3Nckx.js";import"../chunks/Bzak7iHL.js";import{o as St}from"../chunks/DUC-ssvh.js";import{i as B}from"../chunks/RaRNNC-y.js";import{a as y,c as k,f as et,t as jt}from"../chunks/CKcqngaU.js";import{B as Ct}from"../chunks/gqVpgJ8U.js";import{b as S}from"../chunks/DtXypsxD.js";import{p as Y}from"../chunks/CzkEqL6J.js";function j(r,t,e){var n;Z&&(n=vt,ut());var o=new Ct(r);lt(()=>{var l=t()??null;if(Z){var s=_t(n),a=s===ht,i=l!==null;if(a!==i){var P=dt();ft(P),o.anchor=P,$(!1),o.ensure(l,l&&(c=>e(c,l))),$(!0);return}}o.ensure(l,l&&(c=>e(c,l)))},mt)}function Bt(r){return class extends Yt{constructor(t){super({component:r,...t})}}}var p,d;class Yt{constructor(t){H(this,p);H(this,d);var l;var e=new Map,n=(s,a)=>{var i=pt(a,!1,!1);return e.set(s,i),i};const o=new Proxy({...t.props||{},$$events:{}},{get(s,a){return v(e.get(a)??n(a,Reflect.get(s,a)))},has(s,a){return a===gt?!0:(v(e.get(a)??n(a,Reflect.get(s,a))),Reflect.has(s,a))},set(s,a,i){return q(e.get(a)??n(a,i),i),Reflect.set(s,a,i)}});J(this,d,(t.hydrate?kt:Dt)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError})),(!((l=t==null?void 0:t.props)!=null&&l.$$host)||t.sync===!1)&&Et(),J(this,p,o.$$events);for(const s of Object.keys(m(this,d)))s==="$set"||s==="$destroy"||s==="$on"||yt(this,s,{get(){return m(this,d)[s]},set(a){m(this,d)[s]=a},enumerable:!0});m(this,d).$set=s=>{Object.assign(o,s)},m(this,d).$destroy=()=>{xt(m(this,d))}}$set(t){m(this,d).$set(t)}$on(t,e){m(this,p)[t]=m(this,p)[t]||[];const n=(...o)=>e.call(this,...o);return m(this,p)[t].push(n),()=>{m(this,p)[t]=m(this,p)[t].filter(o=>o!==n)}}$destroy(){m(this,d).$destroy()}}p=new WeakMap,d=new WeakMap;const qt="modulepreload",Ft=function(r,t){return new URL(r,t).href},tt={},_=function(t,e,n){let o=Promise.resolve();if(e&&e.length>0){let s=function(c){return Promise.all(c.map(g=>Promise.resolve(g).then(R=>({status:"fulfilled",value:R}),R=>({status:"rejected",reason:R}))))};const a=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),P=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));o=s(e.map(c=>{if(c=Ft(c,n),c in tt)return;tt[c]=!0;const g=c.endsWith(".css"),R=g?'[rel="stylesheet"]':"";if(!!n)for(let b=a.length-1;b>=0;b--){const u=a[b];if(u.href===c&&(!g||u.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${R}`))return;const E=document.createElement("link");if(E.rel=g?"stylesheet":qt,g||(E.as="script"),E.crossOrigin="",E.href=c,P&&E.setAttribute("nonce",P),document.head.appendChild(E),g)return new Promise((b,u)=>{E.addEventListener("load",b),E.addEventListener("error",()=>u(new Error(`Unable to preload CSS for ${c}`)))})}))}function l(s){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=s,window.dispatchEvent(a),!a.defaultPrevented)throw s}return o.then(s=>{for(const a of s||[])a.status==="rejected"&&l(a.reason);return t().catch(l)})},ae={};var Nt=et('
'),Ut=et(" ",1);function Gt(r,t){Pt(t,!0);let e=Y(t,"components",23,()=>[]),n=Y(t,"data_0",3,null),o=Y(t,"data_1",3,null),l=Y(t,"data_2",3,null);Rt(()=>t.stores.page.set(t.page)),bt(()=>{t.stores,t.page,t.constructors,e(),t.form,n(),o(),l(),t.stores.page.notify()});let s=W(!1),a=W(!1),i=W(null);St(()=>{const u=t.stores.page.subscribe(()=>{v(s)&&(q(a,!0),Ot().then(()=>{q(i,document.title||"untitled page",!0)}))});return q(s,!0),u});const P=V(()=>t.constructors[2]);var c=Ut(),g=L(c);{var R=u=>{const O=V(()=>t.constructors[0]);var A=k(),D=L(A);j(D,()=>v(O),(T,w)=>{S(w(T,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(f,Jt)=>{var z=k(),at=L(z);{var st=I=>{const F=V(()=>t.constructors[1]);var x=k(),N=L(x);j(N,()=>v(F),(U,G)=>{S(G(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params},children:(h,Wt)=>{var K=k(),ot=L(K);j(ot,()=>v(P),(it,ct)=>{S(ct(it,{get data(){return l()},get form(){return t.form},get params(){return t.page.params}}),C=>e()[2]=C,()=>{var C;return(C=e())==null?void 0:C[2]})}),y(h,K)},$$slots:{default:!0}}),h=>e()[1]=h,()=>{var h;return(h=e())==null?void 0:h[1]})}),y(I,x)},nt=I=>{const F=V(()=>t.constructors[1]);var x=k(),N=L(x);j(N,()=>v(F),(U,G)=>{S(G(U,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),h=>e()[1]=h,()=>{var h;return(h=e())==null?void 0:h[1]})}),y(I,x)};B(at,I=>{t.constructors[2]?I(st):I(nt,!1)})}y(f,z)},$$slots:{default:!0}}),f=>e()[0]=f,()=>{var f;return(f=e())==null?void 0:f[0]})}),y(u,A)},X=u=>{const O=V(()=>t.constructors[0]);var A=k(),D=L(A);j(D,()=>v(O),(T,w)=>{S(w(T,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),f=>e()[0]=f,()=>{var f;return(f=e())==null?void 0:f[0]})}),y(u,A)};B(g,u=>{t.constructors[1]?u(R):u(X,!1)})}var E=At(g,2);{var b=u=>{var O=Nt(),A=Lt(O);{var D=T=>{var w=jt();It(()=>Vt(w,v(i))),y(T,w)};B(A,T=>{v(a)&&T(D)})}wt(O),y(u,O)};B(E,u=>{v(s)&&u(b)})}y(r,c),Tt()}const se=Bt(Gt),ne=[()=>_(()=>import("../nodes/0.tUYz2cuZ.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]),import.meta.url),()=>_(()=>import("../nodes/1.CssKLfNx.js"),__vite__mapDeps([20,1,21,3,4,5,17,2,15,16]),import.meta.url),()=>_(()=>import("../nodes/2.1GJQ3fqu.js"),__vite__mapDeps([22,1,3,5,9,7]),import.meta.url),()=>_(()=>import("../nodes/3.qBGkDYYb.js"),__vite__mapDeps([23,1,21,3,2,16,15,17]),import.meta.url),()=>_(()=>import("../nodes/4.BYgf5djd.js"),__vite__mapDeps([24,1,3,4,5,6,7,8,10,11,25,12,26]),import.meta.url),()=>_(()=>import("../nodes/5.DVWNDcwc.js"),__vite__mapDeps([27,1,21,3,4,5,6,7,8,25,14,15,18,28,10,11,29,30]),import.meta.url),()=>_(()=>import("../nodes/6.CBsTT29y.js"),__vite__mapDeps([31,1,2,3,4,5,6,7,8,10,11,25,12,32,14,15,17,13,29,28,26,18]),import.meta.url),()=>_(()=>import("../nodes/7.UPq6Ja2I.js"),__vite__mapDeps([33,1,2,3,4,5,6,7,8,11,26]),import.meta.url),()=>_(()=>import("../nodes/8.B2QXJFjO.js"),__vite__mapDeps([34,1,2,3,4,5,6,7,8,10,11,25,12,32,26,28]),import.meta.url),()=>_(()=>import("../nodes/9.B4Pp7ME7.js"),__vite__mapDeps([35,1,2,3,4,5,6,7,8,11,25,14,15,26,18]),import.meta.url),()=>_(()=>import("../nodes/10.evd80og6.js"),__vite__mapDeps([36,1,2,3,4,5,6,7,8,25,26]),import.meta.url),()=>_(()=>import("../nodes/11.gY7s4Ta3.js"),__vite__mapDeps([37,1,2,3,4,5,6,7,8,25,32,26,28]),import.meta.url)],oe=[],ie={"/":[3],"/(app)/explore":[4,[2]],"/(app)/feed":[5,[2]],"/(app)/graph":[6,[2]],"/(app)/intentions":[7,[2]],"/(app)/memories":[8,[2]],"/(app)/settings":[9,[2]],"/(app)/stats":[10,[2]],"/(app)/timeline":[11,[2]]},rt={handleError:(({error:r})=>{console.error(r)}),reroute:(()=>{}),transport:{}},Ht=Object.fromEntries(Object.entries(rt.transport).map(([r,t])=>[r,t.decode])),ce=Object.fromEntries(Object.entries(rt.transport).map(([r,t])=>[r,t.encode])),ue=!1,le=(r,t)=>Ht[r](t);export{le as decode,Ht as decoders,ie as dictionary,ce as encoders,ue as hash,rt as hooks,ae as matchers,ne as nodes,se as root,oe as server_loads}; diff --git a/apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.br b/apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.br new file mode 100644 index 0000000000000000000000000000000000000000..441bb9ab8ced99a5a9373d55b055ba241543a933 GIT binary patch literal 3160 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 F008$P2ps?b literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.br b/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.br deleted file mode 100644 index 5578e841efcdc904b3eebdb89c63ed1ca327d73b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3141 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 fAYUF9A^wnY91&0;Qe diff --git a/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.gz b/apps/dashboard/build/_app/immutable/entry/app.Cznegg3r.js.gz deleted file mode 100644 index ef27d067924a16c4772b3832a72fd8b11680a5e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3566 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 diff --git a/apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js b/apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js deleted file mode 100644 index 8c063a8..0000000 --- a/apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js +++ /dev/null @@ -1 +0,0 @@ -import{l as o,a as r}from"../chunks/DunNqS1N.js";export{o as load_css,r as start}; diff --git a/apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js.br b/apps/dashboard/build/_app/immutable/entry/start.B2d_kw0s.js.br deleted file mode 100644 index 0f16ff49a7ffa6e4af33b387b6d2947ccb3b1c65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmV-b0IL5RQUG9#)JFM1rey7$*6-)4|uSu$>od&()%ypF6#(s(zi6Tv~ba=r6scm36HL w+v=(!k9u8ODVo6hQ(>y*&rZ#cCyySra#e^c^h^r$Tx%-MAh_#hcregV033HGZ2$lO diff --git a/apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js b/apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js new file mode 100644 index 0000000..aa1cf87 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js @@ -0,0 +1 @@ +import{a as r}from"../chunks/cIQD_rb4.js";import{w as t}from"../chunks/BeSd-T80.js";export{t as load_css,r as start}; diff --git a/apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.br b/apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.br new file mode 100644 index 0000000000000000000000000000000000000000..a38b9d424974896361617ac1e9a087c1fd3925c3 GIT binary patch literal 107 zcmV-x0F?h5bpQyQ1$JZginQzJ<1UAE{const x=Ge;return{page:{subscribe:x.page.subscribe},navigating:{subscribe:x.navigating.subscribe},updated:x.updated}},He={subscribe(x){return Re().page.subscribe(x)}};var Ve=_(' '),We=_(' '),Oe=_(''),Qe=_('
No matches
'),Be=_('
esc
'),Je=_('
',1);function ct(x,T){Me(T,!0);const Q=()=>L(He,"$page",k),B=()=>L(je,"$isConnected",k),pe=()=>L(ze,"$memoryCount",k),ve=()=>L(Ie,"$avgRetention",k),[k,me]=De();let c=z(!1),f=z(""),y=z(void 0);Ee(()=>{ce.connect();function r(e){if((e.metaKey||e.ctrlKey)&&e.key==="k"){e.preventDefault(),d(c,!t(c)),d(f,""),t(c)&&requestAnimationFrame(()=>{var n;return(n=t(y))==null?void 0:n.focus()});return}if(e.key==="Escape"&&t(c)){d(c,!1);return}if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)return;if(e.key==="/"){e.preventDefault();const n=document.querySelector('input[type="text"]');n==null||n.focus();return}const i={g:"/graph",m:"/memories",t:"/timeline",f:"/feed",e:"/explore",i:"/intentions",s:"/stats"}[e.key.toLowerCase()];i&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&(e.preventDefault(),de(`${O}${i}`))}return window.addEventListener("keydown",r),()=>{ce.disconnect(),window.removeEventListener("keydown",r)}});const $=[{href:"/graph",label:"Graph",icon:"◎",shortcut:"G"},{href:"/memories",label:"Memories",icon:"◈",shortcut:"M"},{href:"/timeline",label:"Timeline",icon:"◷",shortcut:"T"},{href:"/feed",label:"Feed",icon:"◉",shortcut:"F"},{href:"/explore",label:"Explore",icon:"◬",shortcut:"E"},{href:"/intentions",label:"Intentions",icon:"◇",shortcut:"I"},{href:"/stats",label:"Stats",icon:"◫",shortcut:"S"},{href:"/settings",label:"Settings",icon:"⚙",shortcut:","}],fe=$.slice(0,5);function J(r,e){const p=e.startsWith(O)?e.slice(O.length)||"/":e;return r==="/graph"?p==="/"||p==="/graph":p.startsWith(r)}let C=R(()=>t(f)?$.filter(r=>r.label.toLowerCase().includes(t(f).toLowerCase())):$);function U(r){d(c,!1),d(f,""),de(r)}var X=Je(),q=o(Ke(X),6),F=s(q),S=o(s(F),2);H(S,21,()=>$,V,(r,e)=>{const p=R(()=>J(t(e).href,Q().url.pathname));var i=Ve(),n=s(i),u=s(n,!0);a(n);var m=o(n,2),w=s(m,!0);a(m);var E=o(m,2),l=s(E,!0);a(E),a(i),K(()=>{le(i,"href",t(e).href),W(i,1,`flex items-center gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 text-sm - ${t(p)?"bg-synapse/15 text-synapse-glow border border-synapse/30 shadow-[0_0_12px_rgba(99,102,241,0.15)] nav-active-border":"text-dim hover:text-text hover:bg-white/[0.03] border border-transparent"}`),v(u,t(e).icon),v(w,t(e).label),v(l,t(e).shortcut)}),g(r,i)}),a(S);var A=o(S,2),xe=s(A);a(A);var Y=o(A,2),N=s(Y),Z=s(N),P=o(Z,2),ue=s(P,!0);a(P),a(N);var ee=o(N,2),D=s(ee),be=s(D);a(D);var te=o(D,2),he=s(te);a(te),a(ee),a(Y),a(F);var G=o(F,2),ae=s(G),ge=s(ae);Fe(ge,()=>T.children),a(ae),a(G);var se=o(G,2),re=s(se),ne=s(re);H(ne,17,()=>fe,V,(r,e)=>{const p=R(()=>J(t(e).href,Q().url.pathname));var i=We(),n=s(i),u=s(n,!0);a(n);var m=o(n,2),w=s(m,!0);a(m),a(i),K(()=>{le(i,"href",t(e).href),W(i,1,`flex flex-col items-center gap-0.5 px-3 py-2 rounded-lg transition-all min-w-[3.5rem] - ${t(p)?"text-synapse-glow":"text-muted"}`),v(u,t(e).icon),v(w,t(e).label)}),g(r,i)});var _e=o(ne,2);a(re),a(se),a(q);var ye=o(q,2);{var we=r=>{var e=Be(),p=s(e),i=s(p),n=o(s(i),2);Se(n),Ne(n,l=>d(y,l),()=>t(y)),Te(2),a(i);var u=o(i,2),m=s(u);H(m,17,()=>t(C),V,(l,b)=>{var M=Oe(),I=s(M),ke=s(I,!0);a(I);var j=o(I,2),$e=s(j,!0);a(j);var oe=o(j,2),Ce=s(oe,!0);a(oe),a(M),K(()=>{v(ke,t(b).icon),v($e,t(b).label),v(Ce,t(b).shortcut)}),h("click",M,()=>U(t(b).href)),g(l,M)});var w=o(m,2);{var E=l=>{var b=Qe();g(l,b)};ie(w,l=>{t(C).length===0&&l(E)})}a(u),a(p),a(e),h("keydown",e,l=>{l.key==="Escape"&&d(c,!1)}),h("click",e,l=>{l.target===l.currentTarget&&d(c,!1)}),h("keydown",n,l=>{l.key==="Enter"&&t(C).length>0&&U(t(C)[0].href)}),Ae(n,()=>t(f),l=>d(f,l)),g(r,e)};ie(ye,r=>{t(c)&&r(we)})}K(r=>{W(Z,1,`w-2 h-2 rounded-full ${B()?"bg-recall animate-pulse-glow":"bg-decay"}`),v(ue,B()?"Connected":"Offline"),v(be,`${pe()??""} memories`),v(he,`${r??""}% retention`)},[()=>(ve()*100).toFixed(0)]),h("click",xe,()=>{d(c,!0),d(f,""),requestAnimationFrame(()=>{var r;return(r=t(y))==null?void 0:r.focus()})}),h("click",_e,()=>{d(c,!0),d(f,""),requestAnimationFrame(()=>{var r;return(r=t(y))==null?void 0:r.focus()})}),g(x,X),Le(),me()}qe(["click","keydown"]);export{ct as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.br b/apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.br deleted file mode 100644 index a2d870ef07d959ce9f16ff276d70a6e7f93d51fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2804 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.gz b/apps/dashboard/build/_app/immutable/nodes/0.ChrQNylP.js.gz deleted file mode 100644 index 24f058a3092a32a07d70252c9415829f990a24ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3227 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 Ne*{const x=Ie;return{page:{subscribe:x.page.subscribe},navigating:{subscribe:x.navigating.subscribe},updated:x.updated}},Ve={subscribe(x){return He().page.subscribe(x)}};var We=y(' '),Oe=y(' '),Qe=y(''),Be=y('
No matches
'),Je=y('
esc
'),Ue=y('
',1);function vt(x,q){Ke(q,!0);const B=()=>T(Ve,"$page",$),J=()=>T(ze,"$isConnected",$),ve=()=>T(Re,"$memoryCount",$),me=()=>T(je,"$avgRetention",$),[$,fe]=Ge();let c=R(!1),f=R(""),w=R(void 0);Me(()=>{pe.connect();function r(e){if((e.metaKey||e.ctrlKey)&&e.key==="k"){e.preventDefault(),d(c,!t(c)),d(f,""),t(c)&&requestAnimationFrame(()=>{var n;return(n=t(w))==null?void 0:n.focus()});return}if(e.key==="Escape"&&t(c)){d(c,!1);return}if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)return;if(e.key==="/"){e.preventDefault();const n=document.querySelector('input[type="text"]');n==null||n.focus();return}const i={g:"/graph",m:"/memories",t:"/timeline",f:"/feed",e:"/explore",i:"/intentions",s:"/stats"}[e.key.toLowerCase()];i&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&(e.preventDefault(),ce(`${u}${i}`))}return window.addEventListener("keydown",r),()=>{pe.disconnect(),window.removeEventListener("keydown",r)}});const C=[{href:"/graph",label:"Graph",icon:"◎",shortcut:"G"},{href:"/memories",label:"Memories",icon:"◈",shortcut:"M"},{href:"/timeline",label:"Timeline",icon:"◷",shortcut:"T"},{href:"/feed",label:"Feed",icon:"◉",shortcut:"F"},{href:"/explore",label:"Explore",icon:"◬",shortcut:"E"},{href:"/intentions",label:"Intentions",icon:"◇",shortcut:"I"},{href:"/stats",label:"Stats",icon:"◫",shortcut:"S"},{href:"/settings",label:"Settings",icon:"⚙",shortcut:","}],xe=C.slice(0,5);function U(r,e){const p=e.startsWith(u)?e.slice(u.length)||"/":e;return r==="/graph"?p==="/"||p==="/graph":p.startsWith(r)}let E=H(()=>t(f)?C.filter(r=>r.label.toLowerCase().includes(t(f).toLowerCase())):C);function X(r){d(c,!1),d(f,""),ce(`${u}${r}`)}var Y=Ue(),F=o(Le(Y),6),S=s(F),Z=s(S),A=o(Z,2);V(A,21,()=>C,W,(r,e)=>{const p=H(()=>U(t(e).href,B().url.pathname));var i=We(),n=s(i),b=s(n,!0);a(n);var m=o(n,2),k=s(m,!0);a(m);var M=o(m,2),l=s(M,!0);a(M),a(i),L(()=>{O(i,"href",`${u??""}${t(e).href??""}`),Q(i,1,`flex items-center gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 text-sm + ${t(p)?"bg-synapse/15 text-synapse-glow border border-synapse/30 shadow-[0_0_12px_rgba(99,102,241,0.15)] nav-active-border":"text-dim hover:text-text hover:bg-white/[0.03] border border-transparent"}`),v(b,t(e).icon),v(k,t(e).label),v(l,t(e).shortcut)}),_(r,i)}),a(A);var N=o(A,2),ue=s(N);a(N);var P=o(N,2),D=s(P),ee=s(D),te=o(ee,2),be=s(te,!0);a(te),a(D);var ae=o(D,2),G=s(ae),he=s(G);a(G);var se=o(G,2),ge=s(se);a(se),a(ae),a(P),a(S);var I=o(S,2),re=s(I),_e=s(re);Se(_e,()=>q.children),a(re),a(I);var ne=o(I,2),oe=s(ne),ie=s(oe);V(ie,17,()=>xe,W,(r,e)=>{const p=H(()=>U(t(e).href,B().url.pathname));var i=Oe(),n=s(i),b=s(n,!0);a(n);var m=o(n,2),k=s(m,!0);a(m),a(i),L(()=>{O(i,"href",`${u??""}${t(e).href??""}`),Q(i,1,`flex flex-col items-center gap-0.5 px-3 py-2 rounded-lg transition-all min-w-[3.5rem] + ${t(p)?"text-synapse-glow":"text-muted"}`),v(b,t(e).icon),v(k,t(e).label)}),_(r,i)});var ye=o(ie,2);a(oe),a(ne),a(F);var we=o(F,2);{var ke=r=>{var e=Je(),p=s(e),i=s(p),n=o(s(i),2);Ae(n),De(n,l=>d(w,l),()=>t(w)),qe(2),a(i);var b=o(i,2),m=s(b);V(m,17,()=>t(E),W,(l,h)=>{var K=Qe(),j=s(K),$e=s(j,!0);a(j);var z=o(j,2),Ce=s(z,!0);a(z);var le=o(z,2),Ee=s(le,!0);a(le),a(K),L(()=>{v($e,t(h).icon),v(Ce,t(h).label),v(Ee,t(h).shortcut)}),g("click",K,()=>X(t(h).href)),_(l,K)});var k=o(m,2);{var M=l=>{var h=Be();_(l,h)};de(k,l=>{t(E).length===0&&l(M)})}a(b),a(p),a(e),g("keydown",e,l=>{l.key==="Escape"&&d(c,!1)}),g("click",e,l=>{l.target===l.currentTarget&&d(c,!1)}),g("keydown",n,l=>{l.key==="Enter"&&t(E).length>0&&X(t(E)[0].href)}),Ne(n,()=>t(f),l=>d(f,l)),_(r,e)};de(we,r=>{t(c)&&r(ke)})}L(r=>{O(Z,"href",`${u??""}/graph`),Q(ee,1,`w-2 h-2 rounded-full ${J()?"bg-recall animate-pulse-glow":"bg-decay"}`),v(be,J()?"Connected":"Offline"),v(he,`${ve()??""} memories`),v(ge,`${r??""}% retention`)},[()=>(me()*100).toFixed(0)]),g("click",ue,()=>{d(c,!0),d(f,""),requestAnimationFrame(()=>{var r;return(r=t(w))==null?void 0:r.focus()})}),g("click",ye,()=>{d(c,!0),d(f,""),requestAnimationFrame(()=>{var r;return(r=t(w))==null?void 0:r.focus()})}),_(x,Y),Te(),fe()}Fe(["click","keydown"]);export{vt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.br b/apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.br new file mode 100644 index 0000000000000000000000000000000000000000..15022a764bbac4e0077d975a9b0f02ef6749ba83 GIT binary patch literal 2832 zcmV+r3-9zBejosxgK^_rj%BXD9a>XtwM9f+jF4p3($xIt^Aeag3+&1%RlugyF2`fq zFijmK+9zGnlZ75J_IiZMCK_zh-glp0nQ}_fu@kL`&jJJpk){dWnrX|b)jun<_7UkOEs`PbEWq`k zwJ#NvK+rW*rLN+(5$I6>v;96~YPV_M%_Rf~L9Kg;#2+1;i`>;NZ-!a@2yJeXXTvYi z5H!Tu$Hxi{)rhBQ=Yv;ier|l$!+ynOHlTXX)1&&s*5MV8*AEp1OCGNGG)QB`AM3TM z^+@&lxhCto+9^I|U#0$_`T6_qsKvdY&5;e#Do)|9^hQ+2E*&{3_VTGRZ$FI3jn4(g z&9%lV+zeG3*H7&;iyMyYD=vzQk4i7yQ;zLtu7@n}UFk>ixX=1F*LH%t;##abUH`H_ zd@eGto4>rT787JH+Kdw?A{ZC+HQsd5$Ce&MAwuKzVN3$K$g8yU7Ilf3r{5;bm zxfHvfRov&Z=Bt`tFPkz*gyN!HH|MROZ z9cGdSmz}vk=i*iRm;vXTGsC4#Ub{}$!vjvSV!nsSF>KDyi9v#<{)b+zaB5i7W6vR1 zfnL}p%q%HHYNo>NJ#6R`?qVczKsabqDLR?iqoi;+S+uSdU+Z4++&L&$@VN$fw?wGAINdp+w6$aqiaI zy9z^Y?H}*LD(>npt_Wsg0B`xufFfX-os-^WO(lzY4WdRd(x#F_^(7e*oJz1L1^Eabz%xmfRy%tVj5R0wi211DVi+5l8gVo(T@GR zdi@Fv6sc!S5cQqNZ3=I8wYVZbQNgL(B}Ngik5k=Y6`B_4C11%q(kAwIm39EWn8u>r z3v)_yZ~?adeyJ<#w>;+ty)3j=(c@v$Sts4W?uMC;i(umVX;7BpVwwKSzu)qsDyPv6CMVue3ptEVO0G5J%z)*}Ymi62)NRP>w}`7N>w6;4A{tds-g06pNl~MMbL9^7pz2qyMIe&hpMyR@b-66 zbAEQY-wqZd^6`K}0*c5^t^BP4uo@k{GA+pUBw;|Dv|@3`$<&9VH?gJ~|Ma;hvNMp zW{tz{I=x*29{evAX;yDDHvx_U5E`cuN#k15E$3bpi;$816Uy2{NLZ{4mN}zCBqm=6 zis2DPh$7~N8|8$_4()lJuE(8jJN4&&Ut<;JpFg>jTy8PRlZhV(jS;QLZ!v(6a;5!y zI0VFXqje2Y^R!D$%WerO^DZc!jBe8 zWf*o(5?|^PZ`bGKw0tI~Cnj5AXqth4!Gg@V=VY~8wX6h`DvaoKh!7i1d_5lK%qk#j z_~C4v&0$R#8EaQ|W`Lhi@NF465%BgQ_4nmqh$#`QZt;?%x|Qhol3N}05pRB}kCGqX zq{>rq&9sAzS7PJSPBqglnsQUOk{zFNX+qtm=bUr55*eS9G^C=N4Hp%&WTtMAu{nPr zM|HbHSAb(Ya{9yHKhhH|*z#-J3Q7~}zAc@f1G?-}e&?+&n1`X{ufho8c>G_; zJZuyx*eZEO0@YzErnHIA-?Z};VWRCv42hlKk+E=%wqP%VMOb_OpuIxYHEIeQ+|`-T zjpA%RNq1P7qqh(Pi>s!ywGPvL_Ng|`@6YX)GLc|o*9C1RG5IMF(d&+-hKCQ6~BAY%#{`y;Aa`jZmvTHs-ZPLhA9}j(ypbkHaRisQ?Gs(-g#v1oKNf&a*Kq zJ&8HmW(pdG)XgF6U@xK|jG#M#Z6_GlyrTo}L~}GcA%mXj>0lQT!XEg7tF1lFUqj{F zw;*0I6U49ICmKXHDjnNPq9I7$U zZy&$-IRwd>^!7dp(xErcKRo7>s}s}7rFzrWWfS?nvwCh`?kmnl|1J-~5wlWK}`so{TKWcc%5 i?{nP=mV^nPFm0MRz@X@BpJ&D6G}k08qnhO+J=OO^g@}*< literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.gz b/apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..adf1ff81e772e3cb8513908c00bf97a24bf602bf GIT binary patch literal 3213 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

",1);function B(f,n){g(n,!1),h();var t=E(),r=d(t),c=s(r,!0);o(r);var a=_(r,2),u=s(a,!0);o(a),l(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),x(f,t),v()}export{B as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.br b/apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.br deleted file mode 100644 index 2c9624f..0000000 --- a/apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.br +++ /dev/null @@ -1 +0,0 @@ -f`dͦ{))ڒCx;@hbߺ.*[qRi~ӭ!Hk^_׊`͍12BgQ߫0_ld&R("72xSOB6fpE>Lix>>nҔ[r:=Sɤi ^Ei`pE\q7`;}dCk4D.uH:d1?#I<:dh)a @[D~ (8F/s ǃ R6JnXP+ܰ \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.gz b/apps/dashboard/build/_app/immutable/nodes/1.CUEJZ2Iu.js.gz deleted file mode 100644 index 0c408947fd1de18664dde157cebc35e0bc22e16d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 375 zcmV--0f_z|iwFP!000026J=0KYvV8wzVEM4Lk}}BI7wM3T~{e&w@{W+_5m&Q5>#7` zwYDWyk6_mLzZW?a1~Lk!8!Gj=J&7?SIi+tB1$zpI_u^Vh6>9XZ2V) z)6JB-XR*3|ylUr4o0NO15|k7Yv?LN7s7$aUnZT1vU_NJlzj^(t`})s3(EsGr{duAe4DVYCnIjSqVnm~_rKz`@B7 zon~D&6-G*&4>_OAT8mR`H%z@tnlH(-=q=I{Jbg{zRfIISn@4(R&Qsf@Qi4#aI z0P@X{Br>;9kUEWvWFZnru8zwg=Q_6S-NC4mt-i^ulirKH#1W~7iUQIBaFqRY*KImz VVLEHH)M3oOd;m(hiZf>d008+&x|#q0 diff --git a/apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js b/apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js new file mode 100644 index 0000000..abeb820 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js @@ -0,0 +1 @@ +import"../chunks/Bzak7iHL.js";import{i as h}from"../chunks/D1BK9eoQ.js";import{p as g,f as d,t as l,a as v,d as _,e as s,r as o}from"../chunks/BBD-8XME.js";import{s as p}from"../chunks/DNn3Nckx.js";import{a as x,f as $}from"../chunks/CKcqngaU.js";import{p as m}from"../chunks/BeSd-T80.js";import{s as k}from"../chunks/cIQD_rb4.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=$("

",1);function C(f,n){g(n,!1),h();var t=E(),r=d(t),c=s(r,!0);o(r);var a=_(r,2),u=s(a,!0);o(a),l(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),x(f,t),v()}export{C as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.br b/apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.br new file mode 100644 index 0000000000000000000000000000000000000000..23424055a186f77a824c68c7e41e01214cc55508 GIT binary patch literal 339 zcmV-Z0j&NTi2`7ZlrC=+ZSP<8*Hln4lNI0P0Mz>-Rtnbto$47NpEO`GOYAIbSVB3= z7?Tn`#lBjL#o9V2i#b6$O)@BGlz~Sw6r{n9bVw;7hDH%LH+O^e_j@WON5cz!1hWs-ttgqP zh{rt;x36j(nDRdrk$o@3>%ZFIZ$0L9IqLKG-7Zn)#tZNBeT7?7&wgInIFWpR$nkm- zYJq~qzSRk-*3U709z9RI+!2} z68Ddc?*S=c4KgH^Q%LAwOoWgq1Tyb<;S}XUR(>HPc>u^4tHPOaHq~w~Mmf&g6V`bu4| zcv^PJc2Iek-amaXTk>BOv#+zb*;xqj5e+`?MrR??Q(GW)v2aKj zqYWmN5w0)_WkFl0!F$#*SJF!vt1>WtHX}OiUI%tA;`K0 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js.br b/apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js.br deleted file mode 100644 index dceb4a1ccea7e62f1b839307fe01b4c6c88961af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js b/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js similarity index 92% rename from apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js rename to apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js index 2ac1492..a26e1cd 100644 --- a/apps/dashboard/build/_app/immutable/nodes/10.CsJcFbdU.js +++ b/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js @@ -1 +1 @@ -import"../chunks/Bzak7iHL.js";import{o as Ft}from"../chunks/CkyfbJUz.js";import{p as $t,a as Ct,d as s,e,j as W,h as y,g as t,r as a,s as E,f as dt,G as P,t as B,u as G}from"../chunks/C9Z4nxhR.js";import{d as Rt,s as i,a as At}from"../chunks/DP9qWekZ.js";import{i as X}from"../chunks/C2oj68pw.js";import{e as O,i as U}from"../chunks/kH-DTQyy.js";import{a as p,f as u}from"../chunks/DPfxVJHQ.js";import{s as A}from"../chunks/BkopTN9z.js";import{a as w}from"../chunks/BcuCGYSa.js";var Dt=u('
'),Mt=u('
'),kt=u('
'),Bt=u('
'),St=u('
'),Tt=u('

'),jt=u('

Retention Distribution

Memory Types

',1),Et=u('
Total Memories
Avg Retention
Due for Review
Embedding Coverage
',1),Pt=u('

System Stats

');function Lt(ot,vt){$t(vt,!0);let n=E(null),m=E(null),l=E(null),Y=E(!0);Ft(async()=>{try{await(async d=>{var r=W(d,3);y(n,r[0],!0),y(m,r[1],!0),y(l,r[2],!0)})(await Promise.all([w.stats(),w.health(),w.retentionDistribution()]))}catch{}finally{y(Y,!1)}});function q(d){return{healthy:"#10b981",degraded:"#f59e0b",critical:"#ef4444",empty:"#6b7280"}[d]||"#6b7280"}async function nt(){try{await w.consolidate(),await(async d=>{var r=W(d,3);y(n,r[0],!0),y(m,r[1],!0),y(l,r[2],!0)})(await Promise.all([w.stats(),w.health(),w.retentionDistribution()]))}catch{}}var z=Pt(),lt=s(e(z),2);{var ct=d=>{var r=Mt();O(r,20,()=>Array(8),U,(F,H)=>{var $=Dt();p(F,$)}),a(r),p(d,r)},xt=d=>{var r=Et(),F=dt(r),H=e(F),$=s(H,2),pt=e($,!0);a($);var Z=s($,2),ut=e(Z);a(Z),a(F);var I=s(F,2),J=e(I),tt=e(J),mt=e(tt,!0);a(tt),P(2),a(J);var K=s(J,2),L=e(K),gt=e(L);a(L),P(2),a(K);var N=s(K,2),at=e(N),_t=e(at,!0);a(at),P(2),a(N);var et=s(N,2),st=e(et),ft=e(st);a(st),P(2),a(et),a(I);var rt=s(I,2);{var bt=D=>{var S=jt(),M=dt(S),T=s(e(M),2);O(T,21,()=>t(l).distribution,U,(g,c,v)=>{const C=G(()=>Math.max(...t(l).distribution.map(V=>V.count),1)),R=G(()=>t(c).count/t(C)*100),_=G(()=>v<3?"#ef4444":v<5?"#f59e0b":v<7?"#10b981":"#6366f1");var x=kt(),o=e(x),f=e(o,!0);a(o);var b=s(o,2),h=s(b,2),Q=e(h,!0);a(h),a(x),B(()=>{i(f,t(c).count),A(b,`height: ${t(R)??""}%; background: ${t(_)??""}; opacity: 0.7; min-height: 2px`),i(Q,t(c).range)}),p(g,x)}),a(T),a(M);var k=s(M,2),j=s(e(k),2);O(j,21,()=>Object.entries(t(l).byType),U,(g,c)=>{var v=G(()=>W(t(c),2));let C=()=>t(v)[0],R=()=>t(v)[1];var _=Bt(),x=e(_),o=s(x,2),f=e(o,!0);a(o);var b=s(o,2),h=e(b,!0);a(b),a(_),B(()=>{A(x,`background: ${({fact:"#00A8FF",concept:"#9D00FF",event:"#FFB800",person:"#00FFD1",note:"#8B95A5",pattern:"#FF3CAC",decision:"#FF4757"}[C()]||"#8B95A5")??""}`),i(f,C()),i(h,R())}),p(g,_)}),a(j),a(k);var yt=s(k,2);{var wt=g=>{var c=Tt(),v=e(c),C=e(v);a(v);var R=s(v,2);O(R,21,()=>t(l).endangered.slice(0,20),U,(_,x)=>{var o=St(),f=e(o),b=e(f);a(f);var h=s(f,2),Q=e(h,!0);a(h),a(o),B(V=>{i(b,`${V??""}%`),i(Q,t(x).content)},[()=>(t(x).retentionStrength*100).toFixed(0)]),p(_,o)}),a(R),a(c),B(()=>i(C,`Endangered Memories (${t(l).endangered.length??""})`)),p(g,c)};X(yt,g=>{t(l).endangered.length>0&&g(wt)})}p(D,S)};X(rt,D=>{t(l)&&D(bt)})}var it=s(rt,2),ht=e(it);a(it),B((D,S,M,T,k,j)=>{A(F,`border-color: ${D??""}30`),A(H,`background: ${S??""}`),A($,`color: ${M??""}`),i(pt,T),i(ut,`v${t(m).version??""}`),i(mt,t(n).totalMemories),A(L,`color: ${t(n).averageRetention>.7?"#10b981":t(n).averageRetention>.4?"#f59e0b":"#ef4444"}`),i(gt,`${k??""}%`),i(_t,t(n).dueForReview),i(ft,`${j??""}%`)},[()=>q(t(m).status),()=>q(t(m).status),()=>q(t(m).status),()=>t(m).status.toUpperCase(),()=>(t(n).averageRetention*100).toFixed(1),()=>t(n).embeddingCoverage.toFixed(0)]),At("click",ht,nt),p(d,r)};X(lt,d=>{t(Y)?d(ct):t(n)&&t(m)&&d(xt,1)})}a(z),p(ot,z),Ct()}Rt(["click"]);export{Lt as component}; +import"../chunks/Bzak7iHL.js";import{o as Ft}from"../chunks/DUC-ssvh.js";import{p as $t,a as Ct,d as s,e,j as W,h as y,g as t,r as a,s as E,f as dt,G as P,t as B,u as G}from"../chunks/BBD-8XME.js";import{d as Rt,s as i,a as At}from"../chunks/DNn3Nckx.js";import{i as X}from"../chunks/RaRNNC-y.js";import{e as O,i as U}from"../chunks/C5a--lgk.js";import{a as p,f as u}from"../chunks/CKcqngaU.js";import{s as A}from"../chunks/DBfx-YTU.js";import{a as w}from"../chunks/BcuCGYSa.js";var Dt=u('
'),Mt=u('
'),kt=u('
'),Bt=u('
'),St=u('
'),Tt=u('

'),jt=u('

Retention Distribution

Memory Types

',1),Et=u('
Total Memories
Avg Retention
Due for Review
Embedding Coverage
',1),Pt=u('

System Stats

');function Lt(ot,vt){$t(vt,!0);let n=E(null),m=E(null),l=E(null),Y=E(!0);Ft(async()=>{try{await(async d=>{var r=W(d,3);y(n,r[0],!0),y(m,r[1],!0),y(l,r[2],!0)})(await Promise.all([w.stats(),w.health(),w.retentionDistribution()]))}catch{}finally{y(Y,!1)}});function q(d){return{healthy:"#10b981",degraded:"#f59e0b",critical:"#ef4444",empty:"#6b7280"}[d]||"#6b7280"}async function nt(){try{await w.consolidate(),await(async d=>{var r=W(d,3);y(n,r[0],!0),y(m,r[1],!0),y(l,r[2],!0)})(await Promise.all([w.stats(),w.health(),w.retentionDistribution()]))}catch{}}var z=Pt(),lt=s(e(z),2);{var ct=d=>{var r=Mt();O(r,20,()=>Array(8),U,(F,H)=>{var $=Dt();p(F,$)}),a(r),p(d,r)},xt=d=>{var r=Et(),F=dt(r),H=e(F),$=s(H,2),pt=e($,!0);a($);var Z=s($,2),ut=e(Z);a(Z),a(F);var I=s(F,2),J=e(I),tt=e(J),mt=e(tt,!0);a(tt),P(2),a(J);var K=s(J,2),L=e(K),gt=e(L);a(L),P(2),a(K);var N=s(K,2),at=e(N),_t=e(at,!0);a(at),P(2),a(N);var et=s(N,2),st=e(et),ft=e(st);a(st),P(2),a(et),a(I);var rt=s(I,2);{var bt=D=>{var S=jt(),M=dt(S),T=s(e(M),2);O(T,21,()=>t(l).distribution,U,(g,c,v)=>{const C=G(()=>Math.max(...t(l).distribution.map(V=>V.count),1)),R=G(()=>t(c).count/t(C)*100),_=G(()=>v<3?"#ef4444":v<5?"#f59e0b":v<7?"#10b981":"#6366f1");var x=kt(),o=e(x),f=e(o,!0);a(o);var b=s(o,2),h=s(b,2),Q=e(h,!0);a(h),a(x),B(()=>{i(f,t(c).count),A(b,`height: ${t(R)??""}%; background: ${t(_)??""}; opacity: 0.7; min-height: 2px`),i(Q,t(c).range)}),p(g,x)}),a(T),a(M);var k=s(M,2),j=s(e(k),2);O(j,21,()=>Object.entries(t(l).byType),U,(g,c)=>{var v=G(()=>W(t(c),2));let C=()=>t(v)[0],R=()=>t(v)[1];var _=Bt(),x=e(_),o=s(x,2),f=e(o,!0);a(o);var b=s(o,2),h=e(b,!0);a(b),a(_),B(()=>{A(x,`background: ${({fact:"#00A8FF",concept:"#9D00FF",event:"#FFB800",person:"#00FFD1",note:"#8B95A5",pattern:"#FF3CAC",decision:"#FF4757"}[C()]||"#8B95A5")??""}`),i(f,C()),i(h,R())}),p(g,_)}),a(j),a(k);var yt=s(k,2);{var wt=g=>{var c=Tt(),v=e(c),C=e(v);a(v);var R=s(v,2);O(R,21,()=>t(l).endangered.slice(0,20),U,(_,x)=>{var o=St(),f=e(o),b=e(f);a(f);var h=s(f,2),Q=e(h,!0);a(h),a(o),B(V=>{i(b,`${V??""}%`),i(Q,t(x).content)},[()=>(t(x).retentionStrength*100).toFixed(0)]),p(_,o)}),a(R),a(c),B(()=>i(C,`Endangered Memories (${t(l).endangered.length??""})`)),p(g,c)};X(yt,g=>{t(l).endangered.length>0&&g(wt)})}p(D,S)};X(rt,D=>{t(l)&&D(bt)})}var it=s(rt,2),ht=e(it);a(it),B((D,S,M,T,k,j)=>{A(F,`border-color: ${D??""}30`),A(H,`background: ${S??""}`),A($,`color: ${M??""}`),i(pt,T),i(ut,`v${t(m).version??""}`),i(mt,t(n).totalMemories),A(L,`color: ${t(n).averageRetention>.7?"#10b981":t(n).averageRetention>.4?"#f59e0b":"#ef4444"}`),i(gt,`${k??""}%`),i(_t,t(n).dueForReview),i(ft,`${j??""}%`)},[()=>q(t(m).status),()=>q(t(m).status),()=>q(t(m).status),()=>t(m).status.toUpperCase(),()=>(t(n).averageRetention*100).toFixed(1),()=>t(n).embeddingCoverage.toFixed(0)]),At("click",ht,nt),p(d,r)};X(lt,d=>{t(Y)?d(ct):t(n)&&t(m)&&d(xt,1)})}a(z),p(ot,z),Ct()}Rt(["click"]);export{Lt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.br b/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.br new file mode 100644 index 0000000000000000000000000000000000000000..59b2c4cdd239166df26448ded8b6911c179eb2e0 GIT binary patch literal 2025 zcmVYj+vl`nCS&V62OcYNek5b!FK;K4U+sQX zjaI3C+sx0?&0&(QwhM~Ib?v;BLl*PSBu`;{fg)M0`_P2E(K}5bgoA{b+0=hwGHVzZ zH&C_>9!bNBQ5YK6BmY7=Y|wc-?Yj9X^oNGH_lliMoAC0Z% znRaHWr8)LwteIX4B$nZW6|9-4PUD`&+YjZS))U?PJnHs_v!E)b*PJKsE0q7HrxG*mj7_5AD{d48D%c-k?N2e`zm8Q?QIpxoxm zikIE~4R6@WP?pp;oK`{n#*E7Y%EFb7-oEiF^NTaDTrTcW#dtjHEp8{7uzHYM2 z?8=MgNY2p*D6VHE-yQ<4lSoP*>>+ zRaK0I<+GSp>i=CBo2&=Cahywx z3^?!`VMmr#e^pc;<#zJSzg);1!_X5=H|{?=U^dm z@mKig?ry@^A(~oO83ePAyFLk&&!O@S%YpB@cD zaYjp!{d^R({NNcsvk*S<5pg5L4ZJ@7Qw1|T7? zD{KgajVT7Nvw;V`V_th-03L4IJ7qy=A`)o}NZWO|6;eudr=i?MEx*asgcpFc@tw4X zopd03i1h=#bC|^U(h2suN2i_&9NWvklNUd^*Z?P;P!D1gMq7{A)FEl`+Q7p$CA7{~ z6vR&$zNJIX!I4;oEj8&##Y5~^ewU$;7tKTEG#E2rH>Y|z$sE*YpwE776)#>k877lS zS~;B3;91MBFEwbUP!^%NJz@xCH9w_*a+qh*Lc%$|zNa)SNxgE&R53L=By(egj3274z&np~}YV#Fsec zCGtfOzM~KMD>2<+Ga=VRFeg|UfnV)BKm()8Iq&iB``!Btx07Ys0wIp^GTH68d@M;c z?n7ruPoL@wNn+t3OxA{wA=B`Z%%qEl%c(Y1B2qYSQ=kTUoC+`gh&rFnx%dl0@Xbm} zCO(vp8!@M6>JpkAS zm{h!CFmktmMDHxK{retzlPGZ-4O*m47~5AGAH%0ia#MrX+SE-9UTPyRHPkeRWjxYm z&P-MZ84T}P2gck`bjw%*5Mtd@NGrDU|kWvX~W)PAxqNwD> zP;ti5j5{BYN(rKhZi!3E#9bCbR;l_|;dfcnz1S3_b8b0!riB$ob=!4-wu01&j4O_| z04Z7U^*RYJ&YYzaI=fRT{meHR#hFo>9O`JwTG literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.gz b/apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..146020ccc95560ba2042d66f75c55f2ff52158d2 GIT binary patch literal 2265 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 N{{T7mE*)PF005TkcH;m5 diff --git a/apps/dashboard/build/_app/immutable/nodes/11.C5VMEnLV.js b/apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js similarity index 86% rename from apps/dashboard/build/_app/immutable/nodes/11.C5VMEnLV.js rename to apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js index 5fb29ba..99225ce 100644 --- a/apps/dashboard/build/_app/immutable/nodes/11.C5VMEnLV.js +++ b/apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js @@ -1 +1 @@ -import"../chunks/Bzak7iHL.js";import{o as pe}from"../chunks/CkyfbJUz.js";import{p as ce,s as b,c as me,g as e,a as _e,d as i,e as a,h as c,r as t,t as g}from"../chunks/C9Z4nxhR.js";import{d as ue,a as K,s as m}from"../chunks/DP9qWekZ.js";import{i as M}from"../chunks/C2oj68pw.js";import{e as h,i as P}from"../chunks/kH-DTQyy.js";import{a as l,f as v}from"../chunks/DPfxVJHQ.js";import{s as Q}from"../chunks/BkopTN9z.js";import{b as xe}from"../chunks/-jeO_JOJ.js";import{a as fe}from"../chunks/BcuCGYSa.js";import{N as U}from"../chunks/CZ45jJaw.js";var be=v('
'),ge=v('
'),he=v('

No memories in the selected time range.

'),ye=v('
'),we=v(' '),ke=v('
'),Te=v('
'),je=v('
'),Ae=v('
'),Ne=v('

Timeline

');function Re(V,W){ce(W,!0);let _=b(me([])),y=b(!0),w=b(14),k=b(null);pe(()=>R());async function R(){c(y,!0);try{const s=await fe.timeline(e(w),500);c(_,s.timeline,!0)}catch{c(_,[],!0)}finally{c(y,!1)}}var T=Ne(),j=a(T),u=i(a(j),2),A=a(u);A.value=A.__value=7;var N=i(A);N.value=N.__value=14;var O=i(N);O.value=O.__value=30;var Y=i(O);Y.value=Y.__value=90,t(u),t(j);var X=i(j,2);{var Z=s=>{var d=ge();h(d,20,()=>Array(7),P,(x,f)=>{var r=be();l(x,r)}),t(d),l(s,d)},ee=s=>{var d=he();l(s,d)},te=s=>{var d=Ae(),x=i(a(d),2);h(x,21,()=>e(_),f=>f.date,(f,r)=>{var S=je(),B=i(a(S),2),D=a(B),E=a(D),$=a(E),ae=a($,!0);t($);var q=i($,2),se=a(q);t(q),t(E);var z=i(E,2),G=a(z);h(G,17,()=>e(r).memories.slice(0,10),P,(n,o)=>{var p=ye();g(()=>Q(p,`background: ${(U[e(o).nodeType]||"#8B95A5")??""}; opacity: ${.3+e(o).retentionStrength*.7}`)),l(n,p)});var ie=i(G,2);{var re=n=>{var o=we(),p=a(o);t(o),g(()=>m(p,`+${e(r).memories.length-10}`)),l(n,o)};M(ie,n=>{e(r).memories.length>10&&n(re)})}t(z),t(D);var oe=i(D,2);{var le=n=>{var o=Te();h(o,21,()=>e(r).memories,P,(p,C)=>{var F=ke(),H=a(F),L=i(H,2),I=a(L),ve=a(I,!0);t(I),t(L);var J=i(L,2),de=a(J);t(J),t(F),g(ne=>{Q(H,`background: ${(U[e(C).nodeType]||"#8B95A5")??""}`),m(ve,e(C).content),m(de,`${ne??""}%`)},[()=>(e(C).retentionStrength*100).toFixed(0)]),l(p,F)}),t(o),l(n,o)};M(oe,n=>{e(k)===e(r).date&&n(le)})}t(B),t(S),g(()=>{m(ae,e(r).date),m(se,`${e(r).count??""} memories`)}),K("click",B,()=>c(k,e(k)===e(r).date?null:e(r).date,!0)),l(f,S)}),t(x),t(d),l(s,d)};M(X,s=>{e(y)?s(Z):e(_).length===0?s(ee,1):s(te,!1)})}t(T),K("change",u,R),xe(u,()=>e(w),s=>c(w,s)),l(V,T),_e()}ue(["change","click"]);export{Re as component}; +import"../chunks/Bzak7iHL.js";import{o as pe}from"../chunks/DUC-ssvh.js";import{p as ce,s as b,c as me,g as e,a as _e,d as i,e as a,h as c,r as t,t as g}from"../chunks/BBD-8XME.js";import{d as ue,a as K,s as m}from"../chunks/DNn3Nckx.js";import{i as M}from"../chunks/RaRNNC-y.js";import{e as h,i as P}from"../chunks/C5a--lgk.js";import{a as l,f as v}from"../chunks/CKcqngaU.js";import{s as Q}from"../chunks/DBfx-YTU.js";import{b as xe}from"../chunks/C-QujEl6.js";import{a as fe}from"../chunks/BcuCGYSa.js";import{N as U}from"../chunks/CZ45jJaw.js";var be=v('
'),ge=v('
'),he=v('

No memories in the selected time range.

'),ye=v('
'),we=v(' '),ke=v('
'),Te=v('
'),je=v('
'),Ae=v('
'),Ne=v('

Timeline

');function Re(V,W){ce(W,!0);let _=b(me([])),y=b(!0),w=b(14),k=b(null);pe(()=>R());async function R(){c(y,!0);try{const s=await fe.timeline(e(w),500);c(_,s.timeline,!0)}catch{c(_,[],!0)}finally{c(y,!1)}}var T=Ne(),j=a(T),u=i(a(j),2),A=a(u);A.value=A.__value=7;var N=i(A);N.value=N.__value=14;var O=i(N);O.value=O.__value=30;var Y=i(O);Y.value=Y.__value=90,t(u),t(j);var X=i(j,2);{var Z=s=>{var d=ge();h(d,20,()=>Array(7),P,(x,f)=>{var r=be();l(x,r)}),t(d),l(s,d)},ee=s=>{var d=he();l(s,d)},te=s=>{var d=Ae(),x=i(a(d),2);h(x,21,()=>e(_),f=>f.date,(f,r)=>{var S=je(),B=i(a(S),2),D=a(B),E=a(D),$=a(E),ae=a($,!0);t($);var q=i($,2),se=a(q);t(q),t(E);var z=i(E,2),G=a(z);h(G,17,()=>e(r).memories.slice(0,10),P,(n,o)=>{var p=ye();g(()=>Q(p,`background: ${(U[e(o).nodeType]||"#8B95A5")??""}; opacity: ${.3+e(o).retentionStrength*.7}`)),l(n,p)});var ie=i(G,2);{var re=n=>{var o=we(),p=a(o);t(o),g(()=>m(p,`+${e(r).memories.length-10}`)),l(n,o)};M(ie,n=>{e(r).memories.length>10&&n(re)})}t(z),t(D);var oe=i(D,2);{var le=n=>{var o=Te();h(o,21,()=>e(r).memories,P,(p,C)=>{var F=ke(),H=a(F),L=i(H,2),I=a(L),ve=a(I,!0);t(I),t(L);var J=i(L,2),de=a(J);t(J),t(F),g(ne=>{Q(H,`background: ${(U[e(C).nodeType]||"#8B95A5")??""}`),m(ve,e(C).content),m(de,`${ne??""}%`)},[()=>(e(C).retentionStrength*100).toFixed(0)]),l(p,F)}),t(o),l(n,o)};M(oe,n=>{e(k)===e(r).date&&n(le)})}t(B),t(S),g(()=>{m(ae,e(r).date),m(se,`${e(r).count??""} memories`)}),K("click",B,()=>c(k,e(k)===e(r).date?null:e(r).date,!0)),l(f,S)}),t(x),t(d),l(s,d)};M(X,s=>{e(y)?s(Z):e(_).length===0?s(ee,1):s(te,!1)})}t(T),K("change",u,R),xe(u,()=>e(w),s=>c(w,s)),l(V,T),_e()}ue(["change","click"]);export{Re as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.br b/apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.br new file mode 100644 index 0000000000000000000000000000000000000000..bd79ebe304cb622c003fa5964a33c5a29eaea736 GIT binary patch literal 1551 zcmV+q2JrbCUJntKoGcJJ4stSA^G8ucKsLuMb-cQrvLwbzS248aXUhN z^P1491qhlzO3;Z3YfBZe!M*9;AT+2h4Icw#Y_0Av4DHy`tAZN5TDI&=lY^ruk1?=? zM46K-=}CJ{3}KHngs4zSfdXOUrzp(VJNN2MhRZi*)=}gl&`>eS!{6RAP0RAKD3pi& zZxVL=>9QWkEe^2wCr0E&g8n7FKD5j5egIPD9*9nhsA-O;S@ewYu54^!r2TKCMPzvkXYu0&;VlfsCkOSYZjibrsm;rR~CvrC$8Ah^zg5o-gnJMS)iD;rFn zZwVOo`)kgZW-FMJ0!zdrCOyp$_O++W1KghQHxp!Lri?CJ)&eD4u4WF1j7hqv)Xn<} z+?0gMUWE#p0i8Wm-4ZaArico34S6=$K94yn&WspsnQxRzE~HW?Ps;*R$(N2n2X-MSuugH2nNibLP*STwdWj!}pux1F%-R7X9;gxuw>fm=A5Iz!f`1kF#d&76U* zVw(f3a)~BZWVKgYja}#^S!NWYV7LrfCBoXp+Jb)-pnX@0Qcy+>?X5!PUs)L_&c??D zv=JvI6woXg;w3Z^bRtLG7S0(SX74^sDxH#Ye=X@~YGC0O?L%z?X>?5`G^$Y>QXo|d z{0ilI)iXlX${~(9O4&yQEi<$&&|o4kFJ;Xpt)$Ac&TI+BsL_2cfSaxW4b3S~Vk{e@ zFGf6NYyka%oAKad#2Sy*G-9@|_L*h;}ES$Z=0 zPE4x9;lFTKV<-qpxC^rS5Q0D_T;_xlfX!mJhvt7ay@9-(jN)GFQAK^=fuV=NrCL3E7`EFSNm5JPN_TVHBJ^ z=o?ekL>#pyF%1}T;%K@wV4F9Yk#VYMRpe^poiW0%*3se}Ik=xv;_SQ)Zhh>x{=Zwz z?kEX{twzf8t%fp++iMsjt=_`EaD53!dJAT1x{m_(<{4bK5u){l32f(Rycq9Z({D#1qR@%JPxRQ6{!C6UXJU zDH0MX@d^Rzh)4f@yFp5(L`|ypgAEe>y8HF(1|$Vhnq;ccY_?oKkH@mr{o#xcgSVH> zk!-XBZGB3JBS|V2gDiw@CdwB?icq*pctiyeP;=s;XdbuH=Opu5 zlBuyveE3_|G04NP!fIML0O5Fz)=U;;q8!pSI^?*85cC+=QVc>dBY_eTh^CxOk)e}9 zM(r=LmMwH5WmwIFHC6=U7}C#zcx;$Uj$|{FVUZ|^jj4vzc!PK(3}RuxW|SJ%GxcS- zpO?BxV%;0czp0fErRIgypQTXl3f8H2>lPXYoJiJA1*OdHTv5i_4(Q^N=cp7S(zy<(viXyn#8MGyJ5wiszKEtO zdqD-AGJaqJ&ZQ4rt_B;)Z~__g^78xWS81=EO@9# z@iR^NBc8LNKAT5m=ZSu~6EtDXIPt{IJQeqU|K0fa@7-4iCkGAo`gNnRXp;mkpg_$L z-rW05!!x1a&VfCgJ~$aq92f@>IDDA*v}@&td}d5VPw{pS&;{tgSH z8dvY51$RwTB^SX=c+_O~D0j*)ibIuD#ZQ*vkC|=TS|~gmsCrnc-bJVDWpAG%>L9-o zh~%Uur?*@vRcVr|Z{?4e^#g6VFy7+^@9K`Ybj&w%zQ!B(X!VMsBhvxDE_lz@Zv-I! zl}pWi&R$FUjUC|uFDC~Ao3JSax7d-S7|trnxhdHA__LtFbAAQ)g`jykC~#3rq&MYK xXaAD}{sAUrk;7-j%B`&Cp0&kH|CYMaKNsBuep$uPj79rj{{yfb5X)Z=007!}X&(Rp literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js b/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js new file mode 100644 index 0000000..0c29b80 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js @@ -0,0 +1 @@ +import"../chunks/Bzak7iHL.js";import{f as m}from"../chunks/BBD-8XME.js";import{c as n,a as p}from"../chunks/CKcqngaU.js";import{s as i}from"../chunks/DZuEJlJ5.js";function d(r,t){var o=n(),a=m(o);i(a,()=>t.children),p(r,o)}export{d as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.br b/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.br new file mode 100644 index 0000000000000000000000000000000000000000..e3f8b90eef42c6238ee7f925db9cf70875484c11 GIT binary patch literal 143 zcmV;A0C4{s_5grnV_Th)IMRkDeV6DBG1JNUQBw-@wtx$?fU-2_mfIM39LrIKr9SXX z@w{NTRU8z;uGa$DyF7Tmpyt&!*rZmF(X@7Sa=Qbke4j@c5wn`C>431m8(HjVFBGc> xa`;!rTX+-Af0>Z8WnAB683VG~GJ*u>9%wA!a#iw&IkG7;!O3cE!L*oTniEN+M~naf literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.gz b/apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2a5e4197f081a26787c4f65c48771848ce685c9 GIT binary patch literal 184 zcmV;p07w5HiwFP!0000216|EQ3xY5h#_@ZfVszSI%~KSJ9ZVstjzM%AQ*-Iw*)}5* zzkAM;czO@-@8K_1tBqST7Ko~Y+6M8D*E@N-u$Ntja{Bfq;ufi)G+NDNoNV^@YdV+0 zOQ77Jb~!kn#T%adHXm3ot.children),p(r,o)}export{d as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/2.Bv9w28KX.js.br b/apps/dashboard/build/_app/immutable/nodes/2.Bv9w28KX.js.br deleted file mode 100644 index f91da89db1ae3e75d8ce9609a593a83c3e4a7d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmV;90CE2t_5grnWln#imZ|oHG=a$m("/graph",{replaceState:!0})),p(),a()}export{g as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.br b/apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.br deleted file mode 100644 index 7b4aa5b6e6426c689265ed487f12a986f8e880f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmV;X09pSVBmp30XhpN!nn4;+aihL0AKm{$nQ3W%kz|?h*spi zyC$M2O;`8B_9{g_G735{Uc73GHi@xE2r*oWG_l|`(8{k^$$+x z8$YJxbo9e(Rl#!IgT(HK!nvvxqQ3Vftob8;Z*b%p1^EjA`U86)(nt3q{CDfwG1Q;S U$bUrs1jvs8|MOR-n1}p(6coc-`~Uy| diff --git a/apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.gz b/apps/dashboard/build/_app/immutable/nodes/3.D_o4dH3z.js.gz deleted file mode 100644 index 212c83fbb87e775b9d5766943f320736622b2bce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmV;(05|_1iwFP!000026J^a!3xY5JfZ=<;LOpFT{D?qG>QEgb#6wbtF0o|l(tR{1 znBspAy(D&iA9yK~LTSskog}Y$Q91h-7d}0O_N%f2I@XRFxH4p)D#0f5al@`3F3YJD zgH&^QC_d@)d~K&v4pJlhXV>=?Z}Q93W`kvOd8~Q#j=gAF1-!2hM3QoB0gT)t;kasO50RRAE C6;j;* diff --git a/apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js b/apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js new file mode 100644 index 0000000..321be3f --- /dev/null +++ b/apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js @@ -0,0 +1 @@ +import"../chunks/Bzak7iHL.js";import{i as p}from"../chunks/D1BK9eoQ.js";import{o as r}from"../chunks/DUC-ssvh.js";import{p as t,a}from"../chunks/BBD-8XME.js";import{g as m}from"../chunks/cIQD_rb4.js";function g(i,o){t(o,!1),r(()=>m("/graph",{replaceState:!0})),p(),a()}export{g as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.br b/apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.br new file mode 100644 index 0000000000000000000000000000000000000000..6b4d86cb41d18c3613f0921bd30dfd1200430616 GIT binary patch literal 166 zcmV;X09pSVBmp4hXq$Z{0qK5b-Vk$}ogZponT2s}fwx5x#R0zZ?~&ha443CAMG>vY zdv{G#t2I{g4b`nJ6I$)b`*T%siILD!8KYgy$|FvbvTiI-1KxbV_-!8&?n zn#yvyuJr$x4a8LkVGoZr=`ii6?_C7BY@*Zyvy3-T*#SV4sSZT#qk9qMbnDqM)ZY-V U=LnT8KxGR<*%b&v?U#TrwWxs7c` zB>wl(OJe8uftQt1DC2mZPx6Wv+K=A2n6mA`yK5(8U9FjgwI!QWiLxi-AllEVNcvK= zQvJ#E+SU4*_oZy5L3n7RD0XL;Gw=%$xfVBYv*#Sff z0JvP0!0|JMW$vI_QTf1xo(wj0VUHUKkpvK702})H?TGlkIpwAaM<1ieZp$SB001#j BUT**Z literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js b/apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js similarity index 95% rename from apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js rename to apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js index b6f1009..2b88bad 100644 --- a/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js +++ b/apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js @@ -1,4 +1,4 @@ -import"../chunks/Bzak7iHL.js";import{p as ze,s as I,c as Ae,g as e,a as Pe,d as a,e as r,h as b,r as t,i as Qe,t as y,f as ge,u as se,j as qe}from"../chunks/C9Z4nxhR.js";import{d as Be,a as q,s as o}from"../chunks/DP9qWekZ.js";import{a as c,f as m,c as De}from"../chunks/DPfxVJHQ.js";import{i as k}from"../chunks/C2oj68pw.js";import{e as ie,i as ne}from"../chunks/kH-DTQyy.js";import{r as ye}from"../chunks/ZesQ8l8p.js";import{s as oe}from"../chunks/Co2v30Gm.js";import{s as Ke}from"../chunks/BkopTN9z.js";import{b as de}from"../chunks/P9ZHwQBL.js";import{a as X}from"../chunks/BcuCGYSa.js";var Re=m(''),Ue=m('
Source

'),Ve=m('
Target

'),Ge=m(`
Target Memory
'),Ue=m('
Source

'),Ve=m('
Target

'),Ge=m(`
Target Memory
`,1),He=m('

'),Je=m(' '),Le=m(" "),We=m(" "),Xe=m(" "),Ye=m(' '),Ze=m('

'),et=m('

'),tt=m('

No connections found for this query.

'),rt=m('
'),at=m('
'),st=m('
'),it=m(`

Explore Connections

Source Memory

Importance Scorer

4-channel neuroscience scoring: novelty, arousal, reward, attention

`);function ft(he,we){ze(we,!0);let V=I(""),G=I(""),F=I(null),C=I(null),B=I(Ae([])),$=I("associations"),O=I(!1),H=I(""),D=I(null);const le={associations:{icon:"◎",desc:"Spreading activation — find related memories via graph traversal"},chains:{icon:"⟿",desc:"Build reasoning path from source to target memory"},bridges:{icon:"⬡",desc:"Find connecting memories between two concepts"}};async function ve(){if(e(V).trim()){b(O,!0);try{const s=await X.search(e(V),1);s.results.length>0&&(b(F,s.results[0],!0),await Y())}catch{}finally{b(O,!1)}}}async function pe(){if(e(G).trim()){b(O,!0);try{const s=await X.search(e(G),1);s.results.length>0&&(b(C,s.results[0],!0),e(F)&&await Y())}catch{}finally{b(O,!1)}}}async function Y(){if(e(F)){b(O,!0);try{const s=(e($)==="chains"||e($)==="bridges")&&e(C)?e(C).id:void 0,i=await X.explore(e(F).id,e($),s);b(B,i.results||i.nodes||i.chain||i.bridges||[],!0)}catch{b(B,[],!0)}finally{b(O,!1)}}}async function ke(){e(H).trim()&&b(D,await X.importance(e(H)),!0)}function Se(s){b($,s,!0),e(F)&&Y()}var Z=it(),ee=a(r(Z),2);ie(ee,20,()=>["associations","chains","bridges"],ne,(s,i)=>{var d=Re(),_=r(d),h=r(_,!0);t(_);var f=a(_,2),p=r(f,!0);t(f);var n=a(f,2),g=r(n,!0);t(n),t(d),y(w=>{oe(d,1,`flex flex-col items-center gap-1 p-3 rounded-xl text-sm transition diff --git a/apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.br b/apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.br new file mode 100644 index 0000000000000000000000000000000000000000..908dfaf84513454d84eee631682a8537e732ddca GIT binary patch literal 3021 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 RhLh%Z{{tv{cMZ}d0075&yA%Kb literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.br b/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.br deleted file mode 100644 index 567327567cc88081eae640d69f6f86882ae69a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3026 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 Uz}np=7ylN^Ns=CDA+|KQkN@lRAOHXW diff --git a/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.gz b/apps/dashboard/build/_app/immutable/nodes/4.CeoFmj14.js.gz deleted file mode 100644 index 12ccefb79943083329aa907399542c5cac5f59b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3519 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js.br b/apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js.br deleted file mode 100644 index 62667115d07086e16c3fe52fcdd6548117d5c7d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2964 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js b/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js similarity index 90% rename from apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js rename to apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js index b7cd273..9aec708 100644 --- a/apps/dashboard/build/_app/immutable/nodes/5.CgbdGsQS.js +++ b/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js @@ -1,4 +1,4 @@ -import"../chunks/Bzak7iHL.js";import{i as oe}from"../chunks/_Va07L2l.js";import{p as ee,ah as ie,g as e,h as M,e as o,d,r as s,f as ne,t as $,a as te,s as K,u as X,C as Z}from"../chunks/C9Z4nxhR.js";import{s as x,d as de,a as ce}from"../chunks/DP9qWekZ.js";import{a as l,f as m}from"../chunks/DPfxVJHQ.js";import{i as w}from"../chunks/C2oj68pw.js";import{e as re,i as ae}from"../chunks/kH-DTQyy.js";import{s as C}from"../chunks/BkopTN9z.js";import{s as le,a as me}from"../chunks/DWr9YED7.js";import{w as ve,e as ue}from"../chunks/BmeMLq0p.js";import{E as O}from"../chunks/CZ45jJaw.js";import{s as pe}from"../chunks/ZesQ8l8p.js";import{s as fe}from"../chunks/Co2v30Gm.js";import{p as Q}from"../chunks/Do8TgQ-j.js";var xe=m(' '),_e=m('

'),ge=m('
',1),he=m('
'),ye=m('
'),$e=m('
Cognitive Search Pipeline
');function be(q,F){ee(F,!0);let S=Q(F,"resultCount",3,0),j=Q(F,"durationMs",3,0),I=Q(F,"active",3,!1);const p=[{name:"Overfetch",icon:"◎",color:"#818CF8",desc:"Pull 3x results from hybrid search"},{name:"Rerank",icon:"⟿",color:"#00A8FF",desc:"Re-score by relevance quality"},{name:"Temporal",icon:"◷",color:"#00D4FF",desc:"Recent memories get recency bonus"},{name:"Access",icon:"◇",color:"#00FFD1",desc:"FSRS-6 retention threshold filter"},{name:"Context",icon:"◬",color:"#FFB800",desc:"Encoding specificity matching"},{name:"Compete",icon:"⬡",color:"#FF3CAC",desc:"Retrieval-induced forgetting"},{name:"Activate",icon:"◈",color:"#9D00FF",desc:"Spreading activation cascade"}];let _=K(-1),g=K(!1),u=K(!1);ie(()=>{I()&&!e(g)&&P()});function P(){M(g,!0),M(_,-1),M(u,!1);const t=Math.max(1500,(j()||50)*2),a=t/(p.length+1);p.forEach((i,v)=>{setTimeout(()=>{M(_,v,!0)},a*(v+1))}),setTimeout(()=>{M(u,!0),M(g,!1)},t)}var D=$e(),b=o(D),L=d(o(b),2);{var V=t=>{var a=xe(),i=o(a);s(a),$(()=>x(i,`${S()??""} results in ${j()??""}ms`)),l(t,a)};w(L,t=>{e(u)&&t(V)})}s(b);var A=d(b,2);re(A,21,()=>p,ae,(t,a,i)=>{const v=X(()=>i<=e(_)),E=X(()=>i===e(_)&&e(g));var k=ge(),h=ne(k),y=o(h),J=o(y,!0);s(y);var R=d(y,2),T=o(R,!0);s(R),s(h);var U=d(h,2);{var W=B=>{var c=_e();$(()=>C(c,`background: ${i{i{fe(y,1,`w-8 h-8 rounded-full flex items-center justify-center text-xs transition-all duration-300 +import"../chunks/Bzak7iHL.js";import{i as oe}from"../chunks/D1BK9eoQ.js";import{p as ee,ah as ie,g as e,h as M,e as o,d,r as s,f as ne,t as $,a as te,s as K,u as X,C as Z}from"../chunks/BBD-8XME.js";import{s as x,d as de,a as ce}from"../chunks/DNn3Nckx.js";import{a as l,f as m}from"../chunks/CKcqngaU.js";import{i as w}from"../chunks/RaRNNC-y.js";import{e as re,i as ae}from"../chunks/C5a--lgk.js";import{s as C}from"../chunks/DBfx-YTU.js";import{s as le,a as me}from"../chunks/BexJutgU.js";import{w as ve,e as ue}from"../chunks/CruZBLYW.js";import{E as O}from"../chunks/CZ45jJaw.js";import{s as pe}from"../chunks/BVZqxpRe.js";import{s as fe}from"../chunks/CBWLjDtu.js";import{p as Q}from"../chunks/CzkEqL6J.js";var xe=m(' '),_e=m('
'),ge=m('
',1),he=m('
'),ye=m('
'),$e=m('
Cognitive Search Pipeline
');function be(q,F){ee(F,!0);let S=Q(F,"resultCount",3,0),j=Q(F,"durationMs",3,0),I=Q(F,"active",3,!1);const p=[{name:"Overfetch",icon:"◎",color:"#818CF8",desc:"Pull 3x results from hybrid search"},{name:"Rerank",icon:"⟿",color:"#00A8FF",desc:"Re-score by relevance quality"},{name:"Temporal",icon:"◷",color:"#00D4FF",desc:"Recent memories get recency bonus"},{name:"Access",icon:"◇",color:"#00FFD1",desc:"FSRS-6 retention threshold filter"},{name:"Context",icon:"◬",color:"#FFB800",desc:"Encoding specificity matching"},{name:"Compete",icon:"⬡",color:"#FF3CAC",desc:"Retrieval-induced forgetting"},{name:"Activate",icon:"◈",color:"#9D00FF",desc:"Spreading activation cascade"}];let _=K(-1),g=K(!1),u=K(!1);ie(()=>{I()&&!e(g)&&P()});function P(){M(g,!0),M(_,-1),M(u,!1);const t=Math.max(1500,(j()||50)*2),a=t/(p.length+1);p.forEach((i,v)=>{setTimeout(()=>{M(_,v,!0)},a*(v+1))}),setTimeout(()=>{M(u,!0),M(g,!1)},t)}var D=$e(),b=o(D),L=d(o(b),2);{var V=t=>{var a=xe(),i=o(a);s(a),$(()=>x(i,`${S()??""} results in ${j()??""}ms`)),l(t,a)};w(L,t=>{e(u)&&t(V)})}s(b);var A=d(b,2);re(A,21,()=>p,ae,(t,a,i)=>{const v=X(()=>i<=e(_)),E=X(()=>i===e(_)&&e(g));var k=ge(),h=ne(k),y=o(h),J=o(y,!0);s(y);var R=d(y,2),T=o(R,!0);s(R),s(h);var U=d(h,2);{var W=B=>{var c=_e();$(()=>C(c,`background: ${i{i{fe(y,1,`w-8 h-8 rounded-full flex items-center justify-center text-xs transition-all duration-300 ${e(E)?"scale-125":""}`),C(y,`background: ${e(v)?e(a).color+"25":"rgba(255,255,255,0.03)"}; border: 1.5px solid ${(e(v)?e(a).color:"rgba(255,255,255,0.06)")??""}; color: ${(e(v)?e(a).color:"#4a4a7a")??""}; diff --git a/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.br b/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.br new file mode 100644 index 0000000000000000000000000000000000000000..4c0992fd26d3cbe8a5bbeba4eb1bb29d8c5b1e1a GIT binary patch literal 2952 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.gz b/apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..6e8301cd7946f016cb08680a4120f270875aec9a GIT binary patch literal 3349 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js b/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js similarity index 85% rename from apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js rename to apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js index 2126237..77c057c 100644 --- a/apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js +++ b/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js @@ -1,12 +1,12 @@ -var Tc=Object.defineProperty;var wc=(i,t,e)=>t in i?Tc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var Wt=(i,t,e)=>wc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Al,a as Rl}from"../chunks/CkyfbJUz.js";import{p as lr,a as cr,e as Dt,d as Bt,G as Cl,r as Rt,t as ln,g as q,u as ti,f as Pl,s as Ie,h as se,c as Ac}from"../chunks/C9Z4nxhR.js";import{s as _e,d as Dl,a as $e}from"../chunks/DP9qWekZ.js";import{i as wi}from"../chunks/C2oj68pw.js";import{e as $r,i as Jr}from"../chunks/kH-DTQyy.js";import{a as Be,f as qe,c as Rc}from"../chunks/DPfxVJHQ.js";import{s as Ve,r as Ll}from"../chunks/ZesQ8l8p.js";import{s as Cc}from"../chunks/Co2v30Gm.js";import{s as Ul}from"../chunks/BkopTN9z.js";import{b as Il}from"../chunks/P9ZHwQBL.js";import{b as Nl}from"../chunks/-jeO_JOJ.js";import{s as Pc,a as Dc}from"../chunks/DWr9YED7.js";import{b as Lc}from"../chunks/CR6HhlME.js";import{p as Qs}from"../chunks/Do8TgQ-j.js";import{N as Fl}from"../chunks/CZ45jJaw.js";import{a as Yi}from"../chunks/BcuCGYSa.js";import{e as Uc}from"../chunks/BmeMLq0p.js";/** +var bc=Object.defineProperty;var Tc=(i,t,e)=>t in i?bc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var Wt=(i,t,e)=>Tc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Al,a as Rl}from"../chunks/DUC-ssvh.js";import{p as lr,a as cr,e as Dt,d as Ot,G as wc,r as Rt,t as ln,g as j,u as ti,f as Cl,s as Ie,h as se,c as Ac}from"../chunks/BBD-8XME.js";import{s as _e,d as Pl,a as Je}from"../chunks/DNn3Nckx.js";import{i as wi}from"../chunks/RaRNNC-y.js";import{e as $r,i as Jr}from"../chunks/C5a--lgk.js";import{a as ze,f as je,c as Rc}from"../chunks/CKcqngaU.js";import{s as Be,r as Dl}from"../chunks/BVZqxpRe.js";import{s as Cc}from"../chunks/CBWLjDtu.js";import{s as Ll}from"../chunks/DBfx-YTU.js";import{b as Ul}from"../chunks/BxfT1SOA.js";import{b as Il}from"../chunks/C-QujEl6.js";import{s as Pc,a as Dc}from"../chunks/BexJutgU.js";import{b as Lc}from"../chunks/BeSd-T80.js";import{b as Uc}from"../chunks/DtXypsxD.js";import{p as Qs}from"../chunks/CzkEqL6J.js";import{N as Nl}from"../chunks/CZ45jJaw.js";import{a as Yi}from"../chunks/BcuCGYSa.js";import{e as Ic}from"../chunks/CruZBLYW.js";/** * @license * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT - */const Xa="172",Di={ROTATE:0,DOLLY:1,PAN:2},Ri={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Ic=0,uo=1,Nc=2,Ol=1,Fc=2,yn=3,zn=0,He=1,hn=2,bn=0,Li=1,ze=2,fo=3,po=4,Oc=5,Kn=100,Bc=101,zc=102,Hc=103,kc=104,Vc=200,Gc=201,Wc=202,Xc=203,Qr=204,ta=205,Yc=206,qc=207,jc=208,Zc=209,Kc=210,$c=211,Jc=212,Qc=213,th=214,ea=0,na=1,ia=2,Fi=3,sa=4,ra=5,aa=6,oa=7,Bl=0,eh=1,nh=2,On=0,ih=1,sh=2,rh=3,zl=4,ah=5,oh=6,lh=7,Hl=300,Oi=301,Bi=302,la=303,ca=304,hr=306,ha=1e3,Jn=1001,ua=1002,Ye=1003,ch=1004,ms=1005,dn=1006,gr=1007,Qn=1008,An=1009,kl=1010,Vl=1011,os=1012,Ya=1013,ei=1014,fn=1015,Tn=1016,qa=1017,ja=1018,zi=1020,Gl=35902,Wl=1021,Xl=1022,an=1023,Yl=1024,ql=1025,Ui=1026,Hi=1027,Za=1028,Ka=1029,jl=1030,$a=1031,Ja=1033,Xs=33776,Ys=33777,qs=33778,js=33779,da=35840,fa=35841,pa=35842,ma=35843,ga=36196,_a=37492,va=37496,xa=37808,Ma=37809,Sa=37810,ya=37811,Ea=37812,ba=37813,Ta=37814,wa=37815,Aa=37816,Ra=37817,Ca=37818,Pa=37819,Da=37820,La=37821,Zs=36492,Ua=36494,Ia=36495,Zl=36283,Na=36284,Fa=36285,Oa=36286,hh=3200,uh=3201,Kl=0,dh=1,Fn="",Je="srgb",ki="srgb-linear",tr="linear",re="srgb",oi=7680,mo=519,fh=512,ph=513,mh=514,$l=515,gh=516,_h=517,vh=518,xh=519,Ba=35044,go="300 es",En=2e3,er=2001;class ii{addEventListener(t,e){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[t]===void 0&&(n[t]=[]),n[t].indexOf(e)===-1&&n[t].push(e)}hasEventListener(t,e){if(this._listeners===void 0)return!1;const n=this._listeners;return n[t]!==void 0&&n[t].indexOf(e)!==-1}removeEventListener(t,e){if(this._listeners===void 0)return;const s=this._listeners[t];if(s!==void 0){const r=s.indexOf(e);r!==-1&&s.splice(r,1)}}dispatchEvent(t){if(this._listeners===void 0)return;const n=this._listeners[t.type];if(n!==void 0){t.target=this;const s=n.slice(0);for(let r=0,a=s.length;r>8&255]+Ae[i>>16&255]+Ae[i>>24&255]+"-"+Ae[t&255]+Ae[t>>8&255]+"-"+Ae[t>>16&15|64]+Ae[t>>24&255]+"-"+Ae[e&63|128]+Ae[e>>8&255]+"-"+Ae[e>>16&255]+Ae[e>>24&255]+Ae[n&255]+Ae[n>>8&255]+Ae[n>>16&255]+Ae[n>>24&255]).toLowerCase()}function qt(i,t,e){return Math.max(t,Math.min(e,i))}function Mh(i,t){return(i%t+t)%t}function _r(i,t,e){return(1-e)*i+e*t}function un(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error("Invalid component type.")}}function ae(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error("Invalid component type.")}}const Sh={DEG2RAD:Ks};class vt{constructor(t=0,e=0){vt.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=qt(this.x,t.x,e.x),this.y=qt(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=qt(this.x,t,e),this.y=qt(this.y,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(qt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*s+t.x,this.y=r*s+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ht{constructor(t,e,n,s,r,a,o,l,c){Ht.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c)}set(t,e,n,s,r,a,o,l,c){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],d=n[7],f=n[2],p=n[5],g=n[8],v=s[0],m=s[3],u=s[6],T=s[1],b=s[4],y=s[7],L=s[2],R=s[5],A=s[8];return r[0]=a*v+o*T+l*L,r[3]=a*m+o*b+l*R,r[6]=a*u+o*y+l*A,r[1]=c*v+h*T+d*L,r[4]=c*m+h*b+d*R,r[7]=c*u+h*y+d*A,r[2]=f*v+p*T+g*L,r[5]=f*m+p*b+g*R,r[8]=f*u+p*y+g*A,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8];return e*a*h-e*o*c-n*r*h+n*o*l+s*r*c-s*a*l}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=h*a-o*c,f=o*l-h*r,p=c*r-a*l,g=e*d+n*f+s*p;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/g;return t[0]=d*v,t[1]=(s*c-h*n)*v,t[2]=(o*n-s*a)*v,t[3]=f*v,t[4]=(h*e-s*l)*v,t[5]=(s*r-o*e)*v,t[6]=p*v,t[7]=(n*l-c*e)*v,t[8]=(a*e-n*r)*v,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+t,-s*c,s*l,-s*(-c*a+l*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(vr.makeScale(t,e)),this}rotate(t){return this.premultiply(vr.makeRotation(-t)),this}translate(t,e){return this.premultiply(vr.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}}const vr=new Ht;function Jl(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function nr(i){return document.createElementNS("http://www.w3.org/1999/xhtml",i)}function yh(){const i=nr("canvas");return i.style.display="block",i}const _o={};function Ai(i){i in _o||(_o[i]=!0,console.warn(i))}function Eh(i,t,e){return new Promise(function(n,s){function r(){switch(i.clientWaitSync(t,i.SYNC_FLUSH_COMMANDS_BIT,0)){case i.WAIT_FAILED:s();break;case i.TIMEOUT_EXPIRED:setTimeout(r,e);break;default:n()}}setTimeout(r,e)})}function bh(i){const t=i.elements;t[2]=.5*t[2]+.5*t[3],t[6]=.5*t[6]+.5*t[7],t[10]=.5*t[10]+.5*t[11],t[14]=.5*t[14]+.5*t[15]}function Th(i){const t=i.elements;t[11]===-1?(t[10]=-t[10]-1,t[14]=-t[14]):(t[10]=-t[10],t[14]=-t[14]+1)}const vo=new Ht().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),xo=new Ht().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function wh(){const i={enabled:!0,workingColorSpace:ki,spaces:{},convert:function(s,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===re&&(s.r=wn(s.r),s.g=wn(s.g),s.b=wn(s.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===re&&(s.r=Ii(s.r),s.g=Ii(s.g),s.b=Ii(s.b))),s},fromWorkingColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},toWorkingColorSpace:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===Fn?tr:this.spaces[s].transfer},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,a){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace}},t=[.64,.33,.3,.6,.15,.06],e=[.2126,.7152,.0722],n=[.3127,.329];return i.define({[ki]:{primaries:t,whitePoint:n,transfer:tr,toXYZ:vo,fromXYZ:xo,luminanceCoefficients:e,workingColorSpaceConfig:{unpackColorSpace:Je},outputColorSpaceConfig:{drawingBufferColorSpace:Je}},[Je]:{primaries:t,whitePoint:n,transfer:re,toXYZ:vo,fromXYZ:xo,luminanceCoefficients:e,outputColorSpaceConfig:{drawingBufferColorSpace:Je}}}),i}const Jt=wh();function wn(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function Ii(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}let li;class Ah{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>"u")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{li===void 0&&(li=nr("canvas")),li.width=t.width,li.height=t.height;const n=li.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=li}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap){const e=nr("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let a=0;a0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==Hl)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case ha:t.x=t.x-Math.floor(t.x);break;case Jn:t.x=t.x<0?0:1;break;case ua:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case ha:t.y=t.y-Math.floor(t.y);break;case Jn:t.y=t.y<0?0:1;break;case ua:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){t===!0&&this.pmremVersion++}}Ce.DEFAULT_IMAGE=null;Ce.DEFAULT_MAPPING=Hl;Ce.DEFAULT_ANISOTROPY=1;class le{constructor(t=0,e=0,n=0,s=1){le.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*s+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*s+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*s+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*s+a[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r;const l=t.elements,c=l[0],h=l[4],d=l[8],f=l[1],p=l[5],g=l[9],v=l[2],m=l[6],u=l[10];if(Math.abs(h-f)<.01&&Math.abs(d-v)<.01&&Math.abs(g-m)<.01){if(Math.abs(h+f)<.1&&Math.abs(d+v)<.1&&Math.abs(g+m)<.1&&Math.abs(c+p+u-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;const b=(c+1)/2,y=(p+1)/2,L=(u+1)/2,R=(h+f)/4,A=(d+v)/4,U=(g+m)/4;return b>y&&b>L?b<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(b),s=R/n,r=A/n):y>L?y<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(y),n=R/s,r=U/s):L<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(L),n=A/r,s=U/r),this.set(n,s,r,e),this}let T=Math.sqrt((m-g)*(m-g)+(d-v)*(d-v)+(f-h)*(f-h));return Math.abs(T)<.001&&(T=1),this.x=(m-g)/T,this.y=(d-v)/T,this.z=(f-h)/T,this.w=Math.acos((c+p+u-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=qt(this.x,t.x,e.x),this.y=qt(this.y,t.y,e.y),this.z=qt(this.z,t.z,e.z),this.w=qt(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=qt(this.x,t,e),this.y=qt(this.y,t,e),this.z=qt(this.z,t,e),this.w=qt(this.w,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Ph extends ii{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new le(0,0,t,e),this.scissorTest=!1,this.viewport=new le(0,0,t,e);const s={width:t,height:e,depth:1};n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:dn,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},n);const r=new Ce(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace);r.flipY=!1,r.generateMipmaps=n.generateMipmaps,r.internalFormat=n.internalFormat,this.textures=[];const a=n.count;for(let o=0;o=0?1:-1,b=1-u*u;if(b>Number.EPSILON){const L=Math.sqrt(b),R=Math.atan2(L,u*T);m=Math.sin(m*R)/L,o=Math.sin(o*R)/L}const y=o*T;if(l=l*m+f*y,c=c*m+p*y,h=h*m+g*y,d=d*m+v*y,m===1-o){const L=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=L,c*=L,h*=L,d*=L}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d}static multiplyQuaternionsFlat(t,e,n,s,r,a){const o=n[s],l=n[s+1],c=n[s+2],h=n[s+3],d=r[a],f=r[a+1],p=r[a+2],g=r[a+3];return t[e]=o*g+h*d+l*p-c*f,t[e+1]=l*g+h*f+c*d-o*p,t[e+2]=c*g+h*p+o*f-l*d,t[e+3]=h*g-o*d-l*f-c*p,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const n=t._x,s=t._y,r=t._z,a=t._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(s/2),d=o(r/2),f=l(n/2),p=l(s/2),g=l(r/2);switch(a){case"XYZ":this._x=f*h*d+c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d-f*p*g;break;case"YXZ":this._x=f*h*d+c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d+f*p*g;break;case"ZXY":this._x=f*h*d-c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d-f*p*g;break;case"ZYX":this._x=f*h*d-c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d+f*p*g;break;case"YZX":this._x=f*h*d+c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d-f*p*g;break;case"XZY":this._x=f*h*d-c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d+f*p*g;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],s=e[4],r=e[8],a=e[1],o=e[5],l=e[9],c=e[2],h=e[6],d=e[10],f=n+o+d;if(f>0){const p=.5/Math.sqrt(f+1);this._w=.25/p,this._x=(h-l)*p,this._y=(r-c)*p,this._z=(a-s)*p}else if(n>o&&n>d){const p=2*Math.sqrt(1+n-o-d);this._w=(h-l)/p,this._x=.25*p,this._y=(s+a)/p,this._z=(r+c)/p}else if(o>d){const p=2*Math.sqrt(1+o-n-d);this._w=(r-c)/p,this._x=(s+a)/p,this._y=.25*p,this._z=(l+h)/p}else{const p=2*Math.sqrt(1+d-n-o);this._w=(a-s)/p,this._x=(r+c)/p,this._y=(l+h)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(qt(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(n===0)return this;const s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,a=t._w,o=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+a*o+s*c-r*l,this._y=s*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-s*o,this._w=a*h-n*o-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);const n=this._x,s=this._y,r=this._z,a=this._w;let o=a*t._w+n*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=s,this._z=r,this;const l=1-o*o;if(l<=Number.EPSILON){const p=1-e;return this._w=p*a+e*this._w,this._x=p*n+e*this._x,this._y=p*s+e*this._y,this._z=p*r+e*this._z,this.normalize(),this}const c=Math.sqrt(l),h=Math.atan2(c,o),d=Math.sin((1-e)*h)/c,f=Math.sin(e*h)/c;return this._w=a*d+this._w*f,this._x=n*d+this._x*f,this._y=s*d+this._y*f,this._z=r*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(t=0,e=0,n=0){P.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Mo.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Mo.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,s=this.z,r=t.x,a=t.y,o=t.z,l=t.w,c=2*(a*s-o*n),h=2*(o*e-r*s),d=2*(r*n-a*e);return this.x=e+l*c+a*d-o*h,this.y=n+l*h+o*c-r*d,this.z=s+l*d+r*h-a*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=qt(this.x,t.x,e.x),this.y=qt(this.y,t.y,e.y),this.z=qt(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=qt(this.x,t,e),this.y=qt(this.y,t,e),this.z=qt(this.z,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,s=t.y,r=t.z,a=e.x,o=e.y,l=e.z;return this.x=s*l-r*o,this.y=r*a-n*l,this.z=n*o-s*a,this}projectOnVector(t){const e=t.lengthSq();if(e===0)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Mr.copy(this).projectOnVector(t),this.sub(Mr)}reflect(t){return this.sub(Mr.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(qt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=Math.random()*2-1,n=Math.sqrt(1-e*e);return this.x=n*Math.cos(t),this.y=e,this.z=n*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Mr=new P,Mo=new ni;class si{constructor(t=new P(1/0,1/0,1/0),e=new P(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,nn),nn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(qi),_s.subVectors(this.max,qi),ci.subVectors(t.a,qi),hi.subVectors(t.b,qi),ui.subVectors(t.c,qi),Rn.subVectors(hi,ci),Cn.subVectors(ui,hi),Gn.subVectors(ci,ui);let e=[0,-Rn.z,Rn.y,0,-Cn.z,Cn.y,0,-Gn.z,Gn.y,Rn.z,0,-Rn.x,Cn.z,0,-Cn.x,Gn.z,0,-Gn.x,-Rn.y,Rn.x,0,-Cn.y,Cn.x,0,-Gn.y,Gn.x,0];return!Sr(e,ci,hi,ui,_s)||(e=[1,0,0,0,1,0,0,0,1],!Sr(e,ci,hi,ui,_s))?!1:(vs.crossVectors(Rn,Cn),e=[vs.x,vs.y,vs.z],Sr(e,ci,hi,ui,_s))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,nn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(nn).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(gn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),gn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),gn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),gn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),gn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),gn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),gn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),gn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(gn),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const gn=[new P,new P,new P,new P,new P,new P,new P,new P],nn=new P,gs=new si,ci=new P,hi=new P,ui=new P,Rn=new P,Cn=new P,Gn=new P,qi=new P,_s=new P,vs=new P,Wn=new P;function Sr(i,t,e,n,s){for(let r=0,a=i.length-3;r<=a;r+=3){Wn.fromArray(i,r);const o=s.x*Math.abs(Wn.x)+s.y*Math.abs(Wn.y)+s.z*Math.abs(Wn.z),l=t.dot(Wn),c=e.dot(Wn),h=n.dot(Wn);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Lh=new si,ji=new P,yr=new P;class ri{constructor(t=new P,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;e!==void 0?n.copy(e):Lh.setFromPoints(t).getCenter(n);let s=0;for(let r=0,a=t.length;rthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ji.subVectors(t,this.center);const e=ji.lengthSq();if(e>this.radius*this.radius){const n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(ji,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(yr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ji.copy(t.center).add(yr)),this.expandByPoint(ji.copy(t.center).sub(yr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}}const _n=new P,Er=new P,xs=new P,Pn=new P,br=new P,Ms=new P,Tr=new P;class cs{constructor(t=new P,e=new P(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_n)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_n.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_n.copy(this.origin).addScaledVector(this.direction,e),_n.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){Er.copy(t).add(e).multiplyScalar(.5),xs.copy(e).sub(t).normalize(),Pn.copy(this.origin).sub(Er);const r=t.distanceTo(e)*.5,a=-this.direction.dot(xs),o=Pn.dot(this.direction),l=-Pn.dot(xs),c=Pn.lengthSq(),h=Math.abs(1-a*a);let d,f,p,g;if(h>0)if(d=a*l-o,f=a*o-l,g=r*h,d>=0)if(f>=-g)if(f<=g){const v=1/h;d*=v,f*=v,p=d*(d+a*f+2*o)+f*(a*d+f+2*l)+c}else f=r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;else f=-r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;else f<=-g?(d=Math.max(0,-(-a*r+o)),f=d>0?-r:Math.min(Math.max(-r,-l),r),p=-d*d+f*(f+2*l)+c):f<=g?(d=0,f=Math.min(Math.max(-r,-l),r),p=f*(f+2*l)+c):(d=Math.max(0,-(a*r+o)),f=d>0?r:Math.min(Math.max(-r,-l),r),p=-d*d+f*(f+2*l)+c);else f=a>0?-r:r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(Er).addScaledVector(xs,f),p}intersectSphere(t,e){_n.subVectors(t.center,this.origin);const n=_n.dot(this.direction),s=_n.dot(_n)-n*n,r=t.radius*t.radius;if(s>r)return null;const a=Math.sqrt(r-s),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,f=this.origin;return c>=0?(n=(t.min.x-f.x)*c,s=(t.max.x-f.x)*c):(n=(t.max.x-f.x)*c,s=(t.min.x-f.x)*c),h>=0?(r=(t.min.y-f.y)*h,a=(t.max.y-f.y)*h):(r=(t.max.y-f.y)*h,a=(t.min.y-f.y)*h),n>a||r>s||((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-f.z)*d,l=(t.max.z-f.z)*d):(o=(t.max.z-f.z)*d,l=(t.min.z-f.z)*d),n>l||o>s)||((o>n||n!==n)&&(n=o),(l=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,_n)!==null}intersectTriangle(t,e,n,s,r){br.subVectors(e,t),Ms.subVectors(n,t),Tr.crossVectors(br,Ms);let a=this.direction.dot(Tr),o;if(a>0){if(s)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Pn.subVectors(this.origin,t);const l=o*this.direction.dot(Ms.crossVectors(Pn,Ms));if(l<0)return null;const c=o*this.direction.dot(br.cross(Pn));if(c<0||l+c>a)return null;const h=-o*Pn.dot(Tr);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ne{constructor(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m){ne.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m)}set(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m){const u=this.elements;return u[0]=t,u[4]=e,u[8]=n,u[12]=s,u[1]=r,u[5]=a,u[9]=o,u[13]=l,u[2]=c,u[6]=h,u[10]=d,u[14]=f,u[3]=p,u[7]=g,u[11]=v,u[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ne().fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,s=1/di.setFromMatrixColumn(t,0).length(),r=1/di.setFromMatrixColumn(t,1).length(),a=1/di.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,s=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),d=Math.sin(r);if(t.order==="XYZ"){const f=a*h,p=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=-l*d,e[8]=c,e[1]=p+g*c,e[5]=f-v*c,e[9]=-o*l,e[2]=v-f*c,e[6]=g+p*c,e[10]=a*l}else if(t.order==="YXZ"){const f=l*h,p=l*d,g=c*h,v=c*d;e[0]=f+v*o,e[4]=g*o-p,e[8]=a*c,e[1]=a*d,e[5]=a*h,e[9]=-o,e[2]=p*o-g,e[6]=v+f*o,e[10]=a*l}else if(t.order==="ZXY"){const f=l*h,p=l*d,g=c*h,v=c*d;e[0]=f-v*o,e[4]=-a*d,e[8]=g+p*o,e[1]=p+g*o,e[5]=a*h,e[9]=v-f*o,e[2]=-a*c,e[6]=o,e[10]=a*l}else if(t.order==="ZYX"){const f=a*h,p=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=g*c-p,e[8]=f*c+v,e[1]=l*d,e[5]=v*c+f,e[9]=p*c-g,e[2]=-c,e[6]=o*l,e[10]=a*l}else if(t.order==="YZX"){const f=a*l,p=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=v-f*d,e[8]=g*d+p,e[1]=d,e[5]=a*h,e[9]=-o*h,e[2]=-c*h,e[6]=p*d+g,e[10]=f-v*d}else if(t.order==="XZY"){const f=a*l,p=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=-d,e[8]=c*h,e[1]=f*d+v,e[5]=a*h,e[9]=p*d-g,e[2]=g*d-p,e[6]=o*h,e[10]=v*d+f}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Uh,t,Ih)}lookAt(t,e,n){const s=this.elements;return Ge.subVectors(t,e),Ge.lengthSq()===0&&(Ge.z=1),Ge.normalize(),Dn.crossVectors(n,Ge),Dn.lengthSq()===0&&(Math.abs(n.z)===1?Ge.x+=1e-4:Ge.z+=1e-4,Ge.normalize(),Dn.crossVectors(n,Ge)),Dn.normalize(),Ss.crossVectors(Ge,Dn),s[0]=Dn.x,s[4]=Ss.x,s[8]=Ge.x,s[1]=Dn.y,s[5]=Ss.y,s[9]=Ge.y,s[2]=Dn.z,s[6]=Ss.z,s[10]=Ge.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],d=n[5],f=n[9],p=n[13],g=n[2],v=n[6],m=n[10],u=n[14],T=n[3],b=n[7],y=n[11],L=n[15],R=s[0],A=s[4],U=s[8],S=s[12],M=s[1],D=s[5],W=s[9],z=s[13],V=s[2],$=s[6],G=s[10],J=s[14],k=s[3],it=s[7],ut=s[11],yt=s[15];return r[0]=a*R+o*M+l*V+c*k,r[4]=a*A+o*D+l*$+c*it,r[8]=a*U+o*W+l*G+c*ut,r[12]=a*S+o*z+l*J+c*yt,r[1]=h*R+d*M+f*V+p*k,r[5]=h*A+d*D+f*$+p*it,r[9]=h*U+d*W+f*G+p*ut,r[13]=h*S+d*z+f*J+p*yt,r[2]=g*R+v*M+m*V+u*k,r[6]=g*A+v*D+m*$+u*it,r[10]=g*U+v*W+m*G+u*ut,r[14]=g*S+v*z+m*J+u*yt,r[3]=T*R+b*M+y*V+L*k,r[7]=T*A+b*D+y*$+L*it,r[11]=T*U+b*W+y*G+L*ut,r[15]=T*S+b*z+y*J+L*yt,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],a=t[1],o=t[5],l=t[9],c=t[13],h=t[2],d=t[6],f=t[10],p=t[14],g=t[3],v=t[7],m=t[11],u=t[15];return g*(+r*l*d-s*c*d-r*o*f+n*c*f+s*o*p-n*l*p)+v*(+e*l*p-e*c*f+r*a*f-s*a*p+s*c*h-r*l*h)+m*(+e*c*d-e*o*p-r*a*d+n*a*p+r*o*h-n*c*h)+u*(-s*o*h-e*l*d+e*o*f+s*a*d-n*a*f+n*l*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=t[9],f=t[10],p=t[11],g=t[12],v=t[13],m=t[14],u=t[15],T=d*m*c-v*f*c+v*l*p-o*m*p-d*l*u+o*f*u,b=g*f*c-h*m*c-g*l*p+a*m*p+h*l*u-a*f*u,y=h*v*c-g*d*c+g*o*p-a*v*p-h*o*u+a*d*u,L=g*d*l-h*v*l-g*o*f+a*v*f+h*o*m-a*d*m,R=e*T+n*b+s*y+r*L;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/R;return t[0]=T*A,t[1]=(v*f*r-d*m*r-v*s*p+n*m*p+d*s*u-n*f*u)*A,t[2]=(o*m*r-v*l*r+v*s*c-n*m*c-o*s*u+n*l*u)*A,t[3]=(d*l*r-o*f*r-d*s*c+n*f*c+o*s*p-n*l*p)*A,t[4]=b*A,t[5]=(h*m*r-g*f*r+g*s*p-e*m*p-h*s*u+e*f*u)*A,t[6]=(g*l*r-a*m*r-g*s*c+e*m*c+a*s*u-e*l*u)*A,t[7]=(a*f*r-h*l*r+h*s*c-e*f*c-a*s*p+e*l*p)*A,t[8]=y*A,t[9]=(g*d*r-h*v*r-g*n*p+e*v*p+h*n*u-e*d*u)*A,t[10]=(a*v*r-g*o*r+g*n*c-e*v*c-a*n*u+e*o*u)*A,t[11]=(h*o*r-a*d*r-h*n*c+e*d*c+a*n*p-e*o*p)*A,t[12]=L*A,t[13]=(h*v*s-g*d*s+g*n*f-e*v*f-h*n*m+e*d*m)*A,t[14]=(g*o*s-a*v*s-g*n*l+e*v*l+a*n*m-e*o*m)*A,t[15]=(a*d*s-h*o*s+h*n*l-e*d*l-a*n*f+e*o*f)*A,this}scale(t){const e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),s=Math.sin(e),r=1-n,a=t.x,o=t.y,l=t.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-s*l,c*l+s*o,0,c*o+s*l,h*o+n,h*l-s*a,0,c*l-s*o,h*l+s*a,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,a){return this.set(1,n,r,0,t,1,a,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){const s=this.elements,r=e._x,a=e._y,o=e._z,l=e._w,c=r+r,h=a+a,d=o+o,f=r*c,p=r*h,g=r*d,v=a*h,m=a*d,u=o*d,T=l*c,b=l*h,y=l*d,L=n.x,R=n.y,A=n.z;return s[0]=(1-(v+u))*L,s[1]=(p+y)*L,s[2]=(g-b)*L,s[3]=0,s[4]=(p-y)*R,s[5]=(1-(f+u))*R,s[6]=(m+T)*R,s[7]=0,s[8]=(g+b)*A,s[9]=(m-T)*A,s[10]=(1-(f+v))*A,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){const s=this.elements;let r=di.set(s[0],s[1],s[2]).length();const a=di.set(s[4],s[5],s[6]).length(),o=di.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],sn.copy(this);const c=1/r,h=1/a,d=1/o;return sn.elements[0]*=c,sn.elements[1]*=c,sn.elements[2]*=c,sn.elements[4]*=h,sn.elements[5]*=h,sn.elements[6]*=h,sn.elements[8]*=d,sn.elements[9]*=d,sn.elements[10]*=d,e.setFromRotationMatrix(sn),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,s,r,a,o=En){const l=this.elements,c=2*r/(e-t),h=2*r/(n-s),d=(e+t)/(e-t),f=(n+s)/(n-s);let p,g;if(o===En)p=-(a+r)/(a-r),g=-2*a*r/(a-r);else if(o===er)p=-a/(a-r),g=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return l[0]=c,l[4]=0,l[8]=d,l[12]=0,l[1]=0,l[5]=h,l[9]=f,l[13]=0,l[2]=0,l[6]=0,l[10]=p,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,a,o=En){const l=this.elements,c=1/(e-t),h=1/(n-s),d=1/(a-r),f=(e+t)*c,p=(n+s)*h;let g,v;if(o===En)g=(a+r)*d,v=-2*d;else if(o===er)g=r*d,v=-1*d;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-f,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-p,l[2]=0,l[6]=0,l[10]=v,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const di=new P,sn=new ne,Uh=new P(0,0,0),Ih=new P(1,1,1),Dn=new P,Ss=new P,Ge=new P,So=new ne,yo=new ni;class pn{constructor(t=0,e=0,n=0,s=pn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const s=t.elements,r=s[0],a=s[4],o=s[8],l=s[1],c=s[5],h=s[9],d=s[2],f=s[6],p=s[10];switch(e){case"XYZ":this._y=Math.asin(qt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,p),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(f,c),this._z=0);break;case"YXZ":this._x=Math.asin(-qt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,p),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-d,r),this._z=0);break;case"ZXY":this._x=Math.asin(qt(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,p),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-qt(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,p),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(qt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-d,r)):(this._x=0,this._y=Math.atan2(o,p));break;case"XZY":this._z=Math.asin(-qt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(f,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return So.makeRotationFromQuaternion(t),this.setFromRotationMatrix(So,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yo.setFromEuler(this),this.setFromQuaternion(yo,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}pn.DEFAULT_ORDER="XYZ";class Qa{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let e=0;e1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(o=>({boxInitialized:o.boxInitialized,boxMin:o.box.min.toArray(),boxMax:o.box.max.toArray(),sphereInitialized:o.sphereInitialized,sphereRadius:o.sphere.radius,sphereCenter:o.sphere.center.toArray()})),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(t)),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),f.length>0&&(n.skeletons=f),p.length>0&&(n.animations=p),g.length>0&&(n.nodes=g)}return n.object=s,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){rn.subVectors(s,e),xn.subVectors(n,e),Ar.subVectors(t,e);const a=rn.dot(rn),o=rn.dot(xn),l=rn.dot(Ar),c=xn.dot(xn),h=xn.dot(Ar),d=a*c-o*o;if(d===0)return r.set(0,0,0),null;const f=1/d,p=(c*l-o*h)*f,g=(a*h-o*l)*f;return r.set(1-p-g,g,p)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,Mn)===null?!1:Mn.x>=0&&Mn.y>=0&&Mn.x+Mn.y<=1}static getInterpolation(t,e,n,s,r,a,o,l){return this.getBarycoord(t,e,n,s,Mn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mn.x),l.addScaledVector(a,Mn.y),l.addScaledVector(o,Mn.z),l)}static getInterpolatedAttribute(t,e,n,s,r,a){return Dr.setScalar(0),Lr.setScalar(0),Ur.setScalar(0),Dr.fromBufferAttribute(t,e),Lr.fromBufferAttribute(t,n),Ur.fromBufferAttribute(t,s),a.setScalar(0),a.addScaledVector(Dr,r.x),a.addScaledVector(Lr,r.y),a.addScaledVector(Ur,r.z),a}static isFrontFacing(t,e,n,s){return rn.subVectors(n,e),xn.subVectors(t,e),rn.cross(xn).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return rn.subVectors(this.c,this.b),xn.subVectors(this.a,this.b),rn.cross(xn).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return Qe.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return Qe.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,n,s,r){return Qe.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return Qe.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return Qe.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,s=this.b,r=this.c;let a,o;mi.subVectors(s,n),gi.subVectors(r,n),Rr.subVectors(t,n);const l=mi.dot(Rr),c=gi.dot(Rr);if(l<=0&&c<=0)return e.copy(n);Cr.subVectors(t,s);const h=mi.dot(Cr),d=gi.dot(Cr);if(h>=0&&d<=h)return e.copy(s);const f=l*d-h*c;if(f<=0&&l>=0&&h<=0)return a=l/(l-h),e.copy(n).addScaledVector(mi,a);Pr.subVectors(t,r);const p=mi.dot(Pr),g=gi.dot(Pr);if(g>=0&&p<=g)return e.copy(r);const v=p*c-l*g;if(v<=0&&c>=0&&g<=0)return o=c/(c-g),e.copy(n).addScaledVector(gi,o);const m=h*g-p*d;if(m<=0&&d-h>=0&&p-g>=0)return Ro.subVectors(r,s),o=(d-h)/(d-h+(p-g)),e.copy(s).addScaledVector(Ro,o);const u=1/(m+v+f);return a=v*u,o=f*u,e.copy(n).addScaledVector(mi,a).addScaledVector(gi,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const ec={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ln={h:0,s:0,l:0},Es={h:0,s:0,l:0};function Ir(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}class pt{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){const s=t;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Je){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,Jt.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=Jt.workingColorSpace){return this.r=t,this.g=e,this.b=n,Jt.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=Jt.workingColorSpace){if(t=Mh(t,1),e=qt(e,0,1),n=qt(n,0,1),e===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+e):n+e-n*e,a=2*n-r;this.r=Ir(a,r,t+1/3),this.g=Ir(a,r,t),this.b=Ir(a,r,t-1/3)}return Jt.toWorkingColorSpace(this,s),this}setStyle(t,e=Je){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const a=s[1],o=s[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const r=s[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(a===6)return this.setHex(parseInt(r,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Je){const n=ec[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=Ii(t.r),this.g=Ii(t.g),this.b=Ii(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Je){return Jt.fromWorkingColorSpace(Re.copy(this),t),Math.round(qt(Re.r*255,0,255))*65536+Math.round(qt(Re.g*255,0,255))*256+Math.round(qt(Re.b*255,0,255))}getHexString(t=Je){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=Jt.workingColorSpace){Jt.fromWorkingColorSpace(Re.copy(this),e);const n=Re.r,s=Re.g,r=Re.b,a=Math.max(n,s,r),o=Math.min(n,s,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const d=a-o;switch(c=h<=.5?d/(a+o):d/(2-a-o),a){case n:l=(s-r)/d+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(const e in t){const n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";e&&(t={textures:{},images:{}});const n={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Li&&(n.blending=this.blending),this.side!==zn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Qr&&(n.blendSrc=this.blendSrc),this.blendDst!==ta&&(n.blendDst=this.blendDst),this.blendEquation!==Kn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Fi&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==mo&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==oi&&(n.stencilFail=this.stencilFail),this.stencilZFail!==oi&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==oi&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(e){const r=s(t.textures),a=s(t.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(e!==null){const s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){t===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class ls extends Hn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new pn,this.combine=Bl,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const ge=new P,bs=new vt;class de{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=Ba,this.updateRanges=[],this.gpuType=fn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new si);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n0&&(t.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};const e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const l in n){const c=n[l];t.data.attributes[l]=c.toJSON(t.data)}const s={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let d=0,f=c.length;d0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;n!==null&&this.setIndex(n.clone(e));const s=t.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(e))}const r=t.morphAttributes;for(const c in r){const h=[],d=r[c];for(let f=0,p=d.length;f0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;r(t.far-t.near)**2))&&(Co.copy(r).invert(),Xn.copy(t.ray).applyMatrix4(Co),!(n.boundingBox!==null&&Xn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,Xn)))}_computeIntersections(t,e,n){let s;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,f=r.groups,p=r.drawRange;if(o!==null)if(Array.isArray(a))for(let g=0,v=f.length;ge.far?null:{distance:c,point:Ps.clone(),object:i}}function Ds(i,t,e,n,s,r,a,o,l,c){i.getVertexPosition(o,ws),i.getVertexPosition(l,As),i.getVertexPosition(c,Rs);const h=kh(i,t,e,n,ws,As,Rs,Do);if(h){const d=new P;Qe.getBarycoord(Do,ws,As,Rs,d),s&&(h.uv=Qe.getInterpolatedAttribute(s,o,l,c,d,new vt)),r&&(h.uv1=Qe.getInterpolatedAttribute(r,o,l,c,d,new vt)),a&&(h.normal=Qe.getInterpolatedAttribute(a,o,l,c,d,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const f={a:o,b:l,c,normal:new P,materialIndex:0};Qe.getNormal(ws,As,Rs,f.normal),h.face=f,h.barycoord=d}return h}class hs extends pe{constructor(t=1,e=1,n=1,s=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:a};const o=this;s=Math.floor(s),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],d=[];let f=0,p=0;g("z","y","x",-1,-1,n,e,t,a,r,0),g("z","y","x",1,-1,n,e,-t,a,r,1),g("x","z","y",1,1,t,n,e,s,a,2),g("x","z","y",1,-1,t,n,-e,s,a,3),g("x","y","z",1,-1,t,e,n,s,r,4),g("x","y","z",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute("position",new Pe(c,3)),this.setAttribute("normal",new Pe(h,3)),this.setAttribute("uv",new Pe(d,2));function g(v,m,u,T,b,y,L,R,A,U,S){const M=y/A,D=L/U,W=y/2,z=L/2,V=R/2,$=A+1,G=U+1;let J=0,k=0;const it=new P;for(let ut=0;ut0?1:-1,h.push(it.x,it.y,it.z),d.push(Lt/A),d.push(1-ut/U),J+=1}}for(let ut=0;ut>8&255]+Ae[i>>16&255]+Ae[i>>24&255]+"-"+Ae[t&255]+Ae[t>>8&255]+"-"+Ae[t>>16&15|64]+Ae[t>>24&255]+"-"+Ae[e&63|128]+Ae[e>>8&255]+"-"+Ae[e>>16&255]+Ae[e>>24&255]+Ae[n&255]+Ae[n>>8&255]+Ae[n>>16&255]+Ae[n>>24&255]).toLowerCase()}function Yt(i,t,e){return Math.max(t,Math.min(e,i))}function Sh(i,t){return(i%t+t)%t}function _r(i,t,e){return(1-e)*i+e*t}function un(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error("Invalid component type.")}}function ae(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error("Invalid component type.")}}const yh={DEG2RAD:Ks};class vt{constructor(t=0,e=0){vt.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*s+t.x,this.y=r*s+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ht{constructor(t,e,n,s,r,a,o,l,c){Ht.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c)}set(t,e,n,s,r,a,o,l,c){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],d=n[7],f=n[2],p=n[5],g=n[8],v=s[0],m=s[3],u=s[6],T=s[1],b=s[4],y=s[7],L=s[2],R=s[5],A=s[8];return r[0]=a*v+o*T+l*L,r[3]=a*m+o*b+l*R,r[6]=a*u+o*y+l*A,r[1]=c*v+h*T+d*L,r[4]=c*m+h*b+d*R,r[7]=c*u+h*y+d*A,r[2]=f*v+p*T+g*L,r[5]=f*m+p*b+g*R,r[8]=f*u+p*y+g*A,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8];return e*a*h-e*o*c-n*r*h+n*o*l+s*r*c-s*a*l}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=h*a-o*c,f=o*l-h*r,p=c*r-a*l,g=e*d+n*f+s*p;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/g;return t[0]=d*v,t[1]=(s*c-h*n)*v,t[2]=(o*n-s*a)*v,t[3]=f*v,t[4]=(h*e-s*l)*v,t[5]=(s*r-o*e)*v,t[6]=p*v,t[7]=(n*l-c*e)*v,t[8]=(a*e-n*r)*v,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+t,-s*c,s*l,-s*(-c*a+l*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(vr.makeScale(t,e)),this}rotate(t){return this.premultiply(vr.makeRotation(-t)),this}translate(t,e){return this.premultiply(vr.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}}const vr=new Ht;function $l(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function nr(i){return document.createElementNS("http://www.w3.org/1999/xhtml",i)}function Eh(){const i=nr("canvas");return i.style.display="block",i}const _o={};function Ai(i){i in _o||(_o[i]=!0,console.warn(i))}function bh(i,t,e){return new Promise(function(n,s){function r(){switch(i.clientWaitSync(t,i.SYNC_FLUSH_COMMANDS_BIT,0)){case i.WAIT_FAILED:s();break;case i.TIMEOUT_EXPIRED:setTimeout(r,e);break;default:n()}}setTimeout(r,e)})}function Th(i){const t=i.elements;t[2]=.5*t[2]+.5*t[3],t[6]=.5*t[6]+.5*t[7],t[10]=.5*t[10]+.5*t[11],t[14]=.5*t[14]+.5*t[15]}function wh(i){const t=i.elements;t[11]===-1?(t[10]=-t[10]-1,t[14]=-t[14]):(t[10]=-t[10],t[14]=-t[14]+1)}const vo=new Ht().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),xo=new Ht().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ah(){const i={enabled:!0,workingColorSpace:ki,spaces:{},convert:function(s,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===re&&(s.r=wn(s.r),s.g=wn(s.g),s.b=wn(s.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===re&&(s.r=Ii(s.r),s.g=Ii(s.g),s.b=Ii(s.b))),s},fromWorkingColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},toWorkingColorSpace:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===Fn?tr:this.spaces[s].transfer},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,a){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace}},t=[.64,.33,.3,.6,.15,.06],e=[.2126,.7152,.0722],n=[.3127,.329];return i.define({[ki]:{primaries:t,whitePoint:n,transfer:tr,toXYZ:vo,fromXYZ:xo,luminanceCoefficients:e,workingColorSpaceConfig:{unpackColorSpace:Qe},outputColorSpaceConfig:{drawingBufferColorSpace:Qe}},[Qe]:{primaries:t,whitePoint:n,transfer:re,toXYZ:vo,fromXYZ:xo,luminanceCoefficients:e,outputColorSpaceConfig:{drawingBufferColorSpace:Qe}}}),i}const $t=Ah();function wn(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function Ii(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}let li;class Rh{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>"u")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{li===void 0&&(li=nr("canvas")),li.width=t.width,li.height=t.height;const n=li.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=li}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap){const e=nr("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let a=0;a0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==zl)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case ha:t.x=t.x-Math.floor(t.x);break;case Jn:t.x=t.x<0?0:1;break;case ua:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case ha:t.y=t.y-Math.floor(t.y);break;case Jn:t.y=t.y<0?0:1;break;case ua:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){t===!0&&this.pmremVersion++}}Ce.DEFAULT_IMAGE=null;Ce.DEFAULT_MAPPING=zl;Ce.DEFAULT_ANISOTROPY=1;class le{constructor(t=0,e=0,n=0,s=1){le.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*s+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*s+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*s+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*s+a[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r;const l=t.elements,c=l[0],h=l[4],d=l[8],f=l[1],p=l[5],g=l[9],v=l[2],m=l[6],u=l[10];if(Math.abs(h-f)<.01&&Math.abs(d-v)<.01&&Math.abs(g-m)<.01){if(Math.abs(h+f)<.1&&Math.abs(d+v)<.1&&Math.abs(g+m)<.1&&Math.abs(c+p+u-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;const b=(c+1)/2,y=(p+1)/2,L=(u+1)/2,R=(h+f)/4,A=(d+v)/4,U=(g+m)/4;return b>y&&b>L?b<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(b),s=R/n,r=A/n):y>L?y<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(y),n=R/s,r=U/s):L<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(L),n=A/r,s=U/r),this.set(n,s,r,e),this}let T=Math.sqrt((m-g)*(m-g)+(d-v)*(d-v)+(f-h)*(f-h));return Math.abs(T)<.001&&(T=1),this.x=(m-g)/T,this.y=(d-v)/T,this.z=(f-h)/T,this.w=Math.acos((c+p+u-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this.w=Yt(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this.w=Yt(this.w,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Dh extends ii{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new le(0,0,t,e),this.scissorTest=!1,this.viewport=new le(0,0,t,e);const s={width:t,height:e,depth:1};n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:dn,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},n);const r=new Ce(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace);r.flipY=!1,r.generateMipmaps=n.generateMipmaps,r.internalFormat=n.internalFormat,this.textures=[];const a=n.count;for(let o=0;o=0?1:-1,b=1-u*u;if(b>Number.EPSILON){const L=Math.sqrt(b),R=Math.atan2(L,u*T);m=Math.sin(m*R)/L,o=Math.sin(o*R)/L}const y=o*T;if(l=l*m+f*y,c=c*m+p*y,h=h*m+g*y,d=d*m+v*y,m===1-o){const L=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=L,c*=L,h*=L,d*=L}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d}static multiplyQuaternionsFlat(t,e,n,s,r,a){const o=n[s],l=n[s+1],c=n[s+2],h=n[s+3],d=r[a],f=r[a+1],p=r[a+2],g=r[a+3];return t[e]=o*g+h*d+l*p-c*f,t[e+1]=l*g+h*f+c*d-o*p,t[e+2]=c*g+h*p+o*f-l*d,t[e+3]=h*g-o*d-l*f-c*p,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const n=t._x,s=t._y,r=t._z,a=t._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(s/2),d=o(r/2),f=l(n/2),p=l(s/2),g=l(r/2);switch(a){case"XYZ":this._x=f*h*d+c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d-f*p*g;break;case"YXZ":this._x=f*h*d+c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d+f*p*g;break;case"ZXY":this._x=f*h*d-c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d-f*p*g;break;case"ZYX":this._x=f*h*d-c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d+f*p*g;break;case"YZX":this._x=f*h*d+c*p*g,this._y=c*p*d+f*h*g,this._z=c*h*g-f*p*d,this._w=c*h*d-f*p*g;break;case"XZY":this._x=f*h*d-c*p*g,this._y=c*p*d-f*h*g,this._z=c*h*g+f*p*d,this._w=c*h*d+f*p*g;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],s=e[4],r=e[8],a=e[1],o=e[5],l=e[9],c=e[2],h=e[6],d=e[10],f=n+o+d;if(f>0){const p=.5/Math.sqrt(f+1);this._w=.25/p,this._x=(h-l)*p,this._y=(r-c)*p,this._z=(a-s)*p}else if(n>o&&n>d){const p=2*Math.sqrt(1+n-o-d);this._w=(h-l)/p,this._x=.25*p,this._y=(s+a)/p,this._z=(r+c)/p}else if(o>d){const p=2*Math.sqrt(1+o-n-d);this._w=(r-c)/p,this._x=(s+a)/p,this._y=.25*p,this._z=(l+h)/p}else{const p=2*Math.sqrt(1+d-n-o);this._w=(a-s)/p,this._x=(r+c)/p,this._y=(l+h)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Yt(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(n===0)return this;const s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,a=t._w,o=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+a*o+s*c-r*l,this._y=s*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-s*o,this._w=a*h-n*o-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);const n=this._x,s=this._y,r=this._z,a=this._w;let o=a*t._w+n*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=s,this._z=r,this;const l=1-o*o;if(l<=Number.EPSILON){const p=1-e;return this._w=p*a+e*this._w,this._x=p*n+e*this._x,this._y=p*s+e*this._y,this._z=p*r+e*this._z,this.normalize(),this}const c=Math.sqrt(l),h=Math.atan2(c,o),d=Math.sin((1-e)*h)/c,f=Math.sin(e*h)/c;return this._w=a*d+this._w*f,this._x=n*d+this._x*f,this._y=s*d+this._y*f,this._z=r*d+this._z*f,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(t=0,e=0,n=0){P.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(Mo.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(Mo.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,s=this.z,r=t.x,a=t.y,o=t.z,l=t.w,c=2*(a*s-o*n),h=2*(o*e-r*s),d=2*(r*n-a*e);return this.x=e+l*c+a*d-o*h,this.y=n+l*h+o*c-r*d,this.z=s+l*d+r*h-a*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,s=t.y,r=t.z,a=e.x,o=e.y,l=e.z;return this.x=s*l-r*o,this.y=r*a-n*l,this.z=n*o-s*a,this}projectOnVector(t){const e=t.lengthSq();if(e===0)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Mr.copy(this).projectOnVector(t),this.sub(Mr)}reflect(t){return this.sub(Mr.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=Math.random()*2-1,n=Math.sqrt(1-e*e);return this.x=n*Math.cos(t),this.y=e,this.z=n*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Mr=new P,Mo=new ni;class si{constructor(t=new P(1/0,1/0,1/0),e=new P(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,nn),nn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(qi),_s.subVectors(this.max,qi),ci.subVectors(t.a,qi),hi.subVectors(t.b,qi),ui.subVectors(t.c,qi),Rn.subVectors(hi,ci),Cn.subVectors(ui,hi),Gn.subVectors(ci,ui);let e=[0,-Rn.z,Rn.y,0,-Cn.z,Cn.y,0,-Gn.z,Gn.y,Rn.z,0,-Rn.x,Cn.z,0,-Cn.x,Gn.z,0,-Gn.x,-Rn.y,Rn.x,0,-Cn.y,Cn.x,0,-Gn.y,Gn.x,0];return!Sr(e,ci,hi,ui,_s)||(e=[1,0,0,0,1,0,0,0,1],!Sr(e,ci,hi,ui,_s))?!1:(vs.crossVectors(Rn,Cn),e=[vs.x,vs.y,vs.z],Sr(e,ci,hi,ui,_s))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,nn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(nn).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(gn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),gn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),gn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),gn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),gn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),gn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),gn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),gn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(gn),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const gn=[new P,new P,new P,new P,new P,new P,new P,new P],nn=new P,gs=new si,ci=new P,hi=new P,ui=new P,Rn=new P,Cn=new P,Gn=new P,qi=new P,_s=new P,vs=new P,Wn=new P;function Sr(i,t,e,n,s){for(let r=0,a=i.length-3;r<=a;r+=3){Wn.fromArray(i,r);const o=s.x*Math.abs(Wn.x)+s.y*Math.abs(Wn.y)+s.z*Math.abs(Wn.z),l=t.dot(Wn),c=e.dot(Wn),h=n.dot(Wn);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Uh=new si,ji=new P,yr=new P;class ri{constructor(t=new P,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;e!==void 0?n.copy(e):Uh.setFromPoints(t).getCenter(n);let s=0;for(let r=0,a=t.length;rthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ji.subVectors(t,this.center);const e=ji.lengthSq();if(e>this.radius*this.radius){const n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(ji,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(yr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ji.copy(t.center).add(yr)),this.expandByPoint(ji.copy(t.center).sub(yr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}}const _n=new P,Er=new P,xs=new P,Pn=new P,br=new P,Ms=new P,Tr=new P;class cs{constructor(t=new P,e=new P(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_n)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_n.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_n.copy(this.origin).addScaledVector(this.direction,e),_n.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){Er.copy(t).add(e).multiplyScalar(.5),xs.copy(e).sub(t).normalize(),Pn.copy(this.origin).sub(Er);const r=t.distanceTo(e)*.5,a=-this.direction.dot(xs),o=Pn.dot(this.direction),l=-Pn.dot(xs),c=Pn.lengthSq(),h=Math.abs(1-a*a);let d,f,p,g;if(h>0)if(d=a*l-o,f=a*o-l,g=r*h,d>=0)if(f>=-g)if(f<=g){const v=1/h;d*=v,f*=v,p=d*(d+a*f+2*o)+f*(a*d+f+2*l)+c}else f=r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;else f=-r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;else f<=-g?(d=Math.max(0,-(-a*r+o)),f=d>0?-r:Math.min(Math.max(-r,-l),r),p=-d*d+f*(f+2*l)+c):f<=g?(d=0,f=Math.min(Math.max(-r,-l),r),p=f*(f+2*l)+c):(d=Math.max(0,-(a*r+o)),f=d>0?r:Math.min(Math.max(-r,-l),r),p=-d*d+f*(f+2*l)+c);else f=a>0?-r:r,d=Math.max(0,-(a*f+o)),p=-d*d+f*(f+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(Er).addScaledVector(xs,f),p}intersectSphere(t,e){_n.subVectors(t.center,this.origin);const n=_n.dot(this.direction),s=_n.dot(_n)-n*n,r=t.radius*t.radius;if(s>r)return null;const a=Math.sqrt(r-s),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,f=this.origin;return c>=0?(n=(t.min.x-f.x)*c,s=(t.max.x-f.x)*c):(n=(t.max.x-f.x)*c,s=(t.min.x-f.x)*c),h>=0?(r=(t.min.y-f.y)*h,a=(t.max.y-f.y)*h):(r=(t.max.y-f.y)*h,a=(t.min.y-f.y)*h),n>a||r>s||((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-f.z)*d,l=(t.max.z-f.z)*d):(o=(t.max.z-f.z)*d,l=(t.min.z-f.z)*d),n>l||o>s)||((o>n||n!==n)&&(n=o),(l=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,_n)!==null}intersectTriangle(t,e,n,s,r){br.subVectors(e,t),Ms.subVectors(n,t),Tr.crossVectors(br,Ms);let a=this.direction.dot(Tr),o;if(a>0){if(s)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Pn.subVectors(this.origin,t);const l=o*this.direction.dot(Ms.crossVectors(Pn,Ms));if(l<0)return null;const c=o*this.direction.dot(br.cross(Pn));if(c<0||l+c>a)return null;const h=-o*Pn.dot(Tr);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ee{constructor(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m){ee.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m)}set(t,e,n,s,r,a,o,l,c,h,d,f,p,g,v,m){const u=this.elements;return u[0]=t,u[4]=e,u[8]=n,u[12]=s,u[1]=r,u[5]=a,u[9]=o,u[13]=l,u[2]=c,u[6]=h,u[10]=d,u[14]=f,u[3]=p,u[7]=g,u[11]=v,u[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ee().fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,s=1/di.setFromMatrixColumn(t,0).length(),r=1/di.setFromMatrixColumn(t,1).length(),a=1/di.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,s=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),d=Math.sin(r);if(t.order==="XYZ"){const f=a*h,p=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=-l*d,e[8]=c,e[1]=p+g*c,e[5]=f-v*c,e[9]=-o*l,e[2]=v-f*c,e[6]=g+p*c,e[10]=a*l}else if(t.order==="YXZ"){const f=l*h,p=l*d,g=c*h,v=c*d;e[0]=f+v*o,e[4]=g*o-p,e[8]=a*c,e[1]=a*d,e[5]=a*h,e[9]=-o,e[2]=p*o-g,e[6]=v+f*o,e[10]=a*l}else if(t.order==="ZXY"){const f=l*h,p=l*d,g=c*h,v=c*d;e[0]=f-v*o,e[4]=-a*d,e[8]=g+p*o,e[1]=p+g*o,e[5]=a*h,e[9]=v-f*o,e[2]=-a*c,e[6]=o,e[10]=a*l}else if(t.order==="ZYX"){const f=a*h,p=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=g*c-p,e[8]=f*c+v,e[1]=l*d,e[5]=v*c+f,e[9]=p*c-g,e[2]=-c,e[6]=o*l,e[10]=a*l}else if(t.order==="YZX"){const f=a*l,p=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=v-f*d,e[8]=g*d+p,e[1]=d,e[5]=a*h,e[9]=-o*h,e[2]=-c*h,e[6]=p*d+g,e[10]=f-v*d}else if(t.order==="XZY"){const f=a*l,p=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=-d,e[8]=c*h,e[1]=f*d+v,e[5]=a*h,e[9]=p*d-g,e[2]=g*d-p,e[6]=o*h,e[10]=v*d+f}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ih,t,Nh)}lookAt(t,e,n){const s=this.elements;return We.subVectors(t,e),We.lengthSq()===0&&(We.z=1),We.normalize(),Dn.crossVectors(n,We),Dn.lengthSq()===0&&(Math.abs(n.z)===1?We.x+=1e-4:We.z+=1e-4,We.normalize(),Dn.crossVectors(n,We)),Dn.normalize(),Ss.crossVectors(We,Dn),s[0]=Dn.x,s[4]=Ss.x,s[8]=We.x,s[1]=Dn.y,s[5]=Ss.y,s[9]=We.y,s[2]=Dn.z,s[6]=Ss.z,s[10]=We.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],d=n[5],f=n[9],p=n[13],g=n[2],v=n[6],m=n[10],u=n[14],T=n[3],b=n[7],y=n[11],L=n[15],R=s[0],A=s[4],U=s[8],S=s[12],M=s[1],D=s[5],W=s[9],z=s[13],V=s[2],$=s[6],G=s[10],J=s[14],k=s[3],it=s[7],ut=s[11],yt=s[15];return r[0]=a*R+o*M+l*V+c*k,r[4]=a*A+o*D+l*$+c*it,r[8]=a*U+o*W+l*G+c*ut,r[12]=a*S+o*z+l*J+c*yt,r[1]=h*R+d*M+f*V+p*k,r[5]=h*A+d*D+f*$+p*it,r[9]=h*U+d*W+f*G+p*ut,r[13]=h*S+d*z+f*J+p*yt,r[2]=g*R+v*M+m*V+u*k,r[6]=g*A+v*D+m*$+u*it,r[10]=g*U+v*W+m*G+u*ut,r[14]=g*S+v*z+m*J+u*yt,r[3]=T*R+b*M+y*V+L*k,r[7]=T*A+b*D+y*$+L*it,r[11]=T*U+b*W+y*G+L*ut,r[15]=T*S+b*z+y*J+L*yt,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],a=t[1],o=t[5],l=t[9],c=t[13],h=t[2],d=t[6],f=t[10],p=t[14],g=t[3],v=t[7],m=t[11],u=t[15];return g*(+r*l*d-s*c*d-r*o*f+n*c*f+s*o*p-n*l*p)+v*(+e*l*p-e*c*f+r*a*f-s*a*p+s*c*h-r*l*h)+m*(+e*c*d-e*o*p-r*a*d+n*a*p+r*o*h-n*c*h)+u*(-s*o*h-e*l*d+e*o*f+s*a*d-n*a*f+n*l*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=t[9],f=t[10],p=t[11],g=t[12],v=t[13],m=t[14],u=t[15],T=d*m*c-v*f*c+v*l*p-o*m*p-d*l*u+o*f*u,b=g*f*c-h*m*c-g*l*p+a*m*p+h*l*u-a*f*u,y=h*v*c-g*d*c+g*o*p-a*v*p-h*o*u+a*d*u,L=g*d*l-h*v*l-g*o*f+a*v*f+h*o*m-a*d*m,R=e*T+n*b+s*y+r*L;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/R;return t[0]=T*A,t[1]=(v*f*r-d*m*r-v*s*p+n*m*p+d*s*u-n*f*u)*A,t[2]=(o*m*r-v*l*r+v*s*c-n*m*c-o*s*u+n*l*u)*A,t[3]=(d*l*r-o*f*r-d*s*c+n*f*c+o*s*p-n*l*p)*A,t[4]=b*A,t[5]=(h*m*r-g*f*r+g*s*p-e*m*p-h*s*u+e*f*u)*A,t[6]=(g*l*r-a*m*r-g*s*c+e*m*c+a*s*u-e*l*u)*A,t[7]=(a*f*r-h*l*r+h*s*c-e*f*c-a*s*p+e*l*p)*A,t[8]=y*A,t[9]=(g*d*r-h*v*r-g*n*p+e*v*p+h*n*u-e*d*u)*A,t[10]=(a*v*r-g*o*r+g*n*c-e*v*c-a*n*u+e*o*u)*A,t[11]=(h*o*r-a*d*r-h*n*c+e*d*c+a*n*p-e*o*p)*A,t[12]=L*A,t[13]=(h*v*s-g*d*s+g*n*f-e*v*f-h*n*m+e*d*m)*A,t[14]=(g*o*s-a*v*s-g*n*l+e*v*l+a*n*m-e*o*m)*A,t[15]=(a*d*s-h*o*s+h*n*l-e*d*l-a*n*f+e*o*f)*A,this}scale(t){const e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),s=Math.sin(e),r=1-n,a=t.x,o=t.y,l=t.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-s*l,c*l+s*o,0,c*o+s*l,h*o+n,h*l-s*a,0,c*l-s*o,h*l+s*a,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,a){return this.set(1,n,r,0,t,1,a,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){const s=this.elements,r=e._x,a=e._y,o=e._z,l=e._w,c=r+r,h=a+a,d=o+o,f=r*c,p=r*h,g=r*d,v=a*h,m=a*d,u=o*d,T=l*c,b=l*h,y=l*d,L=n.x,R=n.y,A=n.z;return s[0]=(1-(v+u))*L,s[1]=(p+y)*L,s[2]=(g-b)*L,s[3]=0,s[4]=(p-y)*R,s[5]=(1-(f+u))*R,s[6]=(m+T)*R,s[7]=0,s[8]=(g+b)*A,s[9]=(m-T)*A,s[10]=(1-(f+v))*A,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){const s=this.elements;let r=di.set(s[0],s[1],s[2]).length();const a=di.set(s[4],s[5],s[6]).length(),o=di.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],sn.copy(this);const c=1/r,h=1/a,d=1/o;return sn.elements[0]*=c,sn.elements[1]*=c,sn.elements[2]*=c,sn.elements[4]*=h,sn.elements[5]*=h,sn.elements[6]*=h,sn.elements[8]*=d,sn.elements[9]*=d,sn.elements[10]*=d,e.setFromRotationMatrix(sn),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,s,r,a,o=En){const l=this.elements,c=2*r/(e-t),h=2*r/(n-s),d=(e+t)/(e-t),f=(n+s)/(n-s);let p,g;if(o===En)p=-(a+r)/(a-r),g=-2*a*r/(a-r);else if(o===er)p=-a/(a-r),g=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return l[0]=c,l[4]=0,l[8]=d,l[12]=0,l[1]=0,l[5]=h,l[9]=f,l[13]=0,l[2]=0,l[6]=0,l[10]=p,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,a,o=En){const l=this.elements,c=1/(e-t),h=1/(n-s),d=1/(a-r),f=(e+t)*c,p=(n+s)*h;let g,v;if(o===En)g=(a+r)*d,v=-2*d;else if(o===er)g=r*d,v=-1*d;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-f,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-p,l[2]=0,l[6]=0,l[10]=v,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const di=new P,sn=new ee,Ih=new P(0,0,0),Nh=new P(1,1,1),Dn=new P,Ss=new P,We=new P,So=new ee,yo=new ni;class pn{constructor(t=0,e=0,n=0,s=pn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const s=t.elements,r=s[0],a=s[4],o=s[8],l=s[1],c=s[5],h=s[9],d=s[2],f=s[6],p=s[10];switch(e){case"XYZ":this._y=Math.asin(Yt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,p),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(f,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Yt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,p),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-d,r),this._z=0);break;case"ZXY":this._x=Math.asin(Yt(f,-1,1)),Math.abs(f)<.9999999?(this._y=Math.atan2(-d,p),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-Yt(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(f,p),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(Yt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-d,r)):(this._x=0,this._y=Math.atan2(o,p));break;case"XZY":this._z=Math.asin(-Yt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(f,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,p),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return So.makeRotationFromQuaternion(t),this.setFromRotationMatrix(So,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return yo.setFromEuler(this),this.setFromQuaternion(yo,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}pn.DEFAULT_ORDER="XYZ";class Qa{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let e=0;e1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(o=>({boxInitialized:o.boxInitialized,boxMin:o.box.min.toArray(),boxMax:o.box.max.toArray(),sphereInitialized:o.sphereInitialized,sphereRadius:o.sphere.radius,sphereCenter:o.sphere.center.toArray()})),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(t)),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),f.length>0&&(n.skeletons=f),p.length>0&&(n.animations=p),g.length>0&&(n.nodes=g)}return n.object=s,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){rn.subVectors(s,e),xn.subVectors(n,e),Ar.subVectors(t,e);const a=rn.dot(rn),o=rn.dot(xn),l=rn.dot(Ar),c=xn.dot(xn),h=xn.dot(Ar),d=a*c-o*o;if(d===0)return r.set(0,0,0),null;const f=1/d,p=(c*l-o*h)*f,g=(a*h-o*l)*f;return r.set(1-p-g,g,p)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,Mn)===null?!1:Mn.x>=0&&Mn.y>=0&&Mn.x+Mn.y<=1}static getInterpolation(t,e,n,s,r,a,o,l){return this.getBarycoord(t,e,n,s,Mn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mn.x),l.addScaledVector(a,Mn.y),l.addScaledVector(o,Mn.z),l)}static getInterpolatedAttribute(t,e,n,s,r,a){return Dr.setScalar(0),Lr.setScalar(0),Ur.setScalar(0),Dr.fromBufferAttribute(t,e),Lr.fromBufferAttribute(t,n),Ur.fromBufferAttribute(t,s),a.setScalar(0),a.addScaledVector(Dr,r.x),a.addScaledVector(Lr,r.y),a.addScaledVector(Ur,r.z),a}static isFrontFacing(t,e,n,s){return rn.subVectors(n,e),xn.subVectors(t,e),rn.cross(xn).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return rn.subVectors(this.c,this.b),xn.subVectors(this.a,this.b),rn.cross(xn).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return tn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return tn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,n,s,r){return tn.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return tn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return tn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,s=this.b,r=this.c;let a,o;mi.subVectors(s,n),gi.subVectors(r,n),Rr.subVectors(t,n);const l=mi.dot(Rr),c=gi.dot(Rr);if(l<=0&&c<=0)return e.copy(n);Cr.subVectors(t,s);const h=mi.dot(Cr),d=gi.dot(Cr);if(h>=0&&d<=h)return e.copy(s);const f=l*d-h*c;if(f<=0&&l>=0&&h<=0)return a=l/(l-h),e.copy(n).addScaledVector(mi,a);Pr.subVectors(t,r);const p=mi.dot(Pr),g=gi.dot(Pr);if(g>=0&&p<=g)return e.copy(r);const v=p*c-l*g;if(v<=0&&c>=0&&g<=0)return o=c/(c-g),e.copy(n).addScaledVector(gi,o);const m=h*g-p*d;if(m<=0&&d-h>=0&&p-g>=0)return Ro.subVectors(r,s),o=(d-h)/(d-h+(p-g)),e.copy(s).addScaledVector(Ro,o);const u=1/(m+v+f);return a=v*u,o=f*u,e.copy(n).addScaledVector(mi,a).addScaledVector(gi,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const tc={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ln={h:0,s:0,l:0},Es={h:0,s:0,l:0};function Ir(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}class pt{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){const s=t;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Qe){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,$t.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=$t.workingColorSpace){return this.r=t,this.g=e,this.b=n,$t.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=$t.workingColorSpace){if(t=Sh(t,1),e=Yt(e,0,1),n=Yt(n,0,1),e===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+e):n+e-n*e,a=2*n-r;this.r=Ir(a,r,t+1/3),this.g=Ir(a,r,t),this.b=Ir(a,r,t-1/3)}return $t.toWorkingColorSpace(this,s),this}setStyle(t,e=Qe){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const a=s[1],o=s[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const r=s[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(a===6)return this.setHex(parseInt(r,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Qe){const n=tc[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=Ii(t.r),this.g=Ii(t.g),this.b=Ii(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Qe){return $t.fromWorkingColorSpace(Re.copy(this),t),Math.round(Yt(Re.r*255,0,255))*65536+Math.round(Yt(Re.g*255,0,255))*256+Math.round(Yt(Re.b*255,0,255))}getHexString(t=Qe){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=$t.workingColorSpace){$t.fromWorkingColorSpace(Re.copy(this),e);const n=Re.r,s=Re.g,r=Re.b,a=Math.max(n,s,r),o=Math.min(n,s,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const d=a-o;switch(c=h<=.5?d/(a+o):d/(2-a-o),a){case n:l=(s-r)/d+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(const e in t){const n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";e&&(t={textures:{},images:{}});const n={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Li&&(n.blending=this.blending),this.side!==zn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Qr&&(n.blendSrc=this.blendSrc),this.blendDst!==ta&&(n.blendDst=this.blendDst),this.blendEquation!==Kn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Fi&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==mo&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==oi&&(n.stencilFail=this.stencilFail),this.stencilZFail!==oi&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==oi&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(e){const r=s(t.textures),a=s(t.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(e!==null){const s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){t===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class ls extends Hn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new pn,this.combine=Ol,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const ge=new P,bs=new vt;class de{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=Ba,this.updateRanges=[],this.gpuType=fn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new si);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n0&&(t.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};const e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const l in n){const c=n[l];t.data.attributes[l]=c.toJSON(t.data)}const s={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let d=0,f=c.length;d0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;n!==null&&this.setIndex(n.clone(e));const s=t.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(e))}const r=t.morphAttributes;for(const c in r){const h=[],d=r[c];for(let f=0,p=d.length;f0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;r(t.far-t.near)**2))&&(Co.copy(r).invert(),Xn.copy(t.ray).applyMatrix4(Co),!(n.boundingBox!==null&&Xn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,Xn)))}_computeIntersections(t,e,n){let s;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,f=r.groups,p=r.drawRange;if(o!==null)if(Array.isArray(a))for(let g=0,v=f.length;ge.far?null:{distance:c,point:Ps.clone(),object:i}}function Ds(i,t,e,n,s,r,a,o,l,c){i.getVertexPosition(o,ws),i.getVertexPosition(l,As),i.getVertexPosition(c,Rs);const h=Vh(i,t,e,n,ws,As,Rs,Do);if(h){const d=new P;tn.getBarycoord(Do,ws,As,Rs,d),s&&(h.uv=tn.getInterpolatedAttribute(s,o,l,c,d,new vt)),r&&(h.uv1=tn.getInterpolatedAttribute(r,o,l,c,d,new vt)),a&&(h.normal=tn.getInterpolatedAttribute(a,o,l,c,d,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const f={a:o,b:l,c,normal:new P,materialIndex:0};tn.getNormal(ws,As,Rs,f.normal),h.face=f,h.barycoord=d}return h}class hs extends pe{constructor(t=1,e=1,n=1,s=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:a};const o=this;s=Math.floor(s),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],d=[];let f=0,p=0;g("z","y","x",-1,-1,n,e,t,a,r,0),g("z","y","x",1,-1,n,e,-t,a,r,1),g("x","z","y",1,1,t,n,e,s,a,2),g("x","z","y",1,-1,t,n,-e,s,a,3),g("x","y","z",1,-1,t,e,n,s,r,4),g("x","y","z",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute("position",new Pe(c,3)),this.setAttribute("normal",new Pe(h,3)),this.setAttribute("uv",new Pe(d,2));function g(v,m,u,T,b,y,L,R,A,U,S){const M=y/A,D=L/U,W=y/2,z=L/2,V=R/2,$=A+1,G=U+1;let J=0,k=0;const it=new P;for(let ut=0;ut0?1:-1,h.push(it.x,it.y,it.z),d.push(Lt/A),d.push(1-ut/U),J+=1}}for(let ut=0;ut0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class rc extends we{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ne,this.projectionMatrix=new ne,this.projectionMatrixInverse=new ne,this.coordinateSystem=En}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Un=new P,Lo=new vt,Uo=new vt;class Xe extends rc{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=za*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(Ks*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return za*2*Math.atan(Math.tan(Ks*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,n){Un.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Un.x,Un.y).multiplyScalar(-t/Un.z),Un.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Un.x,Un.y).multiplyScalar(-t/Un.z)}getViewSize(t,e){return this.getViewBounds(t,Lo,Uo),e.subVectors(Uo,Lo)}setViewOffset(t,e,n,s,r,a){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(Ks*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*s/l,e-=a.offsetY*n/c,s*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const vi=-90,xi=1;class Xh extends we{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Xe(vi,xi,t,e);s.layers=this.layers,this.add(s);const r=new Xe(vi,xi,t,e);r.layers=this.layers,this.add(r);const a=new Xe(vi,xi,t,e);a.layers=this.layers,this.add(a);const o=new Xe(vi,xi,t,e);o.layers=this.layers,this.add(o);const l=new Xe(vi,xi,t,e);l.layers=this.layers,this.add(l);const c=new Xe(vi,xi,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[n,s,r,a,o,l]=e;for(const c of e)this.remove(c);if(t===En)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===er)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);for(const c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,d=t.getRenderTarget(),f=t.getActiveCubeFace(),p=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;const v=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,a),t.setRenderTarget(n,2,s),t.render(e,o),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=v,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(d,f,p),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}}class ac extends Ce{constructor(t,e,n,s,r,a,o,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:Oi,super(t,e,n,s,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Yh extends on{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];this.texture=new ac(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:dn}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` +}`;class Ne extends Hn{constructor(t){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Wh,this.fragmentShader=Xh,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,t!==void 0&&this.setValues(t)}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Vi(t.uniforms),this.uniformsGroups=Gh(t.uniformsGroups),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.fog=t.fog,this.lights=t.lights,this.clipping=t.clipping,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){const e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(const s in this.uniforms){const a=this.uniforms[s].value;a&&a.isTexture?e.uniforms[s]={type:"t",value:a.toJSON(t).uuid}:a&&a.isColor?e.uniforms[s]={type:"c",value:a.getHex()}:a&&a.isVector2?e.uniforms[s]={type:"v2",value:a.toArray()}:a&&a.isVector3?e.uniforms[s]={type:"v3",value:a.toArray()}:a&&a.isVector4?e.uniforms[s]={type:"v4",value:a.toArray()}:a&&a.isMatrix3?e.uniforms[s]={type:"m3",value:a.toArray()}:a&&a.isMatrix4?e.uniforms[s]={type:"m4",value:a.toArray()}:e.uniforms[s]={value:a}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class sc extends we{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ee,this.projectionMatrix=new ee,this.projectionMatrixInverse=new ee,this.coordinateSystem=En}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Un=new P,Lo=new vt,Uo=new vt;class Ye extends sc{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=za*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(Ks*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return za*2*Math.atan(Math.tan(Ks*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,n){Un.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Un.x,Un.y).multiplyScalar(-t/Un.z),Un.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Un.x,Un.y).multiplyScalar(-t/Un.z)}getViewSize(t,e){return this.getViewBounds(t,Lo,Uo),e.subVectors(Uo,Lo)}setViewOffset(t,e,n,s,r,a){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(Ks*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*s/l,e-=a.offsetY*n/c,s*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const vi=-90,xi=1;class Yh extends we{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Ye(vi,xi,t,e);s.layers=this.layers,this.add(s);const r=new Ye(vi,xi,t,e);r.layers=this.layers,this.add(r);const a=new Ye(vi,xi,t,e);a.layers=this.layers,this.add(a);const o=new Ye(vi,xi,t,e);o.layers=this.layers,this.add(o);const l=new Ye(vi,xi,t,e);l.layers=this.layers,this.add(l);const c=new Ye(vi,xi,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[n,s,r,a,o,l]=e;for(const c of e)this.remove(c);if(t===En)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===er)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);for(const c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,d=t.getRenderTarget(),f=t.getActiveCubeFace(),p=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;const v=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,a),t.setRenderTarget(n,2,s),t.render(e,o),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=v,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(d,f,p),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}}class rc extends Ce{constructor(t,e,n,s,r,a,o,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:Oi,super(t,e,n,s,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class qh extends on{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];this.texture=new rc(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:dn}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -41,13 +41,13 @@ var Tc=Object.defineProperty;var wc=(i,t,e)=>t in i?Tc(i,t,{enumerable:!0,config gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},s=new hs(5,5,5),r=new Ne({name:"CubemapFromEquirect",uniforms:Vi(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:He,blending:bn});r.uniforms.tEquirect.value=e;const a=new Me(s,r),o=e.minFilter;return e.minFilter===Qn&&(e.minFilter=dn),new Xh(1,10,this).update(t,a),e.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(t,e,n,s){const r=t.getRenderTarget();for(let a=0;a<6;a++)t.setRenderTarget(this,a),t.clear(e,n,s);t.setRenderTarget(r)}}class ur{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new pt(t),this.density=e}clone(){return new ur(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class qh extends we{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new pn,this.environmentIntensity=1,this.environmentRotation=new pn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),t.background!==null&&(this.background=t.background.clone()),t.environment!==null&&(this.environment=t.environment.clone()),t.fog!==null&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),t.overrideMaterial!==null&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return this.fog!==null&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class jh{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=t!==void 0?t.length/e:0,this.usage=Ba,this.updateRanges=[],this.version=0,this.uuid=Bn()}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:l,point:$i.clone(),uv:Qe.getInterpolation($i,Ls,Qi,Us,Io,Or,No,new vt),face:null,object:this})}copy(t,e){return super.copy(t,e),t.center!==void 0&&this.center.copy(t.center),this.material=t.material,this}}function Is(i,t,e,n,s,r){Ei.subVectors(i,e).addScalar(.5).multiply(n),s!==void 0?(Ji.x=r*Ei.x-s*Ei.y,Ji.y=s*Ei.x+r*Ei.y):Ji.copy(Ei),i.copy(t),i.x+=Ji.x,i.y+=Ji.y,i.applyMatrix4(oc)}class Zh extends Ce{constructor(t=null,e=1,n=1,s,r,a,o,l,c=Ye,h=Ye,d,f){super(null,a,o,l,c,h,s,r,d,f),this.isDataTexture=!0,this.image={data:t,width:e,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Fo extends de{constructor(t,e,n,s=1){super(t,e,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}const bi=new ne,Oo=new ne,Ns=[],Bo=new si,Kh=new ne,ts=new Me,es=new ri;class $h extends Me{constructor(t,e,n){super(t,e),this.isInstancedMesh=!0,this.instanceMatrix=new Fo(new Float32Array(n*16),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||Qh.getNormalMatrix(t),s=this.coplanarPoint(zr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Yn=new ri,Fs=new P;class to{constructor(t=new Nn,e=new Nn,n=new Nn,s=new Nn,r=new Nn,a=new Nn){this.planes=[t,e,n,s,r,a]}set(t,e,n,s,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=En){const n=this.planes,s=t.elements,r=s[0],a=s[1],o=s[2],l=s[3],c=s[4],h=s[5],d=s[6],f=s[7],p=s[8],g=s[9],v=s[10],m=s[11],u=s[12],T=s[13],b=s[14],y=s[15];if(n[0].setComponents(l-r,f-c,m-p,y-u).normalize(),n[1].setComponents(l+r,f+c,m+p,y+u).normalize(),n[2].setComponents(l+a,f+h,m+g,y+T).normalize(),n[3].setComponents(l-a,f-h,m-g,y-T).normalize(),n[4].setComponents(l-o,f-d,m-v,y-b).normalize(),e===En)n[5].setComponents(l+o,f+d,m+v,y+b).normalize();else if(e===er)n[5].setComponents(o,d,v,b).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Yn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Yn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Yn)}intersectsSprite(t){return Yn.center.set(0,0,0),Yn.radius=.7071067811865476,Yn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Yn)}intersectsSphere(t){const e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)0?t.max.x:t.min.x,Fs.y=s.normal.y>0?t.max.y:t.min.y,Fs.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Fs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class rr extends Hn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new pt(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const ar=new P,or=new P,zo=new ne,ns=new cs,Os=new ri,Hr=new P,Ho=new P;class ka extends we{constructor(t=new pe,e=new rr){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[0];for(let s=1,r=e.count;s0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rn)return;Hr.applyMatrix4(i.matrixWorld);const l=t.ray.origin.distanceTo(Hr);if(!(lt.far))return{distance:l,point:Ho.clone().applyMatrix4(i.matrixWorld),index:s,face:null,faceIndex:null,barycoord:null,object:i}}class Ni extends Hn{constructor(t){super(),this.isPointsMaterial=!0,this.type="PointsMaterial",this.color=new pt(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const ko=new ne,Va=new cs,zs=new ri,Hs=new P;class rs extends we{constructor(t=new pe,e=new Ni){super(),this.isPoints=!0,this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){const n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,a=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),zs.copy(n.boundingSphere),zs.applyMatrix4(s),zs.radius+=r,t.ray.intersectsSphere(zs)===!1)return;ko.copy(s).invert(),Va.copy(t.ray).applyMatrix4(ko);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=o*o,c=n.index,d=n.attributes.position;if(c!==null){const f=Math.max(0,a.start),p=Math.min(c.count,a.start+a.count);for(let g=f,v=p;g0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rs.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:t,face:null,faceIndex:null,barycoord:null,object:a})}}class Ci extends we{constructor(){super(),this.isGroup=!0,this.type="Group"}}class tu extends Ce{constructor(t,e,n,s,r,a,o,l,c){super(t,e,n,s,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class lc extends Ce{constructor(t,e,n,s,r,a,o,l,c,h=Ui){if(h!==Ui&&h!==Hi)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");n===void 0&&h===Ui&&(n=ei),n===void 0&&h===Hi&&(n=zi),super(null,s,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=o!==void 0?o:Ye,this.minFilter=l!==void 0?l:Ye,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}}class us extends pe{constructor(t=1,e=1,n=1,s=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};const r=t/2,a=e/2,o=Math.floor(n),l=Math.floor(s),c=o+1,h=l+1,d=t/o,f=e/l,p=[],g=[],v=[],m=[];for(let u=0;u0)&&p.push(b,y,R),(u!==n-1||l0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Zh{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=t!==void 0?t.length/e:0,this.usage=Ba,this.updateRanges=[],this.version=0,this.uuid=Bn()}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:l,point:$i.clone(),uv:tn.getInterpolation($i,Ls,Qi,Us,Io,Or,No,new vt),face:null,object:this})}copy(t,e){return super.copy(t,e),t.center!==void 0&&this.center.copy(t.center),this.material=t.material,this}}function Is(i,t,e,n,s,r){Ei.subVectors(i,e).addScalar(.5).multiply(n),s!==void 0?(Ji.x=r*Ei.x-s*Ei.y,Ji.y=s*Ei.x+r*Ei.y):Ji.copy(Ei),i.copy(t),i.x+=Ji.x,i.y+=Ji.y,i.applyMatrix4(ac)}class Kh extends Ce{constructor(t=null,e=1,n=1,s,r,a,o,l,c=qe,h=qe,d,f){super(null,a,o,l,c,h,s,r,d,f),this.isDataTexture=!0,this.image={data:t,width:e,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Fo extends de{constructor(t,e,n,s=1){super(t,e,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}const bi=new ee,Oo=new ee,Ns=[],Bo=new si,$h=new ee,ts=new Se,es=new ri;class Jh extends Se{constructor(t,e,n){super(t,e),this.isInstancedMesh=!0,this.instanceMatrix=new Fo(new Float32Array(n*16),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||tu.getNormalMatrix(t),s=this.coplanarPoint(zr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Yn=new ri,Fs=new P;class to{constructor(t=new Nn,e=new Nn,n=new Nn,s=new Nn,r=new Nn,a=new Nn){this.planes=[t,e,n,s,r,a]}set(t,e,n,s,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=En){const n=this.planes,s=t.elements,r=s[0],a=s[1],o=s[2],l=s[3],c=s[4],h=s[5],d=s[6],f=s[7],p=s[8],g=s[9],v=s[10],m=s[11],u=s[12],T=s[13],b=s[14],y=s[15];if(n[0].setComponents(l-r,f-c,m-p,y-u).normalize(),n[1].setComponents(l+r,f+c,m+p,y+u).normalize(),n[2].setComponents(l+a,f+h,m+g,y+T).normalize(),n[3].setComponents(l-a,f-h,m-g,y-T).normalize(),n[4].setComponents(l-o,f-d,m-v,y-b).normalize(),e===En)n[5].setComponents(l+o,f+d,m+v,y+b).normalize();else if(e===er)n[5].setComponents(o,d,v,b).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Yn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Yn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Yn)}intersectsSprite(t){return Yn.center.set(0,0,0),Yn.radius=.7071067811865476,Yn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Yn)}intersectsSphere(t){const e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)0?t.max.x:t.min.x,Fs.y=s.normal.y>0?t.max.y:t.min.y,Fs.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Fs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class rr extends Hn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new pt(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const ar=new P,or=new P,zo=new ee,ns=new cs,Os=new ri,Hr=new P,Ho=new P;class ka extends we{constructor(t=new pe,e=new rr){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[0];for(let s=1,r=e.count;s0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rn)return;Hr.applyMatrix4(i.matrixWorld);const l=t.ray.origin.distanceTo(Hr);if(!(lt.far))return{distance:l,point:Ho.clone().applyMatrix4(i.matrixWorld),index:s,face:null,faceIndex:null,barycoord:null,object:i}}class Ni extends Hn{constructor(t){super(),this.isPointsMaterial=!0,this.type="PointsMaterial",this.color=new pt(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const ko=new ee,Va=new cs,zs=new ri,Hs=new P;class rs extends we{constructor(t=new pe,e=new Ni){super(),this.isPoints=!0,this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){const n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,a=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),zs.copy(n.boundingSphere),zs.applyMatrix4(s),zs.radius+=r,t.ray.intersectsSphere(zs)===!1)return;ko.copy(s).invert(),Va.copy(t.ray).applyMatrix4(ko);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=o*o,c=n.index,d=n.attributes.position;if(c!==null){const f=Math.max(0,a.start),p=Math.min(c.count,a.start+a.count);for(let g=f,v=p;g0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rs.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:t,face:null,faceIndex:null,barycoord:null,object:a})}}class Ci extends we{constructor(){super(),this.isGroup=!0,this.type="Group"}}class eu extends Ce{constructor(t,e,n,s,r,a,o,l,c){super(t,e,n,s,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class oc extends Ce{constructor(t,e,n,s,r,a,o,l,c,h=Ui){if(h!==Ui&&h!==Hi)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");n===void 0&&h===Ui&&(n=ei),n===void 0&&h===Hi&&(n=zi),super(null,s,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=o!==void 0?o:qe,this.minFilter=l!==void 0?l:qe,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}}class us extends pe{constructor(t=1,e=1,n=1,s=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};const r=t/2,a=e/2,o=Math.floor(n),l=Math.floor(s),c=o+1,h=l+1,d=t/o,f=e/l,p=[],g=[],v=[],m=[];for(let u=0;u0)&&p.push(b,y,R),(u!==n-1||lp.start-g.start);let f=0;for(let p=1;pp.start-g.start);let f=0;for(let p=1;pt in i?Tc(i,t,{enumerable:!0,config : cases.z; return clamp( threshold , 1.0e-6, 1.0 ); } -#endif`,mu=`#ifdef USE_ALPHAMAP - diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g; #endif`,gu=`#ifdef USE_ALPHAMAP + diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g; +#endif`,_u=`#ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`,_u=`#ifdef USE_ALPHATEST +#endif`,vu=`#ifdef USE_ALPHATEST #ifdef ALPHA_TO_COVERAGE diffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a ); if ( diffuseColor.a == 0.0 ) discard; #else if ( diffuseColor.a < alphaTest ) discard; #endif -#endif`,vu=`#ifdef USE_ALPHATEST +#endif`,xu=`#ifdef USE_ALPHATEST uniform float alphaTest; -#endif`,xu=`#ifdef USE_AOMAP +#endif`,Mu=`#ifdef USE_AOMAP float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0; reflectedLight.indirectDiffuse *= ambientOcclusion; #if defined( USE_CLEARCOAT ) @@ -108,10 +108,10 @@ var Tc=Object.defineProperty;var wc=(i,t,e)=>t in i?Tc(i,t,{enumerable:!0,config float dotNV = saturate( dot( geometryNormal, geometryViewDir ) ); reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness ); #endif -#endif`,Mu=`#ifdef USE_AOMAP +#endif`,Su=`#ifdef USE_AOMAP uniform sampler2D aoMap; uniform float aoMapIntensity; -#endif`,Su=`#ifdef USE_BATCHING +#endif`,yu=`#ifdef USE_BATCHING #if ! defined( GL_ANGLE_multi_draw ) #define gl_DrawID _gl_DrawID uniform int _gl_DrawID; @@ -145,15 +145,15 @@ var Tc=Object.defineProperty;var wc=(i,t,e)=>t in i?Tc(i,t,{enumerable:!0,config int y = j / size; return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb; } -#endif`,yu=`#ifdef USE_BATCHING +#endif`,Eu=`#ifdef USE_BATCHING mat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) ); -#endif`,Eu=`vec3 transformed = vec3( position ); +#endif`,bu=`vec3 transformed = vec3( position ); #ifdef USE_ALPHAHASH vPosition = vec3( position ); -#endif`,bu=`vec3 objectNormal = vec3( normal ); +#endif`,Tu=`vec3 objectNormal = vec3( normal ); #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); -#endif`,Tu=`float G_BlinnPhong_Implicit( ) { +#endif`,wu=`float G_BlinnPhong_Implicit( ) { return 0.25; } float D_BlinnPhong( const in float shininess, const in float dotNH ) { @@ -167,7 +167,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve float G = G_BlinnPhong_Implicit( ); float D = D_BlinnPhong( shininess, dotNH ); return F * ( G * D ); -} // validated`,wu=`#ifdef USE_IRIDESCENCE +} // validated`,Au=`#ifdef USE_IRIDESCENCE const mat3 XYZ_TO_REC709 = mat3( 3.2404542, -0.9692660, 0.0556434, -1.5371385, 1.8760108, -0.2040259, @@ -230,7 +230,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve } return max( I, vec3( 0.0 ) ); } -#endif`,Au=`#ifdef USE_BUMPMAP +#endif`,Ru=`#ifdef USE_BUMPMAP uniform sampler2D bumpMap; uniform float bumpScale; vec2 dHdxy_fwd() { @@ -251,7 +251,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); return normalize( abs( fDet ) * surf_norm - vGrad ); } -#endif`,Ru=`#if NUM_CLIPPING_PLANES > 0 +#endif`,Cu=`#if NUM_CLIPPING_PLANES > 0 vec4 plane; #ifdef ALPHA_TO_COVERAGE float distanceToPlane, distanceGradient; @@ -297,26 +297,26 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve if ( clipped ) discard; #endif #endif -#endif`,Cu=`#if NUM_CLIPPING_PLANES > 0 - varying vec3 vClipPosition; - uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; #endif`,Pu=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; + uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; #endif`,Du=`#if NUM_CLIPPING_PLANES > 0 + varying vec3 vClipPosition; +#endif`,Lu=`#if NUM_CLIPPING_PLANES > 0 vClipPosition = - mvPosition.xyz; -#endif`,Lu=`#if defined( USE_COLOR_ALPHA ) +#endif`,Uu=`#if defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; #elif defined( USE_COLOR ) diffuseColor.rgb *= vColor; -#endif`,Uu=`#if defined( USE_COLOR_ALPHA ) +#endif`,Iu=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) varying vec3 vColor; -#endif`,Iu=`#if defined( USE_COLOR_ALPHA ) +#endif`,Nu=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) varying vec3 vColor; -#endif`,Nu=`#if defined( USE_COLOR_ALPHA ) +#endif`,Fu=`#if defined( USE_COLOR_ALPHA ) vColor = vec4( 1.0 ); #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) vColor = vec3( 1.0 ); @@ -330,7 +330,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve #ifdef USE_BATCHING_COLOR vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); vColor.xyz *= batchingColor.xyz; -#endif`,Fu=`#define PI 3.141592653589793 +#endif`,Ou=`#define PI 3.141592653589793 #define PI2 6.283185307179586 #define PI_HALF 1.5707963267948966 #define RECIPROCAL_PI 0.3183098861837907 @@ -404,7 +404,7 @@ vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`,Ou=`#ifdef ENVMAP_TYPE_CUBE_UV +} // validated`,Bu=`#ifdef ENVMAP_TYPE_CUBE_UV #define cubeUV_minMipLevel 4.0 #define cubeUV_minTileSize 16.0 float getFace( vec3 direction ) { @@ -497,7 +497,7 @@ float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { return vec4( mix( color0, color1, mipF ), 1.0 ); } } -#endif`,Bu=`vec3 transformedNormal = objectNormal; +#endif`,zu=`vec3 transformedNormal = objectNormal; #ifdef USE_TANGENT vec3 transformedTangent = objectTangent; #endif @@ -526,21 +526,21 @@ transformedNormal = normalMatrix * transformedNormal; #ifdef FLIP_SIDED transformedTangent = - transformedTangent; #endif -#endif`,zu=`#ifdef USE_DISPLACEMENTMAP +#endif`,Hu=`#ifdef USE_DISPLACEMENTMAP uniform sampler2D displacementMap; uniform float displacementScale; uniform float displacementBias; -#endif`,Hu=`#ifdef USE_DISPLACEMENTMAP +#endif`,ku=`#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`,ku=`#ifdef USE_EMISSIVEMAP +#endif`,Vu=`#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE emissiveColor = sRGBTransferEOTF( emissiveColor ); #endif totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,Vu=`#ifdef USE_EMISSIVEMAP +#endif`,Gu=`#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`,Gu="gl_FragColor = linearToOutputTexel( gl_FragColor );",Wu=`vec4 LinearTransferOETF( in vec4 value ) { +#endif`,Wu="gl_FragColor = linearToOutputTexel( gl_FragColor );",Xu=`vec4 LinearTransferOETF( in vec4 value ) { return value; } vec4 sRGBTransferEOTF( in vec4 value ) { @@ -548,7 +548,7 @@ vec4 sRGBTransferEOTF( in vec4 value ) { } vec4 sRGBTransferOETF( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,Xu=`#ifdef USE_ENVMAP +}`,Yu=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -577,7 +577,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #elif defined( ENVMAP_BLENDING_ADD ) outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif -#endif`,Yu=`#ifdef USE_ENVMAP +#endif`,qu=`#ifdef USE_ENVMAP uniform float envMapIntensity; uniform float flipEnvMap; uniform mat3 envMapRotation; @@ -587,7 +587,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform sampler2D envMap; #endif -#endif`,qu=`#ifdef USE_ENVMAP +#endif`,ju=`#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS @@ -598,7 +598,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`,ju=`#ifdef USE_ENVMAP +#endif`,Zu=`#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS #endif @@ -609,7 +609,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`,Zu=`#ifdef USE_ENVMAP +#endif`,Ku=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -626,18 +626,18 @@ vec4 sRGBTransferOETF( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`,Ku=`#ifdef USE_FOG - vFogDepth = - mvPosition.z; #endif`,$u=`#ifdef USE_FOG - varying float vFogDepth; + vFogDepth = - mvPosition.z; #endif`,Ju=`#ifdef USE_FOG + varying float vFogDepth; +#endif`,Qu=`#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,Qu=`#ifdef USE_FOG +#endif`,td=`#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -646,7 +646,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`,td=`#ifdef USE_GRADIENTMAP +#endif`,ed=`#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -658,12 +658,12 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { vec2 fw = fwidth( coord ) * 0.5; return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); #endif -}`,ed=`#ifdef USE_LIGHTMAP +}`,nd=`#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`,nd=`LambertMaterial material; +#endif`,id=`LambertMaterial material; material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`,id=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,sd=`varying vec3 vViewPosition; struct LambertMaterial { vec3 diffuseColor; float specularStrength; @@ -677,7 +677,7 @@ void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometr reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,sd=`uniform bool receiveShadow; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,rd=`uniform bool receiveShadow; uniform vec3 ambientLightColor; #if defined( USE_LIGHT_PROBES ) uniform vec3 lightProbe[ 9 ]; @@ -793,7 +793,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); return irradiance; } -#endif`,rd=`#ifdef USE_ENVMAP +#endif`,ad=`#ifdef USE_ENVMAP vec3 getIBLIrradiance( const in vec3 normal ) { #ifdef ENVMAP_TYPE_CUBE_UV vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -826,8 +826,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi #endif } #endif -#endif`,ad=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,od=`varying vec3 vViewPosition; +#endif`,od=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,ld=`varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -839,11 +839,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPo reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,ld=`BlinnPhongMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,cd=`BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`,cd=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,hd=`varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -860,7 +860,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geom reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,hd=`PhysicalMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,ud=`PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); @@ -946,7 +946,7 @@ material.roughness = min( material.roughness, 1.0 ); material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`,ud=`struct PhysicalMaterial { +#endif`,dd=`struct PhysicalMaterial { vec3 diffuseColor; float roughness; vec3 specularColor; @@ -1247,7 +1247,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,dd=` +}`,fd=` vec3 geometryPosition = - vViewPosition; vec3 geometryNormal = normal; vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); @@ -1362,7 +1362,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,fd=`#if defined( RE_IndirectDiffuse ) +#endif`,pd=`#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -1381,32 +1381,32 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); #endif -#endif`,pd=`#if defined( RE_IndirectDiffuse ) +#endif`,md=`#if defined( RE_IndirectDiffuse ) RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`,md=`#if defined( USE_LOGDEPTHBUF ) - gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; #endif`,gd=`#if defined( USE_LOGDEPTHBUF ) + gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; +#endif`,_d=`#if defined( USE_LOGDEPTHBUF ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`,_d=`#ifdef USE_LOGDEPTHBUF +#endif`,vd=`#ifdef USE_LOGDEPTHBUF varying float vFragDepth; varying float vIsPerspective; -#endif`,vd=`#ifdef USE_LOGDEPTHBUF +#endif`,xd=`#ifdef USE_LOGDEPTHBUF vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`,xd=`#ifdef USE_MAP +#endif`,Md=`#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vMapUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); #endif diffuseColor *= sampledDiffuseColor; -#endif`,Md=`#ifdef USE_MAP +#endif`,Sd=`#ifdef USE_MAP uniform sampler2D map; -#endif`,Sd=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`,yd=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) #if defined( USE_POINTS_UV ) vec2 uv = vUv; #else @@ -1418,7 +1418,7 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,yd=`#if defined( USE_POINTS_UV ) +#endif`,Ed=`#if defined( USE_POINTS_UV ) varying vec2 vUv; #else #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) @@ -1430,19 +1430,19 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`,Ed=`float metalnessFactor = metalness; +#endif`,bd=`float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); metalnessFactor *= texelMetalness.b; -#endif`,bd=`#ifdef USE_METALNESSMAP +#endif`,Td=`#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`,Td=`#ifdef USE_INSTANCING_MORPH +#endif`,wd=`#ifdef USE_INSTANCING_MORPH float morphTargetInfluences[ MORPHTARGETS_COUNT ]; float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; } -#endif`,wd=`#if defined( USE_MORPHCOLORS ) +#endif`,Ad=`#if defined( USE_MORPHCOLORS ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -1451,12 +1451,12 @@ IncidentLight directLight; if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`,Ad=`#ifdef USE_MORPHNORMALS +#endif`,Rd=`#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; } -#endif`,Rd=`#ifdef USE_MORPHTARGETS +#endif`,Cd=`#ifdef USE_MORPHTARGETS #ifndef USE_INSTANCING_MORPH uniform float morphTargetBaseInfluence; uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -1470,12 +1470,12 @@ IncidentLight directLight; ivec3 morphUV = ivec3( x, y, morphTargetIndex ); return texelFetch( morphTargetsTexture, morphUV, 0 ); } -#endif`,Cd=`#ifdef USE_MORPHTARGETS +#endif`,Pd=`#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; } -#endif`,Pd=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`,Dd=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = dFdx( vViewPosition ); vec3 fdy = dFdy( vViewPosition ); @@ -1516,7 +1516,7 @@ IncidentLight directLight; tbn2[1] *= faceDirection; #endif #endif -vec3 nonPerturbedNormal = normal;`,Dd=`#ifdef USE_NORMALMAP_OBJECTSPACE +vec3 nonPerturbedNormal = normal;`,Ld=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -1531,12 +1531,6 @@ vec3 nonPerturbedNormal = normal;`,Dd=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = normalize( tbn * mapN ); #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); -#endif`,Ld=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif #endif`,Ud=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT @@ -1544,12 +1538,18 @@ vec3 nonPerturbedNormal = normal;`,Dd=`#ifdef USE_NORMALMAP_OBJECTSPACE varying vec3 vBitangent; #endif #endif`,Id=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif +#endif`,Nd=`#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`,Nd=`#ifdef USE_NORMALMAP +#endif`,Fd=`#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -1571,13 +1571,13 @@ vec3 nonPerturbedNormal = normal;`,Dd=`#ifdef USE_NORMALMAP_OBJECTSPACE float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); return mat3( T * scale, B * scale, N ); } -#endif`,Fd=`#ifdef USE_CLEARCOAT +#endif`,Od=`#ifdef USE_CLEARCOAT vec3 clearcoatNormal = nonPerturbedNormal; -#endif`,Od=`#ifdef USE_CLEARCOAT_NORMALMAP +#endif`,Bd=`#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`,Bd=`#ifdef USE_CLEARCOATMAP +#endif`,zd=`#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP @@ -1586,18 +1586,18 @@ vec3 nonPerturbedNormal = normal;`,Dd=`#ifdef USE_NORMALMAP_OBJECTSPACE #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; -#endif`,zd=`#ifdef USE_IRIDESCENCEMAP +#endif`,Hd=`#ifdef USE_IRIDESCENCEMAP uniform sampler2D iridescenceMap; #endif #ifdef USE_IRIDESCENCE_THICKNESSMAP uniform sampler2D iridescenceThicknessMap; -#endif`,Hd=`#ifdef OPAQUE +#endif`,kd=`#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= material.transmissionAlpha; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,kd=`vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,Vd=`vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -1666,9 +1666,9 @@ float viewZToPerspectiveDepth( const in float viewZ, const in float near, const } float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { return ( near * far ) / ( ( far - near ) * depth - far ); -}`,Vd=`#ifdef PREMULTIPLIED_ALPHA +}`,Gd=`#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`,Gd=`vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`,Wd=`vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING mvPosition = batchingMatrix * mvPosition; #endif @@ -1676,22 +1676,22 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`,Xd=`#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,Xd=`#ifdef DITHERING +#endif`,Yd=`#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`,Yd=`float roughnessFactor = roughness; +#endif`,qd=`float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); roughnessFactor *= texelRoughness.g; -#endif`,qd=`#ifdef USE_ROUGHNESSMAP +#endif`,jd=`#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`,jd=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Zd=`#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -1877,7 +1877,7 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING } return mix( 1.0, shadow, shadowIntensity ); } -#endif`,Zd=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Kd=`#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -1918,7 +1918,7 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`,Kd=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`,$d=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; #endif @@ -1950,7 +1950,7 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`,$d=`float getShadowMask() { +#endif`,Jd=`float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -1982,12 +1982,12 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING #endif #endif return shadow; -}`,Jd=`#ifdef USE_SKINNING +}`,Qd=`#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,Qd=`#ifdef USE_SKINNING +#endif`,tf=`#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -2002,7 +2002,7 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`,tf=`#ifdef USE_SKINNING +#endif`,ef=`#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -2010,7 +2010,7 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,ef=`#ifdef USE_SKINNING +#endif`,nf=`#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -2021,17 +2021,17 @@ gl_Position = projectionMatrix * mvPosition;`,Wd=`#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`,nf=`float specularStrength; +#endif`,sf=`float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`,sf=`#ifdef USE_SPECULARMAP +#endif`,rf=`#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`,rf=`#if defined( TONE_MAPPING ) +#endif`,af=`#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,af=`#ifndef saturate +#endif`,of=`#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -2128,7 +2128,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`,lf=`#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -2149,7 +2149,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,lf=`#ifdef USE_TRANSMISSION +#endif`,cf=`#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -2275,7 +2275,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`,cf=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,hf=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2345,7 +2345,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,hf=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,uf=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2439,7 +2439,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,uf=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,df=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -2510,7 +2510,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,df=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`,ff=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -2519,12 +2519,12 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,of=`#ifdef USE_TRANSMISS worldPosition = instanceMatrix * worldPosition; #endif worldPosition = modelMatrix * worldPosition; -#endif`;const ff=`varying vec2 vUv; +#endif`;const pf=`varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`,pf=`uniform sampler2D t2D; +}`,mf=`uniform sampler2D t2D; uniform float backgroundIntensity; varying vec2 vUv; void main() { @@ -2536,14 +2536,14 @@ void main() { gl_FragColor = texColor; #include #include -}`,mf=`varying vec3 vWorldDirection; +}`,gf=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`,gf=`#ifdef ENVMAP_TYPE_CUBE +}`,_f=`#ifdef ENVMAP_TYPE_CUBE uniform samplerCube envMap; #elif defined( ENVMAP_TYPE_CUBE_UV ) uniform sampler2D envMap; @@ -2566,14 +2566,14 @@ void main() { gl_FragColor = texColor; #include #include -}`,_f=`varying vec3 vWorldDirection; +}`,vf=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`,vf=`uniform samplerCube tCube; +}`,xf=`uniform samplerCube tCube; uniform float tFlip; uniform float opacity; varying vec3 vWorldDirection; @@ -2583,7 +2583,7 @@ void main() { gl_FragColor.a *= opacity; #include #include -}`,xf=`#include +}`,Mf=`#include #include #include #include @@ -2610,7 +2610,7 @@ void main() { #include #include vHighPrecisionZW = gl_Position.zw; -}`,Mf=`#if DEPTH_PACKING == 3200 +}`,Sf=`#if DEPTH_PACKING == 3200 uniform float opacity; #endif #include @@ -2644,7 +2644,7 @@ void main() { #elif DEPTH_PACKING == 3203 gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); #endif -}`,Sf=`#define DISTANCE +}`,yf=`#define DISTANCE varying vec3 vWorldPosition; #include #include @@ -2671,7 +2671,7 @@ void main() { #include #include vWorldPosition = worldPosition.xyz; -}`,yf=`#define DISTANCE +}`,Ef=`#define DISTANCE uniform vec3 referencePosition; uniform float nearDistance; uniform float farDistance; @@ -2695,13 +2695,13 @@ void main () { dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); gl_FragColor = packDepthToRGBA( dist ); -}`,Ef=`varying vec3 vWorldDirection; +}`,bf=`varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include -}`,bf=`uniform sampler2D tEquirect; +}`,Tf=`uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include void main() { @@ -2710,7 +2710,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); #include #include -}`,Tf=`uniform float scale; +}`,wf=`uniform float scale; attribute float lineDistance; varying float vLineDistance; #include @@ -2732,7 +2732,7 @@ void main() { #include #include #include -}`,wf=`uniform vec3 diffuse; +}`,Af=`uniform vec3 diffuse; uniform float opacity; uniform float dashSize; uniform float totalSize; @@ -2760,7 +2760,7 @@ void main() { #include #include #include -}`,Af=`#include +}`,Rf=`#include #include #include #include @@ -2792,7 +2792,7 @@ void main() { #include #include #include -}`,Rf=`uniform vec3 diffuse; +}`,Cf=`uniform vec3 diffuse; uniform float opacity; #ifndef FLAT_SHADED varying vec3 vNormal; @@ -2840,7 +2840,7 @@ void main() { #include #include #include -}`,Cf=`#define LAMBERT +}`,Pf=`#define LAMBERT varying vec3 vViewPosition; #include #include @@ -2879,7 +2879,7 @@ void main() { #include #include #include -}`,Pf=`#define LAMBERT +}`,Df=`#define LAMBERT uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -2936,7 +2936,7 @@ void main() { #include #include #include -}`,Df=`#define MATCAP +}`,Lf=`#define MATCAP varying vec3 vViewPosition; #include #include @@ -2970,7 +2970,7 @@ void main() { #include #include vViewPosition = - mvPosition.xyz; -}`,Lf=`#define MATCAP +}`,Uf=`#define MATCAP uniform vec3 diffuse; uniform float opacity; uniform sampler2D matcap; @@ -3016,7 +3016,7 @@ void main() { #include #include #include -}`,Uf=`#define NORMAL +}`,If=`#define NORMAL #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; #endif @@ -3049,7 +3049,7 @@ void main() { #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) vViewPosition = - mvPosition.xyz; #endif -}`,If=`#define NORMAL +}`,Nf=`#define NORMAL uniform float opacity; #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; @@ -3071,7 +3071,7 @@ void main() { #ifdef OPAQUE gl_FragColor.a = 1.0; #endif -}`,Nf=`#define PHONG +}`,Ff=`#define PHONG varying vec3 vViewPosition; #include #include @@ -3110,7 +3110,7 @@ void main() { #include #include #include -}`,Ff=`#define PHONG +}`,Of=`#define PHONG uniform vec3 diffuse; uniform vec3 emissive; uniform vec3 specular; @@ -3169,7 +3169,7 @@ void main() { #include #include #include -}`,Of=`#define STANDARD +}`,Bf=`#define STANDARD varying vec3 vViewPosition; #ifdef USE_TRANSMISSION varying vec3 vWorldPosition; @@ -3212,7 +3212,7 @@ void main() { #ifdef USE_TRANSMISSION vWorldPosition = worldPosition.xyz; #endif -}`,Bf=`#define STANDARD +}`,zf=`#define STANDARD #ifdef PHYSICAL #define IOR #define USE_SPECULAR @@ -3337,7 +3337,7 @@ void main() { #include #include #include -}`,zf=`#define TOON +}`,Hf=`#define TOON varying vec3 vViewPosition; #include #include @@ -3374,7 +3374,7 @@ void main() { #include #include #include -}`,Hf=`#define TOON +}`,kf=`#define TOON uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -3427,7 +3427,7 @@ void main() { #include #include #include -}`,kf=`uniform float size; +}`,Vf=`uniform float size; uniform float scale; #include #include @@ -3458,7 +3458,7 @@ void main() { #include #include #include -}`,Vf=`uniform vec3 diffuse; +}`,Gf=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -3483,7 +3483,7 @@ void main() { #include #include #include -}`,Gf=`#include +}`,Wf=`#include #include #include #include @@ -3506,7 +3506,7 @@ void main() { #include #include #include -}`,Wf=`uniform vec3 color; +}`,Xf=`uniform vec3 color; uniform float opacity; #include #include @@ -3522,7 +3522,7 @@ void main() { #include #include #include -}`,Xf=`uniform float rotation; +}`,Yf=`uniform float rotation; uniform vec2 center; #include #include @@ -3546,7 +3546,7 @@ void main() { #include #include #include -}`,Yf=`uniform vec3 diffuse; +}`,qf=`uniform vec3 diffuse; uniform float opacity; #include #include @@ -3571,7 +3571,7 @@ void main() { #include #include #include -}`,Vt={alphahash_fragment:fu,alphahash_pars_fragment:pu,alphamap_fragment:mu,alphamap_pars_fragment:gu,alphatest_fragment:_u,alphatest_pars_fragment:vu,aomap_fragment:xu,aomap_pars_fragment:Mu,batching_pars_vertex:Su,batching_vertex:yu,begin_vertex:Eu,beginnormal_vertex:bu,bsdfs:Tu,iridescence_fragment:wu,bumpmap_pars_fragment:Au,clipping_planes_fragment:Ru,clipping_planes_pars_fragment:Cu,clipping_planes_pars_vertex:Pu,clipping_planes_vertex:Du,color_fragment:Lu,color_pars_fragment:Uu,color_pars_vertex:Iu,color_vertex:Nu,common:Fu,cube_uv_reflection_fragment:Ou,defaultnormal_vertex:Bu,displacementmap_pars_vertex:zu,displacementmap_vertex:Hu,emissivemap_fragment:ku,emissivemap_pars_fragment:Vu,colorspace_fragment:Gu,colorspace_pars_fragment:Wu,envmap_fragment:Xu,envmap_common_pars_fragment:Yu,envmap_pars_fragment:qu,envmap_pars_vertex:ju,envmap_physical_pars_fragment:rd,envmap_vertex:Zu,fog_vertex:Ku,fog_pars_vertex:$u,fog_fragment:Ju,fog_pars_fragment:Qu,gradientmap_pars_fragment:td,lightmap_pars_fragment:ed,lights_lambert_fragment:nd,lights_lambert_pars_fragment:id,lights_pars_begin:sd,lights_toon_fragment:ad,lights_toon_pars_fragment:od,lights_phong_fragment:ld,lights_phong_pars_fragment:cd,lights_physical_fragment:hd,lights_physical_pars_fragment:ud,lights_fragment_begin:dd,lights_fragment_maps:fd,lights_fragment_end:pd,logdepthbuf_fragment:md,logdepthbuf_pars_fragment:gd,logdepthbuf_pars_vertex:_d,logdepthbuf_vertex:vd,map_fragment:xd,map_pars_fragment:Md,map_particle_fragment:Sd,map_particle_pars_fragment:yd,metalnessmap_fragment:Ed,metalnessmap_pars_fragment:bd,morphinstance_vertex:Td,morphcolor_vertex:wd,morphnormal_vertex:Ad,morphtarget_pars_vertex:Rd,morphtarget_vertex:Cd,normal_fragment_begin:Pd,normal_fragment_maps:Dd,normal_pars_fragment:Ld,normal_pars_vertex:Ud,normal_vertex:Id,normalmap_pars_fragment:Nd,clearcoat_normal_fragment_begin:Fd,clearcoat_normal_fragment_maps:Od,clearcoat_pars_fragment:Bd,iridescence_pars_fragment:zd,opaque_fragment:Hd,packing:kd,premultiplied_alpha_fragment:Vd,project_vertex:Gd,dithering_fragment:Wd,dithering_pars_fragment:Xd,roughnessmap_fragment:Yd,roughnessmap_pars_fragment:qd,shadowmap_pars_fragment:jd,shadowmap_pars_vertex:Zd,shadowmap_vertex:Kd,shadowmask_pars_fragment:$d,skinbase_vertex:Jd,skinning_pars_vertex:Qd,skinning_vertex:tf,skinnormal_vertex:ef,specularmap_fragment:nf,specularmap_pars_fragment:sf,tonemapping_fragment:rf,tonemapping_pars_fragment:af,transmission_fragment:of,transmission_pars_fragment:lf,uv_pars_fragment:cf,uv_pars_vertex:hf,uv_vertex:uf,worldpos_vertex:df,background_vert:ff,background_frag:pf,backgroundCube_vert:mf,backgroundCube_frag:gf,cube_vert:_f,cube_frag:vf,depth_vert:xf,depth_frag:Mf,distanceRGBA_vert:Sf,distanceRGBA_frag:yf,equirect_vert:Ef,equirect_frag:bf,linedashed_vert:Tf,linedashed_frag:wf,meshbasic_vert:Af,meshbasic_frag:Rf,meshlambert_vert:Cf,meshlambert_frag:Pf,meshmatcap_vert:Df,meshmatcap_frag:Lf,meshnormal_vert:Uf,meshnormal_frag:If,meshphong_vert:Nf,meshphong_frag:Ff,meshphysical_vert:Of,meshphysical_frag:Bf,meshtoon_vert:zf,meshtoon_frag:Hf,points_vert:kf,points_frag:Vf,shadow_vert:Gf,shadow_frag:Wf,sprite_vert:Xf,sprite_frag:Yf},st={common:{diffuse:{value:new pt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ht}},envmap:{envMap:{value:null},envMapRotation:{value:new Ht},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ht}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ht}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ht},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ht},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ht},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ht}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ht}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ht}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0},uvTransform:{value:new Ht}},sprite:{diffuse:{value:new pt(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}}},cn={basic:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.fog]),vertexShader:Vt.meshbasic_vert,fragmentShader:Vt.meshbasic_frag},lambert:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshlambert_vert,fragmentShader:Vt.meshlambert_frag},phong:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)},specular:{value:new pt(1118481)},shininess:{value:30}}]),vertexShader:Vt.meshphong_vert,fragmentShader:Vt.meshphong_frag},standard:{uniforms:Ue([st.common,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.roughnessmap,st.metalnessmap,st.fog,st.lights,{emissive:{value:new pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag},toon:{uniforms:Ue([st.common,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.gradientmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshtoon_vert,fragmentShader:Vt.meshtoon_frag},matcap:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,st.fog,{matcap:{value:null}}]),vertexShader:Vt.meshmatcap_vert,fragmentShader:Vt.meshmatcap_frag},points:{uniforms:Ue([st.points,st.fog]),vertexShader:Vt.points_vert,fragmentShader:Vt.points_frag},dashed:{uniforms:Ue([st.common,st.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Vt.linedashed_vert,fragmentShader:Vt.linedashed_frag},depth:{uniforms:Ue([st.common,st.displacementmap]),vertexShader:Vt.depth_vert,fragmentShader:Vt.depth_frag},normal:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,{opacity:{value:1}}]),vertexShader:Vt.meshnormal_vert,fragmentShader:Vt.meshnormal_frag},sprite:{uniforms:Ue([st.sprite,st.fog]),vertexShader:Vt.sprite_vert,fragmentShader:Vt.sprite_frag},background:{uniforms:{uvTransform:{value:new Ht},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Vt.background_vert,fragmentShader:Vt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ht}},vertexShader:Vt.backgroundCube_vert,fragmentShader:Vt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Vt.cube_vert,fragmentShader:Vt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Vt.equirect_vert,fragmentShader:Vt.equirect_frag},distanceRGBA:{uniforms:Ue([st.common,st.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Vt.distanceRGBA_vert,fragmentShader:Vt.distanceRGBA_frag},shadow:{uniforms:Ue([st.lights,st.fog,{color:{value:new pt(0)},opacity:{value:1}}]),vertexShader:Vt.shadow_vert,fragmentShader:Vt.shadow_frag}};cn.physical={uniforms:Ue([cn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ht},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ht},clearcoatNormalScale:{value:new vt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ht},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ht},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ht},sheen:{value:0},sheenColor:{value:new pt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ht},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ht},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ht},transmissionSamplerSize:{value:new vt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ht},attenuationDistance:{value:0},attenuationColor:{value:new pt(0)},specularColor:{value:new pt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ht},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ht},anisotropyVector:{value:new vt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ht}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag};const ks={r:0,b:0,g:0},qn=new pn,qf=new ne;function jf(i,t,e,n,s,r,a){const o=new pt(0);let l=r===!0?0:1,c,h,d=null,f=0,p=null;function g(b){let y=b.isScene===!0?b.background:null;return y&&y.isTexture&&(y=(b.backgroundBlurriness>0?e:t).get(y)),y}function v(b){let y=!1;const L=g(b);L===null?u(o,l):L&&L.isColor&&(u(L,1),y=!0);const R=i.xr.getEnvironmentBlendMode();R==="additive"?n.buffers.color.setClear(0,0,0,1,a):R==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(i.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil))}function m(b,y){const L=g(y);L&&(L.isCubeTexture||L.mapping===hr)?(h===void 0&&(h=new Me(new hs(1,1,1),new Ne({name:"BackgroundCubeMaterial",uniforms:Vi(cn.backgroundCube.uniforms),vertexShader:cn.backgroundCube.vertexShader,fragmentShader:cn.backgroundCube.fragmentShader,side:He,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(R,A,U){this.matrixWorld.copyPosition(U.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),qn.copy(y.backgroundRotation),qn.x*=-1,qn.y*=-1,qn.z*=-1,L.isCubeTexture&&L.isRenderTargetTexture===!1&&(qn.y*=-1,qn.z*=-1),h.material.uniforms.envMap.value=L,h.material.uniforms.flipEnvMap.value=L.isCubeTexture&&L.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(qf.makeRotationFromEuler(qn)),h.material.toneMapped=Jt.getTransfer(L.colorSpace)!==re,(d!==L||f!==L.version||p!==i.toneMapping)&&(h.material.needsUpdate=!0,d=L,f=L.version,p=i.toneMapping),h.layers.enableAll(),b.unshift(h,h.geometry,h.material,0,0,null)):L&&L.isTexture&&(c===void 0&&(c=new Me(new us(2,2),new Ne({name:"BackgroundMaterial",uniforms:Vi(cn.background.uniforms),vertexShader:cn.background.vertexShader,fragmentShader:cn.background.fragmentShader,side:zn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=L,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=Jt.getTransfer(L.colorSpace)!==re,L.matrixAutoUpdate===!0&&L.updateMatrix(),c.material.uniforms.uvTransform.value.copy(L.matrix),(d!==L||f!==L.version||p!==i.toneMapping)&&(c.material.needsUpdate=!0,d=L,f=L.version,p=i.toneMapping),c.layers.enableAll(),b.unshift(c,c.geometry,c.material,0,0,null))}function u(b,y){b.getRGB(ks,sc(i)),n.buffers.color.setClear(ks.r,ks.g,ks.b,y,a)}function T(){h!==void 0&&(h.geometry.dispose(),h.material.dispose()),c!==void 0&&(c.geometry.dispose(),c.material.dispose())}return{getClearColor:function(){return o},setClearColor:function(b,y=1){o.set(b),l=y,u(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(b){l=b,u(o,l)},render:v,addToRenderList:m,dispose:T}}function Zf(i,t){const e=i.getParameter(i.MAX_VERTEX_ATTRIBS),n={},s=f(null);let r=s,a=!1;function o(M,D,W,z,V){let $=!1;const G=d(z,W,D);r!==G&&(r=G,c(r.object)),$=p(M,z,W,V),$&&g(M,z,W,V),V!==null&&t.update(V,i.ELEMENT_ARRAY_BUFFER),($||a)&&(a=!1,y(M,D,W,z),V!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.get(V).buffer))}function l(){return i.createVertexArray()}function c(M){return i.bindVertexArray(M)}function h(M){return i.deleteVertexArray(M)}function d(M,D,W){const z=W.wireframe===!0;let V=n[M.id];V===void 0&&(V={},n[M.id]=V);let $=V[D.id];$===void 0&&($={},V[D.id]=$);let G=$[z];return G===void 0&&(G=f(l()),$[z]=G),G}function f(M){const D=[],W=[],z=[];for(let V=0;V=0){const ut=V[k];let yt=$[k];if(yt===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(yt=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(yt=M.instanceColor)),ut===void 0||ut.attribute!==yt||yt&&ut.data!==yt.data)return!0;G++}return r.attributesNum!==G||r.index!==z}function g(M,D,W,z){const V={},$=D.attributes;let G=0;const J=W.getAttributes();for(const k in J)if(J[k].location>=0){let ut=$[k];ut===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(ut=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(ut=M.instanceColor));const yt={};yt.attribute=ut,ut&&ut.data&&(yt.data=ut.data),V[k]=yt,G++}r.attributes=V,r.attributesNum=G,r.index=z}function v(){const M=r.newAttributes;for(let D=0,W=M.length;D=0){let it=V[J];if(it===void 0&&(J==="instanceMatrix"&&M.instanceMatrix&&(it=M.instanceMatrix),J==="instanceColor"&&M.instanceColor&&(it=M.instanceColor)),it!==void 0){const ut=it.normalized,yt=it.itemSize,Lt=t.get(it);if(Lt===void 0)continue;const jt=Lt.buffer,Y=Lt.type,et=Lt.bytesPerElement,xt=Y===i.INT||Y===i.UNSIGNED_INT||it.gpuType===Ya;if(it.isInterleavedBufferAttribute){const at=it.data,wt=at.stride,Ut=it.offset;if(at.isInstancedInterleavedBuffer){for(let Gt=0;Gt0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=e.precision!==void 0?e.precision:"highp";const h=l(c);h!==c&&(console.warn("THREE.WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const d=e.logarithmicDepthBuffer===!0,f=e.reverseDepthBuffer===!0&&t.has("EXT_clip_control"),p=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),g=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),v=i.getParameter(i.MAX_TEXTURE_SIZE),m=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),u=i.getParameter(i.MAX_VERTEX_ATTRIBS),T=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),b=i.getParameter(i.MAX_VARYING_VECTORS),y=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),L=g>0,R=i.getParameter(i.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:d,reverseDepthBuffer:f,maxTextures:p,maxVertexTextures:g,maxTextureSize:v,maxCubemapSize:m,maxAttributes:u,maxVertexUniforms:T,maxVaryings:b,maxFragmentUniforms:y,vertexTextures:L,maxSamples:R}}function Jf(i){const t=this;let e=null,n=0,s=!1,r=!1;const a=new Nn,o=new Ht,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f){const p=d.length!==0||f||n!==0||s;return s=f,n=d.length,p},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,f){e=h(d,f,0)},this.setState=function(d,f,p){const g=d.clippingPlanes,v=d.clipIntersection,m=d.clipShadows,u=i.get(d);if(!s||g===null||g.length===0||r&&!m)r?h(null):c();else{const T=r?0:n,b=T*4;let y=u.clippingState||null;l.value=y,y=h(g,f,b,p);for(let L=0;L!==b;++L)y[L]=e[L];u.clippingState=y,this.numIntersection=v?this.numPlanes:0,this.numPlanes+=T}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(d,f,p,g){const v=d!==null?d.length:0;let m=null;if(v!==0){if(m=l.value,g!==!0||m===null){const u=p+v*4,T=f.matrixWorldInverse;o.getNormalMatrix(T),(m===null||m.length0){const c=new Yh(l.height);return c.fromEquirectangularTexture(i,a),t.set(a,c),a.addEventListener("dispose",s),e(c.texture,a.mapping)}else return null}}return a}function s(a){const o=a.target;o.removeEventListener("dispose",s);const l=t.get(o);l!==void 0&&(t.delete(o),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}const Pi=4,Jo=[.125,.215,.35,.446,.526,.582],$n=20,Gr=new hc,Qo=new pt;let Wr=null,Xr=0,Yr=0,qr=!1;const Zn=(1+Math.sqrt(5))/2,Ti=1/Zn,tl=[new P(-Zn,Ti,0),new P(Zn,Ti,0),new P(-Ti,0,Zn),new P(Ti,0,Zn),new P(0,Zn,-Ti),new P(0,Zn,Ti),new P(-1,1,-1),new P(1,1,-1),new P(-1,1,1),new P(1,1,1)];class el{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){Wr=this._renderer.getRenderTarget(),Xr=this._renderer.getActiveCubeFace(),Yr=this._renderer.getActiveMipmapLevel(),qr=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=sl(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=il(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t2?b:0,b,b),h.setRenderTarget(s),v&&h.render(g,o),h.render(t,o)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=f,h.autoClear=d,t.background=m}_textureToCubeUV(t,e){const n=this._renderer,s=t.mapping===Oi||t.mapping===Bi;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=sl()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=il());const r=s?this._cubemapMaterial:this._equirectMaterial,a=new Me(this._lodPlanes[0],r),o=r.uniforms;o.envMap.value=t;const l=this._cubeSize;Vs(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(a,Gr)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;const s=this._lodPlanes.length;for(let r=1;r$n&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${$n}`);const u=[];let T=0;for(let A=0;A<$n;++A){const U=A/v,S=Math.exp(-U*U/2);u.push(S),A===0?T+=S:Ab-Pi?s-b+Pi:0),R=4*(this._cubeSize-y);Vs(e,L,R,3*y,2*y),l.setRenderTarget(e),l.render(d,Gr)}}function tp(i){const t=[],e=[],n=[];let s=i;const r=i-Pi+1+Jo.length;for(let a=0;ai-Pi?l=Jo[a-i+Pi-1]:a===0&&(l=0),n.push(l);const c=1/(o-2),h=-c,d=1+c,f=[h,h,d,h,d,d,h,h,d,d,h,d],p=6,g=6,v=3,m=2,u=1,T=new Float32Array(v*g*p),b=new Float32Array(m*g*p),y=new Float32Array(u*g*p);for(let R=0;R2?0:-1,S=[A,U,0,A+2/3,U,0,A+2/3,U+1,0,A,U,0,A+2/3,U+1,0,A,U+1,0];T.set(S,v*g*R),b.set(f,m*g*R);const M=[R,R,R,R,R,R];y.set(M,u*g*R)}const L=new pe;L.setAttribute("position",new de(T,v)),L.setAttribute("uv",new de(b,m)),L.setAttribute("faceIndex",new de(y,u)),t.push(L),s>Pi&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function nl(i,t,e){const n=new on(i,t,e);return n.texture.mapping=hr,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Vs(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function ep(i,t,e){const n=new Float32Array($n),s=new P(0,1,0);return new Ne({name:"SphericalGaussianBlur",defines:{n:$n,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:no(),fragmentShader:` +}`,Vt={alphahash_fragment:pu,alphahash_pars_fragment:mu,alphamap_fragment:gu,alphamap_pars_fragment:_u,alphatest_fragment:vu,alphatest_pars_fragment:xu,aomap_fragment:Mu,aomap_pars_fragment:Su,batching_pars_vertex:yu,batching_vertex:Eu,begin_vertex:bu,beginnormal_vertex:Tu,bsdfs:wu,iridescence_fragment:Au,bumpmap_pars_fragment:Ru,clipping_planes_fragment:Cu,clipping_planes_pars_fragment:Pu,clipping_planes_pars_vertex:Du,clipping_planes_vertex:Lu,color_fragment:Uu,color_pars_fragment:Iu,color_pars_vertex:Nu,color_vertex:Fu,common:Ou,cube_uv_reflection_fragment:Bu,defaultnormal_vertex:zu,displacementmap_pars_vertex:Hu,displacementmap_vertex:ku,emissivemap_fragment:Vu,emissivemap_pars_fragment:Gu,colorspace_fragment:Wu,colorspace_pars_fragment:Xu,envmap_fragment:Yu,envmap_common_pars_fragment:qu,envmap_pars_fragment:ju,envmap_pars_vertex:Zu,envmap_physical_pars_fragment:ad,envmap_vertex:Ku,fog_vertex:$u,fog_pars_vertex:Ju,fog_fragment:Qu,fog_pars_fragment:td,gradientmap_pars_fragment:ed,lightmap_pars_fragment:nd,lights_lambert_fragment:id,lights_lambert_pars_fragment:sd,lights_pars_begin:rd,lights_toon_fragment:od,lights_toon_pars_fragment:ld,lights_phong_fragment:cd,lights_phong_pars_fragment:hd,lights_physical_fragment:ud,lights_physical_pars_fragment:dd,lights_fragment_begin:fd,lights_fragment_maps:pd,lights_fragment_end:md,logdepthbuf_fragment:gd,logdepthbuf_pars_fragment:_d,logdepthbuf_pars_vertex:vd,logdepthbuf_vertex:xd,map_fragment:Md,map_pars_fragment:Sd,map_particle_fragment:yd,map_particle_pars_fragment:Ed,metalnessmap_fragment:bd,metalnessmap_pars_fragment:Td,morphinstance_vertex:wd,morphcolor_vertex:Ad,morphnormal_vertex:Rd,morphtarget_pars_vertex:Cd,morphtarget_vertex:Pd,normal_fragment_begin:Dd,normal_fragment_maps:Ld,normal_pars_fragment:Ud,normal_pars_vertex:Id,normal_vertex:Nd,normalmap_pars_fragment:Fd,clearcoat_normal_fragment_begin:Od,clearcoat_normal_fragment_maps:Bd,clearcoat_pars_fragment:zd,iridescence_pars_fragment:Hd,opaque_fragment:kd,packing:Vd,premultiplied_alpha_fragment:Gd,project_vertex:Wd,dithering_fragment:Xd,dithering_pars_fragment:Yd,roughnessmap_fragment:qd,roughnessmap_pars_fragment:jd,shadowmap_pars_fragment:Zd,shadowmap_pars_vertex:Kd,shadowmap_vertex:$d,shadowmask_pars_fragment:Jd,skinbase_vertex:Qd,skinning_pars_vertex:tf,skinning_vertex:ef,skinnormal_vertex:nf,specularmap_fragment:sf,specularmap_pars_fragment:rf,tonemapping_fragment:af,tonemapping_pars_fragment:of,transmission_fragment:lf,transmission_pars_fragment:cf,uv_pars_fragment:hf,uv_pars_vertex:uf,uv_vertex:df,worldpos_vertex:ff,background_vert:pf,background_frag:mf,backgroundCube_vert:gf,backgroundCube_frag:_f,cube_vert:vf,cube_frag:xf,depth_vert:Mf,depth_frag:Sf,distanceRGBA_vert:yf,distanceRGBA_frag:Ef,equirect_vert:bf,equirect_frag:Tf,linedashed_vert:wf,linedashed_frag:Af,meshbasic_vert:Rf,meshbasic_frag:Cf,meshlambert_vert:Pf,meshlambert_frag:Df,meshmatcap_vert:Lf,meshmatcap_frag:Uf,meshnormal_vert:If,meshnormal_frag:Nf,meshphong_vert:Ff,meshphong_frag:Of,meshphysical_vert:Bf,meshphysical_frag:zf,meshtoon_vert:Hf,meshtoon_frag:kf,points_vert:Vf,points_frag:Gf,shadow_vert:Wf,shadow_frag:Xf,sprite_vert:Yf,sprite_frag:qf},st={common:{diffuse:{value:new pt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ht}},envmap:{envMap:{value:null},envMapRotation:{value:new Ht},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ht}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ht}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ht},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ht},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ht},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ht}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ht}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ht}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0},uvTransform:{value:new Ht}},sprite:{diffuse:{value:new pt(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}}},cn={basic:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.fog]),vertexShader:Vt.meshbasic_vert,fragmentShader:Vt.meshbasic_frag},lambert:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshlambert_vert,fragmentShader:Vt.meshlambert_frag},phong:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)},specular:{value:new pt(1118481)},shininess:{value:30}}]),vertexShader:Vt.meshphong_vert,fragmentShader:Vt.meshphong_frag},standard:{uniforms:Ue([st.common,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.roughnessmap,st.metalnessmap,st.fog,st.lights,{emissive:{value:new pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag},toon:{uniforms:Ue([st.common,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.gradientmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshtoon_vert,fragmentShader:Vt.meshtoon_frag},matcap:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,st.fog,{matcap:{value:null}}]),vertexShader:Vt.meshmatcap_vert,fragmentShader:Vt.meshmatcap_frag},points:{uniforms:Ue([st.points,st.fog]),vertexShader:Vt.points_vert,fragmentShader:Vt.points_frag},dashed:{uniforms:Ue([st.common,st.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Vt.linedashed_vert,fragmentShader:Vt.linedashed_frag},depth:{uniforms:Ue([st.common,st.displacementmap]),vertexShader:Vt.depth_vert,fragmentShader:Vt.depth_frag},normal:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,{opacity:{value:1}}]),vertexShader:Vt.meshnormal_vert,fragmentShader:Vt.meshnormal_frag},sprite:{uniforms:Ue([st.sprite,st.fog]),vertexShader:Vt.sprite_vert,fragmentShader:Vt.sprite_frag},background:{uniforms:{uvTransform:{value:new Ht},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Vt.background_vert,fragmentShader:Vt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ht}},vertexShader:Vt.backgroundCube_vert,fragmentShader:Vt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Vt.cube_vert,fragmentShader:Vt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Vt.equirect_vert,fragmentShader:Vt.equirect_frag},distanceRGBA:{uniforms:Ue([st.common,st.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Vt.distanceRGBA_vert,fragmentShader:Vt.distanceRGBA_frag},shadow:{uniforms:Ue([st.lights,st.fog,{color:{value:new pt(0)},opacity:{value:1}}]),vertexShader:Vt.shadow_vert,fragmentShader:Vt.shadow_frag}};cn.physical={uniforms:Ue([cn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ht},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ht},clearcoatNormalScale:{value:new vt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ht},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ht},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ht},sheen:{value:0},sheenColor:{value:new pt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ht},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ht},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ht},transmissionSamplerSize:{value:new vt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ht},attenuationDistance:{value:0},attenuationColor:{value:new pt(0)},specularColor:{value:new pt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ht},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ht},anisotropyVector:{value:new vt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ht}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag};const ks={r:0,b:0,g:0},qn=new pn,jf=new ee;function Zf(i,t,e,n,s,r,a){const o=new pt(0);let l=r===!0?0:1,c,h,d=null,f=0,p=null;function g(b){let y=b.isScene===!0?b.background:null;return y&&y.isTexture&&(y=(b.backgroundBlurriness>0?e:t).get(y)),y}function v(b){let y=!1;const L=g(b);L===null?u(o,l):L&&L.isColor&&(u(L,1),y=!0);const R=i.xr.getEnvironmentBlendMode();R==="additive"?n.buffers.color.setClear(0,0,0,1,a):R==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(i.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil))}function m(b,y){const L=g(y);L&&(L.isCubeTexture||L.mapping===hr)?(h===void 0&&(h=new Se(new hs(1,1,1),new Ne({name:"BackgroundCubeMaterial",uniforms:Vi(cn.backgroundCube.uniforms),vertexShader:cn.backgroundCube.vertexShader,fragmentShader:cn.backgroundCube.fragmentShader,side:ke,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(R,A,U){this.matrixWorld.copyPosition(U.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),qn.copy(y.backgroundRotation),qn.x*=-1,qn.y*=-1,qn.z*=-1,L.isCubeTexture&&L.isRenderTargetTexture===!1&&(qn.y*=-1,qn.z*=-1),h.material.uniforms.envMap.value=L,h.material.uniforms.flipEnvMap.value=L.isCubeTexture&&L.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(jf.makeRotationFromEuler(qn)),h.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,(d!==L||f!==L.version||p!==i.toneMapping)&&(h.material.needsUpdate=!0,d=L,f=L.version,p=i.toneMapping),h.layers.enableAll(),b.unshift(h,h.geometry,h.material,0,0,null)):L&&L.isTexture&&(c===void 0&&(c=new Se(new us(2,2),new Ne({name:"BackgroundMaterial",uniforms:Vi(cn.background.uniforms),vertexShader:cn.background.vertexShader,fragmentShader:cn.background.fragmentShader,side:zn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=L,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,L.matrixAutoUpdate===!0&&L.updateMatrix(),c.material.uniforms.uvTransform.value.copy(L.matrix),(d!==L||f!==L.version||p!==i.toneMapping)&&(c.material.needsUpdate=!0,d=L,f=L.version,p=i.toneMapping),c.layers.enableAll(),b.unshift(c,c.geometry,c.material,0,0,null))}function u(b,y){b.getRGB(ks,ic(i)),n.buffers.color.setClear(ks.r,ks.g,ks.b,y,a)}function T(){h!==void 0&&(h.geometry.dispose(),h.material.dispose()),c!==void 0&&(c.geometry.dispose(),c.material.dispose())}return{getClearColor:function(){return o},setClearColor:function(b,y=1){o.set(b),l=y,u(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(b){l=b,u(o,l)},render:v,addToRenderList:m,dispose:T}}function Kf(i,t){const e=i.getParameter(i.MAX_VERTEX_ATTRIBS),n={},s=f(null);let r=s,a=!1;function o(M,D,W,z,V){let $=!1;const G=d(z,W,D);r!==G&&(r=G,c(r.object)),$=p(M,z,W,V),$&&g(M,z,W,V),V!==null&&t.update(V,i.ELEMENT_ARRAY_BUFFER),($||a)&&(a=!1,y(M,D,W,z),V!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.get(V).buffer))}function l(){return i.createVertexArray()}function c(M){return i.bindVertexArray(M)}function h(M){return i.deleteVertexArray(M)}function d(M,D,W){const z=W.wireframe===!0;let V=n[M.id];V===void 0&&(V={},n[M.id]=V);let $=V[D.id];$===void 0&&($={},V[D.id]=$);let G=$[z];return G===void 0&&(G=f(l()),$[z]=G),G}function f(M){const D=[],W=[],z=[];for(let V=0;V=0){const ut=V[k];let yt=$[k];if(yt===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(yt=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(yt=M.instanceColor)),ut===void 0||ut.attribute!==yt||yt&&ut.data!==yt.data)return!0;G++}return r.attributesNum!==G||r.index!==z}function g(M,D,W,z){const V={},$=D.attributes;let G=0;const J=W.getAttributes();for(const k in J)if(J[k].location>=0){let ut=$[k];ut===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(ut=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(ut=M.instanceColor));const yt={};yt.attribute=ut,ut&&ut.data&&(yt.data=ut.data),V[k]=yt,G++}r.attributes=V,r.attributesNum=G,r.index=z}function v(){const M=r.newAttributes;for(let D=0,W=M.length;D=0){let it=V[J];if(it===void 0&&(J==="instanceMatrix"&&M.instanceMatrix&&(it=M.instanceMatrix),J==="instanceColor"&&M.instanceColor&&(it=M.instanceColor)),it!==void 0){const ut=it.normalized,yt=it.itemSize,Lt=t.get(it);if(Lt===void 0)continue;const qt=Lt.buffer,Y=Lt.type,nt=Lt.bytesPerElement,xt=Y===i.INT||Y===i.UNSIGNED_INT||it.gpuType===Ya;if(it.isInterleavedBufferAttribute){const at=it.data,wt=at.stride,Ut=it.offset;if(at.isInstancedInterleavedBuffer){for(let Gt=0;Gt0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=e.precision!==void 0?e.precision:"highp";const h=l(c);h!==c&&(console.warn("THREE.WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const d=e.logarithmicDepthBuffer===!0,f=e.reverseDepthBuffer===!0&&t.has("EXT_clip_control"),p=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),g=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),v=i.getParameter(i.MAX_TEXTURE_SIZE),m=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),u=i.getParameter(i.MAX_VERTEX_ATTRIBS),T=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),b=i.getParameter(i.MAX_VARYING_VECTORS),y=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),L=g>0,R=i.getParameter(i.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:d,reverseDepthBuffer:f,maxTextures:p,maxVertexTextures:g,maxTextureSize:v,maxCubemapSize:m,maxAttributes:u,maxVertexUniforms:T,maxVaryings:b,maxFragmentUniforms:y,vertexTextures:L,maxSamples:R}}function Qf(i){const t=this;let e=null,n=0,s=!1,r=!1;const a=new Nn,o=new Ht,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,f){const p=d.length!==0||f||n!==0||s;return s=f,n=d.length,p},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,f){e=h(d,f,0)},this.setState=function(d,f,p){const g=d.clippingPlanes,v=d.clipIntersection,m=d.clipShadows,u=i.get(d);if(!s||g===null||g.length===0||r&&!m)r?h(null):c();else{const T=r?0:n,b=T*4;let y=u.clippingState||null;l.value=y,y=h(g,f,b,p);for(let L=0;L!==b;++L)y[L]=e[L];u.clippingState=y,this.numIntersection=v?this.numPlanes:0,this.numPlanes+=T}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(d,f,p,g){const v=d!==null?d.length:0;let m=null;if(v!==0){if(m=l.value,g!==!0||m===null){const u=p+v*4,T=f.matrixWorldInverse;o.getNormalMatrix(T),(m===null||m.length0){const c=new qh(l.height);return c.fromEquirectangularTexture(i,a),t.set(a,c),a.addEventListener("dispose",s),e(c.texture,a.mapping)}else return null}}return a}function s(a){const o=a.target;o.removeEventListener("dispose",s);const l=t.get(o);l!==void 0&&(t.delete(o),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}const Pi=4,Jo=[.125,.215,.35,.446,.526,.582],$n=20,Gr=new cc,Qo=new pt;let Wr=null,Xr=0,Yr=0,qr=!1;const Zn=(1+Math.sqrt(5))/2,Ti=1/Zn,tl=[new P(-Zn,Ti,0),new P(Zn,Ti,0),new P(-Ti,0,Zn),new P(Ti,0,Zn),new P(0,Zn,-Ti),new P(0,Zn,Ti),new P(-1,1,-1),new P(1,1,-1),new P(-1,1,1),new P(1,1,1)];class el{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){Wr=this._renderer.getRenderTarget(),Xr=this._renderer.getActiveCubeFace(),Yr=this._renderer.getActiveMipmapLevel(),qr=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=sl(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=il(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t2?b:0,b,b),h.setRenderTarget(s),v&&h.render(g,o),h.render(t,o)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=f,h.autoClear=d,t.background=m}_textureToCubeUV(t,e){const n=this._renderer,s=t.mapping===Oi||t.mapping===Bi;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=sl()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=il());const r=s?this._cubemapMaterial:this._equirectMaterial,a=new Se(this._lodPlanes[0],r),o=r.uniforms;o.envMap.value=t;const l=this._cubeSize;Vs(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(a,Gr)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;const s=this._lodPlanes.length;for(let r=1;r$n&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${$n}`);const u=[];let T=0;for(let A=0;A<$n;++A){const U=A/v,S=Math.exp(-U*U/2);u.push(S),A===0?T+=S:Ab-Pi?s-b+Pi:0),R=4*(this._cubeSize-y);Vs(e,L,R,3*y,2*y),l.setRenderTarget(e),l.render(d,Gr)}}function ep(i){const t=[],e=[],n=[];let s=i;const r=i-Pi+1+Jo.length;for(let a=0;ai-Pi?l=Jo[a-i+Pi-1]:a===0&&(l=0),n.push(l);const c=1/(o-2),h=-c,d=1+c,f=[h,h,d,h,d,d,h,h,d,d,h,d],p=6,g=6,v=3,m=2,u=1,T=new Float32Array(v*g*p),b=new Float32Array(m*g*p),y=new Float32Array(u*g*p);for(let R=0;R2?0:-1,S=[A,U,0,A+2/3,U,0,A+2/3,U+1,0,A,U,0,A+2/3,U+1,0,A,U+1,0];T.set(S,v*g*R),b.set(f,m*g*R);const M=[R,R,R,R,R,R];y.set(M,u*g*R)}const L=new pe;L.setAttribute("position",new de(T,v)),L.setAttribute("uv",new de(b,m)),L.setAttribute("faceIndex",new de(y,u)),t.push(L),s>Pi&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function nl(i,t,e){const n=new on(i,t,e);return n.texture.mapping=hr,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Vs(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function np(i,t,e){const n=new Float32Array($n),s=new P(0,1,0);return new Ne({name:"SphericalGaussianBlur",defines:{n:$n,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:no(),fragmentShader:` precision mediump float; precision mediump int; @@ -3721,17 +3721,17 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}function np(i){let t=new WeakMap,e=null;function n(o){if(o&&o.isTexture){const l=o.mapping,c=l===la||l===ca,h=l===Oi||l===Bi;if(c||h){let d=t.get(o);const f=d!==void 0?d.texture.pmremVersion:0;if(o.isRenderTargetTexture&&o.pmremVersion!==f)return e===null&&(e=new el(i)),d=c?e.fromEquirectangular(o,d):e.fromCubemap(o,d),d.texture.pmremVersion=o.pmremVersion,t.set(o,d),d.texture;if(d!==void 0)return d.texture;{const p=o.image;return c&&p&&p.height>0||h&&p&&s(p)?(e===null&&(e=new el(i)),d=c?e.fromEquirectangular(o):e.fromCubemap(o),d.texture.pmremVersion=o.pmremVersion,t.set(o,d),o.addEventListener("dispose",r),d.texture):null}}}return o}function s(o){let l=0;const c=6;for(let h=0;ht.maxTextureSize&&(L=Math.ceil(y/t.maxTextureSize),y=t.maxTextureSize);const R=new Float32Array(y*L*4*d),A=new tc(R,y,L,d);A.type=fn,A.needsUpdate=!0;const U=b*4;for(let M=0;M0)return i;const s=t*e;let r=al[s];if(r===void 0&&(r=new Float32Array(s),al[s]=r),t!==0){n.toArray(r,0);for(let a=1,o=0;a!==t;++a)o+=e,i[a].toArray(r,o)}return r}function Se(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e0||h&&p&&s(p)?(e===null&&(e=new el(i)),d=c?e.fromEquirectangular(o):e.fromCubemap(o),d.texture.pmremVersion=o.pmremVersion,t.set(o,d),o.addEventListener("dispose",r),d.texture):null}}}return o}function s(o){let l=0;const c=6;for(let h=0;ht.maxTextureSize&&(L=Math.ceil(y/t.maxTextureSize),y=t.maxTextureSize);const R=new Float32Array(y*L*4*d),A=new Ql(R,y,L,d);A.type=fn,A.needsUpdate=!0;const U=b*4;for(let M=0;M0)return i;const s=t*e;let r=al[s];if(r===void 0&&(r=new Float32Array(s),al[s]=r),t!==0){n.toArray(r,0);for(let a=1,o=0;a!==t;++a)o+=e,i[a].toArray(r,o)}return r}function ye(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e":" "} ${o}: ${e[a]}`)}return n.join(` -`)}const fl=new Ht;function nm(i){Jt._getMatrix(fl,Jt.workingColorSpace,i);const t=`mat3( ${fl.elements.map(e=>e.toFixed(4))} )`;switch(Jt.getTransfer(i)){case tr:return[t,"LinearTransferOETF"];case re:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",i),[t,"LinearTransferOETF"]}}function pl(i,t,e){const n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s==="")return"";const r=/ERROR: 0:(\d+)/.exec(s);if(r){const a=parseInt(r[1]);return e.toUpperCase()+` +`)}const fl=new Ht;function im(i){$t._getMatrix(fl,$t.workingColorSpace,i);const t=`mat3( ${fl.elements.map(e=>e.toFixed(4))} )`;switch($t.getTransfer(i)){case tr:return[t,"LinearTransferOETF"];case re:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",i),[t,"LinearTransferOETF"]}}function pl(i,t,e){const n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s==="")return"";const r=/ERROR: 0:(\d+)/.exec(s);if(r){const a=parseInt(r[1]);return e.toUpperCase()+` `+s+` -`+em(i.getShaderSource(t),a)}else return s}function im(i,t){const e=nm(t);return[`vec4 ${i}( vec4 value ) {`,` return ${e[1]}( vec4( value.rgb * ${e[0]}, value.a ) );`,"}"].join(` -`)}function sm(i,t){let e;switch(t){case ih:e="Linear";break;case sh:e="Reinhard";break;case rh:e="Cineon";break;case zl:e="ACESFilmic";break;case oh:e="AgX";break;case lh:e="Neutral";break;case ah:e="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),e="Linear"}return"vec3 "+i+"( vec3 color ) { return "+e+"ToneMapping( color ); }"}const Gs=new P;function rm(){Jt.getLuminanceCoefficients(Gs);const i=Gs.x.toFixed(4),t=Gs.y.toFixed(4),e=Gs.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${i}, ${t}, ${e} );`," return dot( weights, rgb );","}"].join(` -`)}function am(i){return[i.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",i.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(ss).join(` -`)}function om(i){const t=[];for(const e in i){const n=i[e];n!==!1&&t.push("#define "+e+" "+n)}return t.join(` -`)}function lm(i,t){const e={},n=i.getProgramParameter(t,i.ACTIVE_ATTRIBUTES);for(let s=0;s/gm;function Wa(i){return i.replace(cm,um)}const hm=new Map;function um(i,t){let e=Vt[t];if(e===void 0){const n=hm.get(t);if(n!==void 0)e=Vt[n],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,n);else throw new Error("Can not resolve #include <"+t+">")}return Wa(e)}const dm=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function _l(i){return i.replace(dm,fm)}function fm(i,t,e,n){let s="";for(let r=parseInt(t);r/gm;function Wa(i){return i.replace(hm,dm)}const um=new Map;function dm(i,t){let e=Vt[t];if(e===void 0){const n=um.get(t);if(n!==void 0)e=Vt[n],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,n);else throw new Error("Can not resolve #include <"+t+">")}return Wa(e)}const fm=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function _l(i){return i.replace(fm,pm)}function pm(i,t,e,n){let s="";for(let r=parseInt(t);r0&&(m+=` `),u=["#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g].filter(ss).join(` `),u.length>0&&(u+=` `)):(m=[vl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",e.batching?"#define USE_BATCHING":"",e.batchingColor?"#define USE_BATCHING_COLOR":"",e.instancing?"#define USE_INSTANCING":"",e.instancingColor?"#define USE_INSTANCING_COLOR":"",e.instancingMorph?"#define USE_INSTANCING_MORPH":"",e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+h:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.displacementMap?"#define USE_DISPLACEMENTMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.mapUv?"#define MAP_UV "+e.mapUv:"",e.alphaMapUv?"#define ALPHAMAP_UV "+e.alphaMapUv:"",e.lightMapUv?"#define LIGHTMAP_UV "+e.lightMapUv:"",e.aoMapUv?"#define AOMAP_UV "+e.aoMapUv:"",e.emissiveMapUv?"#define EMISSIVEMAP_UV "+e.emissiveMapUv:"",e.bumpMapUv?"#define BUMPMAP_UV "+e.bumpMapUv:"",e.normalMapUv?"#define NORMALMAP_UV "+e.normalMapUv:"",e.displacementMapUv?"#define DISPLACEMENTMAP_UV "+e.displacementMapUv:"",e.metalnessMapUv?"#define METALNESSMAP_UV "+e.metalnessMapUv:"",e.roughnessMapUv?"#define ROUGHNESSMAP_UV "+e.roughnessMapUv:"",e.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+e.anisotropyMapUv:"",e.clearcoatMapUv?"#define CLEARCOATMAP_UV "+e.clearcoatMapUv:"",e.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+e.clearcoatNormalMapUv:"",e.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+e.clearcoatRoughnessMapUv:"",e.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+e.iridescenceMapUv:"",e.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+e.iridescenceThicknessMapUv:"",e.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+e.sheenColorMapUv:"",e.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+e.sheenRoughnessMapUv:"",e.specularMapUv?"#define SPECULARMAP_UV "+e.specularMapUv:"",e.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+e.specularColorMapUv:"",e.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+e.specularIntensityMapUv:"",e.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+e.transmissionMapUv:"",e.thicknessMapUv?"#define THICKNESSMAP_UV "+e.thicknessMapUv:"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.flatShading?"#define FLAT_SHADED":"",e.skinning?"#define USE_SKINNING":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals&&e.flatShading===!1?"#define USE_MORPHNORMALS":"",e.morphColors?"#define USE_MORPHCOLORS":"",e.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+e.morphTextureStride:"",e.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+e.morphTargetsCount:"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` `].filter(ss).join(` -`),u=[vl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",e.map?"#define USE_MAP":"",e.matcap?"#define USE_MATCAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+c:"",e.envMap?"#define "+h:"",e.envMap?"#define "+d:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoat?"#define USE_CLEARCOAT":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.dispersion?"#define USE_DISPERSION":"",e.iridescence?"#define USE_IRIDESCENCE":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaTest?"#define USE_ALPHATEST":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.sheen?"#define USE_SHEEN":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors||e.instancingColor||e.batchingColor?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",e.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",e.toneMapping!==On?"#define TONE_MAPPING":"",e.toneMapping!==On?Vt.tonemapping_pars_fragment:"",e.toneMapping!==On?sm("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.opaque?"#define OPAQUE":"",Vt.colorspace_pars_fragment,im("linearToOutputTexel",e.outputColorSpace),rm(),e.useDepthPacking?"#define DEPTH_PACKING "+e.depthPacking:"",` +`),u=[vl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",e.map?"#define USE_MAP":"",e.matcap?"#define USE_MATCAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+c:"",e.envMap?"#define "+h:"",e.envMap?"#define "+d:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoat?"#define USE_CLEARCOAT":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.dispersion?"#define USE_DISPERSION":"",e.iridescence?"#define USE_IRIDESCENCE":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaTest?"#define USE_ALPHATEST":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.sheen?"#define USE_SHEEN":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors||e.instancingColor||e.batchingColor?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",e.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",e.toneMapping!==On?"#define TONE_MAPPING":"",e.toneMapping!==On?Vt.tonemapping_pars_fragment:"",e.toneMapping!==On?rm("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.opaque?"#define OPAQUE":"",Vt.colorspace_pars_fragment,sm("linearToOutputTexel",e.outputColorSpace),am(),e.useDepthPacking?"#define DEPTH_PACKING "+e.depthPacking:"",` `].filter(ss).join(` `)),a=Wa(a),a=ml(a,e),a=gl(a,e),o=Wa(o),o=ml(o,e),o=gl(o,e),a=_l(a),o=_l(o),e.isRawShaderMaterial!==!0&&(T=`#version 300 es `,m=[p,"#define attribute in","#define varying out","#define texture2D texture"].join(` @@ -3772,9 +3772,9 @@ Material Type: `+D.type+` Program Info Log: `+W+` `+J+` -`+k)}else W!==""?console.warn("THREE.WebGLProgram: Program Info Log:",W):(z===""||V==="")&&(G=!1);G&&(D.diagnostics={runnable:$,programLog:W,vertexShader:{log:z,prefix:m},fragmentShader:{log:V,prefix:u}})}s.deleteShader(L),s.deleteShader(R),U=new $s(s,v),S=lm(s,v)}let U;this.getUniforms=function(){return U===void 0&&A(this),U};let S;this.getAttributes=function(){return S===void 0&&A(this),S};let M=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return M===!1&&(M=s.getProgramParameter(v,Qp)),M},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(v),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=tm++,this.cacheKey=t,this.usedTimes=1,this.program=v,this.vertexShader=L,this.fragmentShader=R,this}let Mm=0;class Sm{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(t);return a.has(s)===!1&&(a.add(s),s.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;let n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){const e=this.shaderCache;let n=e.get(t);return n===void 0&&(n=new ym(t),e.set(t,n)),n}}class ym{constructor(t){this.id=Mm++,this.code=t,this.usedTimes=0}}function Em(i,t,e,n,s,r,a){const o=new Qa,l=new Sm,c=new Set,h=[],d=s.logarithmicDepthBuffer,f=s.vertexTextures;let p=s.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function v(S){return c.add(S),S===0?"uv":`uv${S}`}function m(S,M,D,W,z){const V=W.fog,$=z.geometry,G=S.isMeshStandardMaterial?W.environment:null,J=(S.isMeshStandardMaterial?e:t).get(S.envMap||G),k=J&&J.mapping===hr?J.image.height:null,it=g[S.type];S.precision!==null&&(p=s.getMaxPrecision(S.precision),p!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",p,"instead."));const ut=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,yt=ut!==void 0?ut.length:0;let Lt=0;$.morphAttributes.position!==void 0&&(Lt=1),$.morphAttributes.normal!==void 0&&(Lt=2),$.morphAttributes.color!==void 0&&(Lt=3);let jt,Y,et,xt;if(it){const Qt=cn[it];jt=Qt.vertexShader,Y=Qt.fragmentShader}else jt=S.vertexShader,Y=S.fragmentShader,l.update(S),et=l.getVertexShaderID(S),xt=l.getFragmentShaderID(S);const at=i.getRenderTarget(),wt=i.state.buffers.depth.getReversed(),Ut=z.isInstancedMesh===!0,Gt=z.isBatchedMesh===!0,ce=!!S.map,rt=!!S.matcap,Ct=!!J,w=!!S.aoMap,ve=!!S.lightMap,Ft=!!S.bumpMap,kt=!!S.normalMap,Mt=!!S.displacementMap,ie=!!S.emissiveMap,Et=!!S.metalnessMap,E=!!S.roughnessMap,_=S.anisotropy>0,F=S.clearcoat>0,j=S.dispersion>0,K=S.iridescence>0,X=S.sheen>0,St=S.transmission>0,ot=_&&!!S.anisotropyMap,dt=F&&!!S.clearcoatMap,Zt=F&&!!S.clearcoatNormalMap,tt=F&&!!S.clearcoatRoughnessMap,mt=K&&!!S.iridescenceMap,bt=K&&!!S.iridescenceThicknessMap,Pt=X&&!!S.sheenColorMap,ft=X&&!!S.sheenRoughnessMap,Yt=!!S.specularMap,zt=!!S.specularColorMap,Xt=!!S.specularIntensityMap,C=St&&!!S.transmissionMap,nt=St&&!!S.thicknessMap,H=!!S.gradientMap,Z=!!S.alphaMap,ht=S.alphaTest>0,lt=!!S.alphaHash,Ot=!!S.extensions;let he=On;S.toneMapped&&(at===null||at.isXRRenderTarget===!0)&&(he=i.toneMapping);const Ee={shaderID:it,shaderType:S.type,shaderName:S.name,vertexShader:jt,fragmentShader:Y,defines:S.defines,customVertexShaderID:et,customFragmentShaderID:xt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:p,batching:Gt,batchingColor:Gt&&z._colorsTexture!==null,instancing:Ut,instancingColor:Ut&&z.instanceColor!==null,instancingMorph:Ut&&z.morphTexture!==null,supportsVertexTextures:f,outputColorSpace:at===null?i.outputColorSpace:at.isXRRenderTarget===!0?at.texture.colorSpace:ki,alphaToCoverage:!!S.alphaToCoverage,map:ce,matcap:rt,envMap:Ct,envMapMode:Ct&&J.mapping,envMapCubeUVHeight:k,aoMap:w,lightMap:ve,bumpMap:Ft,normalMap:kt,displacementMap:f&&Mt,emissiveMap:ie,normalMapObjectSpace:kt&&S.normalMapType===dh,normalMapTangentSpace:kt&&S.normalMapType===Kl,metalnessMap:Et,roughnessMap:E,anisotropy:_,anisotropyMap:ot,clearcoat:F,clearcoatMap:dt,clearcoatNormalMap:Zt,clearcoatRoughnessMap:tt,dispersion:j,iridescence:K,iridescenceMap:mt,iridescenceThicknessMap:bt,sheen:X,sheenColorMap:Pt,sheenRoughnessMap:ft,specularMap:Yt,specularColorMap:zt,specularIntensityMap:Xt,transmission:St,transmissionMap:C,thicknessMap:nt,gradientMap:H,opaque:S.transparent===!1&&S.blending===Li&&S.alphaToCoverage===!1,alphaMap:Z,alphaTest:ht,alphaHash:lt,combine:S.combine,mapUv:ce&&v(S.map.channel),aoMapUv:w&&v(S.aoMap.channel),lightMapUv:ve&&v(S.lightMap.channel),bumpMapUv:Ft&&v(S.bumpMap.channel),normalMapUv:kt&&v(S.normalMap.channel),displacementMapUv:Mt&&v(S.displacementMap.channel),emissiveMapUv:ie&&v(S.emissiveMap.channel),metalnessMapUv:Et&&v(S.metalnessMap.channel),roughnessMapUv:E&&v(S.roughnessMap.channel),anisotropyMapUv:ot&&v(S.anisotropyMap.channel),clearcoatMapUv:dt&&v(S.clearcoatMap.channel),clearcoatNormalMapUv:Zt&&v(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:tt&&v(S.clearcoatRoughnessMap.channel),iridescenceMapUv:mt&&v(S.iridescenceMap.channel),iridescenceThicknessMapUv:bt&&v(S.iridescenceThicknessMap.channel),sheenColorMapUv:Pt&&v(S.sheenColorMap.channel),sheenRoughnessMapUv:ft&&v(S.sheenRoughnessMap.channel),specularMapUv:Yt&&v(S.specularMap.channel),specularColorMapUv:zt&&v(S.specularColorMap.channel),specularIntensityMapUv:Xt&&v(S.specularIntensityMap.channel),transmissionMapUv:C&&v(S.transmissionMap.channel),thicknessMapUv:nt&&v(S.thicknessMap.channel),alphaMapUv:Z&&v(S.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(kt||_),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:z.isPoints===!0&&!!$.attributes.uv&&(ce||Z),fog:!!V,useFog:S.fog===!0,fogExp2:!!V&&V.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:d,reverseDepthBuffer:wt,skinning:z.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:yt,morphTextureStride:Lt,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&D.length>0,shadowMapType:i.shadowMap.type,toneMapping:he,decodeVideoTexture:ce&&S.map.isVideoTexture===!0&&Jt.getTransfer(S.map.colorSpace)===re,decodeVideoTextureEmissive:ie&&S.emissiveMap.isVideoTexture===!0&&Jt.getTransfer(S.emissiveMap.colorSpace)===re,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===hn,flipSided:S.side===He,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Ot&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Ot&&S.extensions.multiDraw===!0||Gt)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return Ee.vertexUv1s=c.has(1),Ee.vertexUv2s=c.has(2),Ee.vertexUv3s=c.has(3),c.clear(),Ee}function u(S){const M=[];if(S.shaderID?M.push(S.shaderID):(M.push(S.customVertexShaderID),M.push(S.customFragmentShaderID)),S.defines!==void 0)for(const D in S.defines)M.push(D),M.push(S.defines[D]);return S.isRawShaderMaterial===!1&&(T(M,S),b(M,S),M.push(i.outputColorSpace)),M.push(S.customProgramCacheKey),M.join()}function T(S,M){S.push(M.precision),S.push(M.outputColorSpace),S.push(M.envMapMode),S.push(M.envMapCubeUVHeight),S.push(M.mapUv),S.push(M.alphaMapUv),S.push(M.lightMapUv),S.push(M.aoMapUv),S.push(M.bumpMapUv),S.push(M.normalMapUv),S.push(M.displacementMapUv),S.push(M.emissiveMapUv),S.push(M.metalnessMapUv),S.push(M.roughnessMapUv),S.push(M.anisotropyMapUv),S.push(M.clearcoatMapUv),S.push(M.clearcoatNormalMapUv),S.push(M.clearcoatRoughnessMapUv),S.push(M.iridescenceMapUv),S.push(M.iridescenceThicknessMapUv),S.push(M.sheenColorMapUv),S.push(M.sheenRoughnessMapUv),S.push(M.specularMapUv),S.push(M.specularColorMapUv),S.push(M.specularIntensityMapUv),S.push(M.transmissionMapUv),S.push(M.thicknessMapUv),S.push(M.combine),S.push(M.fogExp2),S.push(M.sizeAttenuation),S.push(M.morphTargetsCount),S.push(M.morphAttributeCount),S.push(M.numDirLights),S.push(M.numPointLights),S.push(M.numSpotLights),S.push(M.numSpotLightMaps),S.push(M.numHemiLights),S.push(M.numRectAreaLights),S.push(M.numDirLightShadows),S.push(M.numPointLightShadows),S.push(M.numSpotLightShadows),S.push(M.numSpotLightShadowsWithMaps),S.push(M.numLightProbes),S.push(M.shadowMapType),S.push(M.toneMapping),S.push(M.numClippingPlanes),S.push(M.numClipIntersection),S.push(M.depthPacking)}function b(S,M){o.disableAll(),M.supportsVertexTextures&&o.enable(0),M.instancing&&o.enable(1),M.instancingColor&&o.enable(2),M.instancingMorph&&o.enable(3),M.matcap&&o.enable(4),M.envMap&&o.enable(5),M.normalMapObjectSpace&&o.enable(6),M.normalMapTangentSpace&&o.enable(7),M.clearcoat&&o.enable(8),M.iridescence&&o.enable(9),M.alphaTest&&o.enable(10),M.vertexColors&&o.enable(11),M.vertexAlphas&&o.enable(12),M.vertexUv1s&&o.enable(13),M.vertexUv2s&&o.enable(14),M.vertexUv3s&&o.enable(15),M.vertexTangents&&o.enable(16),M.anisotropy&&o.enable(17),M.alphaHash&&o.enable(18),M.batching&&o.enable(19),M.dispersion&&o.enable(20),M.batchingColor&&o.enable(21),S.push(o.mask),o.disableAll(),M.fog&&o.enable(0),M.useFog&&o.enable(1),M.flatShading&&o.enable(2),M.logarithmicDepthBuffer&&o.enable(3),M.reverseDepthBuffer&&o.enable(4),M.skinning&&o.enable(5),M.morphTargets&&o.enable(6),M.morphNormals&&o.enable(7),M.morphColors&&o.enable(8),M.premultipliedAlpha&&o.enable(9),M.shadowMapEnabled&&o.enable(10),M.doubleSided&&o.enable(11),M.flipSided&&o.enable(12),M.useDepthPacking&&o.enable(13),M.dithering&&o.enable(14),M.transmission&&o.enable(15),M.sheen&&o.enable(16),M.opaque&&o.enable(17),M.pointsUvs&&o.enable(18),M.decodeVideoTexture&&o.enable(19),M.decodeVideoTextureEmissive&&o.enable(20),M.alphaToCoverage&&o.enable(21),S.push(o.mask)}function y(S){const M=g[S.type];let D;if(M){const W=cn[M];D=ir.clone(W.uniforms)}else D=S.uniforms;return D}function L(S,M){let D;for(let W=0,z=h.length;W0?n.push(u):p.transparent===!0?s.push(u):e.push(u)}function l(d,f,p,g,v,m){const u=a(d,f,p,g,v,m);p.transmission>0?n.unshift(u):p.transparent===!0?s.unshift(u):e.unshift(u)}function c(d,f){e.length>1&&e.sort(d||Tm),n.length>1&&n.sort(f||xl),s.length>1&&s.sort(f||xl)}function h(){for(let d=t,f=i.length;d=r.length?(a=new Ml,r.push(a)):a=r[s],a}function e(){i=new WeakMap}return{get:t,dispose:e}}function Am(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={direction:new P,color:new pt};break;case"SpotLight":e={position:new P,direction:new P,color:new pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":e={position:new P,color:new pt,distance:0,decay:0};break;case"HemisphereLight":e={direction:new P,skyColor:new pt,groundColor:new pt};break;case"RectAreaLight":e={color:new pt,position:new P,halfWidth:new P,halfHeight:new P};break}return i[t.id]=e,e}}}function Rm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"SpotLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}let Cm=0;function Pm(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function Dm(i){const t=new Am,e=Rm(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const s=new P,r=new ne,a=new ne;function o(c){let h=0,d=0,f=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let p=0,g=0,v=0,m=0,u=0,T=0,b=0,y=0,L=0,R=0,A=0;c.sort(Pm);for(let S=0,M=c.length;S0&&(i.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=st.LTC_FLOAT_1,n.rectAreaLTC2=st.LTC_FLOAT_2):(n.rectAreaLTC1=st.LTC_HALF_1,n.rectAreaLTC2=st.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=d,n.ambient[2]=f;const U=n.hash;(U.directionalLength!==p||U.pointLength!==g||U.spotLength!==v||U.rectAreaLength!==m||U.hemiLength!==u||U.numDirectionalShadows!==T||U.numPointShadows!==b||U.numSpotShadows!==y||U.numSpotMaps!==L||U.numLightProbes!==A)&&(n.directional.length=p,n.spot.length=v,n.rectArea.length=m,n.point.length=g,n.hemi.length=u,n.directionalShadow.length=T,n.directionalShadowMap.length=T,n.pointShadow.length=b,n.pointShadowMap.length=b,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=T,n.pointShadowMatrix.length=b,n.spotLightMatrix.length=y+L-R,n.spotLightMap.length=L,n.numSpotLightShadowsWithMaps=R,n.numLightProbes=A,U.directionalLength=p,U.pointLength=g,U.spotLength=v,U.rectAreaLength=m,U.hemiLength=u,U.numDirectionalShadows=T,U.numPointShadows=b,U.numSpotShadows=y,U.numSpotMaps=L,U.numLightProbes=A,n.version=Cm++)}function l(c,h){let d=0,f=0,p=0,g=0,v=0;const m=h.matrixWorldInverse;for(let u=0,T=c.length;u=a.length?(o=new Sl(i),a.push(o)):o=a[r],o}function n(){t=new WeakMap}return{get:e,dispose:n}}const Um=`void main() { +`+k)}else W!==""?console.warn("THREE.WebGLProgram: Program Info Log:",W):(z===""||V==="")&&(G=!1);G&&(D.diagnostics={runnable:$,programLog:W,vertexShader:{log:z,prefix:m},fragmentShader:{log:V,prefix:u}})}s.deleteShader(L),s.deleteShader(R),U=new $s(s,v),S=cm(s,v)}let U;this.getUniforms=function(){return U===void 0&&A(this),U};let S;this.getAttributes=function(){return S===void 0&&A(this),S};let M=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return M===!1&&(M=s.getProgramParameter(v,tm)),M},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(v),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=em++,this.cacheKey=t,this.usedTimes=1,this.program=v,this.vertexShader=L,this.fragmentShader=R,this}let Sm=0;class ym{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(t);return a.has(s)===!1&&(a.add(s),s.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;let n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){const e=this.shaderCache;let n=e.get(t);return n===void 0&&(n=new Em(t),e.set(t,n)),n}}class Em{constructor(t){this.id=Sm++,this.code=t,this.usedTimes=0}}function bm(i,t,e,n,s,r,a){const o=new Qa,l=new ym,c=new Set,h=[],d=s.logarithmicDepthBuffer,f=s.vertexTextures;let p=s.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function v(S){return c.add(S),S===0?"uv":`uv${S}`}function m(S,M,D,W,z){const V=W.fog,$=z.geometry,G=S.isMeshStandardMaterial?W.environment:null,J=(S.isMeshStandardMaterial?e:t).get(S.envMap||G),k=J&&J.mapping===hr?J.image.height:null,it=g[S.type];S.precision!==null&&(p=s.getMaxPrecision(S.precision),p!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",p,"instead."));const ut=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,yt=ut!==void 0?ut.length:0;let Lt=0;$.morphAttributes.position!==void 0&&(Lt=1),$.morphAttributes.normal!==void 0&&(Lt=2),$.morphAttributes.color!==void 0&&(Lt=3);let qt,Y,nt,xt;if(it){const Jt=cn[it];qt=Jt.vertexShader,Y=Jt.fragmentShader}else qt=S.vertexShader,Y=S.fragmentShader,l.update(S),nt=l.getVertexShaderID(S),xt=l.getFragmentShaderID(S);const at=i.getRenderTarget(),wt=i.state.buffers.depth.getReversed(),Ut=z.isInstancedMesh===!0,Gt=z.isBatchedMesh===!0,ce=!!S.map,rt=!!S.matcap,Ct=!!J,w=!!S.aoMap,ve=!!S.lightMap,Bt=!!S.bumpMap,kt=!!S.normalMap,Mt=!!S.displacementMap,ne=!!S.emissiveMap,Et=!!S.metalnessMap,E=!!S.roughnessMap,_=S.anisotropy>0,F=S.clearcoat>0,Z=S.dispersion>0,K=S.iridescence>0,X=S.sheen>0,St=S.transmission>0,ot=_&&!!S.anisotropyMap,dt=F&&!!S.clearcoatMap,jt=F&&!!S.clearcoatNormalMap,tt=F&&!!S.clearcoatRoughnessMap,mt=K&&!!S.iridescenceMap,bt=K&&!!S.iridescenceThicknessMap,Pt=X&&!!S.sheenColorMap,ft=X&&!!S.sheenRoughnessMap,Xt=!!S.specularMap,zt=!!S.specularColorMap,ie=!!S.specularIntensityMap,C=St&&!!S.transmissionMap,et=St&&!!S.thicknessMap,H=!!S.gradientMap,q=!!S.alphaMap,lt=S.alphaTest>0,ct=!!S.alphaHash,Nt=!!S.extensions;let he=On;S.toneMapped&&(at===null||at.isXRRenderTarget===!0)&&(he=i.toneMapping);const xe={shaderID:it,shaderType:S.type,shaderName:S.name,vertexShader:qt,fragmentShader:Y,defines:S.defines,customVertexShaderID:nt,customFragmentShaderID:xt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:p,batching:Gt,batchingColor:Gt&&z._colorsTexture!==null,instancing:Ut,instancingColor:Ut&&z.instanceColor!==null,instancingMorph:Ut&&z.morphTexture!==null,supportsVertexTextures:f,outputColorSpace:at===null?i.outputColorSpace:at.isXRRenderTarget===!0?at.texture.colorSpace:ki,alphaToCoverage:!!S.alphaToCoverage,map:ce,matcap:rt,envMap:Ct,envMapMode:Ct&&J.mapping,envMapCubeUVHeight:k,aoMap:w,lightMap:ve,bumpMap:Bt,normalMap:kt,displacementMap:f&&Mt,emissiveMap:ne,normalMapObjectSpace:kt&&S.normalMapType===fh,normalMapTangentSpace:kt&&S.normalMapType===Zl,metalnessMap:Et,roughnessMap:E,anisotropy:_,anisotropyMap:ot,clearcoat:F,clearcoatMap:dt,clearcoatNormalMap:jt,clearcoatRoughnessMap:tt,dispersion:Z,iridescence:K,iridescenceMap:mt,iridescenceThicknessMap:bt,sheen:X,sheenColorMap:Pt,sheenRoughnessMap:ft,specularMap:Xt,specularColorMap:zt,specularIntensityMap:ie,transmission:St,transmissionMap:C,thicknessMap:et,gradientMap:H,opaque:S.transparent===!1&&S.blending===Li&&S.alphaToCoverage===!1,alphaMap:q,alphaTest:lt,alphaHash:ct,combine:S.combine,mapUv:ce&&v(S.map.channel),aoMapUv:w&&v(S.aoMap.channel),lightMapUv:ve&&v(S.lightMap.channel),bumpMapUv:Bt&&v(S.bumpMap.channel),normalMapUv:kt&&v(S.normalMap.channel),displacementMapUv:Mt&&v(S.displacementMap.channel),emissiveMapUv:ne&&v(S.emissiveMap.channel),metalnessMapUv:Et&&v(S.metalnessMap.channel),roughnessMapUv:E&&v(S.roughnessMap.channel),anisotropyMapUv:ot&&v(S.anisotropyMap.channel),clearcoatMapUv:dt&&v(S.clearcoatMap.channel),clearcoatNormalMapUv:jt&&v(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:tt&&v(S.clearcoatRoughnessMap.channel),iridescenceMapUv:mt&&v(S.iridescenceMap.channel),iridescenceThicknessMapUv:bt&&v(S.iridescenceThicknessMap.channel),sheenColorMapUv:Pt&&v(S.sheenColorMap.channel),sheenRoughnessMapUv:ft&&v(S.sheenRoughnessMap.channel),specularMapUv:Xt&&v(S.specularMap.channel),specularColorMapUv:zt&&v(S.specularColorMap.channel),specularIntensityMapUv:ie&&v(S.specularIntensityMap.channel),transmissionMapUv:C&&v(S.transmissionMap.channel),thicknessMapUv:et&&v(S.thicknessMap.channel),alphaMapUv:q&&v(S.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(kt||_),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:z.isPoints===!0&&!!$.attributes.uv&&(ce||q),fog:!!V,useFog:S.fog===!0,fogExp2:!!V&&V.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:d,reverseDepthBuffer:wt,skinning:z.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:yt,morphTextureStride:Lt,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&D.length>0,shadowMapType:i.shadowMap.type,toneMapping:he,decodeVideoTexture:ce&&S.map.isVideoTexture===!0&&$t.getTransfer(S.map.colorSpace)===re,decodeVideoTextureEmissive:ne&&S.emissiveMap.isVideoTexture===!0&&$t.getTransfer(S.emissiveMap.colorSpace)===re,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===hn,flipSided:S.side===ke,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Nt&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Nt&&S.extensions.multiDraw===!0||Gt)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return xe.vertexUv1s=c.has(1),xe.vertexUv2s=c.has(2),xe.vertexUv3s=c.has(3),c.clear(),xe}function u(S){const M=[];if(S.shaderID?M.push(S.shaderID):(M.push(S.customVertexShaderID),M.push(S.customFragmentShaderID)),S.defines!==void 0)for(const D in S.defines)M.push(D),M.push(S.defines[D]);return S.isRawShaderMaterial===!1&&(T(M,S),b(M,S),M.push(i.outputColorSpace)),M.push(S.customProgramCacheKey),M.join()}function T(S,M){S.push(M.precision),S.push(M.outputColorSpace),S.push(M.envMapMode),S.push(M.envMapCubeUVHeight),S.push(M.mapUv),S.push(M.alphaMapUv),S.push(M.lightMapUv),S.push(M.aoMapUv),S.push(M.bumpMapUv),S.push(M.normalMapUv),S.push(M.displacementMapUv),S.push(M.emissiveMapUv),S.push(M.metalnessMapUv),S.push(M.roughnessMapUv),S.push(M.anisotropyMapUv),S.push(M.clearcoatMapUv),S.push(M.clearcoatNormalMapUv),S.push(M.clearcoatRoughnessMapUv),S.push(M.iridescenceMapUv),S.push(M.iridescenceThicknessMapUv),S.push(M.sheenColorMapUv),S.push(M.sheenRoughnessMapUv),S.push(M.specularMapUv),S.push(M.specularColorMapUv),S.push(M.specularIntensityMapUv),S.push(M.transmissionMapUv),S.push(M.thicknessMapUv),S.push(M.combine),S.push(M.fogExp2),S.push(M.sizeAttenuation),S.push(M.morphTargetsCount),S.push(M.morphAttributeCount),S.push(M.numDirLights),S.push(M.numPointLights),S.push(M.numSpotLights),S.push(M.numSpotLightMaps),S.push(M.numHemiLights),S.push(M.numRectAreaLights),S.push(M.numDirLightShadows),S.push(M.numPointLightShadows),S.push(M.numSpotLightShadows),S.push(M.numSpotLightShadowsWithMaps),S.push(M.numLightProbes),S.push(M.shadowMapType),S.push(M.toneMapping),S.push(M.numClippingPlanes),S.push(M.numClipIntersection),S.push(M.depthPacking)}function b(S,M){o.disableAll(),M.supportsVertexTextures&&o.enable(0),M.instancing&&o.enable(1),M.instancingColor&&o.enable(2),M.instancingMorph&&o.enable(3),M.matcap&&o.enable(4),M.envMap&&o.enable(5),M.normalMapObjectSpace&&o.enable(6),M.normalMapTangentSpace&&o.enable(7),M.clearcoat&&o.enable(8),M.iridescence&&o.enable(9),M.alphaTest&&o.enable(10),M.vertexColors&&o.enable(11),M.vertexAlphas&&o.enable(12),M.vertexUv1s&&o.enable(13),M.vertexUv2s&&o.enable(14),M.vertexUv3s&&o.enable(15),M.vertexTangents&&o.enable(16),M.anisotropy&&o.enable(17),M.alphaHash&&o.enable(18),M.batching&&o.enable(19),M.dispersion&&o.enable(20),M.batchingColor&&o.enable(21),S.push(o.mask),o.disableAll(),M.fog&&o.enable(0),M.useFog&&o.enable(1),M.flatShading&&o.enable(2),M.logarithmicDepthBuffer&&o.enable(3),M.reverseDepthBuffer&&o.enable(4),M.skinning&&o.enable(5),M.morphTargets&&o.enable(6),M.morphNormals&&o.enable(7),M.morphColors&&o.enable(8),M.premultipliedAlpha&&o.enable(9),M.shadowMapEnabled&&o.enable(10),M.doubleSided&&o.enable(11),M.flipSided&&o.enable(12),M.useDepthPacking&&o.enable(13),M.dithering&&o.enable(14),M.transmission&&o.enable(15),M.sheen&&o.enable(16),M.opaque&&o.enable(17),M.pointsUvs&&o.enable(18),M.decodeVideoTexture&&o.enable(19),M.decodeVideoTextureEmissive&&o.enable(20),M.alphaToCoverage&&o.enable(21),S.push(o.mask)}function y(S){const M=g[S.type];let D;if(M){const W=cn[M];D=ir.clone(W.uniforms)}else D=S.uniforms;return D}function L(S,M){let D;for(let W=0,z=h.length;W0?n.push(u):p.transparent===!0?s.push(u):e.push(u)}function l(d,f,p,g,v,m){const u=a(d,f,p,g,v,m);p.transmission>0?n.unshift(u):p.transparent===!0?s.unshift(u):e.unshift(u)}function c(d,f){e.length>1&&e.sort(d||wm),n.length>1&&n.sort(f||xl),s.length>1&&s.sort(f||xl)}function h(){for(let d=t,f=i.length;d=r.length?(a=new Ml,r.push(a)):a=r[s],a}function e(){i=new WeakMap}return{get:t,dispose:e}}function Rm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={direction:new P,color:new pt};break;case"SpotLight":e={position:new P,direction:new P,color:new pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":e={position:new P,color:new pt,distance:0,decay:0};break;case"HemisphereLight":e={direction:new P,skyColor:new pt,groundColor:new pt};break;case"RectAreaLight":e={color:new pt,position:new P,halfWidth:new P,halfHeight:new P};break}return i[t.id]=e,e}}}function Cm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"SpotLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}let Pm=0;function Dm(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function Lm(i){const t=new Rm,e=Cm(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const s=new P,r=new ee,a=new ee;function o(c){let h=0,d=0,f=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let p=0,g=0,v=0,m=0,u=0,T=0,b=0,y=0,L=0,R=0,A=0;c.sort(Dm);for(let S=0,M=c.length;S0&&(i.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=st.LTC_FLOAT_1,n.rectAreaLTC2=st.LTC_FLOAT_2):(n.rectAreaLTC1=st.LTC_HALF_1,n.rectAreaLTC2=st.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=d,n.ambient[2]=f;const U=n.hash;(U.directionalLength!==p||U.pointLength!==g||U.spotLength!==v||U.rectAreaLength!==m||U.hemiLength!==u||U.numDirectionalShadows!==T||U.numPointShadows!==b||U.numSpotShadows!==y||U.numSpotMaps!==L||U.numLightProbes!==A)&&(n.directional.length=p,n.spot.length=v,n.rectArea.length=m,n.point.length=g,n.hemi.length=u,n.directionalShadow.length=T,n.directionalShadowMap.length=T,n.pointShadow.length=b,n.pointShadowMap.length=b,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=T,n.pointShadowMatrix.length=b,n.spotLightMatrix.length=y+L-R,n.spotLightMap.length=L,n.numSpotLightShadowsWithMaps=R,n.numLightProbes=A,U.directionalLength=p,U.pointLength=g,U.spotLength=v,U.rectAreaLength=m,U.hemiLength=u,U.numDirectionalShadows=T,U.numPointShadows=b,U.numSpotShadows=y,U.numSpotMaps=L,U.numLightProbes=A,n.version=Pm++)}function l(c,h){let d=0,f=0,p=0,g=0,v=0;const m=h.matrixWorldInverse;for(let u=0,T=c.length;u=a.length?(o=new Sl(i),a.push(o)):o=a[r],o}function n(){t=new WeakMap}return{get:e,dispose:n}}const Im=`void main() { gl_Position = vec4( position, 1.0 ); -}`,Im=`uniform sampler2D shadow_pass; +}`,Nm=`uniform sampler2D shadow_pass; uniform vec2 resolution; uniform float radius; #include @@ -3800,12 +3800,12 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function Nm(i,t,e){let n=new to;const s=new vt,r=new vt,a=new le,o=new nu({depthPacking:uh}),l=new iu,c={},h=e.maxTextureSize,d={[zn]:He,[He]:zn,[hn]:hn},f=new Ne({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:Um,fragmentShader:Im}),p=f.clone();p.defines.HORIZONTAL_PASS=1;const g=new pe;g.setAttribute("position",new de(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new Me(g,f),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Ol;let u=this.type;this.render=function(R,A,U){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||R.length===0)return;const S=i.getRenderTarget(),M=i.getActiveCubeFace(),D=i.getActiveMipmapLevel(),W=i.state;W.setBlending(bn),W.buffers.color.setClear(1,1,1,1),W.buffers.depth.setTest(!0),W.setScissorTest(!1);const z=u!==yn&&this.type===yn,V=u===yn&&this.type!==yn;for(let $=0,G=R.length;$h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/it.x),s.x=r.x*it.x,k.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/it.y),s.y=r.y*it.y,k.mapSize.y=r.y)),k.map===null||z===!0||V===!0){const yt=this.type!==yn?{minFilter:Ye,magFilter:Ye}:{};k.map!==null&&k.map.dispose(),k.map=new on(s.x,s.y,yt),k.map.texture.name=J.name+".shadowMap",k.camera.updateProjectionMatrix()}i.setRenderTarget(k.map),i.clear();const ut=k.getViewportCount();for(let yt=0;yt0||A.map&&A.alphaTest>0){const W=M.uuid,z=A.uuid;let V=c[W];V===void 0&&(V={},c[W]=V);let $=V[z];$===void 0&&($=M.clone(),V[z]=$,A.addEventListener("dispose",L)),M=$}if(M.visible=A.visible,M.wireframe=A.wireframe,S===yn?M.side=A.shadowSide!==null?A.shadowSide:A.side:M.side=A.shadowSide!==null?A.shadowSide:d[A.side],M.alphaMap=A.alphaMap,M.alphaTest=A.alphaTest,M.map=A.map,M.clipShadows=A.clipShadows,M.clippingPlanes=A.clippingPlanes,M.clipIntersection=A.clipIntersection,M.displacementMap=A.displacementMap,M.displacementScale=A.displacementScale,M.displacementBias=A.displacementBias,M.wireframeLinewidth=A.wireframeLinewidth,M.linewidth=A.linewidth,U.isPointLight===!0&&M.isMeshDistanceMaterial===!0){const W=i.properties.get(M);W.light=U}return M}function y(R,A,U,S,M){if(R.visible===!1)return;if(R.layers.test(A.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&M===yn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(U.matrixWorldInverse,R.matrixWorld);const z=t.update(R),V=R.material;if(Array.isArray(V)){const $=z.groups;for(let G=0,J=$.length;G=1):k.indexOf("OpenGL ES")!==-1&&(J=parseFloat(/^OpenGL ES (\d)/.exec(k)[1]),G=J>=2);let it=null,ut={};const yt=i.getParameter(i.SCISSOR_BOX),Lt=i.getParameter(i.VIEWPORT),jt=new le().fromArray(yt),Y=new le().fromArray(Lt);function et(C,nt,H,Z){const ht=new Uint8Array(4),lt=i.createTexture();i.bindTexture(C,lt),i.texParameteri(C,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(C,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Ot=0;Ot"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new vt,h=new WeakMap;let d;const f=new WeakMap;let p=!1;try{p=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function g(E,_){return p?new OffscreenCanvas(E,_):nr("canvas")}function v(E,_,F){let j=1;const K=Et(E);if((K.width>F||K.height>F)&&(j=F/Math.max(K.width,K.height)),j<1)if(typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&E instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&E instanceof ImageBitmap||typeof VideoFrame<"u"&&E instanceof VideoFrame){const X=Math.floor(j*K.width),St=Math.floor(j*K.height);d===void 0&&(d=g(X,St));const ot=_?g(X,St):d;return ot.width=X,ot.height=St,ot.getContext("2d").drawImage(E,0,0,X,St),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+K.width+"x"+K.height+") to ("+X+"x"+St+")."),ot}else return"data"in E&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+K.width+"x"+K.height+")."),E;return E}function m(E){return E.generateMipmaps}function u(E){i.generateMipmap(E)}function T(E){return E.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:E.isWebGL3DRenderTarget?i.TEXTURE_3D:E.isWebGLArrayRenderTarget||E.isCompressedArrayTexture?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D}function b(E,_,F,j,K=!1){if(E!==null){if(i[E]!==void 0)return i[E];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+E+"'")}let X=_;if(_===i.RED&&(F===i.FLOAT&&(X=i.R32F),F===i.HALF_FLOAT&&(X=i.R16F),F===i.UNSIGNED_BYTE&&(X=i.R8)),_===i.RED_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.R8UI),F===i.UNSIGNED_SHORT&&(X=i.R16UI),F===i.UNSIGNED_INT&&(X=i.R32UI),F===i.BYTE&&(X=i.R8I),F===i.SHORT&&(X=i.R16I),F===i.INT&&(X=i.R32I)),_===i.RG&&(F===i.FLOAT&&(X=i.RG32F),F===i.HALF_FLOAT&&(X=i.RG16F),F===i.UNSIGNED_BYTE&&(X=i.RG8)),_===i.RG_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RG8UI),F===i.UNSIGNED_SHORT&&(X=i.RG16UI),F===i.UNSIGNED_INT&&(X=i.RG32UI),F===i.BYTE&&(X=i.RG8I),F===i.SHORT&&(X=i.RG16I),F===i.INT&&(X=i.RG32I)),_===i.RGB_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGB8UI),F===i.UNSIGNED_SHORT&&(X=i.RGB16UI),F===i.UNSIGNED_INT&&(X=i.RGB32UI),F===i.BYTE&&(X=i.RGB8I),F===i.SHORT&&(X=i.RGB16I),F===i.INT&&(X=i.RGB32I)),_===i.RGBA_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGBA8UI),F===i.UNSIGNED_SHORT&&(X=i.RGBA16UI),F===i.UNSIGNED_INT&&(X=i.RGBA32UI),F===i.BYTE&&(X=i.RGBA8I),F===i.SHORT&&(X=i.RGBA16I),F===i.INT&&(X=i.RGBA32I)),_===i.RGB&&F===i.UNSIGNED_INT_5_9_9_9_REV&&(X=i.RGB9_E5),_===i.RGBA){const St=K?tr:Jt.getTransfer(j);F===i.FLOAT&&(X=i.RGBA32F),F===i.HALF_FLOAT&&(X=i.RGBA16F),F===i.UNSIGNED_BYTE&&(X=St===re?i.SRGB8_ALPHA8:i.RGBA8),F===i.UNSIGNED_SHORT_4_4_4_4&&(X=i.RGBA4),F===i.UNSIGNED_SHORT_5_5_5_1&&(X=i.RGB5_A1)}return(X===i.R16F||X===i.R32F||X===i.RG16F||X===i.RG32F||X===i.RGBA16F||X===i.RGBA32F)&&t.get("EXT_color_buffer_float"),X}function y(E,_){let F;return E?_===null||_===ei||_===zi?F=i.DEPTH24_STENCIL8:_===fn?F=i.DEPTH32F_STENCIL8:_===os&&(F=i.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):_===null||_===ei||_===zi?F=i.DEPTH_COMPONENT24:_===fn?F=i.DEPTH_COMPONENT32F:_===os&&(F=i.DEPTH_COMPONENT16),F}function L(E,_){return m(E)===!0||E.isFramebufferTexture&&E.minFilter!==Ye&&E.minFilter!==dn?Math.log2(Math.max(_.width,_.height))+1:E.mipmaps!==void 0&&E.mipmaps.length>0?E.mipmaps.length:E.isCompressedTexture&&Array.isArray(E.image)?_.mipmaps.length:1}function R(E){const _=E.target;_.removeEventListener("dispose",R),U(_),_.isVideoTexture&&h.delete(_)}function A(E){const _=E.target;_.removeEventListener("dispose",A),M(_)}function U(E){const _=n.get(E);if(_.__webglInit===void 0)return;const F=E.source,j=f.get(F);if(j){const K=j[_.__cacheKey];K.usedTimes--,K.usedTimes===0&&S(E),Object.keys(j).length===0&&f.delete(F)}n.remove(E)}function S(E){const _=n.get(E);i.deleteTexture(_.__webglTexture);const F=E.source,j=f.get(F);delete j[_.__cacheKey],a.memory.textures--}function M(E){const _=n.get(E);if(E.depthTexture&&(E.depthTexture.dispose(),n.remove(E.depthTexture)),E.isWebGLCubeRenderTarget)for(let j=0;j<6;j++){if(Array.isArray(_.__webglFramebuffer[j]))for(let K=0;K<_.__webglFramebuffer[j].length;K++)i.deleteFramebuffer(_.__webglFramebuffer[j][K]);else i.deleteFramebuffer(_.__webglFramebuffer[j]);_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer[j])}else{if(Array.isArray(_.__webglFramebuffer))for(let j=0;j<_.__webglFramebuffer.length;j++)i.deleteFramebuffer(_.__webglFramebuffer[j]);else i.deleteFramebuffer(_.__webglFramebuffer);if(_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer),_.__webglMultisampledFramebuffer&&i.deleteFramebuffer(_.__webglMultisampledFramebuffer),_.__webglColorRenderbuffer)for(let j=0;j<_.__webglColorRenderbuffer.length;j++)_.__webglColorRenderbuffer[j]&&i.deleteRenderbuffer(_.__webglColorRenderbuffer[j]);_.__webglDepthRenderbuffer&&i.deleteRenderbuffer(_.__webglDepthRenderbuffer)}const F=E.textures;for(let j=0,K=F.length;j=s.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+E+" texture units while this GPU supports only "+s.maxTextures),D+=1,E}function V(E){const _=[];return _.push(E.wrapS),_.push(E.wrapT),_.push(E.wrapR||0),_.push(E.magFilter),_.push(E.minFilter),_.push(E.anisotropy),_.push(E.internalFormat),_.push(E.format),_.push(E.type),_.push(E.generateMipmaps),_.push(E.premultiplyAlpha),_.push(E.flipY),_.push(E.unpackAlignment),_.push(E.colorSpace),_.join()}function $(E,_){const F=n.get(E);if(E.isVideoTexture&&Mt(E),E.isRenderTargetTexture===!1&&E.version>0&&F.__version!==E.version){const j=E.image;if(j===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(j.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Y(F,E,_);return}}e.bindTexture(i.TEXTURE_2D,F.__webglTexture,i.TEXTURE0+_)}function G(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_2D_ARRAY,F.__webglTexture,i.TEXTURE0+_)}function J(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_3D,F.__webglTexture,i.TEXTURE0+_)}function k(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){et(F,E,_);return}e.bindTexture(i.TEXTURE_CUBE_MAP,F.__webglTexture,i.TEXTURE0+_)}const it={[ha]:i.REPEAT,[Jn]:i.CLAMP_TO_EDGE,[ua]:i.MIRRORED_REPEAT},ut={[Ye]:i.NEAREST,[ch]:i.NEAREST_MIPMAP_NEAREST,[ms]:i.NEAREST_MIPMAP_LINEAR,[dn]:i.LINEAR,[gr]:i.LINEAR_MIPMAP_NEAREST,[Qn]:i.LINEAR_MIPMAP_LINEAR},yt={[fh]:i.NEVER,[xh]:i.ALWAYS,[ph]:i.LESS,[$l]:i.LEQUAL,[mh]:i.EQUAL,[vh]:i.GEQUAL,[gh]:i.GREATER,[_h]:i.NOTEQUAL};function Lt(E,_){if(_.type===fn&&t.has("OES_texture_float_linear")===!1&&(_.magFilter===dn||_.magFilter===gr||_.magFilter===ms||_.magFilter===Qn||_.minFilter===dn||_.minFilter===gr||_.minFilter===ms||_.minFilter===Qn)&&console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),i.texParameteri(E,i.TEXTURE_WRAP_S,it[_.wrapS]),i.texParameteri(E,i.TEXTURE_WRAP_T,it[_.wrapT]),(E===i.TEXTURE_3D||E===i.TEXTURE_2D_ARRAY)&&i.texParameteri(E,i.TEXTURE_WRAP_R,it[_.wrapR]),i.texParameteri(E,i.TEXTURE_MAG_FILTER,ut[_.magFilter]),i.texParameteri(E,i.TEXTURE_MIN_FILTER,ut[_.minFilter]),_.compareFunction&&(i.texParameteri(E,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(E,i.TEXTURE_COMPARE_FUNC,yt[_.compareFunction])),t.has("EXT_texture_filter_anisotropic")===!0){if(_.magFilter===Ye||_.minFilter!==ms&&_.minFilter!==Qn||_.type===fn&&t.has("OES_texture_float_linear")===!1)return;if(_.anisotropy>1||n.get(_).__currentAnisotropy){const F=t.get("EXT_texture_filter_anisotropic");i.texParameterf(E,F.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(_.anisotropy,s.getMaxAnisotropy())),n.get(_).__currentAnisotropy=_.anisotropy}}}function jt(E,_){let F=!1;E.__webglInit===void 0&&(E.__webglInit=!0,_.addEventListener("dispose",R));const j=_.source;let K=f.get(j);K===void 0&&(K={},f.set(j,K));const X=V(_);if(X!==E.__cacheKey){K[X]===void 0&&(K[X]={texture:i.createTexture(),usedTimes:0},a.memory.textures++,F=!0),K[X].usedTimes++;const St=K[E.__cacheKey];St!==void 0&&(K[E.__cacheKey].usedTimes--,St.usedTimes===0&&S(_)),E.__cacheKey=X,E.__webglTexture=K[X].texture}return F}function Y(E,_,F){let j=i.TEXTURE_2D;(_.isDataArrayTexture||_.isCompressedArrayTexture)&&(j=i.TEXTURE_2D_ARRAY),_.isData3DTexture&&(j=i.TEXTURE_3D);const K=jt(E,_),X=_.source;e.bindTexture(j,E.__webglTexture,i.TEXTURE0+F);const St=n.get(X);if(X.version!==St.__version||K===!0){e.activeTexture(i.TEXTURE0+F);const ot=Jt.getPrimaries(Jt.workingColorSpace),dt=_.colorSpace===Fn?null:Jt.getPrimaries(_.colorSpace),Zt=_.colorSpace===Fn||ot===dt?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,Zt);let tt=v(_.image,!1,s.maxTextureSize);tt=ie(_,tt);const mt=r.convert(_.format,_.colorSpace),bt=r.convert(_.type);let Pt=b(_.internalFormat,mt,bt,_.colorSpace,_.isVideoTexture);Lt(j,_);let ft;const Yt=_.mipmaps,zt=_.isVideoTexture!==!0,Xt=St.__version===void 0||K===!0,C=X.dataReady,nt=L(_,tt);if(_.isDepthTexture)Pt=y(_.format===Hi,_.type),Xt&&(zt?e.texStorage2D(i.TEXTURE_2D,1,Pt,tt.width,tt.height):e.texImage2D(i.TEXTURE_2D,0,Pt,tt.width,tt.height,0,mt,bt,null));else if(_.isDataTexture)if(Yt.length>0){zt&&Xt&&e.texStorage2D(i.TEXTURE_2D,nt,Pt,Yt[0].width,Yt[0].height);for(let H=0,Z=Yt.length;H0){const ht=$o(ft.width,ft.height,_.format,_.type);for(const lt of _.layerUpdates){const Ot=ft.data.subarray(lt*ht/ft.data.BYTES_PER_ELEMENT,(lt+1)*ht/ft.data.BYTES_PER_ELEMENT);e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,lt,ft.width,ft.height,1,mt,Ot)}_.clearLayerUpdates()}else e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,ft.data)}else e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,ft.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else zt?C&&e.texSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,bt,ft.data):e.texImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,mt,bt,ft.data)}else{zt&&Xt&&e.texStorage2D(i.TEXTURE_2D,nt,Pt,Yt[0].width,Yt[0].height);for(let H=0,Z=Yt.length;H0){const H=$o(tt.width,tt.height,_.format,_.type);for(const Z of _.layerUpdates){const ht=tt.data.subarray(Z*H/tt.data.BYTES_PER_ELEMENT,(Z+1)*H/tt.data.BYTES_PER_ELEMENT);e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,Z,tt.width,tt.height,1,mt,bt,ht)}_.clearLayerUpdates()}else e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)}else e.texImage3D(i.TEXTURE_2D_ARRAY,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isData3DTexture)zt?(Xt&&e.texStorage3D(i.TEXTURE_3D,nt,Pt,tt.width,tt.height,tt.depth),C&&e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)):e.texImage3D(i.TEXTURE_3D,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isFramebufferTexture){if(Xt)if(zt)e.texStorage2D(i.TEXTURE_2D,nt,Pt,tt.width,tt.height);else{let H=tt.width,Z=tt.height;for(let ht=0;ht>=1,Z>>=1}}else if(Yt.length>0){if(zt&&Xt){const H=Et(Yt[0]);e.texStorage2D(i.TEXTURE_2D,nt,Pt,H.width,H.height)}for(let H=0,Z=Yt.length;H0&&nt++;const Z=Et(mt[0]);e.texStorage2D(i.TEXTURE_CUBE_MAP,nt,Yt,Z.width,Z.height)}for(let Z=0;Z<6;Z++)if(tt){zt?C&&e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+Z,0,0,0,mt[Z].width,mt[Z].height,Pt,ft,mt[Z].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+Z,0,Yt,mt[Z].width,mt[Z].height,0,Pt,ft,mt[Z].data);for(let ht=0;ht>X),bt=Math.max(1,_.height>>X);K===i.TEXTURE_3D||K===i.TEXTURE_2D_ARRAY?e.texImage3D(K,X,dt,mt,bt,_.depth,0,St,ot,null):e.texImage2D(K,X,dt,mt,bt,0,St,ot,null)}e.bindFramebuffer(i.FRAMEBUFFER,E),kt(_)?o.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,j,K,tt.__webglTexture,0,Ft(_)):(K===i.TEXTURE_2D||K>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&K<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,j,K,tt.__webglTexture,X),e.bindFramebuffer(i.FRAMEBUFFER,null)}function at(E,_,F){if(i.bindRenderbuffer(i.RENDERBUFFER,E),_.depthBuffer){const j=_.depthTexture,K=j&&j.isDepthTexture?j.type:null,X=y(_.stencilBuffer,K),St=_.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,ot=Ft(_);kt(_)?o.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,ot,X,_.width,_.height):F?i.renderbufferStorageMultisample(i.RENDERBUFFER,ot,X,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,X,_.width,_.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,St,i.RENDERBUFFER,E)}else{const j=_.textures;for(let K=0;K{delete _.__boundDepthTexture,delete _.__depthDisposeCallback,j.removeEventListener("dispose",K)};j.addEventListener("dispose",K),_.__depthDisposeCallback=K}_.__boundDepthTexture=j}if(E.depthTexture&&!_.__autoAllocateDepthBuffer){if(F)throw new Error("target.depthTexture not supported in Cube render targets");wt(_.__webglFramebuffer,E)}else if(F){_.__webglDepthbuffer=[];for(let j=0;j<6;j++)if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer[j]),_.__webglDepthbuffer[j]===void 0)_.__webglDepthbuffer[j]=i.createRenderbuffer(),at(_.__webglDepthbuffer[j],E,!1);else{const K=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,X=_.__webglDepthbuffer[j];i.bindRenderbuffer(i.RENDERBUFFER,X),i.framebufferRenderbuffer(i.FRAMEBUFFER,K,i.RENDERBUFFER,X)}}else if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer),_.__webglDepthbuffer===void 0)_.__webglDepthbuffer=i.createRenderbuffer(),at(_.__webglDepthbuffer,E,!1);else{const j=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,K=_.__webglDepthbuffer;i.bindRenderbuffer(i.RENDERBUFFER,K),i.framebufferRenderbuffer(i.FRAMEBUFFER,j,i.RENDERBUFFER,K)}e.bindFramebuffer(i.FRAMEBUFFER,null)}function Gt(E,_,F){const j=n.get(E);_!==void 0&&xt(j.__webglFramebuffer,E,E.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),F!==void 0&&Ut(E)}function ce(E){const _=E.texture,F=n.get(E),j=n.get(_);E.addEventListener("dispose",A);const K=E.textures,X=E.isWebGLCubeRenderTarget===!0,St=K.length>1;if(St||(j.__webglTexture===void 0&&(j.__webglTexture=i.createTexture()),j.__version=_.version,a.memory.textures++),X){F.__webglFramebuffer=[];for(let ot=0;ot<6;ot++)if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer[ot]=[];for(let dt=0;dt<_.mipmaps.length;dt++)F.__webglFramebuffer[ot][dt]=i.createFramebuffer()}else F.__webglFramebuffer[ot]=i.createFramebuffer()}else{if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer=[];for(let ot=0;ot<_.mipmaps.length;ot++)F.__webglFramebuffer[ot]=i.createFramebuffer()}else F.__webglFramebuffer=i.createFramebuffer();if(St)for(let ot=0,dt=K.length;ot0&&kt(E)===!1){F.__webglMultisampledFramebuffer=i.createFramebuffer(),F.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,F.__webglMultisampledFramebuffer);for(let ot=0;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[ot][dt],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,dt);else xt(F.__webglFramebuffer[ot],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,0);m(_)&&u(i.TEXTURE_CUBE_MAP),e.unbindTexture()}else if(St){for(let ot=0,dt=K.length;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[dt],E,_,i.COLOR_ATTACHMENT0,ot,dt);else xt(F.__webglFramebuffer,E,_,i.COLOR_ATTACHMENT0,ot,0);m(_)&&u(ot),e.unbindTexture()}E.depthBuffer&&Ut(E)}function rt(E){const _=E.textures;for(let F=0,j=_.length;F0){if(kt(E)===!1){const _=E.textures,F=E.width,j=E.height;let K=i.COLOR_BUFFER_BIT;const X=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,St=n.get(E),ot=_.length>1;if(ot)for(let dt=0;dt<_.length;dt++)e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,null),e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,null,0);e.bindFramebuffer(i.READ_FRAMEBUFFER,St.__webglMultisampledFramebuffer),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglFramebuffer);for(let dt=0;dt<_.length;dt++){if(E.resolveDepthBuffer&&(E.depthBuffer&&(K|=i.DEPTH_BUFFER_BIT),E.stencilBuffer&&E.resolveStencilBuffer&&(K|=i.STENCIL_BUFFER_BIT)),ot){i.framebufferRenderbuffer(i.READ_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const Zt=n.get(_[dt]).__webglTexture;i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,Zt,0)}i.blitFramebuffer(0,0,F,j,0,0,F,j,K,i.NEAREST),l===!0&&(Ct.length=0,w.length=0,Ct.push(i.COLOR_ATTACHMENT0+dt),E.depthBuffer&&E.resolveDepthBuffer===!1&&(Ct.push(X),w.push(X),i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,w)),i.invalidateFramebuffer(i.READ_FRAMEBUFFER,Ct))}if(e.bindFramebuffer(i.READ_FRAMEBUFFER,null),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),ot)for(let dt=0;dt<_.length;dt++){e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const Zt=n.get(_[dt]).__webglTexture;e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,Zt,0)}e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglMultisampledFramebuffer)}else if(E.depthBuffer&&E.resolveDepthBuffer===!1&&l){const _=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT;i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,[_])}}}function Ft(E){return Math.min(s.maxSamples,E.samples)}function kt(E){const _=n.get(E);return E.samples>0&&t.has("WEBGL_multisampled_render_to_texture")===!0&&_.__useRenderToTexture!==!1}function Mt(E){const _=a.render.frame;h.get(E)!==_&&(h.set(E,_),E.update())}function ie(E,_){const F=E.colorSpace,j=E.format,K=E.type;return E.isCompressedTexture===!0||E.isVideoTexture===!0||F!==ki&&F!==Fn&&(Jt.getTransfer(F)===re?(j!==an||K!==An)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",F)),_}function Et(E){return typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement?(c.width=E.naturalWidth||E.width,c.height=E.naturalHeight||E.height):typeof VideoFrame<"u"&&E instanceof VideoFrame?(c.width=E.displayWidth,c.height=E.displayHeight):(c.width=E.width,c.height=E.height),c}this.allocateTextureUnit=z,this.resetTextureUnits=W,this.setTexture2D=$,this.setTexture2DArray=G,this.setTexture3D=J,this.setTextureCube=k,this.rebindTextures=Gt,this.setupRenderTarget=ce,this.updateRenderTargetMipmap=rt,this.updateMultisampleRenderTarget=ve,this.setupDepthRenderbuffer=Ut,this.setupFrameBufferTexture=xt,this.useMultisampledRTT=kt}function zm(i,t){function e(n,s=Fn){let r;const a=Jt.getTransfer(s);if(n===An)return i.UNSIGNED_BYTE;if(n===qa)return i.UNSIGNED_SHORT_4_4_4_4;if(n===ja)return i.UNSIGNED_SHORT_5_5_5_1;if(n===Gl)return i.UNSIGNED_INT_5_9_9_9_REV;if(n===kl)return i.BYTE;if(n===Vl)return i.SHORT;if(n===os)return i.UNSIGNED_SHORT;if(n===Ya)return i.INT;if(n===ei)return i.UNSIGNED_INT;if(n===fn)return i.FLOAT;if(n===Tn)return i.HALF_FLOAT;if(n===Wl)return i.ALPHA;if(n===Xl)return i.RGB;if(n===an)return i.RGBA;if(n===Yl)return i.LUMINANCE;if(n===ql)return i.LUMINANCE_ALPHA;if(n===Ui)return i.DEPTH_COMPONENT;if(n===Hi)return i.DEPTH_STENCIL;if(n===Za)return i.RED;if(n===Ka)return i.RED_INTEGER;if(n===jl)return i.RG;if(n===$a)return i.RG_INTEGER;if(n===Ja)return i.RGBA_INTEGER;if(n===Xs||n===Ys||n===qs||n===js)if(a===re)if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Xs)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Ys)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===qs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===js)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=t.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Xs)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Ys)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===qs)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===js)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===da||n===fa||n===pa||n===ma)if(r=t.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===da)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===fa)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===pa)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===ma)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===ga||n===_a||n===va)if(r=t.get("WEBGL_compressed_texture_etc"),r!==null){if(n===ga||n===_a)return a===re?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===va)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===xa||n===Ma||n===Sa||n===ya||n===Ea||n===ba||n===Ta||n===wa||n===Aa||n===Ra||n===Ca||n===Pa||n===Da||n===La)if(r=t.get("WEBGL_compressed_texture_astc"),r!==null){if(n===xa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Ma)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Sa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===ya)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ea)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===ba)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Ta)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===wa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Aa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Ra)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Ca)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Pa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Da)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===La)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Zs||n===Ua||n===Ia)if(r=t.get("EXT_texture_compression_bptc"),r!==null){if(n===Zs)return a===re?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Ua)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Ia)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Zl||n===Na||n===Fa||n===Oa)if(r=t.get("EXT_texture_compression_rgtc"),r!==null){if(n===Zs)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Na)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Fa)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Oa)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===zi?i.UNSIGNED_INT_24_8:i[n]!==void 0?i[n]:null}return{convert:e}}const Hm={type:"move"};class Zr{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new Ci,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new Ci,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new Ci,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!=="visible-blurred"){if(c&&t.hand){a=!0;for(const v of t.hand.values()){const m=e.getJointPose(v,n),u=this._getHandJoint(c,v);m!==null&&(u.matrix.fromArray(m.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,u.jointRadius=m.radius),u.visible=m!==null}const h=c.joints["index-finger-tip"],d=c.joints["thumb-tip"],f=h.position.distanceTo(d.position),p=.02,g=.005;c.inputState.pinching&&f>p+g?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&f<=p-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Hm)))}return o!==null&&(o.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){const n=new Ci;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}const km=` +}`;function Fm(i,t,e){let n=new to;const s=new vt,r=new vt,a=new le,o=new iu({depthPacking:dh}),l=new su,c={},h=e.maxTextureSize,d={[zn]:ke,[ke]:zn,[hn]:hn},f=new Ne({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:Im,fragmentShader:Nm}),p=f.clone();p.defines.HORIZONTAL_PASS=1;const g=new pe;g.setAttribute("position",new de(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new Se(g,f),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Fl;let u=this.type;this.render=function(R,A,U){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||R.length===0)return;const S=i.getRenderTarget(),M=i.getActiveCubeFace(),D=i.getActiveMipmapLevel(),W=i.state;W.setBlending(bn),W.buffers.color.setClear(1,1,1,1),W.buffers.depth.setTest(!0),W.setScissorTest(!1);const z=u!==yn&&this.type===yn,V=u===yn&&this.type!==yn;for(let $=0,G=R.length;$h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/it.x),s.x=r.x*it.x,k.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/it.y),s.y=r.y*it.y,k.mapSize.y=r.y)),k.map===null||z===!0||V===!0){const yt=this.type!==yn?{minFilter:qe,magFilter:qe}:{};k.map!==null&&k.map.dispose(),k.map=new on(s.x,s.y,yt),k.map.texture.name=J.name+".shadowMap",k.camera.updateProjectionMatrix()}i.setRenderTarget(k.map),i.clear();const ut=k.getViewportCount();for(let yt=0;yt0||A.map&&A.alphaTest>0){const W=M.uuid,z=A.uuid;let V=c[W];V===void 0&&(V={},c[W]=V);let $=V[z];$===void 0&&($=M.clone(),V[z]=$,A.addEventListener("dispose",L)),M=$}if(M.visible=A.visible,M.wireframe=A.wireframe,S===yn?M.side=A.shadowSide!==null?A.shadowSide:A.side:M.side=A.shadowSide!==null?A.shadowSide:d[A.side],M.alphaMap=A.alphaMap,M.alphaTest=A.alphaTest,M.map=A.map,M.clipShadows=A.clipShadows,M.clippingPlanes=A.clippingPlanes,M.clipIntersection=A.clipIntersection,M.displacementMap=A.displacementMap,M.displacementScale=A.displacementScale,M.displacementBias=A.displacementBias,M.wireframeLinewidth=A.wireframeLinewidth,M.linewidth=A.linewidth,U.isPointLight===!0&&M.isMeshDistanceMaterial===!0){const W=i.properties.get(M);W.light=U}return M}function y(R,A,U,S,M){if(R.visible===!1)return;if(R.layers.test(A.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&M===yn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(U.matrixWorldInverse,R.matrixWorld);const z=t.update(R),V=R.material;if(Array.isArray(V)){const $=z.groups;for(let G=0,J=$.length;G=1):k.indexOf("OpenGL ES")!==-1&&(J=parseFloat(/^OpenGL ES (\d)/.exec(k)[1]),G=J>=2);let it=null,ut={};const yt=i.getParameter(i.SCISSOR_BOX),Lt=i.getParameter(i.VIEWPORT),qt=new le().fromArray(yt),Y=new le().fromArray(Lt);function nt(C,et,H,q){const lt=new Uint8Array(4),ct=i.createTexture();i.bindTexture(C,ct),i.texParameteri(C,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(C,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Nt=0;Nt"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new vt,h=new WeakMap;let d;const f=new WeakMap;let p=!1;try{p=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function g(E,_){return p?new OffscreenCanvas(E,_):nr("canvas")}function v(E,_,F){let Z=1;const K=Et(E);if((K.width>F||K.height>F)&&(Z=F/Math.max(K.width,K.height)),Z<1)if(typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&E instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&E instanceof ImageBitmap||typeof VideoFrame<"u"&&E instanceof VideoFrame){const X=Math.floor(Z*K.width),St=Math.floor(Z*K.height);d===void 0&&(d=g(X,St));const ot=_?g(X,St):d;return ot.width=X,ot.height=St,ot.getContext("2d").drawImage(E,0,0,X,St),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+K.width+"x"+K.height+") to ("+X+"x"+St+")."),ot}else return"data"in E&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+K.width+"x"+K.height+")."),E;return E}function m(E){return E.generateMipmaps}function u(E){i.generateMipmap(E)}function T(E){return E.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:E.isWebGL3DRenderTarget?i.TEXTURE_3D:E.isWebGLArrayRenderTarget||E.isCompressedArrayTexture?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D}function b(E,_,F,Z,K=!1){if(E!==null){if(i[E]!==void 0)return i[E];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+E+"'")}let X=_;if(_===i.RED&&(F===i.FLOAT&&(X=i.R32F),F===i.HALF_FLOAT&&(X=i.R16F),F===i.UNSIGNED_BYTE&&(X=i.R8)),_===i.RED_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.R8UI),F===i.UNSIGNED_SHORT&&(X=i.R16UI),F===i.UNSIGNED_INT&&(X=i.R32UI),F===i.BYTE&&(X=i.R8I),F===i.SHORT&&(X=i.R16I),F===i.INT&&(X=i.R32I)),_===i.RG&&(F===i.FLOAT&&(X=i.RG32F),F===i.HALF_FLOAT&&(X=i.RG16F),F===i.UNSIGNED_BYTE&&(X=i.RG8)),_===i.RG_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RG8UI),F===i.UNSIGNED_SHORT&&(X=i.RG16UI),F===i.UNSIGNED_INT&&(X=i.RG32UI),F===i.BYTE&&(X=i.RG8I),F===i.SHORT&&(X=i.RG16I),F===i.INT&&(X=i.RG32I)),_===i.RGB_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGB8UI),F===i.UNSIGNED_SHORT&&(X=i.RGB16UI),F===i.UNSIGNED_INT&&(X=i.RGB32UI),F===i.BYTE&&(X=i.RGB8I),F===i.SHORT&&(X=i.RGB16I),F===i.INT&&(X=i.RGB32I)),_===i.RGBA_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGBA8UI),F===i.UNSIGNED_SHORT&&(X=i.RGBA16UI),F===i.UNSIGNED_INT&&(X=i.RGBA32UI),F===i.BYTE&&(X=i.RGBA8I),F===i.SHORT&&(X=i.RGBA16I),F===i.INT&&(X=i.RGBA32I)),_===i.RGB&&F===i.UNSIGNED_INT_5_9_9_9_REV&&(X=i.RGB9_E5),_===i.RGBA){const St=K?tr:$t.getTransfer(Z);F===i.FLOAT&&(X=i.RGBA32F),F===i.HALF_FLOAT&&(X=i.RGBA16F),F===i.UNSIGNED_BYTE&&(X=St===re?i.SRGB8_ALPHA8:i.RGBA8),F===i.UNSIGNED_SHORT_4_4_4_4&&(X=i.RGBA4),F===i.UNSIGNED_SHORT_5_5_5_1&&(X=i.RGB5_A1)}return(X===i.R16F||X===i.R32F||X===i.RG16F||X===i.RG32F||X===i.RGBA16F||X===i.RGBA32F)&&t.get("EXT_color_buffer_float"),X}function y(E,_){let F;return E?_===null||_===ei||_===zi?F=i.DEPTH24_STENCIL8:_===fn?F=i.DEPTH32F_STENCIL8:_===os&&(F=i.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):_===null||_===ei||_===zi?F=i.DEPTH_COMPONENT24:_===fn?F=i.DEPTH_COMPONENT32F:_===os&&(F=i.DEPTH_COMPONENT16),F}function L(E,_){return m(E)===!0||E.isFramebufferTexture&&E.minFilter!==qe&&E.minFilter!==dn?Math.log2(Math.max(_.width,_.height))+1:E.mipmaps!==void 0&&E.mipmaps.length>0?E.mipmaps.length:E.isCompressedTexture&&Array.isArray(E.image)?_.mipmaps.length:1}function R(E){const _=E.target;_.removeEventListener("dispose",R),U(_),_.isVideoTexture&&h.delete(_)}function A(E){const _=E.target;_.removeEventListener("dispose",A),M(_)}function U(E){const _=n.get(E);if(_.__webglInit===void 0)return;const F=E.source,Z=f.get(F);if(Z){const K=Z[_.__cacheKey];K.usedTimes--,K.usedTimes===0&&S(E),Object.keys(Z).length===0&&f.delete(F)}n.remove(E)}function S(E){const _=n.get(E);i.deleteTexture(_.__webglTexture);const F=E.source,Z=f.get(F);delete Z[_.__cacheKey],a.memory.textures--}function M(E){const _=n.get(E);if(E.depthTexture&&(E.depthTexture.dispose(),n.remove(E.depthTexture)),E.isWebGLCubeRenderTarget)for(let Z=0;Z<6;Z++){if(Array.isArray(_.__webglFramebuffer[Z]))for(let K=0;K<_.__webglFramebuffer[Z].length;K++)i.deleteFramebuffer(_.__webglFramebuffer[Z][K]);else i.deleteFramebuffer(_.__webglFramebuffer[Z]);_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer[Z])}else{if(Array.isArray(_.__webglFramebuffer))for(let Z=0;Z<_.__webglFramebuffer.length;Z++)i.deleteFramebuffer(_.__webglFramebuffer[Z]);else i.deleteFramebuffer(_.__webglFramebuffer);if(_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer),_.__webglMultisampledFramebuffer&&i.deleteFramebuffer(_.__webglMultisampledFramebuffer),_.__webglColorRenderbuffer)for(let Z=0;Z<_.__webglColorRenderbuffer.length;Z++)_.__webglColorRenderbuffer[Z]&&i.deleteRenderbuffer(_.__webglColorRenderbuffer[Z]);_.__webglDepthRenderbuffer&&i.deleteRenderbuffer(_.__webglDepthRenderbuffer)}const F=E.textures;for(let Z=0,K=F.length;Z=s.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+E+" texture units while this GPU supports only "+s.maxTextures),D+=1,E}function V(E){const _=[];return _.push(E.wrapS),_.push(E.wrapT),_.push(E.wrapR||0),_.push(E.magFilter),_.push(E.minFilter),_.push(E.anisotropy),_.push(E.internalFormat),_.push(E.format),_.push(E.type),_.push(E.generateMipmaps),_.push(E.premultiplyAlpha),_.push(E.flipY),_.push(E.unpackAlignment),_.push(E.colorSpace),_.join()}function $(E,_){const F=n.get(E);if(E.isVideoTexture&&Mt(E),E.isRenderTargetTexture===!1&&E.version>0&&F.__version!==E.version){const Z=E.image;if(Z===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(Z.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Y(F,E,_);return}}e.bindTexture(i.TEXTURE_2D,F.__webglTexture,i.TEXTURE0+_)}function G(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_2D_ARRAY,F.__webglTexture,i.TEXTURE0+_)}function J(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_3D,F.__webglTexture,i.TEXTURE0+_)}function k(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){nt(F,E,_);return}e.bindTexture(i.TEXTURE_CUBE_MAP,F.__webglTexture,i.TEXTURE0+_)}const it={[ha]:i.REPEAT,[Jn]:i.CLAMP_TO_EDGE,[ua]:i.MIRRORED_REPEAT},ut={[qe]:i.NEAREST,[hh]:i.NEAREST_MIPMAP_NEAREST,[ms]:i.NEAREST_MIPMAP_LINEAR,[dn]:i.LINEAR,[gr]:i.LINEAR_MIPMAP_NEAREST,[Qn]:i.LINEAR_MIPMAP_LINEAR},yt={[ph]:i.NEVER,[Mh]:i.ALWAYS,[mh]:i.LESS,[Kl]:i.LEQUAL,[gh]:i.EQUAL,[xh]:i.GEQUAL,[_h]:i.GREATER,[vh]:i.NOTEQUAL};function Lt(E,_){if(_.type===fn&&t.has("OES_texture_float_linear")===!1&&(_.magFilter===dn||_.magFilter===gr||_.magFilter===ms||_.magFilter===Qn||_.minFilter===dn||_.minFilter===gr||_.minFilter===ms||_.minFilter===Qn)&&console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),i.texParameteri(E,i.TEXTURE_WRAP_S,it[_.wrapS]),i.texParameteri(E,i.TEXTURE_WRAP_T,it[_.wrapT]),(E===i.TEXTURE_3D||E===i.TEXTURE_2D_ARRAY)&&i.texParameteri(E,i.TEXTURE_WRAP_R,it[_.wrapR]),i.texParameteri(E,i.TEXTURE_MAG_FILTER,ut[_.magFilter]),i.texParameteri(E,i.TEXTURE_MIN_FILTER,ut[_.minFilter]),_.compareFunction&&(i.texParameteri(E,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(E,i.TEXTURE_COMPARE_FUNC,yt[_.compareFunction])),t.has("EXT_texture_filter_anisotropic")===!0){if(_.magFilter===qe||_.minFilter!==ms&&_.minFilter!==Qn||_.type===fn&&t.has("OES_texture_float_linear")===!1)return;if(_.anisotropy>1||n.get(_).__currentAnisotropy){const F=t.get("EXT_texture_filter_anisotropic");i.texParameterf(E,F.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(_.anisotropy,s.getMaxAnisotropy())),n.get(_).__currentAnisotropy=_.anisotropy}}}function qt(E,_){let F=!1;E.__webglInit===void 0&&(E.__webglInit=!0,_.addEventListener("dispose",R));const Z=_.source;let K=f.get(Z);K===void 0&&(K={},f.set(Z,K));const X=V(_);if(X!==E.__cacheKey){K[X]===void 0&&(K[X]={texture:i.createTexture(),usedTimes:0},a.memory.textures++,F=!0),K[X].usedTimes++;const St=K[E.__cacheKey];St!==void 0&&(K[E.__cacheKey].usedTimes--,St.usedTimes===0&&S(_)),E.__cacheKey=X,E.__webglTexture=K[X].texture}return F}function Y(E,_,F){let Z=i.TEXTURE_2D;(_.isDataArrayTexture||_.isCompressedArrayTexture)&&(Z=i.TEXTURE_2D_ARRAY),_.isData3DTexture&&(Z=i.TEXTURE_3D);const K=qt(E,_),X=_.source;e.bindTexture(Z,E.__webglTexture,i.TEXTURE0+F);const St=n.get(X);if(X.version!==St.__version||K===!0){e.activeTexture(i.TEXTURE0+F);const ot=$t.getPrimaries($t.workingColorSpace),dt=_.colorSpace===Fn?null:$t.getPrimaries(_.colorSpace),jt=_.colorSpace===Fn||ot===dt?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,jt);let tt=v(_.image,!1,s.maxTextureSize);tt=ne(_,tt);const mt=r.convert(_.format,_.colorSpace),bt=r.convert(_.type);let Pt=b(_.internalFormat,mt,bt,_.colorSpace,_.isVideoTexture);Lt(Z,_);let ft;const Xt=_.mipmaps,zt=_.isVideoTexture!==!0,ie=St.__version===void 0||K===!0,C=X.dataReady,et=L(_,tt);if(_.isDepthTexture)Pt=y(_.format===Hi,_.type),ie&&(zt?e.texStorage2D(i.TEXTURE_2D,1,Pt,tt.width,tt.height):e.texImage2D(i.TEXTURE_2D,0,Pt,tt.width,tt.height,0,mt,bt,null));else if(_.isDataTexture)if(Xt.length>0){zt&&ie&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let H=0,q=Xt.length;H0){const lt=$o(ft.width,ft.height,_.format,_.type);for(const ct of _.layerUpdates){const Nt=ft.data.subarray(ct*lt/ft.data.BYTES_PER_ELEMENT,(ct+1)*lt/ft.data.BYTES_PER_ELEMENT);e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,ct,ft.width,ft.height,1,mt,Nt)}_.clearLayerUpdates()}else e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,ft.data)}else e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,ft.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else zt?C&&e.texSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,bt,ft.data):e.texImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,mt,bt,ft.data)}else{zt&&ie&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let H=0,q=Xt.length;H0){const H=$o(tt.width,tt.height,_.format,_.type);for(const q of _.layerUpdates){const lt=tt.data.subarray(q*H/tt.data.BYTES_PER_ELEMENT,(q+1)*H/tt.data.BYTES_PER_ELEMENT);e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,q,tt.width,tt.height,1,mt,bt,lt)}_.clearLayerUpdates()}else e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)}else e.texImage3D(i.TEXTURE_2D_ARRAY,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isData3DTexture)zt?(ie&&e.texStorage3D(i.TEXTURE_3D,et,Pt,tt.width,tt.height,tt.depth),C&&e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)):e.texImage3D(i.TEXTURE_3D,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isFramebufferTexture){if(ie)if(zt)e.texStorage2D(i.TEXTURE_2D,et,Pt,tt.width,tt.height);else{let H=tt.width,q=tt.height;for(let lt=0;lt>=1,q>>=1}}else if(Xt.length>0){if(zt&&ie){const H=Et(Xt[0]);e.texStorage2D(i.TEXTURE_2D,et,Pt,H.width,H.height)}for(let H=0,q=Xt.length;H0&&et++;const q=Et(mt[0]);e.texStorage2D(i.TEXTURE_CUBE_MAP,et,Xt,q.width,q.height)}for(let q=0;q<6;q++)if(tt){zt?C&&e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,0,0,mt[q].width,mt[q].height,Pt,ft,mt[q].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,Xt,mt[q].width,mt[q].height,0,Pt,ft,mt[q].data);for(let lt=0;lt>X),bt=Math.max(1,_.height>>X);K===i.TEXTURE_3D||K===i.TEXTURE_2D_ARRAY?e.texImage3D(K,X,dt,mt,bt,_.depth,0,St,ot,null):e.texImage2D(K,X,dt,mt,bt,0,St,ot,null)}e.bindFramebuffer(i.FRAMEBUFFER,E),kt(_)?o.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,Z,K,tt.__webglTexture,0,Bt(_)):(K===i.TEXTURE_2D||K>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&K<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,Z,K,tt.__webglTexture,X),e.bindFramebuffer(i.FRAMEBUFFER,null)}function at(E,_,F){if(i.bindRenderbuffer(i.RENDERBUFFER,E),_.depthBuffer){const Z=_.depthTexture,K=Z&&Z.isDepthTexture?Z.type:null,X=y(_.stencilBuffer,K),St=_.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,ot=Bt(_);kt(_)?o.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,ot,X,_.width,_.height):F?i.renderbufferStorageMultisample(i.RENDERBUFFER,ot,X,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,X,_.width,_.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,St,i.RENDERBUFFER,E)}else{const Z=_.textures;for(let K=0;K{delete _.__boundDepthTexture,delete _.__depthDisposeCallback,Z.removeEventListener("dispose",K)};Z.addEventListener("dispose",K),_.__depthDisposeCallback=K}_.__boundDepthTexture=Z}if(E.depthTexture&&!_.__autoAllocateDepthBuffer){if(F)throw new Error("target.depthTexture not supported in Cube render targets");wt(_.__webglFramebuffer,E)}else if(F){_.__webglDepthbuffer=[];for(let Z=0;Z<6;Z++)if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer[Z]),_.__webglDepthbuffer[Z]===void 0)_.__webglDepthbuffer[Z]=i.createRenderbuffer(),at(_.__webglDepthbuffer[Z],E,!1);else{const K=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,X=_.__webglDepthbuffer[Z];i.bindRenderbuffer(i.RENDERBUFFER,X),i.framebufferRenderbuffer(i.FRAMEBUFFER,K,i.RENDERBUFFER,X)}}else if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer),_.__webglDepthbuffer===void 0)_.__webglDepthbuffer=i.createRenderbuffer(),at(_.__webglDepthbuffer,E,!1);else{const Z=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,K=_.__webglDepthbuffer;i.bindRenderbuffer(i.RENDERBUFFER,K),i.framebufferRenderbuffer(i.FRAMEBUFFER,Z,i.RENDERBUFFER,K)}e.bindFramebuffer(i.FRAMEBUFFER,null)}function Gt(E,_,F){const Z=n.get(E);_!==void 0&&xt(Z.__webglFramebuffer,E,E.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),F!==void 0&&Ut(E)}function ce(E){const _=E.texture,F=n.get(E),Z=n.get(_);E.addEventListener("dispose",A);const K=E.textures,X=E.isWebGLCubeRenderTarget===!0,St=K.length>1;if(St||(Z.__webglTexture===void 0&&(Z.__webglTexture=i.createTexture()),Z.__version=_.version,a.memory.textures++),X){F.__webglFramebuffer=[];for(let ot=0;ot<6;ot++)if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer[ot]=[];for(let dt=0;dt<_.mipmaps.length;dt++)F.__webglFramebuffer[ot][dt]=i.createFramebuffer()}else F.__webglFramebuffer[ot]=i.createFramebuffer()}else{if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer=[];for(let ot=0;ot<_.mipmaps.length;ot++)F.__webglFramebuffer[ot]=i.createFramebuffer()}else F.__webglFramebuffer=i.createFramebuffer();if(St)for(let ot=0,dt=K.length;ot0&&kt(E)===!1){F.__webglMultisampledFramebuffer=i.createFramebuffer(),F.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,F.__webglMultisampledFramebuffer);for(let ot=0;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[ot][dt],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,dt);else xt(F.__webglFramebuffer[ot],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,0);m(_)&&u(i.TEXTURE_CUBE_MAP),e.unbindTexture()}else if(St){for(let ot=0,dt=K.length;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[dt],E,_,i.COLOR_ATTACHMENT0,ot,dt);else xt(F.__webglFramebuffer,E,_,i.COLOR_ATTACHMENT0,ot,0);m(_)&&u(ot),e.unbindTexture()}E.depthBuffer&&Ut(E)}function rt(E){const _=E.textures;for(let F=0,Z=_.length;F0){if(kt(E)===!1){const _=E.textures,F=E.width,Z=E.height;let K=i.COLOR_BUFFER_BIT;const X=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,St=n.get(E),ot=_.length>1;if(ot)for(let dt=0;dt<_.length;dt++)e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,null),e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,null,0);e.bindFramebuffer(i.READ_FRAMEBUFFER,St.__webglMultisampledFramebuffer),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglFramebuffer);for(let dt=0;dt<_.length;dt++){if(E.resolveDepthBuffer&&(E.depthBuffer&&(K|=i.DEPTH_BUFFER_BIT),E.stencilBuffer&&E.resolveStencilBuffer&&(K|=i.STENCIL_BUFFER_BIT)),ot){i.framebufferRenderbuffer(i.READ_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const jt=n.get(_[dt]).__webglTexture;i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,jt,0)}i.blitFramebuffer(0,0,F,Z,0,0,F,Z,K,i.NEAREST),l===!0&&(Ct.length=0,w.length=0,Ct.push(i.COLOR_ATTACHMENT0+dt),E.depthBuffer&&E.resolveDepthBuffer===!1&&(Ct.push(X),w.push(X),i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,w)),i.invalidateFramebuffer(i.READ_FRAMEBUFFER,Ct))}if(e.bindFramebuffer(i.READ_FRAMEBUFFER,null),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),ot)for(let dt=0;dt<_.length;dt++){e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const jt=n.get(_[dt]).__webglTexture;e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,jt,0)}e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglMultisampledFramebuffer)}else if(E.depthBuffer&&E.resolveDepthBuffer===!1&&l){const _=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT;i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,[_])}}}function Bt(E){return Math.min(s.maxSamples,E.samples)}function kt(E){const _=n.get(E);return E.samples>0&&t.has("WEBGL_multisampled_render_to_texture")===!0&&_.__useRenderToTexture!==!1}function Mt(E){const _=a.render.frame;h.get(E)!==_&&(h.set(E,_),E.update())}function ne(E,_){const F=E.colorSpace,Z=E.format,K=E.type;return E.isCompressedTexture===!0||E.isVideoTexture===!0||F!==ki&&F!==Fn&&($t.getTransfer(F)===re?(Z!==an||K!==An)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",F)),_}function Et(E){return typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement?(c.width=E.naturalWidth||E.width,c.height=E.naturalHeight||E.height):typeof VideoFrame<"u"&&E instanceof VideoFrame?(c.width=E.displayWidth,c.height=E.displayHeight):(c.width=E.width,c.height=E.height),c}this.allocateTextureUnit=z,this.resetTextureUnits=W,this.setTexture2D=$,this.setTexture2DArray=G,this.setTexture3D=J,this.setTextureCube=k,this.rebindTextures=Gt,this.setupRenderTarget=ce,this.updateRenderTargetMipmap=rt,this.updateMultisampleRenderTarget=ve,this.setupDepthRenderbuffer=Ut,this.setupFrameBufferTexture=xt,this.useMultisampledRTT=kt}function Hm(i,t){function e(n,s=Fn){let r;const a=$t.getTransfer(s);if(n===An)return i.UNSIGNED_BYTE;if(n===qa)return i.UNSIGNED_SHORT_4_4_4_4;if(n===ja)return i.UNSIGNED_SHORT_5_5_5_1;if(n===Vl)return i.UNSIGNED_INT_5_9_9_9_REV;if(n===Hl)return i.BYTE;if(n===kl)return i.SHORT;if(n===os)return i.UNSIGNED_SHORT;if(n===Ya)return i.INT;if(n===ei)return i.UNSIGNED_INT;if(n===fn)return i.FLOAT;if(n===Tn)return i.HALF_FLOAT;if(n===Gl)return i.ALPHA;if(n===Wl)return i.RGB;if(n===an)return i.RGBA;if(n===Xl)return i.LUMINANCE;if(n===Yl)return i.LUMINANCE_ALPHA;if(n===Ui)return i.DEPTH_COMPONENT;if(n===Hi)return i.DEPTH_STENCIL;if(n===Za)return i.RED;if(n===Ka)return i.RED_INTEGER;if(n===ql)return i.RG;if(n===$a)return i.RG_INTEGER;if(n===Ja)return i.RGBA_INTEGER;if(n===Xs||n===Ys||n===qs||n===js)if(a===re)if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Xs)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Ys)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===qs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===js)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=t.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Xs)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Ys)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===qs)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===js)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===da||n===fa||n===pa||n===ma)if(r=t.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===da)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===fa)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===pa)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===ma)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===ga||n===_a||n===va)if(r=t.get("WEBGL_compressed_texture_etc"),r!==null){if(n===ga||n===_a)return a===re?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===va)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===xa||n===Ma||n===Sa||n===ya||n===Ea||n===ba||n===Ta||n===wa||n===Aa||n===Ra||n===Ca||n===Pa||n===Da||n===La)if(r=t.get("WEBGL_compressed_texture_astc"),r!==null){if(n===xa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===Ma)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Sa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===ya)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ea)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===ba)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Ta)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===wa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Aa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Ra)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Ca)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Pa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Da)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===La)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Zs||n===Ua||n===Ia)if(r=t.get("EXT_texture_compression_bptc"),r!==null){if(n===Zs)return a===re?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Ua)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Ia)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===jl||n===Na||n===Fa||n===Oa)if(r=t.get("EXT_texture_compression_rgtc"),r!==null){if(n===Zs)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Na)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Fa)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Oa)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===zi?i.UNSIGNED_INT_24_8:i[n]!==void 0?i[n]:null}return{convert:e}}const km={type:"move"};class Zr{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new Ci,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new Ci,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new Ci,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!=="visible-blurred"){if(c&&t.hand){a=!0;for(const v of t.hand.values()){const m=e.getJointPose(v,n),u=this._getHandJoint(c,v);m!==null&&(u.matrix.fromArray(m.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,u.jointRadius=m.radius),u.visible=m!==null}const h=c.joints["index-finger-tip"],d=c.joints["thumb-tip"],f=h.position.distanceTo(d.position),p=.02,g=.005;c.inputState.pinching&&f>p+g?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&f<=p-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(km)))}return o!==null&&(o.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){const n=new Ci;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}const Vm=` void main() { gl_Position = vec4( position, 1.0 ); -}`,Vm=` +}`,Gm=` uniform sampler2DArray depthColor; uniform float depthWidth; uniform float depthHeight; @@ -3824,7 +3824,7 @@ void main() { } -}`;class Gm{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(t,e,n){if(this.texture===null){const s=new Ce,r=t.properties.get(s);r.__webglTexture=e.texture,(e.depthNear!==n.depthNear||e.depthFar!==n.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=s}}getMesh(t){if(this.texture!==null&&this.mesh===null){const e=t.cameras[0].viewport,n=new Ne({vertexShader:km,fragmentShader:Vm,uniforms:{depthColor:{value:this.texture},depthWidth:{value:e.z},depthHeight:{value:e.w}}});this.mesh=new Me(new us(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class Wm extends ii{constructor(t,e){super();const n=this;let s=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,d=null,f=null,p=null,g=null;const v=new Gm,m=e.getContextAttributes();let u=null,T=null;const b=[],y=[],L=new vt;let R=null;const A=new Xe;A.viewport=new le;const U=new Xe;U.viewport=new le;const S=[A,U],M=new ou;let D=null,W=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(Y){let et=b[Y];return et===void 0&&(et=new Zr,b[Y]=et),et.getTargetRaySpace()},this.getControllerGrip=function(Y){let et=b[Y];return et===void 0&&(et=new Zr,b[Y]=et),et.getGripSpace()},this.getHand=function(Y){let et=b[Y];return et===void 0&&(et=new Zr,b[Y]=et),et.getHandSpace()};function z(Y){const et=y.indexOf(Y.inputSource);if(et===-1)return;const xt=b[et];xt!==void 0&&(xt.update(Y.inputSource,Y.frame,c||a),xt.dispatchEvent({type:Y.type,data:Y.inputSource}))}function V(){s.removeEventListener("select",z),s.removeEventListener("selectstart",z),s.removeEventListener("selectend",z),s.removeEventListener("squeeze",z),s.removeEventListener("squeezestart",z),s.removeEventListener("squeezeend",z),s.removeEventListener("end",V),s.removeEventListener("inputsourceschange",$);for(let Y=0;Y=0&&(y[at]=null,b[at].disconnect(xt))}for(let et=0;et=y.length){y.push(xt),at=Ut;break}else if(y[Ut]===null){y[Ut]=xt,at=Ut;break}if(at===-1)break}const wt=b[at];wt&&wt.connect(xt)}}const G=new P,J=new P;function k(Y,et,xt){G.setFromMatrixPosition(et.matrixWorld),J.setFromMatrixPosition(xt.matrixWorld);const at=G.distanceTo(J),wt=et.projectionMatrix.elements,Ut=xt.projectionMatrix.elements,Gt=wt[14]/(wt[10]-1),ce=wt[14]/(wt[10]+1),rt=(wt[9]+1)/wt[5],Ct=(wt[9]-1)/wt[5],w=(wt[8]-1)/wt[0],ve=(Ut[8]+1)/Ut[0],Ft=Gt*w,kt=Gt*ve,Mt=at/(-w+ve),ie=Mt*-w;if(et.matrixWorld.decompose(Y.position,Y.quaternion,Y.scale),Y.translateX(ie),Y.translateZ(Mt),Y.matrixWorld.compose(Y.position,Y.quaternion,Y.scale),Y.matrixWorldInverse.copy(Y.matrixWorld).invert(),wt[10]===-1)Y.projectionMatrix.copy(et.projectionMatrix),Y.projectionMatrixInverse.copy(et.projectionMatrixInverse);else{const Et=Gt+Mt,E=ce+Mt,_=Ft-ie,F=kt+(at-ie),j=rt*ce/E*Et,K=Ct*ce/E*Et;Y.projectionMatrix.makePerspective(_,F,j,K,Et,E),Y.projectionMatrixInverse.copy(Y.projectionMatrix).invert()}}function it(Y,et){et===null?Y.matrixWorld.copy(Y.matrix):Y.matrixWorld.multiplyMatrices(et.matrixWorld,Y.matrix),Y.matrixWorldInverse.copy(Y.matrixWorld).invert()}this.updateCamera=function(Y){if(s===null)return;let et=Y.near,xt=Y.far;v.texture!==null&&(v.depthNear>0&&(et=v.depthNear),v.depthFar>0&&(xt=v.depthFar)),M.near=U.near=A.near=et,M.far=U.far=A.far=xt,(D!==M.near||W!==M.far)&&(s.updateRenderState({depthNear:M.near,depthFar:M.far}),D=M.near,W=M.far),A.layers.mask=Y.layers.mask|2,U.layers.mask=Y.layers.mask|4,M.layers.mask=A.layers.mask|U.layers.mask;const at=Y.parent,wt=M.cameras;it(M,at);for(let Ut=0;Ut0&&(m.alphaTest.value=u.alphaTest);const T=t.get(u),b=T.envMap,y=T.envMapRotation;b&&(m.envMap.value=b,jn.copy(y),jn.x*=-1,jn.y*=-1,jn.z*=-1,b.isCubeTexture&&b.isRenderTargetTexture===!1&&(jn.y*=-1,jn.z*=-1),m.envMapRotation.value.setFromMatrix4(Xm.makeRotationFromEuler(jn)),m.flipEnvMap.value=b.isCubeTexture&&b.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=u.reflectivity,m.ior.value=u.ior,m.refractionRatio.value=u.refractionRatio),u.lightMap&&(m.lightMap.value=u.lightMap,m.lightMapIntensity.value=u.lightMapIntensity,e(u.lightMap,m.lightMapTransform)),u.aoMap&&(m.aoMap.value=u.aoMap,m.aoMapIntensity.value=u.aoMapIntensity,e(u.aoMap,m.aoMapTransform))}function a(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform))}function o(m,u){m.dashSize.value=u.dashSize,m.totalSize.value=u.dashSize+u.gapSize,m.scale.value=u.scale}function l(m,u,T,b){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.size.value=u.size*T,m.scale.value=b*.5,u.map&&(m.map.value=u.map,e(u.map,m.uvTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function c(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.rotation.value=u.rotation,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function h(m,u){m.specular.value.copy(u.specular),m.shininess.value=Math.max(u.shininess,1e-4)}function d(m,u){u.gradientMap&&(m.gradientMap.value=u.gradientMap)}function f(m,u){m.metalness.value=u.metalness,u.metalnessMap&&(m.metalnessMap.value=u.metalnessMap,e(u.metalnessMap,m.metalnessMapTransform)),m.roughness.value=u.roughness,u.roughnessMap&&(m.roughnessMap.value=u.roughnessMap,e(u.roughnessMap,m.roughnessMapTransform)),u.envMap&&(m.envMapIntensity.value=u.envMapIntensity)}function p(m,u,T){m.ior.value=u.ior,u.sheen>0&&(m.sheenColor.value.copy(u.sheenColor).multiplyScalar(u.sheen),m.sheenRoughness.value=u.sheenRoughness,u.sheenColorMap&&(m.sheenColorMap.value=u.sheenColorMap,e(u.sheenColorMap,m.sheenColorMapTransform)),u.sheenRoughnessMap&&(m.sheenRoughnessMap.value=u.sheenRoughnessMap,e(u.sheenRoughnessMap,m.sheenRoughnessMapTransform))),u.clearcoat>0&&(m.clearcoat.value=u.clearcoat,m.clearcoatRoughness.value=u.clearcoatRoughness,u.clearcoatMap&&(m.clearcoatMap.value=u.clearcoatMap,e(u.clearcoatMap,m.clearcoatMapTransform)),u.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=u.clearcoatRoughnessMap,e(u.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),u.clearcoatNormalMap&&(m.clearcoatNormalMap.value=u.clearcoatNormalMap,e(u.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(u.clearcoatNormalScale),u.side===He&&m.clearcoatNormalScale.value.negate())),u.dispersion>0&&(m.dispersion.value=u.dispersion),u.iridescence>0&&(m.iridescence.value=u.iridescence,m.iridescenceIOR.value=u.iridescenceIOR,m.iridescenceThicknessMinimum.value=u.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=u.iridescenceThicknessRange[1],u.iridescenceMap&&(m.iridescenceMap.value=u.iridescenceMap,e(u.iridescenceMap,m.iridescenceMapTransform)),u.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=u.iridescenceThicknessMap,e(u.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),u.transmission>0&&(m.transmission.value=u.transmission,m.transmissionSamplerMap.value=T.texture,m.transmissionSamplerSize.value.set(T.width,T.height),u.transmissionMap&&(m.transmissionMap.value=u.transmissionMap,e(u.transmissionMap,m.transmissionMapTransform)),m.thickness.value=u.thickness,u.thicknessMap&&(m.thicknessMap.value=u.thicknessMap,e(u.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=u.attenuationDistance,m.attenuationColor.value.copy(u.attenuationColor)),u.anisotropy>0&&(m.anisotropyVector.value.set(u.anisotropy*Math.cos(u.anisotropyRotation),u.anisotropy*Math.sin(u.anisotropyRotation)),u.anisotropyMap&&(m.anisotropyMap.value=u.anisotropyMap,e(u.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=u.specularIntensity,m.specularColor.value.copy(u.specularColor),u.specularColorMap&&(m.specularColorMap.value=u.specularColorMap,e(u.specularColorMap,m.specularColorMapTransform)),u.specularIntensityMap&&(m.specularIntensityMap.value=u.specularIntensityMap,e(u.specularIntensityMap,m.specularIntensityMapTransform))}function g(m,u){u.matcap&&(m.matcap.value=u.matcap)}function v(m,u){const T=t.get(u).light;m.referencePosition.value.setFromMatrixPosition(T.matrixWorld),m.nearDistance.value=T.shadow.camera.near,m.farDistance.value=T.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function qm(i,t,e,n){let s={},r={},a=[];const o=i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS);function l(T,b){const y=b.program;n.uniformBlockBinding(T,y)}function c(T,b){let y=s[T.id];y===void 0&&(g(T),y=h(T),s[T.id]=y,T.addEventListener("dispose",m));const L=b.program;n.updateUBOMapping(T,L);const R=t.render.frame;r[T.id]!==R&&(f(T),r[T.id]=R)}function h(T){const b=d();T.__bindingPointIndex=b;const y=i.createBuffer(),L=T.__size,R=T.usage;return i.bindBuffer(i.UNIFORM_BUFFER,y),i.bufferData(i.UNIFORM_BUFFER,L,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,b,y),y}function d(){for(let T=0;T0&&(y+=L-R),T.__size=y,T.__cache={},this}function v(T){const b={boundary:0,storage:0};return typeof T=="number"||typeof T=="boolean"?(b.boundary=4,b.storage=4):T.isVector2?(b.boundary=8,b.storage=8):T.isVector3||T.isColor?(b.boundary=16,b.storage=12):T.isVector4?(b.boundary=16,b.storage=16):T.isMatrix3?(b.boundary=48,b.storage=48):T.isMatrix4?(b.boundary=64,b.storage=64):T.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",T),b}function m(T){const b=T.target;b.removeEventListener("dispose",m);const y=a.indexOf(b.__bindingPointIndex);a.splice(y,1),i.deleteBuffer(s[b.id]),delete s[b.id],delete r[b.id]}function u(){for(const T in s)i.deleteBuffer(s[T]);a=[],s={},r={}}return{bind:l,update:c,dispose:u}}class jm{constructor(t={}){const{canvas:e=yh(),context:n=null,depth:s=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:d=!1,reverseDepthBuffer:f=!1}=t;this.isWebGLRenderer=!0;let p;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");p=n.getContextAttributes().alpha}else p=a;const g=new Uint32Array(4),v=new Int32Array(4);let m=null,u=null;const T=[],b=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Je,this.toneMapping=On,this.toneMappingExposure=1;const y=this;let L=!1,R=0,A=0,U=null,S=-1,M=null;const D=new le,W=new le;let z=null;const V=new pt(0);let $=0,G=e.width,J=e.height,k=1,it=null,ut=null;const yt=new le(0,0,G,J),Lt=new le(0,0,G,J);let jt=!1;const Y=new to;let et=!1,xt=!1;this.transmissionResolutionScale=1;const at=new ne,wt=new ne,Ut=new P,Gt=new le,ce={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let rt=!1;function Ct(){return U===null?k:1}let w=n;function ve(x,I){return e.getContext(x,I)}try{const x={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Xa}`),e.addEventListener("webglcontextlost",Z,!1),e.addEventListener("webglcontextrestored",ht,!1),e.addEventListener("webglcontextcreationerror",lt,!1),w===null){const I="webgl2";if(w=ve(I,x),w===null)throw ve(I)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(x){throw console.error("THREE.WebGLRenderer: "+x.message),x}let Ft,kt,Mt,ie,Et,E,_,F,j,K,X,St,ot,dt,Zt,tt,mt,bt,Pt,ft,Yt,zt,Xt,C;function nt(){Ft=new ip(w),Ft.init(),zt=new zm(w,Ft),kt=new $f(w,Ft,t,zt),Mt=new Om(w,Ft),kt.reverseDepthBuffer&&f&&Mt.buffers.depth.setReversed(!0),ie=new ap(w),Et=new bm,E=new Bm(w,Ft,Mt,Et,kt,zt,ie),_=new Qf(y),F=new np(y),j=new du(w),Xt=new Zf(w,j),K=new sp(w,j,ie,Xt),X=new lp(w,K,j,ie),Pt=new op(w,kt,E),tt=new Jf(Et),St=new Em(y,_,F,Ft,kt,Xt,tt),ot=new Ym(y,Et),dt=new wm,Zt=new Lm(Ft),bt=new jf(y,_,F,Mt,X,p,l),mt=new Nm(y,X,kt),C=new qm(w,ie,kt,Mt),ft=new Kf(w,Ft,ie),Yt=new rp(w,Ft,ie),ie.programs=St.programs,y.capabilities=kt,y.extensions=Ft,y.properties=Et,y.renderLists=dt,y.shadowMap=mt,y.state=Mt,y.info=ie}nt();const H=new Wm(y,w);this.xr=H,this.getContext=function(){return w},this.getContextAttributes=function(){return w.getContextAttributes()},this.forceContextLoss=function(){const x=Ft.get("WEBGL_lose_context");x&&x.loseContext()},this.forceContextRestore=function(){const x=Ft.get("WEBGL_lose_context");x&&x.restoreContext()},this.getPixelRatio=function(){return k},this.setPixelRatio=function(x){x!==void 0&&(k=x,this.setSize(G,J,!1))},this.getSize=function(x){return x.set(G,J)},this.setSize=function(x,I,O=!0){if(H.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}G=x,J=I,e.width=Math.floor(x*k),e.height=Math.floor(I*k),O===!0&&(e.style.width=x+"px",e.style.height=I+"px"),this.setViewport(0,0,x,I)},this.getDrawingBufferSize=function(x){return x.set(G*k,J*k).floor()},this.setDrawingBufferSize=function(x,I,O){G=x,J=I,k=O,e.width=Math.floor(x*O),e.height=Math.floor(I*O),this.setViewport(0,0,x,I)},this.getCurrentViewport=function(x){return x.copy(D)},this.getViewport=function(x){return x.copy(yt)},this.setViewport=function(x,I,O,B){x.isVector4?yt.set(x.x,x.y,x.z,x.w):yt.set(x,I,O,B),Mt.viewport(D.copy(yt).multiplyScalar(k).round())},this.getScissor=function(x){return x.copy(Lt)},this.setScissor=function(x,I,O,B){x.isVector4?Lt.set(x.x,x.y,x.z,x.w):Lt.set(x,I,O,B),Mt.scissor(W.copy(Lt).multiplyScalar(k).round())},this.getScissorTest=function(){return jt},this.setScissorTest=function(x){Mt.setScissorTest(jt=x)},this.setOpaqueSort=function(x){it=x},this.setTransparentSort=function(x){ut=x},this.getClearColor=function(x){return x.copy(bt.getClearColor())},this.setClearColor=function(){bt.setClearColor.apply(bt,arguments)},this.getClearAlpha=function(){return bt.getClearAlpha()},this.setClearAlpha=function(){bt.setClearAlpha.apply(bt,arguments)},this.clear=function(x=!0,I=!0,O=!0){let B=0;if(x){let N=!1;if(U!==null){const Q=U.texture.format;N=Q===Ja||Q===$a||Q===Ka}if(N){const Q=U.texture.type,ct=Q===An||Q===ei||Q===os||Q===zi||Q===qa||Q===ja,gt=bt.getClearColor(),_t=bt.getClearAlpha(),It=gt.r,Nt=gt.g,Tt=gt.b;ct?(g[0]=It,g[1]=Nt,g[2]=Tt,g[3]=_t,w.clearBufferuiv(w.COLOR,0,g)):(v[0]=It,v[1]=Nt,v[2]=Tt,v[3]=_t,w.clearBufferiv(w.COLOR,0,v))}else B|=w.COLOR_BUFFER_BIT}I&&(B|=w.DEPTH_BUFFER_BIT),O&&(B|=w.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),w.clear(B)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",Z,!1),e.removeEventListener("webglcontextrestored",ht,!1),e.removeEventListener("webglcontextcreationerror",lt,!1),bt.dispose(),dt.dispose(),Zt.dispose(),Et.dispose(),_.dispose(),F.dispose(),X.dispose(),Xt.dispose(),C.dispose(),St.dispose(),H.dispose(),H.removeEventListener("sessionstart",so),H.removeEventListener("sessionend",ro),kn.stop()};function Z(x){x.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),L=!0}function ht(){console.log("THREE.WebGLRenderer: Context Restored."),L=!1;const x=ie.autoReset,I=mt.enabled,O=mt.autoUpdate,B=mt.needsUpdate,N=mt.type;nt(),ie.autoReset=x,mt.enabled=I,mt.autoUpdate=O,mt.needsUpdate=B,mt.type=N}function lt(x){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",x.statusMessage)}function Ot(x){const I=x.target;I.removeEventListener("dispose",Ot),he(I)}function he(x){Ee(x),Et.remove(x)}function Ee(x){const I=Et.get(x).programs;I!==void 0&&(I.forEach(function(O){St.releaseProgram(O)}),x.isShaderMaterial&&St.releaseShaderCache(x))}this.renderBufferDirect=function(x,I,O,B,N,Q){I===null&&(I=ce);const ct=N.isMesh&&N.matrixWorld.determinant()<0,gt=xc(x,I,O,B,N);Mt.setMaterial(B,ct);let _t=O.index,It=1;if(B.wireframe===!0){if(_t=K.getWireframeAttribute(O),_t===void 0)return;It=2}const Nt=O.drawRange,Tt=O.attributes.position;let Kt=Nt.start*It,te=(Nt.start+Nt.count)*It;Q!==null&&(Kt=Math.max(Kt,Q.start*It),te=Math.min(te,(Q.start+Q.count)*It)),_t!==null?(Kt=Math.max(Kt,0),te=Math.min(te,_t.count)):Tt!=null&&(Kt=Math.max(Kt,0),te=Math.min(te,Tt.count));const me=te-Kt;if(me<0||me===1/0)return;Xt.setup(N,B,gt,O,_t);let fe,$t=ft;if(_t!==null&&(fe=j.get(_t),$t=Yt,$t.setIndex(fe)),N.isMesh)B.wireframe===!0?(Mt.setLineWidth(B.wireframeLinewidth*Ct()),$t.setMode(w.LINES)):$t.setMode(w.TRIANGLES);else if(N.isLine){let At=B.linewidth;At===void 0&&(At=1),Mt.setLineWidth(At*Ct()),N.isLineSegments?$t.setMode(w.LINES):N.isLineLoop?$t.setMode(w.LINE_LOOP):$t.setMode(w.LINE_STRIP)}else N.isPoints?$t.setMode(w.POINTS):N.isSprite&&$t.setMode(w.TRIANGLES);if(N.isBatchedMesh)if(N._multiDrawInstances!==null)$t.renderMultiDrawInstances(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount,N._multiDrawInstances);else if(Ft.get("WEBGL_multi_draw"))$t.renderMultiDraw(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount);else{const At=N._multiDrawStarts,Te=N._multiDrawCounts,ee=N._multiDrawCount,en=_t?j.get(_t).bytesPerElement:1,ai=Et.get(B).currentProgram.getUniforms();for(let ke=0;ke{function Q(){if(B.forEach(function(ct){Et.get(ct).currentProgram.isReady()&&B.delete(ct)}),B.size===0){N(x);return}setTimeout(Q,10)}Ft.get("KHR_parallel_shader_compile")!==null?Q():setTimeout(Q,10)})};let tn=null;function mn(x){tn&&tn(x)}function so(){kn.stop()}function ro(){kn.start()}const kn=new uc;kn.setAnimationLoop(mn),typeof self<"u"&&kn.setContext(self),this.setAnimationLoop=function(x){tn=x,H.setAnimationLoop(x),x===null?kn.stop():kn.start()},H.addEventListener("sessionstart",so),H.addEventListener("sessionend",ro),this.render=function(x,I){if(I!==void 0&&I.isCamera!==!0){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(L===!0)return;if(x.matrixWorldAutoUpdate===!0&&x.updateMatrixWorld(),I.parent===null&&I.matrixWorldAutoUpdate===!0&&I.updateMatrixWorld(),H.enabled===!0&&H.isPresenting===!0&&(H.cameraAutoUpdate===!0&&H.updateCamera(I),I=H.getCamera()),x.isScene===!0&&x.onBeforeRender(y,x,I,U),u=Zt.get(x,b.length),u.init(I),b.push(u),wt.multiplyMatrices(I.projectionMatrix,I.matrixWorldInverse),Y.setFromProjectionMatrix(wt),xt=this.localClippingEnabled,et=tt.init(this.clippingPlanes,xt),m=dt.get(x,T.length),m.init(),T.push(m),H.enabled===!0&&H.isPresenting===!0){const Q=y.xr.getDepthSensingMesh();Q!==null&&pr(Q,I,-1/0,y.sortObjects)}pr(x,I,0,y.sortObjects),m.finish(),y.sortObjects===!0&&m.sort(it,ut),rt=H.enabled===!1||H.isPresenting===!1||H.hasDepthSensing()===!1,rt&&bt.addToRenderList(m,x),this.info.render.frame++,et===!0&&tt.beginShadows();const O=u.state.shadowsArray;mt.render(O,x,I),et===!0&&tt.endShadows(),this.info.autoReset===!0&&this.info.reset();const B=m.opaque,N=m.transmissive;if(u.setupLights(),I.isArrayCamera){const Q=I.cameras;if(N.length>0)for(let ct=0,gt=Q.length;ct0&&oo(B,N,x,I),rt&&bt.render(x),ao(m,x,I);U!==null&&A===0&&(E.updateMultisampleRenderTarget(U),E.updateRenderTargetMipmap(U)),x.isScene===!0&&x.onAfterRender(y,x,I),Xt.resetDefaultState(),S=-1,M=null,b.pop(),b.length>0?(u=b[b.length-1],et===!0&&tt.setGlobalState(y.clippingPlanes,u.state.camera)):u=null,T.pop(),T.length>0?m=T[T.length-1]:m=null};function pr(x,I,O,B){if(x.visible===!1)return;if(x.layers.test(I.layers)){if(x.isGroup)O=x.renderOrder;else if(x.isLOD)x.autoUpdate===!0&&x.update(I);else if(x.isLight)u.pushLight(x),x.castShadow&&u.pushShadow(x);else if(x.isSprite){if(!x.frustumCulled||Y.intersectsSprite(x)){B&&Gt.setFromMatrixPosition(x.matrixWorld).applyMatrix4(wt);const ct=X.update(x),gt=x.material;gt.visible&&m.push(x,ct,gt,O,Gt.z,null)}}else if((x.isMesh||x.isLine||x.isPoints)&&(!x.frustumCulled||Y.intersectsObject(x))){const ct=X.update(x),gt=x.material;if(B&&(x.boundingSphere!==void 0?(x.boundingSphere===null&&x.computeBoundingSphere(),Gt.copy(x.boundingSphere.center)):(ct.boundingSphere===null&&ct.computeBoundingSphere(),Gt.copy(ct.boundingSphere.center)),Gt.applyMatrix4(x.matrixWorld).applyMatrix4(wt)),Array.isArray(gt)){const _t=ct.groups;for(let It=0,Nt=_t.length;It0&&fs(N,I,O),Q.length>0&&fs(Q,I,O),ct.length>0&&fs(ct,I,O),Mt.buffers.depth.setTest(!0),Mt.buffers.depth.setMask(!0),Mt.buffers.color.setMask(!0),Mt.setPolygonOffset(!1)}function oo(x,I,O,B){if((O.isScene===!0?O.overrideMaterial:null)!==null)return;u.state.transmissionRenderTarget[B.id]===void 0&&(u.state.transmissionRenderTarget[B.id]=new on(1,1,{generateMipmaps:!0,type:Ft.has("EXT_color_buffer_half_float")||Ft.has("EXT_color_buffer_float")?Tn:An,minFilter:Qn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:Jt.workingColorSpace}));const Q=u.state.transmissionRenderTarget[B.id],ct=B.viewport||D;Q.setSize(ct.z*y.transmissionResolutionScale,ct.w*y.transmissionResolutionScale);const gt=y.getRenderTarget();y.setRenderTarget(Q),y.getClearColor(V),$=y.getClearAlpha(),$<1&&y.setClearColor(16777215,.5),y.clear(),rt&&bt.render(O);const _t=y.toneMapping;y.toneMapping=On;const It=B.viewport;if(B.viewport!==void 0&&(B.viewport=void 0),u.setupLightsView(B),et===!0&&tt.setGlobalState(y.clippingPlanes,B),fs(x,O,B),E.updateMultisampleRenderTarget(Q),E.updateRenderTargetMipmap(Q),Ft.has("WEBGL_multisampled_render_to_texture")===!1){let Nt=!1;for(let Tt=0,Kt=I.length;Tt0),Tt=!!O.morphAttributes.position,Kt=!!O.morphAttributes.normal,te=!!O.morphAttributes.color;let me=On;B.toneMapped&&(U===null||U.isXRRenderTarget===!0)&&(me=y.toneMapping);const fe=O.morphAttributes.position||O.morphAttributes.normal||O.morphAttributes.color,$t=fe!==void 0?fe.length:0,At=Et.get(B),Te=u.state.lights;if(et===!0&&(xt===!0||x!==M)){const De=x===M&&B.id===S;tt.setState(B,x,De)}let ee=!1;B.version===At.__version?(At.needsLights&&At.lightsStateVersion!==Te.state.version||At.outputColorSpace!==gt||N.isBatchedMesh&&At.batching===!1||!N.isBatchedMesh&&At.batching===!0||N.isBatchedMesh&&At.batchingColor===!0&&N.colorTexture===null||N.isBatchedMesh&&At.batchingColor===!1&&N.colorTexture!==null||N.isInstancedMesh&&At.instancing===!1||!N.isInstancedMesh&&At.instancing===!0||N.isSkinnedMesh&&At.skinning===!1||!N.isSkinnedMesh&&At.skinning===!0||N.isInstancedMesh&&At.instancingColor===!0&&N.instanceColor===null||N.isInstancedMesh&&At.instancingColor===!1&&N.instanceColor!==null||N.isInstancedMesh&&At.instancingMorph===!0&&N.morphTexture===null||N.isInstancedMesh&&At.instancingMorph===!1&&N.morphTexture!==null||At.envMap!==_t||B.fog===!0&&At.fog!==Q||At.numClippingPlanes!==void 0&&(At.numClippingPlanes!==tt.numPlanes||At.numIntersection!==tt.numIntersection)||At.vertexAlphas!==It||At.vertexTangents!==Nt||At.morphTargets!==Tt||At.morphNormals!==Kt||At.morphColors!==te||At.toneMapping!==me||At.morphTargetsCount!==$t)&&(ee=!0):(ee=!0,At.__version=B.version);let en=At.currentProgram;ee===!0&&(en=ps(B,I,N));let ai=!1,ke=!1,Xi=!1;const ue=en.getUniforms(),je=At.uniforms;if(Mt.useProgram(en.program)&&(ai=!0,ke=!0,Xi=!0),B.id!==S&&(S=B.id,ke=!0),ai||M!==x){Mt.buffers.depth.getReversed()?(at.copy(x.projectionMatrix),bh(at),Th(at),ue.setValue(w,"projectionMatrix",at)):ue.setValue(w,"projectionMatrix",x.projectionMatrix),ue.setValue(w,"viewMatrix",x.matrixWorldInverse);const Fe=ue.map.cameraPosition;Fe!==void 0&&Fe.setValue(w,Ut.setFromMatrixPosition(x.matrixWorld)),kt.logarithmicDepthBuffer&&ue.setValue(w,"logDepthBufFC",2/(Math.log(x.far+1)/Math.LN2)),(B.isMeshPhongMaterial||B.isMeshToonMaterial||B.isMeshLambertMaterial||B.isMeshBasicMaterial||B.isMeshStandardMaterial||B.isShaderMaterial)&&ue.setValue(w,"isOrthographic",x.isOrthographicCamera===!0),M!==x&&(M=x,ke=!0,Xi=!0)}if(N.isSkinnedMesh){ue.setOptional(w,N,"bindMatrix"),ue.setOptional(w,N,"bindMatrixInverse");const De=N.skeleton;De&&(De.boneTexture===null&&De.computeBoneTexture(),ue.setValue(w,"boneTexture",De.boneTexture,E))}N.isBatchedMesh&&(ue.setOptional(w,N,"batchingTexture"),ue.setValue(w,"batchingTexture",N._matricesTexture,E),ue.setOptional(w,N,"batchingIdTexture"),ue.setValue(w,"batchingIdTexture",N._indirectTexture,E),ue.setOptional(w,N,"batchingColorTexture"),N._colorsTexture!==null&&ue.setValue(w,"batchingColorTexture",N._colorsTexture,E));const Ze=O.morphAttributes;if((Ze.position!==void 0||Ze.normal!==void 0||Ze.color!==void 0)&&Pt.update(N,O,en),(ke||At.receiveShadow!==N.receiveShadow)&&(At.receiveShadow=N.receiveShadow,ue.setValue(w,"receiveShadow",N.receiveShadow)),B.isMeshGouraudMaterial&&B.envMap!==null&&(je.envMap.value=_t,je.flipEnvMap.value=_t.isCubeTexture&&_t.isRenderTargetTexture===!1?-1:1),B.isMeshStandardMaterial&&B.envMap===null&&I.environment!==null&&(je.envMapIntensity.value=I.environmentIntensity),ke&&(ue.setValue(w,"toneMappingExposure",y.toneMappingExposure),At.needsLights&&Mc(je,Xi),Q&&B.fog===!0&&ot.refreshFogUniforms(je,Q),ot.refreshMaterialUniforms(je,B,k,J,u.state.transmissionRenderTarget[x.id]),$s.upload(w,co(At),je,E)),B.isShaderMaterial&&B.uniformsNeedUpdate===!0&&($s.upload(w,co(At),je,E),B.uniformsNeedUpdate=!1),B.isSpriteMaterial&&ue.setValue(w,"center",N.center),ue.setValue(w,"modelViewMatrix",N.modelViewMatrix),ue.setValue(w,"normalMatrix",N.normalMatrix),ue.setValue(w,"modelMatrix",N.matrixWorld),B.isShaderMaterial||B.isRawShaderMaterial){const De=B.uniformsGroups;for(let Fe=0,mr=De.length;Fe0&&E.useMultisampledRTT(x)===!1?N=Et.get(x).__webglMultisampledFramebuffer:Array.isArray(Nt)?N=Nt[O]:N=Nt,D.copy(x.viewport),W.copy(x.scissor),z=x.scissorTest}else D.copy(yt).multiplyScalar(k).floor(),W.copy(Lt).multiplyScalar(k).floor(),z=jt;if(O!==0&&(N=yc),Mt.bindFramebuffer(w.FRAMEBUFFER,N)&&B&&Mt.drawBuffers(x,N),Mt.viewport(D),Mt.scissor(W),Mt.setScissorTest(z),Q){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_CUBE_MAP_POSITIVE_X+I,_t.__webglTexture,O)}else if(ct){const _t=Et.get(x.texture),It=I;w.framebufferTextureLayer(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,_t.__webglTexture,O,It)}else if(x!==null&&O!==0){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,_t.__webglTexture,O)}S=-1},this.readRenderTargetPixels=function(x,I,O,B,N,Q,ct){if(!(x&&x.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ct!==void 0&&(gt=gt[ct]),gt){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);try{const _t=x.texture,It=_t.format,Nt=_t.type;if(!kt.textureFormatReadable(It)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!kt.textureTypeReadable(Nt)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N&&w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Nt),Q)}finally{const _t=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,_t)}}},this.readRenderTargetPixelsAsync=async function(x,I,O,B,N,Q,ct){if(!(x&&x.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ct!==void 0&&(gt=gt[ct]),gt){const _t=x.texture,It=_t.format,Nt=_t.type;if(!kt.textureFormatReadable(It))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!kt.textureTypeReadable(Nt))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);const Tt=w.createBuffer();w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.bufferData(w.PIXEL_PACK_BUFFER,Q.byteLength,w.STREAM_READ),w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Nt),0);const Kt=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,Kt);const te=w.fenceSync(w.SYNC_GPU_COMMANDS_COMPLETE,0);return w.flush(),await Eh(w,te,4),w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.getBufferSubData(w.PIXEL_PACK_BUFFER,0,Q),w.deleteBuffer(Tt),w.deleteSync(te),Q}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(x,I=null,O=0){x.isTexture!==!0&&(Ai("WebGLRenderer: copyFramebufferToTexture function signature has changed."),I=arguments[0]||null,x=arguments[1]);const B=Math.pow(2,-O),N=Math.floor(x.image.width*B),Q=Math.floor(x.image.height*B),ct=I!==null?I.x:0,gt=I!==null?I.y:0;E.setTexture2D(x,0),w.copyTexSubImage2D(w.TEXTURE_2D,O,0,0,ct,gt,N,Q),Mt.unbindTexture()};const Ec=w.createFramebuffer(),bc=w.createFramebuffer();this.copyTextureToTexture=function(x,I,O=null,B=null,N=0,Q=null){x.isTexture!==!0&&(Ai("WebGLRenderer: copyTextureToTexture function signature has changed."),B=arguments[0]||null,x=arguments[1],I=arguments[2],Q=arguments[3]||0,O=null),Q===null&&(N!==0?(Ai("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Q=N,N=0):Q=0);let ct,gt,_t,It,Nt,Tt,Kt,te,me;const fe=x.isCompressedTexture?x.mipmaps[Q]:x.image;if(O!==null)ct=O.max.x-O.min.x,gt=O.max.y-O.min.y,_t=O.isBox3?O.max.z-O.min.z:1,It=O.min.x,Nt=O.min.y,Tt=O.isBox3?O.min.z:0;else{const Ze=Math.pow(2,-N);ct=Math.floor(fe.width*Ze),gt=Math.floor(fe.height*Ze),x.isDataArrayTexture?_t=fe.depth:x.isData3DTexture?_t=Math.floor(fe.depth*Ze):_t=1,It=0,Nt=0,Tt=0}B!==null?(Kt=B.x,te=B.y,me=B.z):(Kt=0,te=0,me=0);const $t=zt.convert(I.format),At=zt.convert(I.type);let Te;I.isData3DTexture?(E.setTexture3D(I,0),Te=w.TEXTURE_3D):I.isDataArrayTexture||I.isCompressedArrayTexture?(E.setTexture2DArray(I,0),Te=w.TEXTURE_2D_ARRAY):(E.setTexture2D(I,0),Te=w.TEXTURE_2D),w.pixelStorei(w.UNPACK_FLIP_Y_WEBGL,I.flipY),w.pixelStorei(w.UNPACK_PREMULTIPLY_ALPHA_WEBGL,I.premultiplyAlpha),w.pixelStorei(w.UNPACK_ALIGNMENT,I.unpackAlignment);const ee=w.getParameter(w.UNPACK_ROW_LENGTH),en=w.getParameter(w.UNPACK_IMAGE_HEIGHT),ai=w.getParameter(w.UNPACK_SKIP_PIXELS),ke=w.getParameter(w.UNPACK_SKIP_ROWS),Xi=w.getParameter(w.UNPACK_SKIP_IMAGES);w.pixelStorei(w.UNPACK_ROW_LENGTH,fe.width),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,fe.height),w.pixelStorei(w.UNPACK_SKIP_PIXELS,It),w.pixelStorei(w.UNPACK_SKIP_ROWS,Nt),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Tt);const ue=x.isDataArrayTexture||x.isData3DTexture,je=I.isDataArrayTexture||I.isData3DTexture;if(x.isDepthTexture){const Ze=Et.get(x),De=Et.get(I),Fe=Et.get(Ze.__renderTarget),mr=Et.get(De.__renderTarget);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,Fe.__webglFramebuffer),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,mr.__webglFramebuffer);for(let Vn=0;Vn<_t;Vn++)ue&&(w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(x).__webglTexture,N,Tt+Vn),w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(I).__webglTexture,Q,me+Vn)),w.blitFramebuffer(It,Nt,ct,gt,Kt,te,ct,gt,w.DEPTH_BUFFER_BIT,w.NEAREST);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else if(N!==0||x.isRenderTargetTexture||Et.has(x)){const Ze=Et.get(x),De=Et.get(I);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,Ec),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,bc);for(let Fe=0;Fe<_t;Fe++)ue?w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Ze.__webglTexture,N,Tt+Fe):w.framebufferTexture2D(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,Ze.__webglTexture,N),je?w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,De.__webglTexture,Q,me+Fe):w.framebufferTexture2D(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,De.__webglTexture,Q),N!==0?w.blitFramebuffer(It,Nt,ct,gt,Kt,te,ct,gt,w.COLOR_BUFFER_BIT,w.NEAREST):je?w.copyTexSubImage3D(Te,Q,Kt,te,me+Fe,It,Nt,ct,gt):w.copyTexSubImage2D(Te,Q,Kt,te,It,Nt,ct,gt);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else je?x.isDataTexture||x.isData3DTexture?w.texSubImage3D(Te,Q,Kt,te,me,ct,gt,_t,$t,At,fe.data):I.isCompressedArrayTexture?w.compressedTexSubImage3D(Te,Q,Kt,te,me,ct,gt,_t,$t,fe.data):w.texSubImage3D(Te,Q,Kt,te,me,ct,gt,_t,$t,At,fe):x.isDataTexture?w.texSubImage2D(w.TEXTURE_2D,Q,Kt,te,ct,gt,$t,At,fe.data):x.isCompressedTexture?w.compressedTexSubImage2D(w.TEXTURE_2D,Q,Kt,te,fe.width,fe.height,$t,fe.data):w.texSubImage2D(w.TEXTURE_2D,Q,Kt,te,ct,gt,$t,At,fe);w.pixelStorei(w.UNPACK_ROW_LENGTH,ee),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,en),w.pixelStorei(w.UNPACK_SKIP_PIXELS,ai),w.pixelStorei(w.UNPACK_SKIP_ROWS,ke),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Xi),Q===0&&I.generateMipmaps&&w.generateMipmap(Te),Mt.unbindTexture()},this.copyTextureToTexture3D=function(x,I,O=null,B=null,N=0){return x.isTexture!==!0&&(Ai("WebGLRenderer: copyTextureToTexture3D function signature has changed."),O=arguments[0]||null,B=arguments[1]||null,x=arguments[2],I=arguments[3],N=arguments[4]||0),Ai('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(x,I,O,B,N)},this.initRenderTarget=function(x){Et.get(x).__webglFramebuffer===void 0&&E.setupRenderTarget(x)},this.initTexture=function(x){x.isCubeTexture?E.setTextureCube(x,0):x.isData3DTexture?E.setTexture3D(x,0):x.isDataArrayTexture||x.isCompressedArrayTexture?E.setTexture2DArray(x,0):E.setTexture2D(x,0),Mt.unbindTexture()},this.resetState=function(){R=0,A=0,U=null,Mt.reset(),Xt.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return En}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;const e=this.getContext();e.drawingBufferColorspace=Jt._getDrawingBufferColorSpace(t),e.unpackColorSpace=Jt._getUnpackColorSpace()}}const yl={type:"change"},io={type:"start"},gc={type:"end"},Ws=new cs,El=new Nn,Zm=Math.cos(70*Sh.DEG2RAD),xe=new P,Oe=2*Math.PI,oe={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Kr=1e-6;class Km extends hu{constructor(t,e=null){super(t,e),this.state=oe.NONE,this.enabled=!0,this.target=new P,this.cursor=new P,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Di.ROTATE,MIDDLE:Di.DOLLY,RIGHT:Di.PAN},this.touches={ONE:Ri.ROTATE,TWO:Ri.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new P,this._lastQuaternion=new ni,this._lastTargetPosition=new P,this._quat=new ni().setFromUnitVectors(t.up,new P(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new Ko,this._sphericalDelta=new Ko,this._scale=1,this._panOffset=new P,this._rotateStart=new vt,this._rotateEnd=new vt,this._rotateDelta=new vt,this._panStart=new vt,this._panEnd=new vt,this._panDelta=new vt,this._dollyStart=new vt,this._dollyEnd=new vt,this._dollyDelta=new vt,this._dollyDirection=new P,this._mouse=new vt,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Jm.bind(this),this._onPointerDown=$m.bind(this),this._onPointerUp=Qm.bind(this),this._onContextMenu=ag.bind(this),this._onMouseWheel=ng.bind(this),this._onKeyDown=ig.bind(this),this._onTouchStart=sg.bind(this),this._onTouchMove=rg.bind(this),this._onMouseDown=tg.bind(this),this._onMouseMove=eg.bind(this),this._interceptControlDown=og.bind(this),this._interceptControlUp=lg.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(yl),this.update(),this.state=oe.NONE}update(t=null){const e=this.object.position;xe.copy(e).sub(this.target),xe.applyQuaternion(this._quat),this._spherical.setFromVector3(xe),this.autoRotate&&this.state===oe.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Oe:n>Math.PI&&(n-=Oe),s<-Math.PI?s+=Oe:s>Math.PI&&(s-=Oe),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(xe.setFromSpherical(this._spherical),xe.applyQuaternion(this._quatInverse),e.copy(this.target).add(xe),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=xe.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=xe.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Ws.origin.copy(this.object.position),Ws.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Ws.direction))Kr||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Kr||this._lastTargetPosition.distanceToSquared(this.target)>Kr?(this.dispatchEvent(yl),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?Oe/60*this.autoRotateSpeed*t:Oe/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){xe.setFromMatrixColumn(e,0),xe.multiplyScalar(-t),this._panOffset.add(xe)}_panUp(t,e){this.screenSpacePanning===!0?xe.setFromMatrixColumn(e,1):(xe.setFromMatrixColumn(e,0),xe.crossVectors(this.object.up,xe)),xe.multiplyScalar(t),this._panOffset.add(xe)}_pan(t,e){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;xe.copy(s).sub(this.target);let r=xe.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*r/n.clientHeight,this.object.matrix),this._panUp(2*e*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=t-n.left,r=e-n.top,a=n.width,o=n.height;this._mouse.x=s/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(n,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const n=this._getSecondPointerPosition(t),s=.5*(t.pageX+n.x),r=.5*(t.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,o=(t.pageY+e.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e=0&&(y[at]=null,b[at].disconnect(xt))}for(let nt=0;nt=y.length){y.push(xt),at=Ut;break}else if(y[Ut]===null){y[Ut]=xt,at=Ut;break}if(at===-1)break}const wt=b[at];wt&&wt.connect(xt)}}const G=new P,J=new P;function k(Y,nt,xt){G.setFromMatrixPosition(nt.matrixWorld),J.setFromMatrixPosition(xt.matrixWorld);const at=G.distanceTo(J),wt=nt.projectionMatrix.elements,Ut=xt.projectionMatrix.elements,Gt=wt[14]/(wt[10]-1),ce=wt[14]/(wt[10]+1),rt=(wt[9]+1)/wt[5],Ct=(wt[9]-1)/wt[5],w=(wt[8]-1)/wt[0],ve=(Ut[8]+1)/Ut[0],Bt=Gt*w,kt=Gt*ve,Mt=at/(-w+ve),ne=Mt*-w;if(nt.matrixWorld.decompose(Y.position,Y.quaternion,Y.scale),Y.translateX(ne),Y.translateZ(Mt),Y.matrixWorld.compose(Y.position,Y.quaternion,Y.scale),Y.matrixWorldInverse.copy(Y.matrixWorld).invert(),wt[10]===-1)Y.projectionMatrix.copy(nt.projectionMatrix),Y.projectionMatrixInverse.copy(nt.projectionMatrixInverse);else{const Et=Gt+Mt,E=ce+Mt,_=Bt-ne,F=kt+(at-ne),Z=rt*ce/E*Et,K=Ct*ce/E*Et;Y.projectionMatrix.makePerspective(_,F,Z,K,Et,E),Y.projectionMatrixInverse.copy(Y.projectionMatrix).invert()}}function it(Y,nt){nt===null?Y.matrixWorld.copy(Y.matrix):Y.matrixWorld.multiplyMatrices(nt.matrixWorld,Y.matrix),Y.matrixWorldInverse.copy(Y.matrixWorld).invert()}this.updateCamera=function(Y){if(s===null)return;let nt=Y.near,xt=Y.far;v.texture!==null&&(v.depthNear>0&&(nt=v.depthNear),v.depthFar>0&&(xt=v.depthFar)),M.near=U.near=A.near=nt,M.far=U.far=A.far=xt,(D!==M.near||W!==M.far)&&(s.updateRenderState({depthNear:M.near,depthFar:M.far}),D=M.near,W=M.far),A.layers.mask=Y.layers.mask|2,U.layers.mask=Y.layers.mask|4,M.layers.mask=A.layers.mask|U.layers.mask;const at=Y.parent,wt=M.cameras;it(M,at);for(let Ut=0;Ut0&&(m.alphaTest.value=u.alphaTest);const T=t.get(u),b=T.envMap,y=T.envMapRotation;b&&(m.envMap.value=b,jn.copy(y),jn.x*=-1,jn.y*=-1,jn.z*=-1,b.isCubeTexture&&b.isRenderTargetTexture===!1&&(jn.y*=-1,jn.z*=-1),m.envMapRotation.value.setFromMatrix4(Ym.makeRotationFromEuler(jn)),m.flipEnvMap.value=b.isCubeTexture&&b.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=u.reflectivity,m.ior.value=u.ior,m.refractionRatio.value=u.refractionRatio),u.lightMap&&(m.lightMap.value=u.lightMap,m.lightMapIntensity.value=u.lightMapIntensity,e(u.lightMap,m.lightMapTransform)),u.aoMap&&(m.aoMap.value=u.aoMap,m.aoMapIntensity.value=u.aoMapIntensity,e(u.aoMap,m.aoMapTransform))}function a(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform))}function o(m,u){m.dashSize.value=u.dashSize,m.totalSize.value=u.dashSize+u.gapSize,m.scale.value=u.scale}function l(m,u,T,b){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.size.value=u.size*T,m.scale.value=b*.5,u.map&&(m.map.value=u.map,e(u.map,m.uvTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function c(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.rotation.value=u.rotation,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function h(m,u){m.specular.value.copy(u.specular),m.shininess.value=Math.max(u.shininess,1e-4)}function d(m,u){u.gradientMap&&(m.gradientMap.value=u.gradientMap)}function f(m,u){m.metalness.value=u.metalness,u.metalnessMap&&(m.metalnessMap.value=u.metalnessMap,e(u.metalnessMap,m.metalnessMapTransform)),m.roughness.value=u.roughness,u.roughnessMap&&(m.roughnessMap.value=u.roughnessMap,e(u.roughnessMap,m.roughnessMapTransform)),u.envMap&&(m.envMapIntensity.value=u.envMapIntensity)}function p(m,u,T){m.ior.value=u.ior,u.sheen>0&&(m.sheenColor.value.copy(u.sheenColor).multiplyScalar(u.sheen),m.sheenRoughness.value=u.sheenRoughness,u.sheenColorMap&&(m.sheenColorMap.value=u.sheenColorMap,e(u.sheenColorMap,m.sheenColorMapTransform)),u.sheenRoughnessMap&&(m.sheenRoughnessMap.value=u.sheenRoughnessMap,e(u.sheenRoughnessMap,m.sheenRoughnessMapTransform))),u.clearcoat>0&&(m.clearcoat.value=u.clearcoat,m.clearcoatRoughness.value=u.clearcoatRoughness,u.clearcoatMap&&(m.clearcoatMap.value=u.clearcoatMap,e(u.clearcoatMap,m.clearcoatMapTransform)),u.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=u.clearcoatRoughnessMap,e(u.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),u.clearcoatNormalMap&&(m.clearcoatNormalMap.value=u.clearcoatNormalMap,e(u.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(u.clearcoatNormalScale),u.side===ke&&m.clearcoatNormalScale.value.negate())),u.dispersion>0&&(m.dispersion.value=u.dispersion),u.iridescence>0&&(m.iridescence.value=u.iridescence,m.iridescenceIOR.value=u.iridescenceIOR,m.iridescenceThicknessMinimum.value=u.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=u.iridescenceThicknessRange[1],u.iridescenceMap&&(m.iridescenceMap.value=u.iridescenceMap,e(u.iridescenceMap,m.iridescenceMapTransform)),u.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=u.iridescenceThicknessMap,e(u.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),u.transmission>0&&(m.transmission.value=u.transmission,m.transmissionSamplerMap.value=T.texture,m.transmissionSamplerSize.value.set(T.width,T.height),u.transmissionMap&&(m.transmissionMap.value=u.transmissionMap,e(u.transmissionMap,m.transmissionMapTransform)),m.thickness.value=u.thickness,u.thicknessMap&&(m.thicknessMap.value=u.thicknessMap,e(u.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=u.attenuationDistance,m.attenuationColor.value.copy(u.attenuationColor)),u.anisotropy>0&&(m.anisotropyVector.value.set(u.anisotropy*Math.cos(u.anisotropyRotation),u.anisotropy*Math.sin(u.anisotropyRotation)),u.anisotropyMap&&(m.anisotropyMap.value=u.anisotropyMap,e(u.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=u.specularIntensity,m.specularColor.value.copy(u.specularColor),u.specularColorMap&&(m.specularColorMap.value=u.specularColorMap,e(u.specularColorMap,m.specularColorMapTransform)),u.specularIntensityMap&&(m.specularIntensityMap.value=u.specularIntensityMap,e(u.specularIntensityMap,m.specularIntensityMapTransform))}function g(m,u){u.matcap&&(m.matcap.value=u.matcap)}function v(m,u){const T=t.get(u).light;m.referencePosition.value.setFromMatrixPosition(T.matrixWorld),m.nearDistance.value=T.shadow.camera.near,m.farDistance.value=T.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function jm(i,t,e,n){let s={},r={},a=[];const o=i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS);function l(T,b){const y=b.program;n.uniformBlockBinding(T,y)}function c(T,b){let y=s[T.id];y===void 0&&(g(T),y=h(T),s[T.id]=y,T.addEventListener("dispose",m));const L=b.program;n.updateUBOMapping(T,L);const R=t.render.frame;r[T.id]!==R&&(f(T),r[T.id]=R)}function h(T){const b=d();T.__bindingPointIndex=b;const y=i.createBuffer(),L=T.__size,R=T.usage;return i.bindBuffer(i.UNIFORM_BUFFER,y),i.bufferData(i.UNIFORM_BUFFER,L,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,b,y),y}function d(){for(let T=0;T0&&(y+=L-R),T.__size=y,T.__cache={},this}function v(T){const b={boundary:0,storage:0};return typeof T=="number"||typeof T=="boolean"?(b.boundary=4,b.storage=4):T.isVector2?(b.boundary=8,b.storage=8):T.isVector3||T.isColor?(b.boundary=16,b.storage=12):T.isVector4?(b.boundary=16,b.storage=16):T.isMatrix3?(b.boundary=48,b.storage=48):T.isMatrix4?(b.boundary=64,b.storage=64):T.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",T),b}function m(T){const b=T.target;b.removeEventListener("dispose",m);const y=a.indexOf(b.__bindingPointIndex);a.splice(y,1),i.deleteBuffer(s[b.id]),delete s[b.id],delete r[b.id]}function u(){for(const T in s)i.deleteBuffer(s[T]);a=[],s={},r={}}return{bind:l,update:c,dispose:u}}class Zm{constructor(t={}){const{canvas:e=Eh(),context:n=null,depth:s=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:d=!1,reverseDepthBuffer:f=!1}=t;this.isWebGLRenderer=!0;let p;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");p=n.getContextAttributes().alpha}else p=a;const g=new Uint32Array(4),v=new Int32Array(4);let m=null,u=null;const T=[],b=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Qe,this.toneMapping=On,this.toneMappingExposure=1;const y=this;let L=!1,R=0,A=0,U=null,S=-1,M=null;const D=new le,W=new le;let z=null;const V=new pt(0);let $=0,G=e.width,J=e.height,k=1,it=null,ut=null;const yt=new le(0,0,G,J),Lt=new le(0,0,G,J);let qt=!1;const Y=new to;let nt=!1,xt=!1;this.transmissionResolutionScale=1;const at=new ee,wt=new ee,Ut=new P,Gt=new le,ce={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let rt=!1;function Ct(){return U===null?k:1}let w=n;function ve(x,I){return e.getContext(x,I)}try{const x={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Xa}`),e.addEventListener("webglcontextlost",q,!1),e.addEventListener("webglcontextrestored",lt,!1),e.addEventListener("webglcontextcreationerror",ct,!1),w===null){const I="webgl2";if(w=ve(I,x),w===null)throw ve(I)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(x){throw console.error("THREE.WebGLRenderer: "+x.message),x}let Bt,kt,Mt,ne,Et,E,_,F,Z,K,X,St,ot,dt,jt,tt,mt,bt,Pt,ft,Xt,zt,ie,C;function et(){Bt=new sp(w),Bt.init(),zt=new Hm(w,Bt),kt=new Jf(w,Bt,t,zt),Mt=new Bm(w,Bt),kt.reverseDepthBuffer&&f&&Mt.buffers.depth.setReversed(!0),ne=new op(w),Et=new Tm,E=new zm(w,Bt,Mt,Et,kt,zt,ne),_=new tp(y),F=new ip(y),Z=new fu(w),ie=new Kf(w,Z),K=new rp(w,Z,ne,ie),X=new cp(w,K,Z,ne),Pt=new lp(w,kt,E),tt=new Qf(Et),St=new bm(y,_,F,Bt,kt,ie,tt),ot=new qm(y,Et),dt=new Am,jt=new Um(Bt),bt=new Zf(y,_,F,Mt,X,p,l),mt=new Fm(y,X,kt),C=new jm(w,ne,kt,Mt),ft=new $f(w,Bt,ne),Xt=new ap(w,Bt,ne),ne.programs=St.programs,y.capabilities=kt,y.extensions=Bt,y.properties=Et,y.renderLists=dt,y.shadowMap=mt,y.state=Mt,y.info=ne}et();const H=new Xm(y,w);this.xr=H,this.getContext=function(){return w},this.getContextAttributes=function(){return w.getContextAttributes()},this.forceContextLoss=function(){const x=Bt.get("WEBGL_lose_context");x&&x.loseContext()},this.forceContextRestore=function(){const x=Bt.get("WEBGL_lose_context");x&&x.restoreContext()},this.getPixelRatio=function(){return k},this.setPixelRatio=function(x){x!==void 0&&(k=x,this.setSize(G,J,!1))},this.getSize=function(x){return x.set(G,J)},this.setSize=function(x,I,O=!0){if(H.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}G=x,J=I,e.width=Math.floor(x*k),e.height=Math.floor(I*k),O===!0&&(e.style.width=x+"px",e.style.height=I+"px"),this.setViewport(0,0,x,I)},this.getDrawingBufferSize=function(x){return x.set(G*k,J*k).floor()},this.setDrawingBufferSize=function(x,I,O){G=x,J=I,k=O,e.width=Math.floor(x*O),e.height=Math.floor(I*O),this.setViewport(0,0,x,I)},this.getCurrentViewport=function(x){return x.copy(D)},this.getViewport=function(x){return x.copy(yt)},this.setViewport=function(x,I,O,B){x.isVector4?yt.set(x.x,x.y,x.z,x.w):yt.set(x,I,O,B),Mt.viewport(D.copy(yt).multiplyScalar(k).round())},this.getScissor=function(x){return x.copy(Lt)},this.setScissor=function(x,I,O,B){x.isVector4?Lt.set(x.x,x.y,x.z,x.w):Lt.set(x,I,O,B),Mt.scissor(W.copy(Lt).multiplyScalar(k).round())},this.getScissorTest=function(){return qt},this.setScissorTest=function(x){Mt.setScissorTest(qt=x)},this.setOpaqueSort=function(x){it=x},this.setTransparentSort=function(x){ut=x},this.getClearColor=function(x){return x.copy(bt.getClearColor())},this.setClearColor=function(){bt.setClearColor.apply(bt,arguments)},this.getClearAlpha=function(){return bt.getClearAlpha()},this.setClearAlpha=function(){bt.setClearAlpha.apply(bt,arguments)},this.clear=function(x=!0,I=!0,O=!0){let B=0;if(x){let N=!1;if(U!==null){const Q=U.texture.format;N=Q===Ja||Q===$a||Q===Ka}if(N){const Q=U.texture.type,ht=Q===An||Q===ei||Q===os||Q===zi||Q===qa||Q===ja,gt=bt.getClearColor(),_t=bt.getClearAlpha(),It=gt.r,Ft=gt.g,Tt=gt.b;ht?(g[0]=It,g[1]=Ft,g[2]=Tt,g[3]=_t,w.clearBufferuiv(w.COLOR,0,g)):(v[0]=It,v[1]=Ft,v[2]=Tt,v[3]=_t,w.clearBufferiv(w.COLOR,0,v))}else B|=w.COLOR_BUFFER_BIT}I&&(B|=w.DEPTH_BUFFER_BIT),O&&(B|=w.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),w.clear(B)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",q,!1),e.removeEventListener("webglcontextrestored",lt,!1),e.removeEventListener("webglcontextcreationerror",ct,!1),bt.dispose(),dt.dispose(),jt.dispose(),Et.dispose(),_.dispose(),F.dispose(),X.dispose(),ie.dispose(),C.dispose(),St.dispose(),H.dispose(),H.removeEventListener("sessionstart",so),H.removeEventListener("sessionend",ro),kn.stop()};function q(x){x.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),L=!0}function lt(){console.log("THREE.WebGLRenderer: Context Restored."),L=!1;const x=ne.autoReset,I=mt.enabled,O=mt.autoUpdate,B=mt.needsUpdate,N=mt.type;et(),ne.autoReset=x,mt.enabled=I,mt.autoUpdate=O,mt.needsUpdate=B,mt.type=N}function ct(x){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",x.statusMessage)}function Nt(x){const I=x.target;I.removeEventListener("dispose",Nt),he(I)}function he(x){xe(x),Et.remove(x)}function xe(x){const I=Et.get(x).programs;I!==void 0&&(I.forEach(function(O){St.releaseProgram(O)}),x.isShaderMaterial&&St.releaseShaderCache(x))}this.renderBufferDirect=function(x,I,O,B,N,Q){I===null&&(I=ce);const ht=N.isMesh&&N.matrixWorld.determinant()<0,gt=vc(x,I,O,B,N);Mt.setMaterial(B,ht);let _t=O.index,It=1;if(B.wireframe===!0){if(_t=K.getWireframeAttribute(O),_t===void 0)return;It=2}const Ft=O.drawRange,Tt=O.attributes.position;let Zt=Ft.start*It,Qt=(Ft.start+Ft.count)*It;Q!==null&&(Zt=Math.max(Zt,Q.start*It),Qt=Math.min(Qt,(Q.start+Q.count)*It)),_t!==null?(Zt=Math.max(Zt,0),Qt=Math.min(Qt,_t.count)):Tt!=null&&(Zt=Math.max(Zt,0),Qt=Math.min(Qt,Tt.count));const me=Qt-Zt;if(me<0||me===1/0)return;ie.setup(N,B,gt,O,_t);let fe,Kt=ft;if(_t!==null&&(fe=Z.get(_t),Kt=Xt,Kt.setIndex(fe)),N.isMesh)B.wireframe===!0?(Mt.setLineWidth(B.wireframeLinewidth*Ct()),Kt.setMode(w.LINES)):Kt.setMode(w.TRIANGLES);else if(N.isLine){let At=B.linewidth;At===void 0&&(At=1),Mt.setLineWidth(At*Ct()),N.isLineSegments?Kt.setMode(w.LINES):N.isLineLoop?Kt.setMode(w.LINE_LOOP):Kt.setMode(w.LINE_STRIP)}else N.isPoints?Kt.setMode(w.POINTS):N.isSprite&&Kt.setMode(w.TRIANGLES);if(N.isBatchedMesh)if(N._multiDrawInstances!==null)Kt.renderMultiDrawInstances(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount,N._multiDrawInstances);else if(Bt.get("WEBGL_multi_draw"))Kt.renderMultiDraw(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount);else{const At=N._multiDrawStarts,Te=N._multiDrawCounts,te=N._multiDrawCount,en=_t?Z.get(_t).bytesPerElement:1,ai=Et.get(B).currentProgram.getUniforms();for(let Ge=0;Ge{function Q(){if(B.forEach(function(ht){Et.get(ht).currentProgram.isReady()&&B.delete(ht)}),B.size===0){N(x);return}setTimeout(Q,10)}Bt.get("KHR_parallel_shader_compile")!==null?Q():setTimeout(Q,10)})};let Ve=null;function mn(x){Ve&&Ve(x)}function so(){kn.stop()}function ro(){kn.start()}const kn=new hc;kn.setAnimationLoop(mn),typeof self<"u"&&kn.setContext(self),this.setAnimationLoop=function(x){Ve=x,H.setAnimationLoop(x),x===null?kn.stop():kn.start()},H.addEventListener("sessionstart",so),H.addEventListener("sessionend",ro),this.render=function(x,I){if(I!==void 0&&I.isCamera!==!0){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(L===!0)return;if(x.matrixWorldAutoUpdate===!0&&x.updateMatrixWorld(),I.parent===null&&I.matrixWorldAutoUpdate===!0&&I.updateMatrixWorld(),H.enabled===!0&&H.isPresenting===!0&&(H.cameraAutoUpdate===!0&&H.updateCamera(I),I=H.getCamera()),x.isScene===!0&&x.onBeforeRender(y,x,I,U),u=jt.get(x,b.length),u.init(I),b.push(u),wt.multiplyMatrices(I.projectionMatrix,I.matrixWorldInverse),Y.setFromProjectionMatrix(wt),xt=this.localClippingEnabled,nt=tt.init(this.clippingPlanes,xt),m=dt.get(x,T.length),m.init(),T.push(m),H.enabled===!0&&H.isPresenting===!0){const Q=y.xr.getDepthSensingMesh();Q!==null&&pr(Q,I,-1/0,y.sortObjects)}pr(x,I,0,y.sortObjects),m.finish(),y.sortObjects===!0&&m.sort(it,ut),rt=H.enabled===!1||H.isPresenting===!1||H.hasDepthSensing()===!1,rt&&bt.addToRenderList(m,x),this.info.render.frame++,nt===!0&&tt.beginShadows();const O=u.state.shadowsArray;mt.render(O,x,I),nt===!0&&tt.endShadows(),this.info.autoReset===!0&&this.info.reset();const B=m.opaque,N=m.transmissive;if(u.setupLights(),I.isArrayCamera){const Q=I.cameras;if(N.length>0)for(let ht=0,gt=Q.length;ht0&&oo(B,N,x,I),rt&&bt.render(x),ao(m,x,I);U!==null&&A===0&&(E.updateMultisampleRenderTarget(U),E.updateRenderTargetMipmap(U)),x.isScene===!0&&x.onAfterRender(y,x,I),ie.resetDefaultState(),S=-1,M=null,b.pop(),b.length>0?(u=b[b.length-1],nt===!0&&tt.setGlobalState(y.clippingPlanes,u.state.camera)):u=null,T.pop(),T.length>0?m=T[T.length-1]:m=null};function pr(x,I,O,B){if(x.visible===!1)return;if(x.layers.test(I.layers)){if(x.isGroup)O=x.renderOrder;else if(x.isLOD)x.autoUpdate===!0&&x.update(I);else if(x.isLight)u.pushLight(x),x.castShadow&&u.pushShadow(x);else if(x.isSprite){if(!x.frustumCulled||Y.intersectsSprite(x)){B&&Gt.setFromMatrixPosition(x.matrixWorld).applyMatrix4(wt);const ht=X.update(x),gt=x.material;gt.visible&&m.push(x,ht,gt,O,Gt.z,null)}}else if((x.isMesh||x.isLine||x.isPoints)&&(!x.frustumCulled||Y.intersectsObject(x))){const ht=X.update(x),gt=x.material;if(B&&(x.boundingSphere!==void 0?(x.boundingSphere===null&&x.computeBoundingSphere(),Gt.copy(x.boundingSphere.center)):(ht.boundingSphere===null&&ht.computeBoundingSphere(),Gt.copy(ht.boundingSphere.center)),Gt.applyMatrix4(x.matrixWorld).applyMatrix4(wt)),Array.isArray(gt)){const _t=ht.groups;for(let It=0,Ft=_t.length;It0&&fs(N,I,O),Q.length>0&&fs(Q,I,O),ht.length>0&&fs(ht,I,O),Mt.buffers.depth.setTest(!0),Mt.buffers.depth.setMask(!0),Mt.buffers.color.setMask(!0),Mt.setPolygonOffset(!1)}function oo(x,I,O,B){if((O.isScene===!0?O.overrideMaterial:null)!==null)return;u.state.transmissionRenderTarget[B.id]===void 0&&(u.state.transmissionRenderTarget[B.id]=new on(1,1,{generateMipmaps:!0,type:Bt.has("EXT_color_buffer_half_float")||Bt.has("EXT_color_buffer_float")?Tn:An,minFilter:Qn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:$t.workingColorSpace}));const Q=u.state.transmissionRenderTarget[B.id],ht=B.viewport||D;Q.setSize(ht.z*y.transmissionResolutionScale,ht.w*y.transmissionResolutionScale);const gt=y.getRenderTarget();y.setRenderTarget(Q),y.getClearColor(V),$=y.getClearAlpha(),$<1&&y.setClearColor(16777215,.5),y.clear(),rt&&bt.render(O);const _t=y.toneMapping;y.toneMapping=On;const It=B.viewport;if(B.viewport!==void 0&&(B.viewport=void 0),u.setupLightsView(B),nt===!0&&tt.setGlobalState(y.clippingPlanes,B),fs(x,O,B),E.updateMultisampleRenderTarget(Q),E.updateRenderTargetMipmap(Q),Bt.has("WEBGL_multisampled_render_to_texture")===!1){let Ft=!1;for(let Tt=0,Zt=I.length;Tt0),Tt=!!O.morphAttributes.position,Zt=!!O.morphAttributes.normal,Qt=!!O.morphAttributes.color;let me=On;B.toneMapped&&(U===null||U.isXRRenderTarget===!0)&&(me=y.toneMapping);const fe=O.morphAttributes.position||O.morphAttributes.normal||O.morphAttributes.color,Kt=fe!==void 0?fe.length:0,At=Et.get(B),Te=u.state.lights;if(nt===!0&&(xt===!0||x!==M)){const De=x===M&&B.id===S;tt.setState(B,x,De)}let te=!1;B.version===At.__version?(At.needsLights&&At.lightsStateVersion!==Te.state.version||At.outputColorSpace!==gt||N.isBatchedMesh&&At.batching===!1||!N.isBatchedMesh&&At.batching===!0||N.isBatchedMesh&&At.batchingColor===!0&&N.colorTexture===null||N.isBatchedMesh&&At.batchingColor===!1&&N.colorTexture!==null||N.isInstancedMesh&&At.instancing===!1||!N.isInstancedMesh&&At.instancing===!0||N.isSkinnedMesh&&At.skinning===!1||!N.isSkinnedMesh&&At.skinning===!0||N.isInstancedMesh&&At.instancingColor===!0&&N.instanceColor===null||N.isInstancedMesh&&At.instancingColor===!1&&N.instanceColor!==null||N.isInstancedMesh&&At.instancingMorph===!0&&N.morphTexture===null||N.isInstancedMesh&&At.instancingMorph===!1&&N.morphTexture!==null||At.envMap!==_t||B.fog===!0&&At.fog!==Q||At.numClippingPlanes!==void 0&&(At.numClippingPlanes!==tt.numPlanes||At.numIntersection!==tt.numIntersection)||At.vertexAlphas!==It||At.vertexTangents!==Ft||At.morphTargets!==Tt||At.morphNormals!==Zt||At.morphColors!==Qt||At.toneMapping!==me||At.morphTargetsCount!==Kt)&&(te=!0):(te=!0,At.__version=B.version);let en=At.currentProgram;te===!0&&(en=ps(B,I,N));let ai=!1,Ge=!1,Xi=!1;const ue=en.getUniforms(),Ze=At.uniforms;if(Mt.useProgram(en.program)&&(ai=!0,Ge=!0,Xi=!0),B.id!==S&&(S=B.id,Ge=!0),ai||M!==x){Mt.buffers.depth.getReversed()?(at.copy(x.projectionMatrix),Th(at),wh(at),ue.setValue(w,"projectionMatrix",at)):ue.setValue(w,"projectionMatrix",x.projectionMatrix),ue.setValue(w,"viewMatrix",x.matrixWorldInverse);const Fe=ue.map.cameraPosition;Fe!==void 0&&Fe.setValue(w,Ut.setFromMatrixPosition(x.matrixWorld)),kt.logarithmicDepthBuffer&&ue.setValue(w,"logDepthBufFC",2/(Math.log(x.far+1)/Math.LN2)),(B.isMeshPhongMaterial||B.isMeshToonMaterial||B.isMeshLambertMaterial||B.isMeshBasicMaterial||B.isMeshStandardMaterial||B.isShaderMaterial)&&ue.setValue(w,"isOrthographic",x.isOrthographicCamera===!0),M!==x&&(M=x,Ge=!0,Xi=!0)}if(N.isSkinnedMesh){ue.setOptional(w,N,"bindMatrix"),ue.setOptional(w,N,"bindMatrixInverse");const De=N.skeleton;De&&(De.boneTexture===null&&De.computeBoneTexture(),ue.setValue(w,"boneTexture",De.boneTexture,E))}N.isBatchedMesh&&(ue.setOptional(w,N,"batchingTexture"),ue.setValue(w,"batchingTexture",N._matricesTexture,E),ue.setOptional(w,N,"batchingIdTexture"),ue.setValue(w,"batchingIdTexture",N._indirectTexture,E),ue.setOptional(w,N,"batchingColorTexture"),N._colorsTexture!==null&&ue.setValue(w,"batchingColorTexture",N._colorsTexture,E));const Ke=O.morphAttributes;if((Ke.position!==void 0||Ke.normal!==void 0||Ke.color!==void 0)&&Pt.update(N,O,en),(Ge||At.receiveShadow!==N.receiveShadow)&&(At.receiveShadow=N.receiveShadow,ue.setValue(w,"receiveShadow",N.receiveShadow)),B.isMeshGouraudMaterial&&B.envMap!==null&&(Ze.envMap.value=_t,Ze.flipEnvMap.value=_t.isCubeTexture&&_t.isRenderTargetTexture===!1?-1:1),B.isMeshStandardMaterial&&B.envMap===null&&I.environment!==null&&(Ze.envMapIntensity.value=I.environmentIntensity),Ge&&(ue.setValue(w,"toneMappingExposure",y.toneMappingExposure),At.needsLights&&xc(Ze,Xi),Q&&B.fog===!0&&ot.refreshFogUniforms(Ze,Q),ot.refreshMaterialUniforms(Ze,B,k,J,u.state.transmissionRenderTarget[x.id]),$s.upload(w,co(At),Ze,E)),B.isShaderMaterial&&B.uniformsNeedUpdate===!0&&($s.upload(w,co(At),Ze,E),B.uniformsNeedUpdate=!1),B.isSpriteMaterial&&ue.setValue(w,"center",N.center),ue.setValue(w,"modelViewMatrix",N.modelViewMatrix),ue.setValue(w,"normalMatrix",N.normalMatrix),ue.setValue(w,"modelMatrix",N.matrixWorld),B.isShaderMaterial||B.isRawShaderMaterial){const De=B.uniformsGroups;for(let Fe=0,mr=De.length;Fe0&&E.useMultisampledRTT(x)===!1?N=Et.get(x).__webglMultisampledFramebuffer:Array.isArray(Ft)?N=Ft[O]:N=Ft,D.copy(x.viewport),W.copy(x.scissor),z=x.scissorTest}else D.copy(yt).multiplyScalar(k).floor(),W.copy(Lt).multiplyScalar(k).floor(),z=qt;if(O!==0&&(N=Sc),Mt.bindFramebuffer(w.FRAMEBUFFER,N)&&B&&Mt.drawBuffers(x,N),Mt.viewport(D),Mt.scissor(W),Mt.setScissorTest(z),Q){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_CUBE_MAP_POSITIVE_X+I,_t.__webglTexture,O)}else if(ht){const _t=Et.get(x.texture),It=I;w.framebufferTextureLayer(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,_t.__webglTexture,O,It)}else if(x!==null&&O!==0){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,_t.__webglTexture,O)}S=-1},this.readRenderTargetPixels=function(x,I,O,B,N,Q,ht){if(!(x&&x.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ht!==void 0&&(gt=gt[ht]),gt){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);try{const _t=x.texture,It=_t.format,Ft=_t.type;if(!kt.textureFormatReadable(It)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!kt.textureTypeReadable(Ft)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N&&w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),Q)}finally{const _t=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,_t)}}},this.readRenderTargetPixelsAsync=async function(x,I,O,B,N,Q,ht){if(!(x&&x.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ht!==void 0&&(gt=gt[ht]),gt){const _t=x.texture,It=_t.format,Ft=_t.type;if(!kt.textureFormatReadable(It))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!kt.textureTypeReadable(Ft))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);const Tt=w.createBuffer();w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.bufferData(w.PIXEL_PACK_BUFFER,Q.byteLength,w.STREAM_READ),w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),0);const Zt=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,Zt);const Qt=w.fenceSync(w.SYNC_GPU_COMMANDS_COMPLETE,0);return w.flush(),await bh(w,Qt,4),w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.getBufferSubData(w.PIXEL_PACK_BUFFER,0,Q),w.deleteBuffer(Tt),w.deleteSync(Qt),Q}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(x,I=null,O=0){x.isTexture!==!0&&(Ai("WebGLRenderer: copyFramebufferToTexture function signature has changed."),I=arguments[0]||null,x=arguments[1]);const B=Math.pow(2,-O),N=Math.floor(x.image.width*B),Q=Math.floor(x.image.height*B),ht=I!==null?I.x:0,gt=I!==null?I.y:0;E.setTexture2D(x,0),w.copyTexSubImage2D(w.TEXTURE_2D,O,0,0,ht,gt,N,Q),Mt.unbindTexture()};const yc=w.createFramebuffer(),Ec=w.createFramebuffer();this.copyTextureToTexture=function(x,I,O=null,B=null,N=0,Q=null){x.isTexture!==!0&&(Ai("WebGLRenderer: copyTextureToTexture function signature has changed."),B=arguments[0]||null,x=arguments[1],I=arguments[2],Q=arguments[3]||0,O=null),Q===null&&(N!==0?(Ai("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Q=N,N=0):Q=0);let ht,gt,_t,It,Ft,Tt,Zt,Qt,me;const fe=x.isCompressedTexture?x.mipmaps[Q]:x.image;if(O!==null)ht=O.max.x-O.min.x,gt=O.max.y-O.min.y,_t=O.isBox3?O.max.z-O.min.z:1,It=O.min.x,Ft=O.min.y,Tt=O.isBox3?O.min.z:0;else{const Ke=Math.pow(2,-N);ht=Math.floor(fe.width*Ke),gt=Math.floor(fe.height*Ke),x.isDataArrayTexture?_t=fe.depth:x.isData3DTexture?_t=Math.floor(fe.depth*Ke):_t=1,It=0,Ft=0,Tt=0}B!==null?(Zt=B.x,Qt=B.y,me=B.z):(Zt=0,Qt=0,me=0);const Kt=zt.convert(I.format),At=zt.convert(I.type);let Te;I.isData3DTexture?(E.setTexture3D(I,0),Te=w.TEXTURE_3D):I.isDataArrayTexture||I.isCompressedArrayTexture?(E.setTexture2DArray(I,0),Te=w.TEXTURE_2D_ARRAY):(E.setTexture2D(I,0),Te=w.TEXTURE_2D),w.pixelStorei(w.UNPACK_FLIP_Y_WEBGL,I.flipY),w.pixelStorei(w.UNPACK_PREMULTIPLY_ALPHA_WEBGL,I.premultiplyAlpha),w.pixelStorei(w.UNPACK_ALIGNMENT,I.unpackAlignment);const te=w.getParameter(w.UNPACK_ROW_LENGTH),en=w.getParameter(w.UNPACK_IMAGE_HEIGHT),ai=w.getParameter(w.UNPACK_SKIP_PIXELS),Ge=w.getParameter(w.UNPACK_SKIP_ROWS),Xi=w.getParameter(w.UNPACK_SKIP_IMAGES);w.pixelStorei(w.UNPACK_ROW_LENGTH,fe.width),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,fe.height),w.pixelStorei(w.UNPACK_SKIP_PIXELS,It),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ft),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Tt);const ue=x.isDataArrayTexture||x.isData3DTexture,Ze=I.isDataArrayTexture||I.isData3DTexture;if(x.isDepthTexture){const Ke=Et.get(x),De=Et.get(I),Fe=Et.get(Ke.__renderTarget),mr=Et.get(De.__renderTarget);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,Fe.__webglFramebuffer),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,mr.__webglFramebuffer);for(let Vn=0;Vn<_t;Vn++)ue&&(w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(x).__webglTexture,N,Tt+Vn),w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(I).__webglTexture,Q,me+Vn)),w.blitFramebuffer(It,Ft,ht,gt,Zt,Qt,ht,gt,w.DEPTH_BUFFER_BIT,w.NEAREST);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else if(N!==0||x.isRenderTargetTexture||Et.has(x)){const Ke=Et.get(x),De=Et.get(I);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,yc),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,Ec);for(let Fe=0;Fe<_t;Fe++)ue?w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Ke.__webglTexture,N,Tt+Fe):w.framebufferTexture2D(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,Ke.__webglTexture,N),Ze?w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,De.__webglTexture,Q,me+Fe):w.framebufferTexture2D(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,De.__webglTexture,Q),N!==0?w.blitFramebuffer(It,Ft,ht,gt,Zt,Qt,ht,gt,w.COLOR_BUFFER_BIT,w.NEAREST):Ze?w.copyTexSubImage3D(Te,Q,Zt,Qt,me+Fe,It,Ft,ht,gt):w.copyTexSubImage2D(Te,Q,Zt,Qt,It,Ft,ht,gt);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else Ze?x.isDataTexture||x.isData3DTexture?w.texSubImage3D(Te,Q,Zt,Qt,me,ht,gt,_t,Kt,At,fe.data):I.isCompressedArrayTexture?w.compressedTexSubImage3D(Te,Q,Zt,Qt,me,ht,gt,_t,Kt,fe.data):w.texSubImage3D(Te,Q,Zt,Qt,me,ht,gt,_t,Kt,At,fe):x.isDataTexture?w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ht,gt,Kt,At,fe.data):x.isCompressedTexture?w.compressedTexSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,fe.width,fe.height,Kt,fe.data):w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ht,gt,Kt,At,fe);w.pixelStorei(w.UNPACK_ROW_LENGTH,te),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,en),w.pixelStorei(w.UNPACK_SKIP_PIXELS,ai),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ge),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Xi),Q===0&&I.generateMipmaps&&w.generateMipmap(Te),Mt.unbindTexture()},this.copyTextureToTexture3D=function(x,I,O=null,B=null,N=0){return x.isTexture!==!0&&(Ai("WebGLRenderer: copyTextureToTexture3D function signature has changed."),O=arguments[0]||null,B=arguments[1]||null,x=arguments[2],I=arguments[3],N=arguments[4]||0),Ai('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(x,I,O,B,N)},this.initRenderTarget=function(x){Et.get(x).__webglFramebuffer===void 0&&E.setupRenderTarget(x)},this.initTexture=function(x){x.isCubeTexture?E.setTextureCube(x,0):x.isData3DTexture?E.setTexture3D(x,0):x.isDataArrayTexture||x.isCompressedArrayTexture?E.setTexture2DArray(x,0):E.setTexture2D(x,0),Mt.unbindTexture()},this.resetState=function(){R=0,A=0,U=null,Mt.reset(),ie.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return En}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;const e=this.getContext();e.drawingBufferColorspace=$t._getDrawingBufferColorSpace(t),e.unpackColorSpace=$t._getUnpackColorSpace()}}const yl={type:"change"},io={type:"start"},mc={type:"end"},Ws=new cs,El=new Nn,Km=Math.cos(70*yh.DEG2RAD),Me=new P,Oe=2*Math.PI,oe={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Kr=1e-6;class $m extends uu{constructor(t,e=null){super(t,e),this.state=oe.NONE,this.enabled=!0,this.target=new P,this.cursor=new P,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Di.ROTATE,MIDDLE:Di.DOLLY,RIGHT:Di.PAN},this.touches={ONE:Ri.ROTATE,TWO:Ri.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new P,this._lastQuaternion=new ni,this._lastTargetPosition=new P,this._quat=new ni().setFromUnitVectors(t.up,new P(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new Ko,this._sphericalDelta=new Ko,this._scale=1,this._panOffset=new P,this._rotateStart=new vt,this._rotateEnd=new vt,this._rotateDelta=new vt,this._panStart=new vt,this._panEnd=new vt,this._panDelta=new vt,this._dollyStart=new vt,this._dollyEnd=new vt,this._dollyDelta=new vt,this._dollyDirection=new P,this._mouse=new vt,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Qm.bind(this),this._onPointerDown=Jm.bind(this),this._onPointerUp=tg.bind(this),this._onContextMenu=og.bind(this),this._onMouseWheel=ig.bind(this),this._onKeyDown=sg.bind(this),this._onTouchStart=rg.bind(this),this._onTouchMove=ag.bind(this),this._onMouseDown=eg.bind(this),this._onMouseMove=ng.bind(this),this._interceptControlDown=lg.bind(this),this._interceptControlUp=cg.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(yl),this.update(),this.state=oe.NONE}update(t=null){const e=this.object.position;Me.copy(e).sub(this.target),Me.applyQuaternion(this._quat),this._spherical.setFromVector3(Me),this.autoRotate&&this.state===oe.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Oe:n>Math.PI&&(n-=Oe),s<-Math.PI?s+=Oe:s>Math.PI&&(s-=Oe),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(Me.setFromSpherical(this._spherical),Me.applyQuaternion(this._quatInverse),e.copy(this.target).add(Me),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=Me.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=Me.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Ws.origin.copy(this.object.position),Ws.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Ws.direction))Kr||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Kr||this._lastTargetPosition.distanceToSquared(this.target)>Kr?(this.dispatchEvent(yl),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?Oe/60*this.autoRotateSpeed*t:Oe/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){Me.setFromMatrixColumn(e,0),Me.multiplyScalar(-t),this._panOffset.add(Me)}_panUp(t,e){this.screenSpacePanning===!0?Me.setFromMatrixColumn(e,1):(Me.setFromMatrixColumn(e,0),Me.crossVectors(this.object.up,Me)),Me.multiplyScalar(t),this._panOffset.add(Me)}_pan(t,e){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;Me.copy(s).sub(this.target);let r=Me.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*r/n.clientHeight,this.object.matrix),this._panUp(2*e*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=t-n.left,r=e-n.top,a=n.width,o=n.height;this._mouse.x=s/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-Oe*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(n,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const n=this._getSecondPointerPosition(t),s=.5*(t.pageX+n.x),r=.5*(t.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Oe*this._rotateDelta.x/e.clientHeight),this._rotateUp(Oe*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,o=(t.pageY+e.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e{var e;(t instanceof Me||t instanceof $h)&&((e=t.geometry)==null||e.dispose(),Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material&&t.material.dispose())}),i.renderer.dispose(),i.composer.dispose()}class xg{constructor(t){Wt(this,"positions");Wt(this,"velocities");Wt(this,"running",!0);Wt(this,"step",0);Wt(this,"repulsionStrength",500);Wt(this,"attractionStrength",.01);Wt(this,"dampening",.9);Wt(this,"baseMaxSteps",300);Wt(this,"maxSteps",300);Wt(this,"cooldownExtension",0);this.positions=t,this.velocities=new Map;for(const e of t.keys())this.velocities.set(e,new P)}addNode(t,e){this.positions.set(t,e.clone()),this.velocities.set(t,new P),this.cooldownExtension=100,this.maxSteps=Math.max(this.maxSteps,this.step+this.cooldownExtension),this.running=!0}removeNode(t){this.positions.delete(t),this.velocities.delete(t)}tick(t){if(!this.running)return;if(this.step>this.maxSteps){this.cooldownExtension>0&&(this.cooldownExtension=0,this.maxSteps=this.baseMaxSteps);return}this.step++;const e=Math.max(.001,1-this.step/this.maxSteps),n=Array.from(this.positions.keys());for(let s=0;s0?.15+t.retention*.2:0,blending:ze}),h=new Br(c);h.scale.set(s*4*n,s*4*n,1),h.position.copy(e),h.userData={isGlow:!0,nodeId:t.id},this.glowMap.set(t.id,h),this.group.add(h);const d=t.label||t.type,f=this.createTextSprite(d,"#e2e8f0");return f.position.copy(e),f.position.y+=s*2+1.5,f.userData={isLabel:!0,nodeId:t.id,offset:s*2+1.5},this.group.add(f),this.labelSprites.set(t.id,f),{mesh:l,glow:h,label:f,size:s}}addNode(t,e){const n=(e==null?void 0:e.clone())??new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40);this.positions.set(t.id,n);const{mesh:s,glow:r,label:a}=this.createNodeMeshes(t,n,0);return s.scale.setScalar(.001),r.scale.set(.001,.001,1),r.material.opacity=0,a.material.opacity=0,this.materializingNodes.push({id:t.id,frame:0,totalFrames:30,mesh:s,glow:r,label:a,targetScale:.5+t.retention*2}),n}removeNode(t){const e=this.meshMap.get(t),n=this.glowMap.get(t),s=this.labelSprites.get(t);!e||!n||!s||(this.materializingNodes=this.materializingNodes.filter(r=>r.id!==t),this.dissolvingNodes.push({id:t,frame:0,totalFrames:60,mesh:e,glow:n,label:s,originalScale:e.scale.x}))}growNode(t,e){const n=this.meshMap.get(t);if(!n)return;const s=n.scale.x,r=.5+e*2;n.userData.retention=e,this.growingNodes.push({id:t,frame:0,totalFrames:30,startScale:s,targetScale:r})}createTextSprite(t,e){const n=document.createElement("canvas"),s=n.getContext("2d");n.width=512,n.height=64;const r=t.length>40?t.slice(0,37)+"...":t;s.clearRect(0,0,n.width,n.height),s.font="bold 28px -apple-system, BlinkMacSystemFont, sans-serif",s.textAlign="center",s.textBaseline="middle",s.shadowColor="rgba(0, 0, 0, 0.8)",s.shadowBlur=6,s.shadowOffsetX=0,s.shadowOffsetY=2,s.fillStyle=e,s.fillText(r,n.width/2,n.height/2);const a=new tu(n);a.needsUpdate=!0;const o=new Ha({map:a,transparent:!0,opacity:0,depthTest:!1,sizeAttenuation:!0}),l=new Br(o);return l.scale.set(12,1.5,1),l}updatePositions(){this.group.children.forEach(t=>{if(t.userData.nodeId){const e=this.positions.get(t.userData.nodeId);if(!e)return;t.userData.isGlow?t.position.copy(e):t.userData.isLabel?(t.position.copy(e),t.position.y+=t.userData.offset):t instanceof Me&&t.position.copy(e)}})}animate(t,e,n){var r,a;for(let o=this.materializingNodes.length-1;o>=0;o--){const l=this.materializingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=Tl(c);if(l.mesh.scale.setScalar(Math.max(.001,h)),l.frame>=5){const d=Math.min((l.frame-5)/5,1),f=l.glow.material;f.opacity=d*.25;const p=l.targetScale*4*h;l.glow.scale.set(p,p,1)}if(l.frame>=40){const d=Math.min((l.frame-40)/20,1);l.label.material.opacity=d*.9}l.frame>=60&&this.materializingNodes.splice(o,1)}for(let o=this.dissolvingNodes.length-1;o>=0;o--){const l=this.dissolvingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=1-Mg(c),d=Math.max(.001,l.originalScale*h);l.mesh.scale.setScalar(d);const f=d*4;l.glow.scale.set(f,f,1);const p=l.mesh.material;p.opacity*=.97,l.glow.material.opacity*=.95,l.label.material.opacity*=.93,l.frame>=l.totalFrames&&(this.group.remove(l.mesh),this.group.remove(l.glow),this.group.remove(l.label),l.mesh.geometry.dispose(),l.mesh.material.dispose(),(r=l.glow.material.map)==null||r.dispose(),l.glow.material.dispose(),(a=l.label.material.map)==null||a.dispose(),l.label.material.dispose(),this.meshMap.delete(l.id),this.glowMap.delete(l.id),this.labelSprites.delete(l.id),this.positions.delete(l.id),this.dissolvingNodes.splice(o,1))}for(let o=this.growingNodes.length-1;o>=0;o--){const l=this.growingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=l.startScale+(l.targetScale-l.startScale)*Tl(c),d=this.meshMap.get(l.id);d&&d.scale.setScalar(h);const f=this.glowMap.get(l.id);if(f){const p=h*4;f.scale.set(p,p,1)}l.frame>=l.totalFrames&&this.growingNodes.splice(o,1)}const s=new Set([...this.materializingNodes.map(o=>o.id),...this.dissolvingNodes.map(o=>o.id),...this.growingNodes.map(o=>o.id)]);this.meshMap.forEach((o,l)=>{if(s.has(l))return;const c=e.find(f=>f.id===l);if(!c)return;const h=1+Math.sin(t*1.5+e.indexOf(c)*.5)*.15*c.retention;o.scale.setScalar(h);const d=o.material;if(l===this.hoveredNode)d.emissiveIntensity=1;else if(l===this.selectedNode)d.emissiveIntensity=.8;else{const p=.3+c.retention*.5+Math.sin(t*(.8+c.retention*.7))*.1*c.retention;d.emissiveIntensity=p}}),this.labelSprites.forEach((o,l)=>{if(s.has(l))return;const c=this.positions.get(l);if(!c)return;const h=n.position.distanceTo(c),d=o.material,f=l===this.hoveredNode||l===this.selectedNode?1:h<40?.9:h<80?.9*(1-(h-40)/40):0;d.opacity+=(f-d.opacity)*.1})}getMeshes(){return Array.from(this.meshMap.values())}dispose(){this.group.traverse(t=>{var e,n,s,r,a;t instanceof Me?((e=t.geometry)==null||e.dispose(),(n=t.material)==null||n.dispose()):t instanceof Br&&((r=(s=t.material)==null?void 0:s.map)==null||r.dispose(),(a=t.material)==null||a.dispose())}),this.materializingNodes=[],this.dissolvingNodes=[],this.growingNodes=[]}}function yg(i){return 1-Math.pow(1-i,3)}class Eg{constructor(){Wt(this,"group");Wt(this,"growingEdges",[]);Wt(this,"dissolvingEdges",[]);this.group=new Ci}createEdges(t,e){for(const n of t){const s=e.get(n.source),r=e.get(n.target);if(!s||!r)continue;const a=[s,r],o=new pe().setFromPoints(a),l=new rr({color:4868730,transparent:!0,opacity:Math.min(.1+n.weight*.5,.6),blending:ze}),c=new ka(o,l);c.userData={source:n.source,target:n.target},this.group.add(c)}}addEdge(t,e){const n=e.get(t.source),s=e.get(t.target);if(!n||!s)return;const r=[n.clone(),n.clone()],a=new pe().setFromPoints(r),o=new rr({color:4868730,transparent:!0,opacity:0,blending:ze}),l=new ka(a,o);l.userData={source:t.source,target:t.target},this.group.add(l),this.growingEdges.push({line:l,source:t.source,target:t.target,frame:0,totalFrames:45})}removeEdgesForNode(t){const e=[];this.group.children.forEach(n=>{const s=n;(s.userData.source===t||s.userData.target===t)&&e.push(s)});for(const n of e)this.growingEdges=this.growingEdges.filter(s=>s.line!==n),this.dissolvingEdges.push({line:n,frame:0,totalFrames:40})}animateEdges(t){for(let e=this.growingEdges.length-1;e>=0;e--){const n=this.growingEdges[e];n.frame++;const s=yg(Math.min(n.frame/n.totalFrames,1)),r=t.get(n.source),a=t.get(n.target);if(!r||!a)continue;const o=r.clone().lerp(a,s),l=n.line.geometry.attributes.position;l.setXYZ(0,r.x,r.y,r.z),l.setXYZ(1,o.x,o.y,o.z),l.needsUpdate=!0;const c=n.line.material;c.opacity=s*.5,n.frame>=n.totalFrames&&(c.opacity=.5,this.growingEdges.splice(e,1))}for(let e=this.dissolvingEdges.length-1;e>=0;e--){const n=this.dissolvingEdges[e];n.frame++;const s=n.frame/n.totalFrames,r=n.line.material;r.opacity=Math.max(0,.5*(1-s)),n.frame>=n.totalFrames&&(this.group.remove(n.line),n.line.geometry.dispose(),n.line.material.dispose(),this.dissolvingEdges.splice(e,1))}}updatePositions(t){this.group.children.forEach(e=>{const n=e;if(this.growingEdges.some(a=>a.line===n)||this.dissolvingEdges.some(a=>a.line===n))return;const s=t.get(n.userData.source),r=t.get(n.userData.target);if(s&&r){const a=n.geometry.attributes.position;a.setXYZ(0,s.x,s.y,s.z),a.setXYZ(1,r.x,r.y,r.z),a.needsUpdate=!0}})}dispose(){this.group.children.forEach(t=>{var n,s;const e=t;(n=e.geometry)==null||n.dispose(),(s=e.material)==null||s.dispose()}),this.growingEdges=[],this.dissolvingEdges=[]}}class bg{constructor(t){Wt(this,"starField");Wt(this,"neuralParticles");this.starField=this.createStarField(),this.neuralParticles=this.createNeuralParticles(),t.add(this.starField),t.add(this.neuralParticles)}createStarField(){const e=new pe,n=new Float32Array(3e3*3),s=new Float32Array(3e3);for(let a=0;a<3e3;a++)n[a*3]=(Math.random()-.5)*1e3,n[a*3+1]=(Math.random()-.5)*1e3,n[a*3+2]=(Math.random()-.5)*1e3,s[a]=Math.random()*1.5;e.setAttribute("position",new de(n,3)),e.setAttribute("size",new de(s,1));const r=new Ni({color:6514417,size:.5,transparent:!0,opacity:.4,sizeAttenuation:!0,blending:ze});return new rs(e,r)}createNeuralParticles(){const e=new pe,n=new Float32Array(500*3),s=new Float32Array(500*3);for(let a=0;a<500;a++)n[a*3]=(Math.random()-.5)*100,n[a*3+1]=(Math.random()-.5)*100,n[a*3+2]=(Math.random()-.5)*100,s[a*3]=.4+Math.random()*.3,s[a*3+1]=.3+Math.random()*.2,s[a*3+2]=.8+Math.random()*.2;e.setAttribute("position",new de(n,3)),e.setAttribute("color",new de(s,3));const r=new Ni({size:.3,vertexColors:!0,transparent:!0,opacity:.4,blending:ze,sizeAttenuation:!0});return new rs(e,r)}animate(t){this.starField.rotation.y+=1e-4,this.starField.rotation.x+=5e-5;const e=this.neuralParticles.geometry.attributes.position;for(let n=0;n=0;s--){const r=this.pulseEffects[s];if(r.intensity-=r.decay,r.intensity<=0){this.pulseEffects.splice(s,1);continue}const a=t.get(r.nodeId);if(a){const o=a.material;o.emissive.lerp(r.color,r.intensity*.3),o.emissiveIntensity=Math.max(o.emissiveIntensity,r.intensity)}}for(let s=this.spawnBursts.length-1;s>=0;s--){const r=this.spawnBursts[s];if(r.age++,r.age>120){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.spawnBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let c=0;c=0;s--){const r=this.rainbowBursts[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.rainbowBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let f=0;f=0;s--){const r=this.rippleWaves[s];if(r.age++,r.radius+=r.speed,r.age>r.maxAge){this.rippleWaves.splice(s,1);continue}const a=r.radius,o=3;n.forEach((l,c)=>{if(r.pulsedNodes.has(c))return;const h=l.distanceTo(r.origin);if(h>=a-o&&h<=a+o){r.pulsedNodes.add(c),this.addPulse(c,.8,new pt(65489),.03);const d=t.get(c);d&&d.scale.multiplyScalar(1.3)}})}for(let s=this.implosions.length-1;s>=0;s--){const r=this.implosions[s];if(r.age++,r.age>r.maxAge+20){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),r.flash&&(this.scene.remove(r.flash),r.flash.geometry.dispose(),r.flash.material.dispose()),this.implosions.splice(s,1);continue}if(r.age<=r.maxAge){const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity,l=1+r.age*.02;for(let h=0;hr.maxAge){const a=(r.age-r.maxAge)/20;r.flash.material.opacity=Math.max(0,1-a),r.flash.scale.setScalar(1+a*3)}}for(let s=this.shockwaves.length-1;s>=0;s--){const r=this.shockwaves[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.mesh),r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.shockwaves.splice(s,1);continue}const a=r.age/r.maxAge;r.mesh.scale.setScalar(1+a*20),r.mesh.material.opacity=.8*(1-a),r.mesh.lookAt(e.position)}for(let s=this.connectionFlashes.length-1;s>=0;s--){const r=this.connectionFlashes[s];if(r.intensity-=.015,r.intensity<=0){this.scene.remove(r.line),r.line.geometry.dispose(),r.line.material.dispose(),this.connectionFlashes.splice(s,1);continue}r.line.material.opacity=r.intensity}}dispose(){for(const t of this.spawnBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.rainbowBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.implosions)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose(),t.flash&&(this.scene.remove(t.flash),t.flash.geometry.dispose(),t.flash.material.dispose());for(const t of this.shockwaves)this.scene.remove(t.mesh),t.mesh.geometry.dispose(),t.mesh.material.dispose();for(const t of this.connectionFlashes)this.scene.remove(t.line),t.line.geometry.dispose(),t.line.material.dispose();this.pulseEffects=[],this.spawnBursts=[],this.rainbowBursts=[],this.rippleWaves=[],this.implosions=[],this.shockwaves=[],this.connectionFlashes=[]}}const Sn={bloomStrength:.8,rotateSpeed:.3,fogColor:328976,fogDensity:.008,nebulaIntensity:0,chromaticIntensity:.002,vignetteRadius:.9,breatheAmplitude:1},In={bloomStrength:1.8,rotateSpeed:.08,fogColor:656672,fogDensity:.006,nebulaIntensity:1,chromaticIntensity:.005,vignetteRadius:.7,breatheAmplitude:2};class wg{constructor(){Wt(this,"active",!1);Wt(this,"transition",0);Wt(this,"transitionSpeed",.008);Wt(this,"current");Wt(this,"auroraHue",0);this.current={...Sn}}setActive(t){this.active=t}update(t,e,n,s,r){const a=this.active?1:0;this.transition+=(a-this.transition)*this.transitionSpeed*60*(1/60),this.transition=Math.max(0,Math.min(1,this.transition));const o=this.transition;this.current.bloomStrength=this.lerp(Sn.bloomStrength,In.bloomStrength,o),this.current.rotateSpeed=this.lerp(Sn.rotateSpeed,In.rotateSpeed,o),this.current.fogDensity=this.lerp(Sn.fogDensity,In.fogDensity,o),this.current.nebulaIntensity=this.lerp(Sn.nebulaIntensity,In.nebulaIntensity,o),this.current.chromaticIntensity=this.lerp(Sn.chromaticIntensity,In.chromaticIntensity,o),this.current.vignetteRadius=this.lerp(Sn.vignetteRadius,In.vignetteRadius,o),this.current.breatheAmplitude=this.lerp(Sn.breatheAmplitude,In.breatheAmplitude,o),e.strength=this.current.bloomStrength,n.autoRotateSpeed=this.current.rotateSpeed;const l=new pt(Sn.fogColor),c=new pt(In.fogColor),h=l.clone().lerp(c,o);if(t.fog=new ur(h,this.current.fogDensity),o>.01){this.auroraHue=r*.1%1;const d=new pt().setHSL(.75+this.auroraHue*.15,.8,.5),f=new pt().setHSL(.55+this.auroraHue*.2,.7,.4);s.point1.color.lerp(d,o*.3),s.point2.color.lerp(f,o*.3)}else s.point1.color.set(6514417),s.point2.color.set(11032055)}lerp(t,e,n){return t+(e-t)*n}}const Ag=50,as=[];function Rg(i,t,e){const n=i.tags??[],s=i.type??"";let r=null,a=0;for(const o of t){let l=0;o.type===s&&(l+=2);for(const c of o.tags)n.includes(c)&&(l+=1);l>a&&(a=l,r=o.id)}if(r&&a>0){const o=e.get(r);if(o)return new P(o.x+(Math.random()-.5)*10,o.y+(Math.random()-.5)*10,o.z+(Math.random()-.5)*10)}return new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40)}function Cg(i,t){if(as.length<=Ag)return;const e=as.shift();i.edgeManager.removeEdgesForNode(e),i.nodeManager.removeNode(e),i.forceSim.removeNode(e),i.onMutation({type:"edgesRemoved",nodeId:e}),i.onMutation({type:"nodeRemoved",nodeId:e});const n=t.findIndex(s=>s.id===e);n!==-1&&t.splice(n,1)}function Pg(i,t,e){var d,f;const{effects:n,nodeManager:s,edgeManager:r,forceSim:a,camera:o,onMutation:l}=t,c=s.positions,h=s.meshMap;switch(i.type){case"MemoryCreated":{const p=i.data;if(!p.id)break;const g={id:p.id,label:(p.content??"").slice(0,60),type:p.node_type??"fact",retention:p.retention??.9,tags:p.tags??[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),isCenter:!1},v=Rg(g,e,c),m=s.addNode(g,v);a.addNode(p.id,m),as.push(p.id),Cg(t,e);const u=new pt(Fl[g.type]||"#00ffd1");n.createRainbowBurst(v,u),n.createShockwave(v,u,o);const T=u.clone();T.offsetHSL(.15,0,0),setTimeout(()=>{n.createShockwave(v,T,o)},166),n.createRippleWave(v),l({type:"nodeAdded",node:g});break}case"ConnectionDiscovered":{const p=i.data;if(!p.source_id||!p.target_id)break;const g=c.get(p.source_id),v=c.get(p.target_id),m={source:p.source_id,target:p.target_id,weight:p.weight??.5,type:p.connection_type??"semantic"};r.addEdge(m,c),g&&v&&n.createConnectionFlash(g,v,new pt(54527)),p.source_id&&h.has(p.source_id)&&n.addPulse(p.source_id,1,new pt(54527),.02),p.target_id&&h.has(p.target_id)&&n.addPulse(p.target_id,1,new pt(54527),.02),l({type:"edgeAdded",edge:m});break}case"MemoryDeleted":{const p=i.data;if(!p.id)break;const g=c.get(p.id);if(g){const m=new pt(16729943);n.createImplosion(g,m)}r.removeEdgesForNode(p.id),s.removeNode(p.id),a.removeNode(p.id);const v=as.indexOf(p.id);v!==-1&&as.splice(v,1),l({type:"edgesRemoved",nodeId:p.id}),l({type:"nodeRemoved",nodeId:p.id});break}case"MemoryPromoted":{const p=i.data,g=p==null?void 0:p.id;if(!g)break;const v=p.new_retention??.95;if(h.has(g)){s.growNode(g,v),n.addPulse(g,1.2,new pt(65416),.01);const m=c.get(g);m&&(n.createShockwave(m,new pt(65416),o),n.createSpawnBurst(m,new pt(65416))),l({type:"nodeUpdated",nodeId:g,retention:v})}break}case"MemoryDemoted":{const p=i.data,g=p==null?void 0:p.id;if(!g)break;const v=p.new_retention??.3;h.has(g)&&(s.growNode(g,v),n.addPulse(g,.8,new pt(16729943),.03),l({type:"nodeUpdated",nodeId:g,retention:v}));break}case"MemoryUpdated":{const p=i.data,g=p==null?void 0:p.id;if(!g||!h.has(g))break;n.addPulse(g,.6,new pt(8490232),.02),p.retention!==void 0&&(s.growNode(g,p.retention),l({type:"nodeUpdated",nodeId:g,retention:p.retention}));break}case"SearchPerformed":{h.forEach((p,g)=>{n.addPulse(g,.6+Math.random()*.4,new pt(8490232),.02)});break}case"DreamStarted":{h.forEach((p,g)=>{n.addPulse(g,1,new pt(11032055),.005)});break}case"DreamProgress":{const p=(d=i.data)==null?void 0:d.memory_id;p&&h.has(p)&&n.addPulse(p,1.5,new pt(12616956),.01);break}case"DreamCompleted":{n.createSpawnBurst(new P(0,0,0),new pt(11032055)),n.createShockwave(new P(0,0,0),new pt(11032055),o);break}case"RetentionDecayed":{const p=(f=i.data)==null?void 0:f.id;p&&h.has(p)&&n.addPulse(p,.8,new pt(16729943),.03);break}case"ConsolidationCompleted":{h.forEach((p,g)=>{n.addPulse(g,.4+Math.random()*.3,new pt(16758784),.015)});break}case"ActivationSpread":{const p=i.data;if(p.source_id&&p.target_ids){const g=c.get(p.source_id);if(g)for(const v of p.target_ids){const m=c.get(v);m&&n.createConnectionFlash(g,m,new pt(1370310))}}break}}}const Dg=` + }`})}}Gi.BlurDirectionX=new vt(1,0);Gi.BlurDirectionY=new vt(0,1);function _g(i){const t=new jh;t.fog=new ur(328976,.008);const e=new Ye(60,i.clientWidth/i.clientHeight,.1,2e3);e.position.set(0,30,80);const n=new Zm({antialias:!0,alpha:!0,powerPreference:"high-performance"});n.setSize(i.clientWidth,i.clientHeight),n.setPixelRatio(Math.min(window.devicePixelRatio,2)),n.toneMapping=Bl,n.toneMappingExposure=1.2,i.appendChild(n.domElement);const s=new $m(e,n.domElement);s.enableDamping=!0,s.dampingFactor=.05,s.rotateSpeed=.5,s.zoomSpeed=.8,s.minDistance=10,s.maxDistance=500,s.autoRotate=!0,s.autoRotateSpeed=.3;const r=new pg(n);r.addPass(new mg(t,e));const a=new Gi(new vt(i.clientWidth,i.clientHeight),.8,.4,.85);r.addPass(a);const o=new ou(1710650,.5);t.add(o);const l=new Yo(6514417,1.5,200);l.position.set(50,50,50),t.add(l);const c=new Yo(11032055,1,200);c.position.set(-50,-30,-50),t.add(c);const h=new hu;h.params.Points={threshold:2};const d=new vt;return{scene:t,camera:e,renderer:n,controls:s,composer:r,bloomPass:a,raycaster:h,mouse:d,lights:{ambient:o,point1:l,point2:c}}}function vg(i,t){const e=t.clientWidth,n=t.clientHeight;i.camera.aspect=e/n,i.camera.updateProjectionMatrix(),i.renderer.setSize(e,n),i.composer.setSize(e,n)}function xg(i){i.scene.traverse(t=>{var e;(t instanceof Se||t instanceof Jh)&&((e=t.geometry)==null||e.dispose(),Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material&&t.material.dispose())}),i.renderer.dispose(),i.composer.dispose()}class Mg{constructor(t){Wt(this,"positions");Wt(this,"velocities");Wt(this,"running",!0);Wt(this,"step",0);Wt(this,"repulsionStrength",500);Wt(this,"attractionStrength",.01);Wt(this,"dampening",.9);Wt(this,"baseMaxSteps",300);Wt(this,"maxSteps",300);Wt(this,"cooldownExtension",0);this.positions=t,this.velocities=new Map;for(const e of t.keys())this.velocities.set(e,new P)}addNode(t,e){this.positions.set(t,e.clone()),this.velocities.set(t,new P),this.cooldownExtension=100,this.maxSteps=Math.max(this.maxSteps,this.step+this.cooldownExtension),this.running=!0}removeNode(t){this.positions.delete(t),this.velocities.delete(t)}tick(t){if(!this.running)return;if(this.step>this.maxSteps){this.cooldownExtension>0&&(this.cooldownExtension=0,this.maxSteps=this.baseMaxSteps);return}this.step++;const e=Math.max(.001,1-this.step/this.maxSteps),n=Array.from(this.positions.keys());for(let s=0;s0?.15+t.retention*.2:0,blending:He}),h=new Br(c);h.scale.set(s*4*n,s*4*n,1),h.position.copy(e),h.userData={isGlow:!0,nodeId:t.id},this.glowMap.set(t.id,h),this.group.add(h);const d=t.label||t.type,f=this.createTextSprite(d,"#e2e8f0");return f.position.copy(e),f.position.y+=s*2+1.5,f.userData={isLabel:!0,nodeId:t.id,offset:s*2+1.5},this.group.add(f),this.labelSprites.set(t.id,f),{mesh:l,glow:h,label:f,size:s}}addNode(t,e){const n=(e==null?void 0:e.clone())??new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40);this.positions.set(t.id,n);const{mesh:s,glow:r,label:a}=this.createNodeMeshes(t,n,0);return s.scale.setScalar(.001),r.scale.set(.001,.001,1),r.material.opacity=0,a.material.opacity=0,this.materializingNodes.push({id:t.id,frame:0,totalFrames:30,mesh:s,glow:r,label:a,targetScale:.5+t.retention*2}),n}removeNode(t){const e=this.meshMap.get(t),n=this.glowMap.get(t),s=this.labelSprites.get(t);!e||!n||!s||(this.materializingNodes=this.materializingNodes.filter(r=>r.id!==t),this.dissolvingNodes.push({id:t,frame:0,totalFrames:60,mesh:e,glow:n,label:s,originalScale:e.scale.x}))}growNode(t,e){const n=this.meshMap.get(t);if(!n)return;const s=n.scale.x,r=.5+e*2;n.userData.retention=e,this.growingNodes.push({id:t,frame:0,totalFrames:30,startScale:s,targetScale:r})}createTextSprite(t,e){const n=document.createElement("canvas"),s=n.getContext("2d");n.width=512,n.height=64;const r=t.length>40?t.slice(0,37)+"...":t;s.clearRect(0,0,n.width,n.height),s.font="bold 28px -apple-system, BlinkMacSystemFont, sans-serif",s.textAlign="center",s.textBaseline="middle",s.shadowColor="rgba(0, 0, 0, 0.8)",s.shadowBlur=6,s.shadowOffsetX=0,s.shadowOffsetY=2,s.fillStyle=e,s.fillText(r,n.width/2,n.height/2);const a=new eu(n);a.needsUpdate=!0;const o=new Ha({map:a,transparent:!0,opacity:0,depthTest:!1,sizeAttenuation:!0}),l=new Br(o);return l.scale.set(12,1.5,1),l}updatePositions(){this.group.children.forEach(t=>{if(t.userData.nodeId){const e=this.positions.get(t.userData.nodeId);if(!e)return;t.userData.isGlow?t.position.copy(e):t.userData.isLabel?(t.position.copy(e),t.position.y+=t.userData.offset):t instanceof Se&&t.position.copy(e)}})}animate(t,e,n){var r,a;for(let o=this.materializingNodes.length-1;o>=0;o--){const l=this.materializingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=Tl(c);if(l.mesh.scale.setScalar(Math.max(.001,h)),l.frame>=5){const d=Math.min((l.frame-5)/5,1),f=l.glow.material;f.opacity=d*.25;const p=l.targetScale*4*h;l.glow.scale.set(p,p,1)}if(l.frame>=40){const d=Math.min((l.frame-40)/20,1);l.label.material.opacity=d*.9}l.frame>=60&&this.materializingNodes.splice(o,1)}for(let o=this.dissolvingNodes.length-1;o>=0;o--){const l=this.dissolvingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=1-Sg(c),d=Math.max(.001,l.originalScale*h);l.mesh.scale.setScalar(d);const f=d*4;l.glow.scale.set(f,f,1);const p=l.mesh.material;p.opacity*=.97,l.glow.material.opacity*=.95,l.label.material.opacity*=.93,l.frame>=l.totalFrames&&(this.group.remove(l.mesh),this.group.remove(l.glow),this.group.remove(l.label),l.mesh.geometry.dispose(),l.mesh.material.dispose(),(r=l.glow.material.map)==null||r.dispose(),l.glow.material.dispose(),(a=l.label.material.map)==null||a.dispose(),l.label.material.dispose(),this.meshMap.delete(l.id),this.glowMap.delete(l.id),this.labelSprites.delete(l.id),this.positions.delete(l.id),this.dissolvingNodes.splice(o,1))}for(let o=this.growingNodes.length-1;o>=0;o--){const l=this.growingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=l.startScale+(l.targetScale-l.startScale)*Tl(c),d=this.meshMap.get(l.id);d&&d.scale.setScalar(h);const f=this.glowMap.get(l.id);if(f){const p=h*4;f.scale.set(p,p,1)}l.frame>=l.totalFrames&&this.growingNodes.splice(o,1)}const s=new Set([...this.materializingNodes.map(o=>o.id),...this.dissolvingNodes.map(o=>o.id),...this.growingNodes.map(o=>o.id)]);this.meshMap.forEach((o,l)=>{if(s.has(l))return;const c=e.find(f=>f.id===l);if(!c)return;const h=1+Math.sin(t*1.5+e.indexOf(c)*.5)*.15*c.retention;o.scale.setScalar(h);const d=o.material;if(l===this.hoveredNode)d.emissiveIntensity=1;else if(l===this.selectedNode)d.emissiveIntensity=.8;else{const p=.3+c.retention*.5+Math.sin(t*(.8+c.retention*.7))*.1*c.retention;d.emissiveIntensity=p}}),this.labelSprites.forEach((o,l)=>{if(s.has(l))return;const c=this.positions.get(l);if(!c)return;const h=n.position.distanceTo(c),d=o.material,f=l===this.hoveredNode||l===this.selectedNode?1:h<40?.9:h<80?.9*(1-(h-40)/40):0;d.opacity+=(f-d.opacity)*.1})}getMeshes(){return Array.from(this.meshMap.values())}dispose(){this.group.traverse(t=>{var e,n,s,r,a;t instanceof Se?((e=t.geometry)==null||e.dispose(),(n=t.material)==null||n.dispose()):t instanceof Br&&((r=(s=t.material)==null?void 0:s.map)==null||r.dispose(),(a=t.material)==null||a.dispose())}),this.materializingNodes=[],this.dissolvingNodes=[],this.growingNodes=[]}}function Eg(i){return 1-Math.pow(1-i,3)}class bg{constructor(){Wt(this,"group");Wt(this,"growingEdges",[]);Wt(this,"dissolvingEdges",[]);this.group=new Ci}createEdges(t,e){for(const n of t){const s=e.get(n.source),r=e.get(n.target);if(!s||!r)continue;const a=[s,r],o=new pe().setFromPoints(a),l=new rr({color:4868730,transparent:!0,opacity:Math.min(.1+n.weight*.5,.6),blending:He}),c=new ka(o,l);c.userData={source:n.source,target:n.target},this.group.add(c)}}addEdge(t,e){const n=e.get(t.source),s=e.get(t.target);if(!n||!s)return;const r=[n.clone(),n.clone()],a=new pe().setFromPoints(r),o=new rr({color:4868730,transparent:!0,opacity:0,blending:He}),l=new ka(a,o);l.userData={source:t.source,target:t.target},this.group.add(l),this.growingEdges.push({line:l,source:t.source,target:t.target,frame:0,totalFrames:45})}removeEdgesForNode(t){const e=[];this.group.children.forEach(n=>{const s=n;(s.userData.source===t||s.userData.target===t)&&e.push(s)});for(const n of e)this.growingEdges=this.growingEdges.filter(s=>s.line!==n),this.dissolvingEdges.push({line:n,frame:0,totalFrames:40})}animateEdges(t){for(let e=this.growingEdges.length-1;e>=0;e--){const n=this.growingEdges[e];n.frame++;const s=Eg(Math.min(n.frame/n.totalFrames,1)),r=t.get(n.source),a=t.get(n.target);if(!r||!a)continue;const o=r.clone().lerp(a,s),l=n.line.geometry.attributes.position;l.setXYZ(0,r.x,r.y,r.z),l.setXYZ(1,o.x,o.y,o.z),l.needsUpdate=!0;const c=n.line.material;c.opacity=s*.5,n.frame>=n.totalFrames&&(c.opacity=.5,this.growingEdges.splice(e,1))}for(let e=this.dissolvingEdges.length-1;e>=0;e--){const n=this.dissolvingEdges[e];n.frame++;const s=n.frame/n.totalFrames,r=n.line.material;r.opacity=Math.max(0,.5*(1-s)),n.frame>=n.totalFrames&&(this.group.remove(n.line),n.line.geometry.dispose(),n.line.material.dispose(),this.dissolvingEdges.splice(e,1))}}updatePositions(t){this.group.children.forEach(e=>{const n=e;if(this.growingEdges.some(a=>a.line===n)||this.dissolvingEdges.some(a=>a.line===n))return;const s=t.get(n.userData.source),r=t.get(n.userData.target);if(s&&r){const a=n.geometry.attributes.position;a.setXYZ(0,s.x,s.y,s.z),a.setXYZ(1,r.x,r.y,r.z),a.needsUpdate=!0}})}dispose(){this.group.children.forEach(t=>{var n,s;const e=t;(n=e.geometry)==null||n.dispose(),(s=e.material)==null||s.dispose()}),this.growingEdges=[],this.dissolvingEdges=[]}}class Tg{constructor(t){Wt(this,"starField");Wt(this,"neuralParticles");this.starField=this.createStarField(),this.neuralParticles=this.createNeuralParticles(),t.add(this.starField),t.add(this.neuralParticles)}createStarField(){const e=new pe,n=new Float32Array(3e3*3),s=new Float32Array(3e3);for(let a=0;a<3e3;a++)n[a*3]=(Math.random()-.5)*1e3,n[a*3+1]=(Math.random()-.5)*1e3,n[a*3+2]=(Math.random()-.5)*1e3,s[a]=Math.random()*1.5;e.setAttribute("position",new de(n,3)),e.setAttribute("size",new de(s,1));const r=new Ni({color:6514417,size:.5,transparent:!0,opacity:.4,sizeAttenuation:!0,blending:He});return new rs(e,r)}createNeuralParticles(){const e=new pe,n=new Float32Array(500*3),s=new Float32Array(500*3);for(let a=0;a<500;a++)n[a*3]=(Math.random()-.5)*100,n[a*3+1]=(Math.random()-.5)*100,n[a*3+2]=(Math.random()-.5)*100,s[a*3]=.4+Math.random()*.3,s[a*3+1]=.3+Math.random()*.2,s[a*3+2]=.8+Math.random()*.2;e.setAttribute("position",new de(n,3)),e.setAttribute("color",new de(s,3));const r=new Ni({size:.3,vertexColors:!0,transparent:!0,opacity:.4,blending:He,sizeAttenuation:!0});return new rs(e,r)}animate(t){this.starField.rotation.y+=1e-4,this.starField.rotation.x+=5e-5;const e=this.neuralParticles.geometry.attributes.position;for(let n=0;n=0;s--){const r=this.pulseEffects[s];if(r.intensity-=r.decay,r.intensity<=0){this.pulseEffects.splice(s,1);continue}const a=t.get(r.nodeId);if(a){const o=a.material;o.emissive.lerp(r.color,r.intensity*.3),o.emissiveIntensity=Math.max(o.emissiveIntensity,r.intensity)}}for(let s=this.spawnBursts.length-1;s>=0;s--){const r=this.spawnBursts[s];if(r.age++,r.age>120){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.spawnBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let c=0;c=0;s--){const r=this.rainbowBursts[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.rainbowBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let f=0;f=0;s--){const r=this.rippleWaves[s];if(r.age++,r.radius+=r.speed,r.age>r.maxAge){this.rippleWaves.splice(s,1);continue}const a=r.radius,o=3;n.forEach((l,c)=>{if(r.pulsedNodes.has(c))return;const h=l.distanceTo(r.origin);if(h>=a-o&&h<=a+o){r.pulsedNodes.add(c),this.addPulse(c,.8,new pt(65489),.03);const d=t.get(c);d&&d.scale.multiplyScalar(1.3)}})}for(let s=this.implosions.length-1;s>=0;s--){const r=this.implosions[s];if(r.age++,r.age>r.maxAge+20){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),r.flash&&(this.scene.remove(r.flash),r.flash.geometry.dispose(),r.flash.material.dispose()),this.implosions.splice(s,1);continue}if(r.age<=r.maxAge){const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity,l=1+r.age*.02;for(let h=0;hr.maxAge){const a=(r.age-r.maxAge)/20;r.flash.material.opacity=Math.max(0,1-a),r.flash.scale.setScalar(1+a*3)}}for(let s=this.shockwaves.length-1;s>=0;s--){const r=this.shockwaves[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.mesh),r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.shockwaves.splice(s,1);continue}const a=r.age/r.maxAge;r.mesh.scale.setScalar(1+a*20),r.mesh.material.opacity=.8*(1-a),r.mesh.lookAt(e.position)}for(let s=this.connectionFlashes.length-1;s>=0;s--){const r=this.connectionFlashes[s];if(r.intensity-=.015,r.intensity<=0){this.scene.remove(r.line),r.line.geometry.dispose(),r.line.material.dispose(),this.connectionFlashes.splice(s,1);continue}r.line.material.opacity=r.intensity}}dispose(){for(const t of this.spawnBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.rainbowBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.implosions)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose(),t.flash&&(this.scene.remove(t.flash),t.flash.geometry.dispose(),t.flash.material.dispose());for(const t of this.shockwaves)this.scene.remove(t.mesh),t.mesh.geometry.dispose(),t.mesh.material.dispose();for(const t of this.connectionFlashes)this.scene.remove(t.line),t.line.geometry.dispose(),t.line.material.dispose();this.pulseEffects=[],this.spawnBursts=[],this.rainbowBursts=[],this.rippleWaves=[],this.implosions=[],this.shockwaves=[],this.connectionFlashes=[]}}const Sn={bloomStrength:.8,rotateSpeed:.3,fogColor:328976,fogDensity:.008,nebulaIntensity:0,chromaticIntensity:.002,vignetteRadius:.9,breatheAmplitude:1},In={bloomStrength:1.8,rotateSpeed:.08,fogColor:656672,fogDensity:.006,nebulaIntensity:1,chromaticIntensity:.005,vignetteRadius:.7,breatheAmplitude:2};class Ag{constructor(){Wt(this,"active",!1);Wt(this,"transition",0);Wt(this,"transitionSpeed",.008);Wt(this,"current");Wt(this,"auroraHue",0);this.current={...Sn}}setActive(t){this.active=t}update(t,e,n,s,r){const a=this.active?1:0;this.transition+=(a-this.transition)*this.transitionSpeed*60*(1/60),this.transition=Math.max(0,Math.min(1,this.transition));const o=this.transition;this.current.bloomStrength=this.lerp(Sn.bloomStrength,In.bloomStrength,o),this.current.rotateSpeed=this.lerp(Sn.rotateSpeed,In.rotateSpeed,o),this.current.fogDensity=this.lerp(Sn.fogDensity,In.fogDensity,o),this.current.nebulaIntensity=this.lerp(Sn.nebulaIntensity,In.nebulaIntensity,o),this.current.chromaticIntensity=this.lerp(Sn.chromaticIntensity,In.chromaticIntensity,o),this.current.vignetteRadius=this.lerp(Sn.vignetteRadius,In.vignetteRadius,o),this.current.breatheAmplitude=this.lerp(Sn.breatheAmplitude,In.breatheAmplitude,o),e.strength=this.current.bloomStrength,n.autoRotateSpeed=this.current.rotateSpeed;const l=new pt(Sn.fogColor),c=new pt(In.fogColor),h=l.clone().lerp(c,o);if(t.fog=new ur(h,this.current.fogDensity),o>.01){this.auroraHue=r*.1%1;const d=new pt().setHSL(.75+this.auroraHue*.15,.8,.5),f=new pt().setHSL(.55+this.auroraHue*.2,.7,.4);s.point1.color.lerp(d,o*.3),s.point2.color.lerp(f,o*.3)}else s.point1.color.set(6514417),s.point2.color.set(11032055)}lerp(t,e,n){return t+(e-t)*n}}const Rg=50,as=[];function Cg(i,t,e){const n=i.tags??[],s=i.type??"";let r=null,a=0;for(const o of t){let l=0;o.type===s&&(l+=2);for(const c of o.tags)n.includes(c)&&(l+=1);l>a&&(a=l,r=o.id)}if(r&&a>0){const o=e.get(r);if(o)return new P(o.x+(Math.random()-.5)*10,o.y+(Math.random()-.5)*10,o.z+(Math.random()-.5)*10)}return new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40)}function Pg(i,t){if(as.length<=Rg)return;const e=as.shift();i.edgeManager.removeEdgesForNode(e),i.nodeManager.removeNode(e),i.forceSim.removeNode(e),i.onMutation({type:"edgesRemoved",nodeId:e}),i.onMutation({type:"nodeRemoved",nodeId:e});const n=t.findIndex(s=>s.id===e);n!==-1&&t.splice(n,1)}function Dg(i,t,e){var d,f;const{effects:n,nodeManager:s,edgeManager:r,forceSim:a,camera:o,onMutation:l}=t,c=s.positions,h=s.meshMap;switch(i.type){case"MemoryCreated":{const p=i.data;if(!p.id)break;const g={id:p.id,label:(p.content??"").slice(0,60),type:p.node_type??"fact",retention:p.retention??.9,tags:p.tags??[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),isCenter:!1},v=Cg(g,e,c),m=s.addNode(g,v);a.addNode(p.id,m),as.push(p.id),Pg(t,e);const u=new pt(Nl[g.type]||"#00ffd1");n.createRainbowBurst(v,u),n.createShockwave(v,u,o);const T=u.clone();T.offsetHSL(.15,0,0),setTimeout(()=>{n.createShockwave(v,T,o)},166),n.createRippleWave(v),l({type:"nodeAdded",node:g});break}case"ConnectionDiscovered":{const p=i.data;if(!p.source_id||!p.target_id)break;const g=c.get(p.source_id),v=c.get(p.target_id),m={source:p.source_id,target:p.target_id,weight:p.weight??.5,type:p.connection_type??"semantic"};r.addEdge(m,c),g&&v&&n.createConnectionFlash(g,v,new pt(54527)),p.source_id&&h.has(p.source_id)&&n.addPulse(p.source_id,1,new pt(54527),.02),p.target_id&&h.has(p.target_id)&&n.addPulse(p.target_id,1,new pt(54527),.02),l({type:"edgeAdded",edge:m});break}case"MemoryDeleted":{const p=i.data;if(!p.id)break;const g=c.get(p.id);if(g){const m=new pt(16729943);n.createImplosion(g,m)}r.removeEdgesForNode(p.id),s.removeNode(p.id),a.removeNode(p.id);const v=as.indexOf(p.id);v!==-1&&as.splice(v,1),l({type:"edgesRemoved",nodeId:p.id}),l({type:"nodeRemoved",nodeId:p.id});break}case"MemoryPromoted":{const p=i.data,g=p==null?void 0:p.id;if(!g)break;const v=p.new_retention??.95;if(h.has(g)){s.growNode(g,v),n.addPulse(g,1.2,new pt(65416),.01);const m=c.get(g);m&&(n.createShockwave(m,new pt(65416),o),n.createSpawnBurst(m,new pt(65416))),l({type:"nodeUpdated",nodeId:g,retention:v})}break}case"MemoryDemoted":{const p=i.data,g=p==null?void 0:p.id;if(!g)break;const v=p.new_retention??.3;h.has(g)&&(s.growNode(g,v),n.addPulse(g,.8,new pt(16729943),.03),l({type:"nodeUpdated",nodeId:g,retention:v}));break}case"MemoryUpdated":{const p=i.data,g=p==null?void 0:p.id;if(!g||!h.has(g))break;n.addPulse(g,.6,new pt(8490232),.02),p.retention!==void 0&&(s.growNode(g,p.retention),l({type:"nodeUpdated",nodeId:g,retention:p.retention}));break}case"SearchPerformed":{h.forEach((p,g)=>{n.addPulse(g,.6+Math.random()*.4,new pt(8490232),.02)});break}case"DreamStarted":{h.forEach((p,g)=>{n.addPulse(g,1,new pt(11032055),.005)});break}case"DreamProgress":{const p=(d=i.data)==null?void 0:d.memory_id;p&&h.has(p)&&n.addPulse(p,1.5,new pt(12616956),.01);break}case"DreamCompleted":{n.createSpawnBurst(new P(0,0,0),new pt(11032055)),n.createShockwave(new P(0,0,0),new pt(11032055),o);break}case"RetentionDecayed":{const p=(f=i.data)==null?void 0:f.id;p&&h.has(p)&&n.addPulse(p,.8,new pt(16729943),.03);break}case"ConsolidationCompleted":{h.forEach((p,g)=>{n.addPulse(g,.4+Math.random()*.3,new pt(16758784),.015)});break}case"ActivationSpread":{const p=i.data;if(p.source_id&&p.target_ids){const g=c.get(p.source_id);if(g)for(const v of p.target_ids){const m=c.get(v);m&&n.createConnectionFlash(g,m,new pt(1370310))}}break}}}const Lg=` varying vec2 vUv; void main() { vUv = uv; gl_Position = vec4(position, 1.0); } -`,Lg=` +`,Ug=` precision highp float; uniform float uTime; @@ -4031,7 +4031,7 @@ void main() { gl_FragColor = vec4(color, 1.0); } -`;function Ug(i){const t=new us(2,2),e=new Ne({vertexShader:Dg,fragmentShader:Lg,uniforms:{uTime:{value:0},uResolution:{value:new vt(window.innerWidth,window.innerHeight)},uDreamIntensity:{value:0}},depthWrite:!1,depthTest:!1,transparent:!1}),n=new Me(t,e);return n.frustumCulled=!1,n.renderOrder=-1e3,i.add(n),{mesh:n,material:e}}function Ig(i,t,e,n,s){i.uniforms.uTime.value=t,i.uniforms.uDreamIntensity.value=e,i.uniforms.uResolution.value.set(n,s)}const Ng={uniforms:{tDiffuse:{value:null},uIntensity:{value:.002}},vertexShader:` +`;function Ig(i){const t=new us(2,2),e=new Ne({vertexShader:Lg,fragmentShader:Ug,uniforms:{uTime:{value:0},uResolution:{value:new vt(window.innerWidth,window.innerHeight)},uDreamIntensity:{value:0}},depthWrite:!1,depthTest:!1,transparent:!1}),n=new Se(t,e);return n.frustumCulled=!1,n.renderOrder=-1e3,i.add(n),{mesh:n,material:e}}function Ng(i,t,e,n,s){i.uniforms.uTime.value=t,i.uniforms.uDreamIntensity.value=e,i.uniforms.uResolution.value.set(n,s)}const Fg={uniforms:{tDiffuse:{value:null},uIntensity:{value:.002}},vertexShader:` varying vec2 vUv; void main() { vUv = uv; @@ -4061,7 +4061,7 @@ void main() { gl_FragColor = vec4(r, g, b, 1.0); } - `},Fg={uniforms:{tDiffuse:{value:null},uTime:{value:0},uIntensity:{value:.04}},vertexShader:` + `},Og={uniforms:{tDiffuse:{value:null},uTime:{value:0},uIntensity:{value:.04}},vertexShader:` varying vec2 vUv; void main() { vUv = uv; @@ -4083,7 +4083,7 @@ void main() { color.rgb += grain * uIntensity; gl_FragColor = color; } - `},Og={uniforms:{tDiffuse:{value:null},uRadius:{value:.9},uSoftness:{value:.5}},vertexShader:` + `},Bg={uniforms:{tDiffuse:{value:null},uRadius:{value:.9},uSoftness:{value:.5}},vertexShader:` varying vec2 vUv; void main() { vUv = uv; @@ -4103,11 +4103,11 @@ void main() { color.rgb *= vignette; gl_FragColor = color; } - `};function Bg(i){const t=new Js(Ng),e=new Js(Fg),n=new Js(Og);return i.addPass(t),i.addPass(e),i.addPass(n),{chromatic:t,grain:e,vignette:n}}function zg(i,t,e){i.chromatic.uniforms.uIntensity.value=.002+(.005-.002)*e,i.grain.uniforms.uTime.value=t,i.grain.uniforms.uIntensity.value=.04+e*.02;const r=.9,a=.7;i.vignette.uniforms.uRadius.value=r+(a-r)*e}var Hg=qe('
');function kg(i,t){lr(t,!0);let e=Qs(t,"events",19,()=>[]),n=Qs(t,"isDreaming",3,!1),s,r,a,o,l,c,h,d,f,p,g,v=0,m=[];Al(()=>{r=gg(s),p=Ug(r.scene).material,g=Bg(r.composer),c=new bg(r.scene),o=new Sg,l=new Eg,h=new Tg(r.scene),f=new wg;const U=o.createNodes(t.nodes);l.createEdges(t.edges,U),d=new xg(U),m=[...t.nodes],r.scene.add(l.group),r.scene.add(o.group),u(),window.addEventListener("resize",b),s.addEventListener("pointermove",y),s.addEventListener("click",L)}),Rl(()=>{cancelAnimationFrame(a),window.removeEventListener("resize",b),s==null||s.removeEventListener("pointermove",y),s==null||s.removeEventListener("click",L),h==null||h.dispose(),c==null||c.dispose(),o==null||o.dispose(),l==null||l.dispose(),r&&vg(r)});function u(){a=requestAnimationFrame(u);const A=performance.now()*.001;d.tick(t.edges),o.updatePositions(),l.updatePositions(o.positions),l.animateEdges(o.positions),c.animate(A),o.animate(A,m,r.camera),f.setActive(n()),f.update(r.scene,r.bloomPass,r.controls,r.lights,A),Ig(p,A,f.current.nebulaIntensity,s.clientWidth,s.clientHeight),zg(g,A,f.current.nebulaIntensity),T(),h.update(o.meshMap,r.camera,o.positions),r.controls.update(),r.composer.render()}function T(){if(!e()||e().length<=v)return;const A=e().slice(v);v=e().length;const U={effects:h,nodeManager:o,edgeManager:l,forceSim:d,camera:r.camera,onMutation:S=>{var M;S.type==="nodeAdded"?m=[...m,S.node]:S.type==="nodeRemoved"&&(m=m.filter(D=>D.id!==S.nodeId)),(M=t.onGraphMutation)==null||M.call(t,S)}};for(const S of A)Pg(S,U,m)}function b(){!s||!r||_g(r,s)}function y(A){const U=s.getBoundingClientRect();r.mouse.x=(A.clientX-U.left)/U.width*2-1,r.mouse.y=-((A.clientY-U.top)/U.height)*2+1,r.raycaster.setFromCamera(r.mouse,r.camera);const S=r.raycaster.intersectObjects(o.getMeshes());S.length>0?(o.hoveredNode=S[0].object.userData.nodeId,s.style.cursor="pointer"):(o.hoveredNode=null,s.style.cursor="grab")}function L(){var A;if(o.hoveredNode){o.selectedNode=o.hoveredNode,(A=t.onSelect)==null||A.call(t,o.hoveredNode);const U=o.positions.get(o.hoveredNode);U&&r.controls.target.lerp(U.clone(),.5)}}var R=Hg();Lc(R,A=>s=A,()=>s),Be(i,R),cr()}var Vg=qe('
'),Gg=qe('
');function Wg(i,t){lr(t,!0);let e=Qs(t,"width",3,240),n=Qs(t,"height",3,80);function s(m){return t.stability<=0?0:Math.exp(-m/t.stability)}let r=ti(()=>{const m=[],u=Math.max(t.stability*3,30),T=4,b=e()-T*2,y=n()-T*2;for(let L=0;L<=50;L++){const R=L/50*u,A=s(R),U=T+L/50*b,S=T+(1-A)*y;m.push(`${L===0?"M":"L"}${U.toFixed(1)},${S.toFixed(1)}`)}return m.join(" ")}),a=ti(()=>[{label:"Now",days:0,value:t.retention},{label:"1d",days:1,value:s(1)},{label:"7d",days:7,value:s(7)},{label:"30d",days:30,value:s(30)}]);function o(m){return m>.7?"#10b981":m>.4?"#f59e0b":"#ef4444"}var l=Gg(),c=Dt(l),h=Dt(c),d=Bt(h),f=Bt(d),p=Bt(f),g=Bt(p);Cl(),Rt(c);var v=Bt(c,2);$r(v,21,()=>q(a),Jr,(m,u)=>{var T=Vg(),b=Dt(T),y=Dt(b);Rt(b);var L=Bt(b,2),R=Dt(L);Rt(L),Rt(T),ln((A,U)=>{_e(y,`${q(u).label??""}:`),Ul(L,`color: ${A??""}`),_e(R,`${U??""}%`)},[()=>o(q(u).value),()=>(q(u).value*100).toFixed(0)]),Be(m,T)}),Rt(v),Rt(l),ln(m=>{Ve(c,"width",e()),Ve(c,"height",n()),Ve(c,"viewBox",`0 0 ${e()??""} ${n()??""}`),Ve(h,"y1",4+(n()-8)*.5),Ve(h,"x2",e()-4),Ve(h,"y2",4+(n()-8)*.5),Ve(d,"y1",4+(n()-8)*.8),Ve(d,"x2",e()-4),Ve(d,"y2",4+(n()-8)*.8),Ve(f,"d",q(r)),Ve(p,"d",`${q(r)??""} L${e()-4},${n()-4} L4,${n()-4} Z`),Ve(g,"cy",4+(1-t.retention)*(n()-8)),Ve(g,"fill",m)},[()=>o(t.retention)]),Be(i,l),cr()}function wl(i,t,e){const n=e.getTime(),s=new Set,r=new Map,a=i.filter(l=>{const c=new Date(l.createdAt).getTime();if(c<=n){s.add(l.id);const h=n-c,d=1440*60*1e3,f=hs.has(l.source)&&s.has(l.target));return{visibleNodes:a,visibleEdges:o,nodeOpacities:r}}function Xg(i){if(i.length===0){const n=new Date;return{oldest:n,newest:n}}let t=1/0,e=-1/0;for(const n of i){const s=new Date(n.createdAt).getTime();se&&(e=s)}return{oldest:new Date(t),newest:new Date(e)}}var Yg=qe(`
');function Vg(i,t){lr(t,!0);let e=Qs(t,"events",19,()=>[]),n=Qs(t,"isDreaming",3,!1),s,r,a,o,l,c,h,d,f,p,g,v=0,m=[];Al(()=>{r=_g(s),p=Ig(r.scene).material,g=zg(r.composer),c=new Tg(r.scene),o=new yg,l=new bg,h=new wg(r.scene),f=new Ag;const U=o.createNodes(t.nodes);l.createEdges(t.edges,U),d=new Mg(U),m=[...t.nodes],r.scene.add(l.group),r.scene.add(o.group),u(),window.addEventListener("resize",b),s.addEventListener("pointermove",y),s.addEventListener("click",L)}),Rl(()=>{cancelAnimationFrame(a),window.removeEventListener("resize",b),s==null||s.removeEventListener("pointermove",y),s==null||s.removeEventListener("click",L),h==null||h.dispose(),c==null||c.dispose(),o==null||o.dispose(),l==null||l.dispose(),r&&xg(r)});function u(){a=requestAnimationFrame(u);const A=performance.now()*.001;d.tick(t.edges),o.updatePositions(),l.updatePositions(o.positions),l.animateEdges(o.positions),c.animate(A),o.animate(A,m,r.camera),f.setActive(n()),f.update(r.scene,r.bloomPass,r.controls,r.lights,A),Ng(p,A,f.current.nebulaIntensity,s.clientWidth,s.clientHeight),Hg(g,A,f.current.nebulaIntensity),T(),h.update(o.meshMap,r.camera,o.positions),r.controls.update(),r.composer.render()}function T(){if(!e()||e().length<=v)return;const A=e().slice(v);v=e().length;const U={effects:h,nodeManager:o,edgeManager:l,forceSim:d,camera:r.camera,onMutation:S=>{var M;S.type==="nodeAdded"?m=[...m,S.node]:S.type==="nodeRemoved"&&(m=m.filter(D=>D.id!==S.nodeId)),(M=t.onGraphMutation)==null||M.call(t,S)}};for(const S of A)Dg(S,U,m)}function b(){!s||!r||vg(r,s)}function y(A){const U=s.getBoundingClientRect();r.mouse.x=(A.clientX-U.left)/U.width*2-1,r.mouse.y=-((A.clientY-U.top)/U.height)*2+1,r.raycaster.setFromCamera(r.mouse,r.camera);const S=r.raycaster.intersectObjects(o.getMeshes());S.length>0?(o.hoveredNode=S[0].object.userData.nodeId,s.style.cursor="pointer"):(o.hoveredNode=null,s.style.cursor="grab")}function L(){var A;if(o.hoveredNode){o.selectedNode=o.hoveredNode,(A=t.onSelect)==null||A.call(t,o.hoveredNode);const U=o.positions.get(o.hoveredNode);U&&r.controls.target.lerp(U.clone(),.5)}}var R=kg();Uc(R,A=>s=A,()=>s),ze(i,R),cr()}var Gg=je('
'),Wg=je('
');function Xg(i,t){lr(t,!0);let e=Qs(t,"width",3,240),n=Qs(t,"height",3,80);function s(m){return t.stability<=0?0:Math.exp(-m/t.stability)}let r=ti(()=>{const m=[],u=Math.max(t.stability*3,30),T=4,b=e()-T*2,y=n()-T*2;for(let L=0;L<=50;L++){const R=L/50*u,A=s(R),U=T+L/50*b,S=T+(1-A)*y;m.push(`${L===0?"M":"L"}${U.toFixed(1)},${S.toFixed(1)}`)}return m.join(" ")}),a=ti(()=>[{label:"Now",days:0,value:t.retention},{label:"1d",days:1,value:s(1)},{label:"7d",days:7,value:s(7)},{label:"30d",days:30,value:s(30)}]);function o(m){return m>.7?"#10b981":m>.4?"#f59e0b":"#ef4444"}var l=Wg(),c=Dt(l),h=Dt(c),d=Ot(h),f=Ot(d),p=Ot(f),g=Ot(p);wc(),Rt(c);var v=Ot(c,2);$r(v,21,()=>j(a),Jr,(m,u)=>{var T=Gg(),b=Dt(T),y=Dt(b);Rt(b);var L=Ot(b,2),R=Dt(L);Rt(L),Rt(T),ln((A,U)=>{_e(y,`${j(u).label??""}:`),Ll(L,`color: ${A??""}`),_e(R,`${U??""}%`)},[()=>o(j(u).value),()=>(j(u).value*100).toFixed(0)]),ze(m,T)}),Rt(v),Rt(l),ln(m=>{Be(c,"width",e()),Be(c,"height",n()),Be(c,"viewBox",`0 0 ${e()??""} ${n()??""}`),Be(h,"y1",4+(n()-8)*.5),Be(h,"x2",e()-4),Be(h,"y2",4+(n()-8)*.5),Be(d,"y1",4+(n()-8)*.8),Be(d,"x2",e()-4),Be(d,"y2",4+(n()-8)*.8),Be(f,"d",j(r)),Be(p,"d",`${j(r)??""} L${e()-4},${n()-4} L4,${n()-4} Z`),Be(g,"cy",4+(1-t.retention)*(n()-8)),Be(g,"fill",m)},[()=>o(t.retention)]),ze(i,l),cr()}function wl(i,t,e){const n=e.getTime(),s=new Set,r=new Map,a=i.filter(l=>{const c=new Date(l.createdAt).getTime();if(c<=n){s.add(l.id);const h=n-c,d=1440*60*1e3,f=hs.has(l.source)&&s.has(l.target));return{visibleNodes:a,visibleEdges:o,nodeOpacities:r}}function Yg(i){if(i.length===0){const n=new Date;return{oldest:n,newest:n}}let t=1/0,e=-1/0;for(const n of i){const s=new Date(n.createdAt).getTime();se&&(e=s)}return{oldest:new Date(t),newest:new Date(e)}}var qg=je(`
`),qg=qe('');function jg(i,t){lr(t,!0);let e=Ie(!1),n=Ie(!1),s=Ie(1),r=Ie(100),a,o=0,l=ti(()=>Xg(t.nodes)),c=ti(()=>{const b=q(l).oldest.getTime(),L=q(l).newest.getTime()-b||1;return new Date(b+q(r)/100*L)});function h(b){return b.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function d(){se(e,!q(e)),t.onToggle(q(e)),q(e)&&(se(r,100),t.onDateChange(q(c)))}function f(){se(n,!q(n)),q(n)?(se(r,0),o=performance.now(),p()):cancelAnimationFrame(a)}function p(){a=requestAnimationFrame(b=>{const y=(b-o)/1e3;o=b;const L=q(l).oldest.getTime(),A=(q(l).newest.getTime()-L)/(1440*60*1e3)||1,U=q(s)/A*100;if(se(r,Math.min(100,q(r)+U*y),!0),t.onDateChange(q(c)),q(r)>=100){se(n,!1);return}p()})}function g(){t.onDateChange(q(c))}Rl(()=>{cancelAnimationFrame(a)});var v=Rc(),m=Pl(v);{var u=b=>{var y=Yg(),L=Dt(y),R=Dt(L),A=Dt(R),U=Dt(A),S=Dt(U,!0);Rt(U);var M=Bt(U,2),D=Dt(M);D.value=D.__value=1;var W=Bt(D);W.value=W.__value=7;var z=Bt(W);z.value=z.__value=30,Rt(M),Rt(A);var V=Bt(A,2),$=Dt(V,!0);Rt(V);var G=Bt(V,2);Rt(R);var J=Bt(R,2);Ll(J);var k=Bt(J,2),it=Dt(k),ut=Dt(it,!0);Rt(it);var yt=Bt(it,2),Lt=Dt(yt,!0);Rt(yt),Rt(k),Rt(L),Rt(y),ln((jt,Y,et)=>{_e(S,q(n)?"⏸":"▶"),_e($,jt),_e(ut,Y),_e(Lt,et)},[()=>h(q(c)),()=>h(q(l).oldest),()=>h(q(l).newest)]),$e("click",U,f),Nl(M,()=>q(s),jt=>se(s,jt)),$e("click",G,d),$e("input",J,g),Il(J,()=>q(r),jt=>se(r,jt)),Be(b,y)},T=b=>{var y=qg();$e("click",y,d),Be(b,y)};wi(m,b=>{q(e)?b(u):b(T,!1)})}Be(i,v),cr()}Dl(["click","input"]);var Zg=qe('

Loading memory graph...

'),Kg=qe('

Your Mind Awaits

'),$g=qe(' · · ',1),Jg=qe(' '),Qg=qe('
'),t_=qe("
"),e_=qe(`

Memory Detail

Retention Forecast
◬ Explore Connections
`),n_=qe(`
`);function y_(i,t){lr(t,!0);const e=()=>Dc(Uc,"$eventFeed",n),[n,s]=Pc();let r=Ie(null),a=Ie(null),o=Ie(!0),l=Ie(""),c=Ie(!1),h=Ie(""),d=Ie(150),f=Ie(!1),p=Ie(Ac(new Date)),g=Ie(0),v=Ie(0),m=ti(()=>q(r)?q(f)?wl(q(r).nodes,q(r).edges,q(p)).visibleNodes:q(r).nodes:[]),u=ti(()=>q(r)?q(f)?wl(q(r).nodes,q(r).edges,q(p)).visibleEdges:q(r).edges:[]);function T(rt){if(q(r))switch(rt.type){case"nodeAdded":q(r).nodes=[...q(r).nodes,rt.node],q(r).nodeCount=q(r).nodes.length,se(g,q(r).nodeCount,!0);break;case"nodeRemoved":q(r).nodes=q(r).nodes.filter(Ct=>Ct.id!==rt.nodeId),q(r).nodeCount=q(r).nodes.length,se(g,q(r).nodeCount,!0);break;case"edgeAdded":q(r).edges=[...q(r).edges,rt.edge],q(r).edgeCount=q(r).edges.length,se(v,q(r).edgeCount,!0);break;case"edgesRemoved":q(r).edges=q(r).edges.filter(Ct=>Ct.source!==rt.nodeId&&Ct.target!==rt.nodeId),q(r).edgeCount=q(r).edges.length,se(v,q(r).edgeCount,!0);break;case"nodeUpdated":{const Ct=q(r).nodes.find(w=>w.id===rt.nodeId);Ct&&(Ct.retention=rt.retention);break}}}Al(()=>b());async function b(rt,Ct){se(o,!0),se(l,"");try{se(r,await Yi.graph({max_nodes:q(d),depth:3,query:rt||void 0,center_id:Ct||void 0}),!0),q(r)&&(se(g,q(r).nodeCount,!0),se(v,q(r).edgeCount,!0))}catch{se(l,"No memories yet. Start using Vestige to populate your graph.")}finally{se(o,!1)}}async function y(){se(c,!0);try{await Yi.dream(),await b()}catch{}finally{se(c,!1)}}async function L(rt){try{se(a,await Yi.memories.get(rt),!0)}catch{se(a,null)}}function R(){q(h).trim()&&b(q(h))}var A=n_(),U=Dt(A);{var S=rt=>{var Ct=Zg();Be(rt,Ct)},M=rt=>{var Ct=Kg(),w=Dt(Ct),ve=Bt(Dt(w),4),Ft=Dt(ve,!0);Rt(ve),Rt(w),Rt(Ct),ln(()=>_e(Ft,q(l))),Be(rt,Ct)},D=rt=>{kg(rt,{get nodes(){return q(m)},get edges(){return q(u)},get centerId(){return q(r).center_id},get events(){return e()},get isDreaming(){return q(c)},onSelect:L,onGraphMutation:T})};wi(U,rt=>{q(o)?rt(S):q(l)?rt(M,1):q(r)&&rt(D,2)})}var W=Bt(U,2),z=Dt(W),V=Dt(z);Ll(V);var $=Bt(V,2);Rt(z);var G=Bt(z,2),J=Dt(G),k=Dt(J);k.value=k.__value=50;var it=Bt(k);it.value=it.__value=100;var ut=Bt(it);ut.value=ut.__value=150;var yt=Bt(ut);yt.value=yt.__value=200,Rt(J);var Lt=Bt(J,2),jt=Dt(Lt,!0);Rt(Lt);var Y=Bt(Lt,2);Rt(G),Rt(W);var et=Bt(W,2),xt=Dt(et);{var at=rt=>{var Ct=$g(),w=Pl(Ct),ve=Dt(w);Rt(w);var Ft=Bt(w,4),kt=Dt(Ft);Rt(Ft);var Mt=Bt(Ft,4),ie=Dt(Mt);Rt(Mt),ln(()=>{_e(ve,`${q(g)??""} nodes`),_e(kt,`${q(v)??""} edges`),_e(ie,`depth ${q(r).depth??""}`)}),Be(rt,Ct)};wi(xt,rt=>{q(r)&&rt(at)})}Rt(et);var wt=Bt(et,2);{var Ut=rt=>{jg(rt,{get nodes(){return q(r).nodes},onDateChange:Ct=>{se(p,Ct,!0)},onToggle:Ct=>{se(f,Ct,!0)}})};wi(wt,rt=>{q(r)&&rt(Ut)})}var Gt=Bt(wt,2);{var ce=rt=>{var Ct=e_(),w=Dt(Ct),ve=Bt(Dt(w),2);Rt(w);var Ft=Bt(w,2),kt=Dt(Ft),Mt=Dt(kt),ie=Dt(Mt,!0);Rt(Mt);var Et=Bt(Mt,2);$r(Et,17,()=>q(a).tags,Jr,(Xt,C)=>{var nt=Jg(),H=Dt(nt,!0);Rt(nt),ln(()=>_e(H,q(C))),Be(Xt,nt)}),Rt(kt);var E=Bt(kt,2),_=Dt(E,!0);Rt(E);var F=Bt(E,2);$r(F,21,()=>[{label:"Retention",value:q(a).retentionStrength},{label:"Storage",value:q(a).storageStrength},{label:"Retrieval",value:q(a).retrievalStrength}],Jr,(Xt,C)=>{var nt=Qg(),H=Dt(nt),Z=Dt(H),ht=Dt(Z,!0);Rt(Z);var lt=Bt(Z,2),Ot=Dt(lt);Rt(lt),Rt(H);var he=Bt(H,2),Ee=Dt(he);Rt(he),Rt(nt),ln(Qt=>{_e(ht,q(C).label),_e(Ot,`${Qt??""}%`),Ul(Ee,`width: ${q(C).value*100}%; background: ${q(C).value>.7?"#10b981":q(C).value>.4?"#f59e0b":"#ef4444"}`)},[()=>(q(C).value*100).toFixed(1)]),Be(Xt,nt)}),Rt(F);var j=Bt(F,2),K=Bt(Dt(j),2);{let Xt=ti(()=>q(a).storageStrength*30);Wg(K,{get retention(){return q(a).retentionStrength},get stability(){return q(Xt)}})}Rt(j);var X=Bt(j,2),St=Dt(X),ot=Dt(St);Rt(St);var dt=Bt(St,2),Zt=Dt(dt);Rt(dt);var tt=Bt(dt,2);{var mt=Xt=>{var C=t_(),nt=Dt(C);Rt(C),ln(H=>_e(nt,`Accessed: ${H??""}`),[()=>new Date(q(a).lastAccessedAt).toLocaleString()]),Be(Xt,C)};wi(tt,Xt=>{q(a).lastAccessedAt&&Xt(mt)})}var bt=Bt(tt,2),Pt=Dt(bt);Rt(bt),Rt(X);var ft=Bt(X,2),Yt=Dt(ft),zt=Bt(Yt,2);Rt(ft),Cl(2),Rt(Ft),Rt(Ct),ln((Xt,C)=>{_e(ie,q(a).nodeType),_e(_,q(a).content),_e(ot,`Created: ${Xt??""}`),_e(Zt,`Updated: ${C??""}`),_e(Pt,`Reviews: ${q(a).reviewCount??0??""}`)},[()=>new Date(q(a).createdAt).toLocaleString(),()=>new Date(q(a).updatedAt).toLocaleString()]),$e("click",ve,()=>se(a,null)),$e("click",Yt,()=>{q(a)&&Yi.memories.promote(q(a).id)}),$e("click",zt,()=>{q(a)&&Yi.memories.demote(q(a).id)}),Be(rt,Ct)};wi(Gt,rt=>{q(a)&&rt(ce)})}Rt(A),ln(()=>{Lt.disabled=q(c),Cc(Lt,1,`px-4 py-2 rounded-xl bg-dream/20 border border-dream/40 text-dream-glow text-sm + [&::-webkit-slider-thumb]:shadow-[0_0_8px_rgba(129,140,248,0.4)]"/>
`),jg=je('');function Zg(i,t){lr(t,!0);let e=Ie(!1),n=Ie(!1),s=Ie(1),r=Ie(100),a,o=0,l=ti(()=>Yg(t.nodes)),c=ti(()=>{const b=j(l).oldest.getTime(),L=j(l).newest.getTime()-b||1;return new Date(b+j(r)/100*L)});function h(b){return b.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function d(){se(e,!j(e)),t.onToggle(j(e)),j(e)&&(se(r,100),t.onDateChange(j(c)))}function f(){se(n,!j(n)),j(n)?(se(r,0),o=performance.now(),p()):cancelAnimationFrame(a)}function p(){a=requestAnimationFrame(b=>{const y=(b-o)/1e3;o=b;const L=j(l).oldest.getTime(),A=(j(l).newest.getTime()-L)/(1440*60*1e3)||1,U=j(s)/A*100;if(se(r,Math.min(100,j(r)+U*y),!0),t.onDateChange(j(c)),j(r)>=100){se(n,!1);return}p()})}function g(){t.onDateChange(j(c))}Rl(()=>{cancelAnimationFrame(a)});var v=Rc(),m=Cl(v);{var u=b=>{var y=qg(),L=Dt(y),R=Dt(L),A=Dt(R),U=Dt(A),S=Dt(U,!0);Rt(U);var M=Ot(U,2),D=Dt(M);D.value=D.__value=1;var W=Ot(D);W.value=W.__value=7;var z=Ot(W);z.value=z.__value=30,Rt(M),Rt(A);var V=Ot(A,2),$=Dt(V,!0);Rt(V);var G=Ot(V,2);Rt(R);var J=Ot(R,2);Dl(J);var k=Ot(J,2),it=Dt(k),ut=Dt(it,!0);Rt(it);var yt=Ot(it,2),Lt=Dt(yt,!0);Rt(yt),Rt(k),Rt(L),Rt(y),ln((qt,Y,nt)=>{_e(S,j(n)?"⏸":"▶"),_e($,qt),_e(ut,Y),_e(Lt,nt)},[()=>h(j(c)),()=>h(j(l).oldest),()=>h(j(l).newest)]),Je("click",U,f),Il(M,()=>j(s),qt=>se(s,qt)),Je("click",G,d),Je("input",J,g),Ul(J,()=>j(r),qt=>se(r,qt)),ze(b,y)},T=b=>{var y=jg();Je("click",y,d),ze(b,y)};wi(m,b=>{j(e)?b(u):b(T,!1)})}ze(i,v),cr()}Pl(["click","input"]);var Kg=je('

Loading memory graph...

'),$g=je('

Your Mind Awaits

'),Jg=je(' · · ',1),Qg=je(' '),t_=je('
'),e_=je("
"),n_=je(`

Memory Detail

Retention Forecast
◬ Explore Connections
`),i_=je(`
`);function b_(i,t){lr(t,!0);const e=()=>Dc(Ic,"$eventFeed",n),[n,s]=Pc();let r=Ie(null),a=Ie(null),o=Ie(!0),l=Ie(""),c=Ie(!1),h=Ie(""),d=Ie(150),f=Ie(!1),p=Ie(Ac(new Date)),g=Ie(0),v=Ie(0),m=ti(()=>j(r)?j(f)?wl(j(r).nodes,j(r).edges,j(p)).visibleNodes:j(r).nodes:[]),u=ti(()=>j(r)?j(f)?wl(j(r).nodes,j(r).edges,j(p)).visibleEdges:j(r).edges:[]);function T(rt){if(j(r))switch(rt.type){case"nodeAdded":j(r).nodes=[...j(r).nodes,rt.node],j(r).nodeCount=j(r).nodes.length,se(g,j(r).nodeCount,!0);break;case"nodeRemoved":j(r).nodes=j(r).nodes.filter(Ct=>Ct.id!==rt.nodeId),j(r).nodeCount=j(r).nodes.length,se(g,j(r).nodeCount,!0);break;case"edgeAdded":j(r).edges=[...j(r).edges,rt.edge],j(r).edgeCount=j(r).edges.length,se(v,j(r).edgeCount,!0);break;case"edgesRemoved":j(r).edges=j(r).edges.filter(Ct=>Ct.source!==rt.nodeId&&Ct.target!==rt.nodeId),j(r).edgeCount=j(r).edges.length,se(v,j(r).edgeCount,!0);break;case"nodeUpdated":{const Ct=j(r).nodes.find(w=>w.id===rt.nodeId);Ct&&(Ct.retention=rt.retention);break}}}Al(()=>b());async function b(rt,Ct){se(o,!0),se(l,"");try{se(r,await Yi.graph({max_nodes:j(d),depth:3,query:rt||void 0,center_id:Ct||void 0}),!0),j(r)&&(se(g,j(r).nodeCount,!0),se(v,j(r).edgeCount,!0))}catch{se(l,"No memories yet. Start using Vestige to populate your graph.")}finally{se(o,!1)}}async function y(){se(c,!0);try{await Yi.dream(),await b()}catch{}finally{se(c,!1)}}async function L(rt){try{se(a,await Yi.memories.get(rt),!0)}catch{se(a,null)}}function R(){j(h).trim()&&b(j(h))}var A=i_(),U=Dt(A);{var S=rt=>{var Ct=Kg();ze(rt,Ct)},M=rt=>{var Ct=$g(),w=Dt(Ct),ve=Ot(Dt(w),4),Bt=Dt(ve,!0);Rt(ve),Rt(w),Rt(Ct),ln(()=>_e(Bt,j(l))),ze(rt,Ct)},D=rt=>{Vg(rt,{get nodes(){return j(m)},get edges(){return j(u)},get centerId(){return j(r).center_id},get events(){return e()},get isDreaming(){return j(c)},onSelect:L,onGraphMutation:T})};wi(U,rt=>{j(o)?rt(S):j(l)?rt(M,1):j(r)&&rt(D,2)})}var W=Ot(U,2),z=Dt(W),V=Dt(z);Dl(V);var $=Ot(V,2);Rt(z);var G=Ot(z,2),J=Dt(G),k=Dt(J);k.value=k.__value=50;var it=Ot(k);it.value=it.__value=100;var ut=Ot(it);ut.value=ut.__value=150;var yt=Ot(ut);yt.value=yt.__value=200,Rt(J);var Lt=Ot(J,2),qt=Dt(Lt,!0);Rt(Lt);var Y=Ot(Lt,2);Rt(G),Rt(W);var nt=Ot(W,2),xt=Dt(nt);{var at=rt=>{var Ct=Jg(),w=Cl(Ct),ve=Dt(w);Rt(w);var Bt=Ot(w,4),kt=Dt(Bt);Rt(Bt);var Mt=Ot(Bt,4),ne=Dt(Mt);Rt(Mt),ln(()=>{_e(ve,`${j(g)??""} nodes`),_e(kt,`${j(v)??""} edges`),_e(ne,`depth ${j(r).depth??""}`)}),ze(rt,Ct)};wi(xt,rt=>{j(r)&&rt(at)})}Rt(nt);var wt=Ot(nt,2);{var Ut=rt=>{Zg(rt,{get nodes(){return j(r).nodes},onDateChange:Ct=>{se(p,Ct,!0)},onToggle:Ct=>{se(f,Ct,!0)}})};wi(wt,rt=>{j(r)&&rt(Ut)})}var Gt=Ot(wt,2);{var ce=rt=>{var Ct=n_(),w=Dt(Ct),ve=Ot(Dt(w),2);Rt(w);var Bt=Ot(w,2),kt=Dt(Bt),Mt=Dt(kt),ne=Dt(Mt,!0);Rt(Mt);var Et=Ot(Mt,2);$r(Et,17,()=>j(a).tags,Jr,(C,et)=>{var H=Qg(),q=Dt(H,!0);Rt(H),ln(()=>_e(q,j(et))),ze(C,H)}),Rt(kt);var E=Ot(kt,2),_=Dt(E,!0);Rt(E);var F=Ot(E,2);$r(F,21,()=>[{label:"Retention",value:j(a).retentionStrength},{label:"Storage",value:j(a).storageStrength},{label:"Retrieval",value:j(a).retrievalStrength}],Jr,(C,et)=>{var H=t_(),q=Dt(H),lt=Dt(q),ct=Dt(lt,!0);Rt(lt);var Nt=Ot(lt,2),he=Dt(Nt);Rt(Nt),Rt(q);var xe=Ot(q,2),Jt=Dt(xe);Rt(xe),Rt(H),ln(Ve=>{_e(ct,j(et).label),_e(he,`${Ve??""}%`),Ll(Jt,`width: ${j(et).value*100}%; background: ${j(et).value>.7?"#10b981":j(et).value>.4?"#f59e0b":"#ef4444"}`)},[()=>(j(et).value*100).toFixed(1)]),ze(C,H)}),Rt(F);var Z=Ot(F,2),K=Ot(Dt(Z),2);{let C=ti(()=>j(a).storageStrength*30);Xg(K,{get retention(){return j(a).retentionStrength},get stability(){return j(C)}})}Rt(Z);var X=Ot(Z,2),St=Dt(X),ot=Dt(St);Rt(St);var dt=Ot(St,2),jt=Dt(dt);Rt(dt);var tt=Ot(dt,2);{var mt=C=>{var et=e_(),H=Dt(et);Rt(et),ln(q=>_e(H,`Accessed: ${q??""}`),[()=>new Date(j(a).lastAccessedAt).toLocaleString()]),ze(C,et)};wi(tt,C=>{j(a).lastAccessedAt&&C(mt)})}var bt=Ot(tt,2),Pt=Dt(bt);Rt(bt),Rt(X);var ft=Ot(X,2),Xt=Dt(ft),zt=Ot(Xt,2);Rt(ft);var ie=Ot(ft,2);Rt(Bt),Rt(Ct),ln((C,et)=>{_e(ne,j(a).nodeType),_e(_,j(a).content),_e(ot,`Created: ${C??""}`),_e(jt,`Updated: ${et??""}`),_e(Pt,`Reviews: ${j(a).reviewCount??0??""}`),Be(ie,"href",`${Lc??""}/explore`)},[()=>new Date(j(a).createdAt).toLocaleString(),()=>new Date(j(a).updatedAt).toLocaleString()]),Je("click",ve,()=>se(a,null)),Je("click",Xt,()=>{j(a)&&Yi.memories.promote(j(a).id)}),Je("click",zt,()=>{j(a)&&Yi.memories.demote(j(a).id)}),ze(rt,Ct)};wi(Gt,rt=>{j(a)&&rt(ce)})}Rt(A),ln(()=>{Lt.disabled=j(c),Cc(Lt,1,`px-4 py-2 rounded-xl bg-dream/20 border border-dream/40 text-dream-glow text-sm hover:bg-dream/30 transition-all backdrop-blur-sm disabled:opacity-50 - ${q(c)?"glow-dream animate-pulse-glow":""}`),_e(jt,q(c)?"◈ Dreaming...":"◈ Dream")}),$e("keydown",V,rt=>rt.key==="Enter"&&R()),Il(V,()=>q(h),rt=>se(h,rt)),$e("click",$,R),$e("change",J,()=>b()),Nl(J,()=>q(d),rt=>se(d,rt)),$e("click",Lt,y),$e("click",Y,()=>b()),Be(i,A),cr(),s()}Dl(["keydown","click","change"]);export{y_ as component}; + ${j(c)?"glow-dream animate-pulse-glow":""}`),_e(qt,j(c)?"◈ Dreaming...":"◈ Dream")}),Je("keydown",V,rt=>rt.key==="Enter"&&R()),Ul(V,()=>j(h),rt=>se(h,rt)),Je("click",$,R),Je("change",J,()=>b()),Il(J,()=>j(d),rt=>se(d,rt)),Je("click",Lt,y),Je("click",Y,()=>b()),ze(i,A),cr(),s()}Pl(["keydown","click","change"]);export{b_ as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.br b/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.br new file mode 100644 index 0000000000000000000000000000000000000000..c0af5527d03a17c070850c27d49ec96a024aee03 GIT binary patch literal 119649 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

$$jPv<)NrxOhk^sCm<;c4Gxu3qPOW!{Q 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz b/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..fbb9870d8e43e5c4acad5bef5cac6228a811a38b GIT binary patch literal 144193 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

qa}1Y7ZYt_w8fjSF=MqU>X<(u_ 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 Q+T-6wYE&<5?>eLL2SwE2ivR!s diff --git a/apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js.gz b/apps/dashboard/build/_app/immutable/nodes/6.DXXEUSu1.js.gz deleted file mode 100644 index 768e97bf9d56ce2e6ad9e21b887642019823d040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144380 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%0D-4Im9WNbI7D8 zd7BA+y9TjB&G0Bs%}5mt7sYtGUp`3+I~iCi?s0tlVg#2QZJ|Q8*k3Z+oYxMD1S1;d z4-ytkxvaY^H8=B*k3hgn1%`#yK!v`s*9OXI% z5IXa^=5%wrYEkANR#{r?iz^JIUXiE+!jp zgB-Qg{L*|mhHErae_qHDJn8Y~3o%=gy$$OB#yF{oPrjf7-xv||;*^S>tiUOWCw>*3 zEmD73C?^@Q^^_V|*0FS<~uw8dBY7=BqF-LEw2{>pB$I3j)T zA@V1xM4e{`%-G}Tb7!GGC?mm#1x+J8-62()$A7l%j=q{HCe6rvpfg4bB*bv7Z@iC_OcY#ym?}M+P5$ z?@I=R`#TV@5r>Ay12?vgOi>qtvd~33-dBlFLsJ_b?~GBW<$K@JVJw-4twE}})nc0_ zNZPH;LVkgu^h8==g~`%EAZ_6WxloFxleM zp^UhV1VzPoXuQEpb(#|zFB3nxeJk&d)y+7?6wpD!yg|ugR<0cJoQF+H+%g;f$ez*f zZfzEUE^aUk@Suihyq~oDmTGJQ-5f~uzc|;VmK?1##u90?&_sE{^j!U z6uIkHhG4+Y$H(uG_Gj%%@hv+TRc+baepR=jcFvNWwPvU*peTa7qC>+`k#O*vSi;;i zd*VeBykwt&!5-c7@5HwW3UwmDv{cjqD8jJOmrbs5KrAAJWdysz5v3GiB!TE_sPJ7t zBLU_6p_MJ>Qt!1F(Gng@*`Y$tSFd(F9O8Zku94#uqMc=KO|h(EJ;Y@_#F`n08uG*C zBvnmpd06*`sb#L~Rf}Dq?vsFrcJqqu${3YZAgywaS~yBgQ!M=^g4P9L++hWNO3ja>Ndp062`lYII)QPA4$P*woLE+DGyc5u_E(wo$Zx&UKw!73@qWL(N9ysDbf)z z%>_ox2;zM`_E^gxN-+ou(^N5}WGxBR0|$Mx_Sj1!8<(c{!&(iZ0iM4dnwixDp0UZr zBl%9b)-p&>{WLqKS1w+sRD;MGE?0zLg-f&`XwDVB=2tha{or!#2S+7NsxkvxW`Yht z1&EH1Y2{SkIEf+h1oiCUE{>kKLVW~$9w%N&kJIN#FKsk(=IN~O={1;*`kMTPkT^fT z8A>(?o8976rWW$GLy!*yl_RgjZj_-23JU^HIul9P8HIU~oK=|1ET!^2d9cOyo3|Hb zXPds6zj7QFQd=r%h6!g?8nC<#)%dZ#dh@ys4}c))GuJotmQH{`U1Pc+_y2+ z#KL)0f^#KjlX}SI!L-i<4kpmcHzD^M|;`HAD8)u^=! zdB_c3;%myKz>|^pulFKN; ze)u9J1|4Z?-zGG8%DU3Iz-{X7a^N|=!E-qSy@9+@4$C{+8?NcrxYih;;fmH*t``+% z4Ec?DTG5H=noit7C#GN4362!B3sVbeh>#Q(-rsKVSNqtTjOdz=gV7jza9Ma7i}O!o zc~HA#$Fs+ww4#JU4H%^DxcbA}kF3nAAk1(gp5gR|vwX$+c@?jGK#L0xXq=&+`UwaR zUWBuRpV%O76P_-w+Ngt`qG!l;uY2EO*R4eB6`f)dG!~!iybQ(+uLjrF%As8iuEi3= zBMe+;_~Ra>XYO`_+--j&%<8eL%7h%pjqB^85#Av=Uw%^Q}Y-l;jQaD@-o zD;L>&$lgWv4zgRK>M;kyz*}KCU+#nQT&>>s%Ha z@7TNP_k<{*NUFzqQcVQ@uk)%5It^8;(&^`TCH)-d=qKW@3*FBc4QSN%H0wTb>BoBz zLBSVs%sTZG9A!#$kQLfSs{{k=62@|zNEG0;JaI$WdbE3l)99lVO#RMnoPvr=?+bLL*Dr34yP)9Uq-|B{nVm(i0TaphNRMg8MSI?#wbrx!iXdQqcc zVR}=y+t2o%?NDdbcs@0ocBdZIqir**XO^{{3Ge2dQ|GG04?iEDy*WO;IXgT$xjgS? zOU1H6r4sr}0pl7}f&X1*+8tzfKX33!TzDEN%D4aa zx4eM+Z-2|1X?)9<0jRCyY2fcc)DLF^Y&`GBlSv%y(~gyPxA=shPOc6^O0pR)$q}=w z=TTXD+0_tGFkR%jdI+;gwhCT(cRbFCKJ1Q+VZFK^-4^TY#qkqb?g@ z)c{%>L6jMR;Tdkv2#n{3)@4X)Gz`&C*3r4)(NTkSua1yy3}N zHR^osjk+;cz}sx`+;!t@$a=|;OX_H?tD{*_hcep@&oFt98oXW$=9dG@m27xM%XXB! zrPw3tD+$4W*~GS}fNTY^6PCoFqeR>$EISHR=FR2no7X4ras)<|x#)&?-`4PbUQfa#PGMQxEQ z0qC+-W;0~C;+TA0AkA$fhZ`#Fcal1VIGMhXRhsmK4t2SBysHEL8 znhcU*2itk@&`HygRtTws`lsR( zA%B+9U?gm1J8pG5?wWR5U(!yix}DaVcG_RkPP@9D_L_EfzNDR<>UMV4w9{ejsAs{l zaJ3b3B#3iXxcKp0Vm>KMkw?T7nd^oF$ft1+f~-*U#aUvuTYJx*?jqZ9_N4kS}PwN#GPsKoK_KK8ObKy*5-~!Xj zSQtL>Yzr_SVsp3S?(Dcvk!yEQ%K;-a9osq%BL9)=-(X;dmKHJaLu|UP({4GP4svM) zeZ7Ka$3e}ugPO9Az9n98ppO2mH@4v>IZ18e#Uk|{gsiXIS~6hvRFSb;;R8`7>t={5 zx^*$)+RohwF&_YFH${DBkkU;kr$el(eU$i%zMp3Ba)XFBtnL7XFuQ5@!Jpj1Yp6`SS2sR_M5CDIy(&PF^mGU6ZKw5%LF+1QxA?^g5v& zD>4g})s(TCxaci61n_z(!ZVXm=R-8IWUkkSr;YNOxUh|`tw$_?z-)U0t67>?9 zJjJYCfEKbbQ+MpPJ*(QI!6~&7!0DJ|Gu?kMp--zWrnAG2TBs6(9Dc1 za;|ekqC#k>5}I4#A}&I5P7loh9PBCM>#`panOvCcs5lJ zOmKJd+MiP2F0cKmk~IqB`-&`iB9~-_{w)sAr=TiRnm-0h0!$8{8Y1r_%1Mnw+|Md9 zIinGL4x$l2q&0MPtscoin#SQ>MeZnx@AWLI&IeOMw&2TP*-x;ak%L7uh&A1Y^kv_% ztnC(I6d8TY(NxtkH1V>l^cwk|+ica-Z8K`RkB=@8OIe@W^y@wlNwNI(bQ`0-*LE5a zIGG=2RqrFe-bb-SBS?drMUcJ(Z$rt}*0>OHUO(a!I~X9o;pNa@<8+Ku zGeKjp>Qz1Hh~movbk3^D?li#0CBqTG*IOv@UWHeg4O+z4kB_y#@4a}|IqcLBy+REV zGezz$a(7{FAO+7%`YOb2JQ54xNkIK~6_ZXPa@b~zuHDvJwmT?^XQOe1)3j^15x8s( z=|^6TOL+3iSMhYo&#>2+oLlO3iv$e7#55IRXA!=h5~v6gXDLpO{LJ?rqIiJ8%P>qj zQKqJ|fkZ=HrO_p08R+(8Zr6hW;*W_0Ys;>7Kl;Uas~Bdq?;O~!zEF0n>!?a_ON*i3 z3vzyp#Hxa%_qFWM&fz13{k1 z{0%(?e?fReX^%NTwZG#Q-WxhK@g_Mec2Y@NG`tkzU)mis)Vh8O4d(ieV)AIxWhIvR z9uL_VRB|XsIJD3MEN(YMF#7Ho5xDLUrSRIBE_ME#3yn<7qEu7cjjm+T4-P1ipu(NR zj|TC?w3>Fus_!`H3sUp<4%z33tpV+LN;{sgj{8fmoQz~Bg3AnBfV8kn;DCq2TOtD2p>cd<7qAx9yUp6AHV7msZ37k%+)kkL{T^N!m>+|!J=yCWoxoQv4s0Z(ix@uuOR_EW1- zvu(T9&3a77ki`6jvz$Az;k8*PwTE$(d9_vCucL!@(%e?7z=`?9Q&r* zA_7_0LgA8$200bww-I_i^g&Rb;7CZ=K)weu2Z`wPq{;ha(QZ{mXtJZQa8xVv>FIlr z6^_5I21L%e1G5N*GVPR93ei*0>gL3fAQ;S7vRqnAKME#3-C4jcf=m-E+&K#!S5h>( zOPX#k-uIkd+-&lx39E`+#n-*iCUihZQ~I8G`(Rnyp{xU`c8e^Vs6FbhTUhFv5c8k1-h4kPl9;So3{cI_!+vPE1OO}QC|B0asxkbz$HS1O| z2mkfU=QdxD%)W&NInh~YYo}Iy3^P!=z#`<=&>PfuigP|hL*kHCtdiz6v^V7wS@-N` zPf>2M)yxj6S_8;!OT5yC$t8`Hm{1;s;i|?siyUabJcl$6_*>y|73IdJeF04h@Pd8X0VFu(dTP?2xhCAqBpc77K>vkPmF? zjq5wTVUcQ8;dgP;R6?V^DWBuays~Y(ia<^LsTq6wFHg!Ihr>wsgA3!H+;%<3-i!NL<;AHob; zb=&RK`;s34DlgU0?#0z>H1J|coZz6~0oW8#oHeiuvJ}rHAu|oNh$^8gEo1MgaWVAmhv|ctc(zJJiuzKOK0ZE4@-J1sca@^#nn`G<@LB`z_>y=+ z6+ld%Uy+i8OCfjmcK4pPovK@xILU0c5%HHS(B9v*a$-m--u&p3z1{08@;N$^E*}!R z)_3`U3X-|LMWkymTlx(jvuhQfnpC8yQ$u7jI*mxYt4KJj6ThyRaJyup5-#T6c%t%B z*^o~MlSdb(Bg;)kRy7@pNLgSZlcd1KzZ;@8HI~X+b~;P$UX;}MDo*lZva9RfsylJy z?F*!hdS)u`oU|K2S05jhWZD}@wzjsIwMuF&tzK?3V5=}*uQ&rtgqC{ysSWc0PO%D{ zUtzMM^2u=I)t7Bj%`7}xrK5tC0H+^x5O@WR?oWYE87bpp5cS`VI@oOuYdF+)g|GLG>!I!UB`5GmK z@g<_);&KbBg1|ncL~FBRyv55Otr?2w%O#K3T-*8kR(>9|IV%XjvegnWEOvY3VWEGc zuSq^a@NN-GrMu&vNsqJ~yB4Vo6dZ8{21<3#S#mg(a85j3 z1d6EE=7XE(s{n@sl>>_KEb+s4K3LF(M5T{M$)d38+tN8tl%DIg!rD8Oo@H`fR=svD zHCG#d6;N7zP&LA*#5F0tH(r7DM7u>5D%-eSZ<7~+k{qdp<$F%gf8NIJp5JI#(Uo6s zUwb95axQKolG||C#3LY?Qsp$g zp>f>*cwbVYA4d_@-+vYQAXCW~1YLY_BvB{RBpd_`O1kN!5+!Az>|VfiMo=JhlrUl{ zI%t6V{-T?T$LDh~8|u|G<%BFLk}G%5vDihkkS?&c?>W8x^IfOc2i>&fst;raJbsd& zKvptfLdZu8K0XWSmrhT(hFXiiuK0kxOmj`pGxEk&BvhTAPg@rIV_-?0wy{+oBA@rC z00O@ikQM`hk^`$gT&C;DTtdiP9*pUHE(DmbP`WsGm|=E|?N(7ZcP)YA0+Q5B;o`11 zSXS@i%BEmg#D~+BUh(}A+%uhC?|;UxndkRWa|03SKkb{+Axkk9s)l#Mj@oZk4k+j4qix|7CoCymveG|um&LFG;wuHH#g z&u-;+(r(YEEsL!&RCdz9s!x&6`%?g6yNZLTJ81~X@zprTDSq3{RR9~$FjWK*aIwNs zh83G|?@w&PzTAXiVH5J$L)!VXZW}V(bobO9*+*dIK|PiWRXvHk;tUh4jdHB92I-Tv z(j4{L({)e^MvGmrztnp0%t7Q3BJT`om%WjRMo;+hxbgYYsyJU-WV`I;w#E+I8Gjn- zd7tFs78KuGd8L>fVxc^`X*re3*2HiX_LU4?Z|CqX7-}V+fnmcB=2*R zS5ET&lH;jrXLSDRogsOw4Y$RvzAJ{nXHiEM94}w$Oj!Qlx{?)RDPK>j0a9 zu|;D|FR=+jiIl|Wo>Rt~GGSfH^jL^ocPX79j)-}HqE_b1cu`XOwik=HSt6Nr^HDdmY$tgeZ+z%r6 zgUtP%=l(8oeIkpW2whbk=4LPiYa{T&pnA_e<3kLq31Tlp3Yr$IB6S8(l+L#Z7fLJ*n$nqh})PG zx3M5@O8)OW|96r9JI${mOyzW_mnR)TM4lSSA=r`BqtnpITHS7o3HCfO!&_TV_}V_G zRu_ZBZ0SauQjX;AK7IPM<#sk?x_hhv)yPsHi!M=0s-;K@29{v4uoR*jq}VecAK8MyA{F>+KSLR!Y6rvaq2el1 z^^$TOdzg!sQ*2bIWstMY7XVC%DBWrm2x{?8wr(~HCCctpw&QlnFI2hdrRo$(r8-5j zTAiZU{nA;^*TUyZ>ESXL5hCyBK)H-q#ern%agnV)F0z%!MX8eojXVAKH!lyEzqD$KV((=p;r)B2$d5B zb!Bup6{BRTWI9EfTzpxfm^URDeQtDAv4zaRdE`Clo?Pucr1++T*YIIX-C1^-8^K{b zI^xa=90$0`+ga#Kj|C3ukCS-fXF*?aW8gR~bQg>woWU~(k@?!s&@Bkd#`thD4TEep zARc5-3Vm|(opSbMuXa1TyH8uWUhNio(H8I{~Dg@H*;ysc~5Q-^w4xs-fm`5l&9$6PL1%6wW(G*C1=C`Azz6+B~B zVS)AzG0oUIvamaSo_eCD!u4EJ8t%h0II(?J9I%e7kj6ssKB&mB?aKGKm(*?dKU~e{ zq$+r^pLQC039z3c9yvRpt5AUN6yaOQev0fJ@L5V7Ofn%36WPQ>(9QB%YTl6MEr~5v zt}xibF%`K&VPaCw+;mz?QWbkb;68a8CT?a{J>sX+;mGSa$R~jwg|*5Vad@fPIRtj* zkJ5vKt80|P$6|^P4r(s;oNg*SSUeBmHoJoVZ)}X2MjDQVl+_w#0mIFg}39RsEoDtK;6EISw zMia!o5nH|JiRU$45>ppRp=*~ME znInWz-$E0Q2tWzyjL;oOpZF&kc)&>a_$cXm3hrY#tTG^3 znVgMWWpePPm4zzpV~YzvyAyqJDHS*(M*o{r0lrqu{(ZzxvkBi3?(Wmpvu8VPxe25` z&InDcWhu?4n=Dl+I!*EmNvtb(aHepBahh?*$gnTuN_WIl&C0_7iY{|oq8z3;dGC^V z5|_;$8hKOQ!WXI_b2`!{^v;{w5x&3Ch+&63({T-jJ5P*P1d2W91Ei%RU}Y>gB$f48)jB{=sN%v!t0XKZWB zTsdX(wM*bCdGPw8QI%i=FYzVAdVG8$7MhMw@9Hk^>fX*Xr`2u=f+0Hd#Peva`C%(C zUobSKRBn*x*iZW7cQif&8Rl3%Ury18o<>^d^SW(2rK8bz)=`4}378^fo3tS)ptwbV z+@w=h=er~xB{)r$^)Ux*iE`%n1A9VN^d=berh+2p=rD1F#anOfy1UOheD~#>hUiY5 z%$Dpg%9b-Hrup%du?#B<05hR<;EXTl5vWaR=xGkihYyZBR*bu9|KvD_G!BCS;ZfD$ zufv%VyCB(EXYc9W4w>Wp3KJohPX$j2_RG&R?aWrr(Uc!zW&8;}<>cM(4(@(sg*mak zBgD3vl@Qd_Z9jF|t^<~&bR_(ado=R?_^uc~Di>Nv323DUvm&u*v@lgx@4Mx9f1p#S zcbedS0H?75@m8iZPEzl?@AN25Ghi}%-)XV(W@k8!!x@d1mjfqgE(Arr?@GG=-S)O| z4&rG%Z>Hb`&lvmZ_&XBo34XQPCiy*Wli^L<5RndCft%Adjj+=;9ou!zU++l%>UqhYk$cDoJv+&wC((VVvJ`FvqCDBv7I^i13K=f#{% z6?CFXRez@WX z)WU!6*^UK+-DyAV?Ae{2PMh_3$GB^i*GO7t<=q|rv-Q-GKi#rgS+&05kvLj+5RIyZ zjG_IRHQ6$5S)Omt7s&AK&-akOP?igFZ|ylUZtVr+$@O{l;K@}YuRI$@Df<}V|`J%Nq zJf+Gy!<8wlF|UvWdXm-GNgzQ;Q_AtaEX5p<+WD|gelhxS8bsKb`XNYD=>}pSCLKYB zXb3f*{k>&>`|R(4bemQ08w~>@NrGPZuHD*eyL*77eTZ6RG>m~or#w%6XvjyyGfWZR zEKUaYd|@XNmd8V&ugWm#+!PAN5Po3lHk4s(r+OxbTx4cSJdR8LKA@noaH!0JYuY(`R_Yd=NC zGrNV1jC7EaAX&VfE8Zf_cX;tVyN!&Ny~m5UEQ<~B75MI>s6*FXAZ4z`HXRTzN8i0* z4JSdLV}p^6{mdY8x6~NSKqg`gfKZd*hHQ>#G=)PxQ;zMl2wf#q*69d>M&Vv4aBTuX zq4#odFF70`L;Rl{(2=a{DIw;a4soyQaO%;f-Bml+Q936ZC17gbb_oFKq1)2I^sYIu z3ToE~jMB3`0<=T^eWvt`(=|4Kh;<$77a*Kd&3^=A84hBX#yUjvufCX+d3_fDQO3)xx9A67zrTqEF^p%Z&;{^5UTEW z$e9S+x4@&YChDFn!|MN)y;Si!LD|yq3>K(lc4w)Dl@Y>?0H^^XCCH4G1%;&s1d=h6 z4;hz*xP7zKY$33$_IMarE&l1zC?9zAbfmHNrlzp? zZcCJ#L^Uoe@h$uwywrhnVa?O9rXlBoTXC)hM`Wt}b;2GdvoxDcUe3Z054yL_bAnY!0XMpHT*$ffSN>27J6j@_XFGI_vm$RJUjDICcw+oyvdv1qJVnwyCD z)UszrofJ~)7zrrKEAsSPk=`sRF8Y^{^`Mcfp|5q`tQ^9q05Zyh+!jD?IfybIE$%g6 z2LxTPY;{^j6@ViE9I0ch0K5gjTiSLRK}(P^A_s+vK1=j!lkJeFP$k=A=YPoEL2uY! zv1!=q`_aIp+a+eB)vmb20yNIdevIfoa$EMZy=QyKc)Dk|+HI@k9!P^2mu<=&!77yD z2Sl+|@eS0~43Bk@ATj9y88T_MMQ*?@+h9}|0OHvWQ6OR+s}~i*-v|c(DYJSC$c!KY|=3OW@6Rx5)>kS9C@Fx`H$y=;Lac_ zm0s<>Ih=)|F(!X%`_H!r!QK8plmOQsnchj5m>G$LN}U(}0={8u_zp+lPRD(Q;Enw1 z8kU7-1u0?kNKDfZ36lpdp%~5xVmnGyxr>!;rqSC*EiTHrG?{a%3h{ z57?4saU<`=h?oY`*sokQ>{h}u`;qezbB}U7VqvE)6d0@JJ4`c^ae{j&Neu z5=J2Z7hObS4mnozy8Aq_uO!AiF;+eL^F+j|nO;s!Mb+!Vq!D*91bd|l zpj0L9PS=P#^oU0Xs-$4`?mP)A_P)>$8*BPuv8EpuO8u|_*AJ6pk!oV+%zftT-Z|H7 zRJ4B%D6N>Fb3!eyyE+iphuGROC*Fkn4LZ$wj@n&QuaMzYj%FRQ5AYXdK z!TpPPMl9}L5~LvUq`>fw#8J2Bo_Wa7<+tXg9pYhTZC}#JOZ8S0%m*pp!fToW^h5K~ z&f+ORvS3sY4UgCbvq0_KF~>_X=_ad1ZVa}d=bl=IkfRj$v$wav8^V559Nt^Ka~?Fy zIWS|@-M)8zG6r_!Pn#~` zcbiwPGo4@8_MfLyKjI}w&SVB}-22A!ZOGa;p0hvnlQS{shhl^2)bHcwqS=CK??yTs zRNH?JRz$|!^=dmcBh8ZdBlc>4Z}~01gLy)e24Sl?c1I)){B-PtDeUk1x=x77WB`&MZa2J&4qQz;;BJ3GQFDfA25P=+U(O1aeSQn&$l5t2kkl)@Qx!(Z0mgk zd?8)lPVYwhMgctmBU=XiY~CmSlrzaiR{8xZR++2^u)?h!M{>!O&_Ocsu*hpl&52aZ z2mhP5K}fAd4;&ii0MDmpbF!^uf>u8o~nr>5J>kJKgR$^%*+!QuEA0m)=E#q}-x&@1kM4%|olc z=uN0%?;qbkoI+^pgWBs_w{}`ve*XZZ{#7u?1JkvZ==+Cr_4^N@M?bOu83&PBGinxb z56A|0^*~jlYj5KF8XEWu@L@&;3tHS;4(1LRl*^z}(k#z@%Cnz}?59e0+u`|bM*y@P zYk93KS*$GCWZ!;zQ2V><+&n3e`>^v2JGZqiCjd1<6hrTa5#e)>AZQF4 z!(S2(=0yha(}(bP0JotR8H9ly!QZLXdl{M*IwQ^^pq4vG?xU8~`#v%6P|GDm_!IE; zKPAYVpqa(kk_+!wXzv!Gx9G0oI+K%@Dg$cd8Z`rlr(l>p)fMdLv#tX z-C%Qp{`mgklR2|!=p4{bUv~en&}C?zqCcqhzVZFTA<6i|LO0kvgCdtC;XnScmgovP z8k?jNGPf4#x{?6ij4gp4j&)6rmI=Bbw;E6bf`3EOw~4p^@GCgl;QNhugP(ftU(gWHgb z61qNOpX9dJjmZ_`Ejd^NoOTmM+VmR{d<8=@U_2=hO*xf(PIxnMIDlur2-Mujk0m(* zGSA(15cZnxwv!K666jtU$qYy3Gn_upz~J0VEtKx#tt}IKDW}V#Xk zZ_a^HQ>q)mpXSt$aA*+b1`nF^(3m#chRW`(WIO*kOS53OXx`%N9^+^oIN=Fu`_FG@ zSr$ie2!jW-1YNm_GpQhj%%(#u=d6oSU8EuF1yX?CO@$YELJTZIv2aK*Hjz$TM>0`Km0-fS7uMbm{|-j9O}Z(o5f$8|+NT}K_6!lKjPgJ5C| zbauX;$m?YEX%|1n)PgorZgEUO6|;&E9l= zL!w5zt!K#HaZqb#4>|UZbzR#o;pKDNoFVZu9TnJ(bM^I7{r3+GePUNl9o342j^Jr? zhmy7FyxE2g*fIzSQ;C<@Q5?;y(bK57MB5!ckbnKx|E3QGNIdLNF(QW9>TTwq<+qs= zY=SU9;y+UO;ezvT`0IdwUle-|3OTR-+ek>$fz8#gC%4`wGqh}aoG6^aDNUzmicD|b zK0dl?SO;>_+%|v-+IAhMeyT}&$L6iz$#3l}K8?X|&=HBiLhKf6IBH&=*U-ZxjnB3|`0VIJ$^OqY#@k0saMR5%9=M z<^~|3{g-2)7v?AMIHy!Nq!mU`VMNMD)&VU}93&TH(r5}%5GzFbvfk+mk@u}wjD=_3 zHe+ks#qD0~-7ELpa;U zWqkoGSou5=kbMv4kxi1zIj-fDxWX3W9YJu5k}8&K9zmA;Hg(oF;aTTh2r^@GZ<=|x z>;|>)K8y&89%bf2+>+2C{3Tc6qYQ-i=kWKE?3}aAyreb1hRf9@T&|8F`?b|OVlQ<^ z_RS6bt=?yr|5@a>9k>s@CbyzP+U&0Yd~?uh@xS)3|M~x{b!-3n-~Nvpxj}x9{+W>< zvkZM8KTb0!#BM5MhAsTJz+EkgVl7-`zQ^Jb>Jn}MZ$k4myFI5C`e)|tr{Fg0pP8k> z{(uJbn{WX&^b;Cc=p;0MVr3IiHlbx-VDlC&tR=coFzFM>PL*00P%DS*-3R6b0Wi>! zgIjZEb#KiJ!26}OBp0wdb^$vI%`099>(Mn`h~JAcQ2N-rmb27(U~=*>IL=k?=pgq^ zcNf^2U1KtDg4++BdtuyUtAzb!DS`zy*t=IVod!`&FkDluGvahiC$;_4*oWr`gPN0p zZp(CR+xGMAX--^+e*P;bgxydk1326FN(yx5A(yH)+fHr&U;p)g;-ee4bk;UhS=-wF zhj^A4uY+h{9NzmumOkGew^q-IQ8N1P+2~6c9A41`t_8FbqJ3Q3|G)oRIVbeB<^BQ2 z!apfJ$=^u8tRa8Zn5Q~(yd$q2lGp!-g?^FiyT2L#$1f2ud6Qdcd?OCf&`}7u`Fsa8 z{09bZ7{>R_aWEL#O{D zq9>G8t*qKKD-r6DrF50MnsQ6Kg^7i?R(O@d2pTL~f)?SVzU>7uN zXJ1c&i}uPJ>ZdTdJT36=6)Ba!wJJlcB_ggt5@ z;(tPiBJ0T<&+rzxE}Yt?QW<-fdzpFrFEgqg$GUJbu)awrq+2It^5n4TOea(m^jglo z(jr!3xO1v^`8 zEa1LRjL(Bu=o*;-CNw_t6ztlSWrFEVX(!gfc zmov);LcMBcWRm1yeMIQ0@~(YmS`VMhv1MmTFfpyIty>d5saD{j7u}dbY)XZ#=U&32 z(7(*Q-$6+B0<*PWqSspP&mfGwhte-I3*BKNH_gm@3+-6w6%jq&VJ>>S!$jP8PyPjX zkUCo4{tY%?We6mLR8q&AI-*T|96`#%2x2x9`vCE*@W})f3CJK@NzItC42oDM12r$P zY=LjAI5DM=Fc934WJp5_wSvC2L|pH)dx~;;z}<@_6(3$A(*I9pY#k(-d2V%KjPUa{ za;+{!>?AXf5O{}L3c)iGQGbTHdvBp%;qPZ62xbD~?^S{EXGMto8Or?x@IP4SBmDiz z>V0G)>W@N1-El~ffCz~{TD>4+AVDU@;0^_vF-fx3n{lX_0>!GL^5$7)^%fjzA)#6h zk%==g_Gu>M*#9K>aVkX9|8HN{wwp!_MBn=rC`u7jZj_{{DuJRXS}masCoUy&TT>8d(#$J2o__Cg3Q#0GwE!L=!Y2gLnaxWr{-1nS& zh1{A9YI~Fc=Dq;)I0ZD1Zzq>xxL~FEDx?>u>{tf=+TM{(wFNMyd{h13$b%jvw_Yy zN_TdRAjjL>b)0gSs!Je*5)WA@)s0{Z3=i9EbCa@7QMLI;wWvn$MBBEq zEv<}T{We?S3JQ^Qp-5s-RnZ#3=T+A7;l`1M)<~ucWB41A{x%|*UO12FOIPS-H)Lsz zOn~&Y>Vkw=LI?9wY{s|uWqiI4@hy~!@{NXYzK^V@7@j=R(B-iw0c13%?+*vsuysj#$3H7 zd>0he6hE5c#HN9I2q!mz^)?hjQ3#C!K_N^=fFE=kxDnu#cmRlz(L+8D{;r~*#iY9D zgMpsUHC$D-v`|>xkr2?@s5d98%WOJJIk49xJ4bjjXc4JE2Ca?E`FucyA8rimqXmQ} zUZbXcX<}c197sbSp%$=K3tEqSR11kMJDYKm7Zr{L2$We0*`6lz1FFU2^LPFhWT1B> z&D=+gq$#Pcx#6146Htom+a}dDp9?JWQle{8-G*iY?p!(mz{1a1K%bo*+No%pp;L^- zbsMWqZFhh5R*$5@uL~`QSKJ~tBW)3+sB1o-UI#zR9KiH%NhRu`JJ_!IpSPM7hXx`Pd8bTH8`e9q2CEH|HTFc17|RJb#(usJCi$nK_mHVcCs*v)J*~cbjsQV7 zibS<9!?ql>z}hg}8Fv-x1C%RQ-OYY~*ZZf{wOg zBabZ53(%)Np#NJ-W%o}QbcC-kL04r?M&|$dH!pL!2Qgqjw~(Ftz^%RD*EpuyjFwp+XF@RozdW|1yc+qE{ED3uVC)G?l|BAFB%v}1MsF3 z`R=X-`N%W)c3LNjAyTo12*Hn27aWCEdXEIQRpyV2t$eOyb|fFj31d`}-X7 z<4^21L-`A_P@!g)5L1WzA0^?IE_m)Vzi)=jwq3lxlE0VCM>)iReA6)m%TlC%D=+eLWta{6QGB{E%7oqZ%c6%9|rH5PiLHw3a7u<|YnpNS7_ za#{9XaANI{#0cpF_(J&1iRJBVGdMxfO*ooK*%rB5q8h%cedvAN{#)8I;kb0=HUvC| zMZb%Q+=+Od5dToLa2pV%{KNSK93 zD1UBAGdN_v^cOLR!oh=1RMXnXL_{ph@HBZ^j0Pg`xRC_B-0n z*k5eJNu?g|C)AJpPrRU%s0MQqPv5|G9HtG3hfH^Y%QTT><+d_wVP2UsE8Qd3r)LTp_JED#@X7lEv5 z+DH;ka0JfwMTt#=|9QZ~8QaxkG;naWr~_ApV$w}eaCRAJZI1J&?4}ONK*PohyUK53 zdS%;f2{h$HIKIyU@|V?cH+ssHkN08U-!i4tbr|no&6BU=y=hn3Soou<;4%6c>?(<4 z-$qAX1Y~aeZMjK!-eh2RSdYgjVqLzrh|`xX6XWAZO+xI}A-bqU7+-qQi%sOsw^%OFliqCVDox{Cfhqv9 zF!qpml^!Tw-wObG%3#mXig3&in1)+t0~63lP5pUHbx^7Gvd5Qd8|o+jA{OG`%FyVM zV9nyIFi-CWX4o}zoOlJY>zH=gW=XLMwPW9&K(C9EPZS>JNF()TtktIxAaEP)mQS4SfOTS%kt*XUzuII1cKZlYDn)e931AS5 z_$C_RYdmap1Uft{3xjD&J@~4A09QOf=eTfN(^YrShz_oF)2+IJR5aj;v^oWzNXc~Q zCiDN!RhGhwUWL#r?CICWdBIvNe8qQX(QbHMZIGXck7jmNibm`wjrYiF&%HXQdvPaV z{w>E;FgE@q0 zR=OuPr-7cIb#SX&_%H$Fg2|Z%7JU42otj=P2Xx}!KlqP83^P;v;OerAm@jn-M3|r( zCZSuKYY*GOoH=Mni>DCb;Frx7TfXUU!a1AZ3RVi!4SiJIQ5Ysz# zj+a`HKjGPNM1GOQYV#SHR;5=8%M3%6jy#m*EtehrXLnX&6Lr-(#t~G{1f2QXuJR1m zV!A8JW-T2=?Bivq!Y%wAg-{Jnv;YHBbR5V1P^dsPa3Zv(Tt<$HE}02tV(D6r(O;{bmRD|FZoiGCJgeMA4qGnG%)ktkX>EWgoKHMk^-^5EgNp%+v1 z_H{;e8kIeBs-$n7uqDu?{e4f3qJgWr+wCcwL)>N+>=Y}r-Jt!3ASWx}woeR&xLPX+ zLLyRqM`4+1pf+Smq%JBwC+Ra zGh-bv7Y<#+d?w&bvj7eotOp0f6dVLQghQ~p+h0F#$K&9vx|#&ZwBq{nGV-N2*gyPq?pox~RcK^*Oz>`JU`!IX(e7q(hABIPrJr_v zIYeIQYRz%rG@hXzoI85ZF`+;z8N|NuopFfVSVpc9PC5v+!0p{lUk=+pQFgrIMyIYP zoXlxfQ0FTsBgV$@L~MjYY34MV$lmc~gxf2)?Qw{rjwcNz_h@KI!(25w(!f$*7#WbC6z)M_=1WQ@Ed9tx#hBa;}J1bIrhMj#m* z5yL%Q1OH_>{X86SB-i)zAhqB!i}6>n2a#611y-HJiyfQU9j3%$zSSh-&d=} z1a?C)M$(8#JKDI)pq`sLTZ@>H^Be`v^U_DyL!F*83ZxO6SM^$b`x;f;6ji$&Xd}DX z?9wt1dlu;EK*_l8)NK%Xjg}}m4HU`P83AUgY&y!F!9P5!>~cib$4I%Uji(9K1;N>b z%@T*!T|PAHX!nu*%lXfu__2pI39$aEetx3t?m>OC|D(Qn{@>bWYkk}Nt8AO4wBz=1 zf>I@X=~>aEOqd#ij`<+8kv)N;L<#5*qg)vy6NnN%ghgM3i;Z%W&!2@dV9HMKX@Yxt z=3hiJD=~Yv?l-#X4X5B&9m0>9S!deN> z%|}&!RxvAXfR*RQo~T&)GFp6~Z(Wz0+4;HItYfC*B)Oa0%!gk&80VYi*IRWwW!mtG zr=*dd8_sNn=Vq7%vKJJ0T+perU9V#nCn}mFWrSInjEc*=ep99lpBNd59sK?8|HjNq zVp!h6-~ady|CB>Hi?qh1Upy<@ZHCJH`~GSAQDP?m<7o| z?ck>4%bqltMKT^3F~2dLg;Q*)rc?ObIOGS0Q1+H0?h{SkQr4u*H(Zm~v?a)E z$^>~!?dQom?vuB${K-P!0km~VKCxzkW=$K(Q4DmHPU_>zq zVt@^Xd<2ACuF24rUXUSW12X3A$yYLD4fZ7+J6rY(r1rG>7Ez8B<;Ggtv~Ns637m7e zhbxUcds|p+Y}+Qw9lc%0J9y!}rEJe2849(t)TDU&g|d*iY)q%@3Nj*VUf`-1hSZ_9 zmuV{0zN-bHPh?Gp(i5aXuPMt6!Col6K4wFkNok0rlqE#5A)P`AKIJ6{4fi48w3R2! za8=|^@?%4w9CB8U7fQJq*`|=>A#-O*9`iE*CS(Xa!MDtJl615?A#?aPUT3Oh_ z6jccfX%@x<0^330UyhS`-ffBZFy4XdCm7*rtoo^afH@z#PXxJzWxm%531DJKW zCS%G1u1S}&eXdDRh$hIB)#E-1fcH7qq(|8i*W|o_oac}Z_sKaxGOkI7vQw@}RzR{G zGU7hT0P>1!GJ=IszR>4B8Nq_bHR;1bKVL|>Px@tzPIy%CzTth~{gG>O1MnM2-EWY& zkL-&tTpwN>chJVc{hW8OFKsOe&$m+wK)dC8rMFzMD$hIK8JY&CdpY$M=H!yg9 zEeh}}AiD5xY()m%d3zF)eWuKn^=_2x^@O@HSt_o-eZ$}X_#HzJ9x=OYpG2{t>?_HN z>CuGgQLjBk)$hUTmvlY~HYUU^_Rz*P0}b9E{&c3ZgoWgkRlER`5iqIlzA+)X*eg{s zQPO1PZuuj&;_emuvN2h}+BG!0vLLSnRTE@^ps#4|?#4jL^13b<4Bc=bYN3dGCTMTh z_tq@t6Rgg*ex^?_{5G?*3St$(-CB5N3c?U{LjU8NXXes`2bFD z*ns@Jx%}RM?cqE;-{kR?%FP3tKLPXbjA4hAbq%4@jv-gYTfjAKiLw3R_@n&=-b "),Rt=n('

'),Nt=n('
'),St=n('

Use "Remind me..." in conversation to create intentions.

'),kt=n(' '),Ot=n(' '),$t=n('

'),zt=n('
'),Ct=n('

No predictions yet. Use Vestige more to train the predictive model.

'),It=n(" "),Pt=n(' '),Tt=n('

'),Ut=n('
'),Dt=n('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){gt(et,!0);let z=T(Q([])),j=T(Q([])),A=T(!0),N=T("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={critical:"text-decay",high:"text-amber-400",normal:"text-dim",low:"text-muted"},rt={time:"⏰",context:"◎",event:"⚡"};ut(async()=>{await B()});async function B(){$(A,!0);try{const[r,i]=await Promise.all([Z.intentions(t(N)),Z.predict()]);$(z,r.intentions||[],!0),$(j,i.predictions||[],!0)}catch{}finally{$(A,!1)}}async function it(r){$(N,r,!0),await B()}function F(r){if(!r)return"";try{return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return r}}var G=Dt(),L=s(G),H=d(s(L),2),dt=s(H);e(H),e(L);var M=d(L,2),Y=d(s(M),2);U(Y,20,()=>["active","fulfilled","snoozed","cancelled","all"],D,(r,i)=>{var v=wt(),a=s(v,!0);e(v),u(x=>{q(v,1,`px-3 py-1.5 rounded-xl text-xs transition ${t(N)===i?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),l(a,x)},[()=>i.charAt(0).toUpperCase()+i.slice(1)]),yt("click",v,()=>it(i)),o(r,v)}),e(Y);var lt=d(Y,2);{var vt=r=>{var i=Nt();U(i,20,()=>Array(4),D,(v,a)=>{var x=Rt();o(v,x)}),e(i),o(r,i)},ot=r=>{var i=St(),v=d(s(i),2),a=s(v);e(v),ht(2),e(i),u(()=>l(a,`No ${t(N)==="all"?"":t(N)+" "}intentions.`)),o(r,i)},nt=r=>{var i=zt();U(i,21,()=>t(z),D,(v,a)=>{var x=$t(),f=s(x),h=s(f),C=s(h,!0);e(h);var g=d(h,2),S=s(g),I=s(S,!0);e(S);var b=d(S,2),y=s(b),P=s(y,!0);e(y);var w=d(y,2),E=s(w);e(w);var k=d(w,2),c=s(k);e(k);var p=d(k,2);{var O=m=>{var _=kt(),W=s(_);e(_),u(X=>l(W,`deadline: ${X??""}`),[()=>F(t(a).deadline)]),o(m,_)};R(p,m=>{t(a).deadline&&m(O)})}var V=d(p,2);{var mt=m=>{var _=Ot(),W=s(_);e(_),u(X=>l(W,`snoozed until ${X??""}`),[()=>F(t(a).snoozed_until)]),o(m,_)};R(V,m=>{t(a).snoozed_until&&m(mt)})}e(b),e(g);var K=d(g,2),_t=s(K,!0);e(K),e(f),e(x),u((m,_)=>{l(C,rt[t(a).trigger_type]||"◇"),l(I,t(a).content),q(y,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[t(a).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),l(P,t(a).status),q(w,1,`text-[10px] ${(st[t(a).priority]||"text-muted")??""}`),l(E,`${t(a).priority??""} priority`),l(c,`${t(a).trigger_type??""}: ${m??""}`),l(_t,_)},[()=>t(a).trigger_value.length>40?t(a).trigger_value.slice(0,37)+"...":t(a).trigger_value,()=>F(t(a).created_at)]),o(v,x)}),e(i),o(r,i)};R(lt,r=>{t(A)?r(vt):t(z).length===0?r(ot,1):r(nt,!1)})}e(M);var J=d(M,2),pt=d(s(J),2);{var xt=r=>{var i=Ct();o(r,i)},ct=r=>{var i=Ut();U(i,21,()=>t(j),D,(v,a,x)=>{var f=Tt(),h=s(f);h.textContent=x+1;var C=d(h,2),g=s(C),S=s(g,!0);e(g);var I=d(g,2),b=s(I),y=s(b,!0);e(b);var P=d(b,2);{var w=c=>{var p=It(),O=s(p);e(p),u(V=>l(O,`${V??""}% retention`),[()=>(Number(t(a).retention)*100).toFixed(0)]),o(c,p)};R(P,c=>{t(a).retention&&c(w)})}var E=d(P,2);{var k=c=>{var p=Pt(),O=s(p);e(p),u(()=>l(O,`${t(a).predictedNeed??""} need`)),o(c,p)};R(E,c=>{t(a).predictedNeed&&c(k)})}e(I),e(C),e(f),u(()=>{l(S,t(a).content),l(y,t(a).nodeType)}),o(v,f)}),e(i),o(r,i)};R(pt,r=>{t(j).length===0?r(xt):r(ct,!1)})}e(J),e(G),u(()=>l(dt,`${t(z).length??""} intentions`)),o(tt,G),ft()}bt(["click"]);export{Wt as component}; +import"../chunks/Bzak7iHL.js";import{o as ut}from"../chunks/DUC-ssvh.js";import{p as gt,s as T,c as Q,t as u,a as ft,d,e as s,h as $,g as t,r as e,G as ht}from"../chunks/BBD-8XME.js";import{d as bt,s as l,a as yt}from"../chunks/DNn3Nckx.js";import{i as R}from"../chunks/RaRNNC-y.js";import{e as U,i as D}from"../chunks/C5a--lgk.js";import{a as o,f as n}from"../chunks/CKcqngaU.js";import{s as q}from"../chunks/CBWLjDtu.js";import{a as Z}from"../chunks/BcuCGYSa.js";var wt=n(""),Rt=n('
'),Nt=n('
'),St=n('

Use "Remind me..." in conversation to create intentions.

'),kt=n(' '),Ot=n(' '),$t=n('

'),zt=n('
'),Ct=n('

No predictions yet. Use Vestige more to train the predictive model.

'),It=n(" "),Pt=n(' '),Tt=n('

'),Ut=n('
'),Dt=n('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){gt(et,!0);let z=T(Q([])),j=T(Q([])),A=T(!0),N=T("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={critical:"text-decay",high:"text-amber-400",normal:"text-dim",low:"text-muted"},rt={time:"⏰",context:"◎",event:"⚡"};ut(async()=>{await B()});async function B(){$(A,!0);try{const[r,i]=await Promise.all([Z.intentions(t(N)),Z.predict()]);$(z,r.intentions||[],!0),$(j,i.predictions||[],!0)}catch{}finally{$(A,!1)}}async function it(r){$(N,r,!0),await B()}function F(r){if(!r)return"";try{return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return r}}var G=Dt(),L=s(G),H=d(s(L),2),dt=s(H);e(H),e(L);var M=d(L,2),Y=d(s(M),2);U(Y,20,()=>["active","fulfilled","snoozed","cancelled","all"],D,(r,i)=>{var v=wt(),a=s(v,!0);e(v),u(x=>{q(v,1,`px-3 py-1.5 rounded-xl text-xs transition ${t(N)===i?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),l(a,x)},[()=>i.charAt(0).toUpperCase()+i.slice(1)]),yt("click",v,()=>it(i)),o(r,v)}),e(Y);var lt=d(Y,2);{var vt=r=>{var i=Nt();U(i,20,()=>Array(4),D,(v,a)=>{var x=Rt();o(v,x)}),e(i),o(r,i)},ot=r=>{var i=St(),v=d(s(i),2),a=s(v);e(v),ht(2),e(i),u(()=>l(a,`No ${t(N)==="all"?"":t(N)+" "}intentions.`)),o(r,i)},nt=r=>{var i=zt();U(i,21,()=>t(z),D,(v,a)=>{var x=$t(),f=s(x),h=s(f),C=s(h,!0);e(h);var g=d(h,2),S=s(g),I=s(S,!0);e(S);var b=d(S,2),y=s(b),P=s(y,!0);e(y);var w=d(y,2),E=s(w);e(w);var k=d(w,2),c=s(k);e(k);var p=d(k,2);{var O=m=>{var _=kt(),W=s(_);e(_),u(X=>l(W,`deadline: ${X??""}`),[()=>F(t(a).deadline)]),o(m,_)};R(p,m=>{t(a).deadline&&m(O)})}var V=d(p,2);{var mt=m=>{var _=Ot(),W=s(_);e(_),u(X=>l(W,`snoozed until ${X??""}`),[()=>F(t(a).snoozed_until)]),o(m,_)};R(V,m=>{t(a).snoozed_until&&m(mt)})}e(b),e(g);var K=d(g,2),_t=s(K,!0);e(K),e(f),e(x),u((m,_)=>{l(C,rt[t(a).trigger_type]||"◇"),l(I,t(a).content),q(y,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[t(a).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),l(P,t(a).status),q(w,1,`text-[10px] ${(st[t(a).priority]||"text-muted")??""}`),l(E,`${t(a).priority??""} priority`),l(c,`${t(a).trigger_type??""}: ${m??""}`),l(_t,_)},[()=>t(a).trigger_value.length>40?t(a).trigger_value.slice(0,37)+"...":t(a).trigger_value,()=>F(t(a).created_at)]),o(v,x)}),e(i),o(r,i)};R(lt,r=>{t(A)?r(vt):t(z).length===0?r(ot,1):r(nt,!1)})}e(M);var J=d(M,2),pt=d(s(J),2);{var xt=r=>{var i=Ct();o(r,i)},ct=r=>{var i=Ut();U(i,21,()=>t(j),D,(v,a,x)=>{var f=Tt(),h=s(f);h.textContent=x+1;var C=d(h,2),g=s(C),S=s(g,!0);e(g);var I=d(g,2),b=s(I),y=s(b,!0);e(b);var P=d(b,2);{var w=c=>{var p=It(),O=s(p);e(p),u(V=>l(O,`${V??""}% retention`),[()=>(Number(t(a).retention)*100).toFixed(0)]),o(c,p)};R(P,c=>{t(a).retention&&c(w)})}var E=d(P,2);{var k=c=>{var p=Pt(),O=s(p);e(p),u(()=>l(O,`${t(a).predictedNeed??""} need`)),o(c,p)};R(E,c=>{t(a).predictedNeed&&c(k)})}e(I),e(C),e(f),u(()=>{l(S,t(a).content),l(y,t(a).nodeType)}),o(v,f)}),e(i),o(r,i)};R(pt,r=>{t(j).length===0?r(xt):r(ct,!1)})}e(J),e(G),u(()=>l(dt,`${t(z).length??""} intentions`)),o(tt,G),ft()}bt(["click"]);export{Wt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br b/apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br new file mode 100644 index 0000000000000000000000000000000000000000..bc143fd52ee07eba89fe52990d84f0bd153d2f3f GIT binary patch literal 2199 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 tTR^A>L7H_1y~3Ha;H>qR{{Z
'),Ke=g('
'),Ue=g(' '),Ve=g('

Promote Demote Delete
'),We=g(''),Xe=g('
'),Ze=g(`

Memories

'),Ke=g('
'),Ue=g(' '),Ve=g('

Promote Demote Delete
'),We=g(''),Xe=g('
'),Ze=g(`

Memories

Min retention:
`);function xt(ge,me){Be(me,!0);let k=b(Qe([])),P=b(""),S=b(""),be="",h=b(0),F=b(!0),T=b(null),ee;qe(()=>m());async function m(){u(F,!0);try{const i={};e(P)&&(i.q=e(P)),e(S)&&(i.node_type=e(S)),e(h)>0&&(i.min_retention=String(e(h)));const c=await f.memories.list(i);u(k,c.memories,!0)}catch{u(k,[],!0)}finally{u(F,!1)}}function he(){clearTimeout(ee),ee=setTimeout(m,300)}function ye(i){return i>.7?"#10b981":i>.4?"#f59e0b":"#ef4444"}var M=Ze(),A=s(M),te=t(s(A),2),we=s(te);a(te),a(A);var C=t(A,2),$=s(C);xe($);var y=t($,2),N=s(y);N.value=N.__value="";var O=t(N);O.value=O.__value="fact";var R=t(O);R.value=R.__value="concept";var j=t(R);j.value=j.__value="event";var L=t(j);L.value=L.__value="person";var q=t(L);q.value=q.__value="place";var B=t(q);B.value=B.__value="note";var Q=t(B);Q.value=Q.__value="pattern";var ae=t(Q);ae.value=ae.__value="decision",a(y);var se=t(y,2),D=t(s(se),2);xe(D);var ie=t(D,2),ke=s(ie);a(ie),a(se),a(C);var Pe=t(C,2);{var Se=i=>{var c=Ke();Z(c,20,()=>Array(8),ue,(w,o)=>{var x=Je();_(w,x)}),a(c),_(i,c)},Te=i=>{var c=Xe();Z(c,21,()=>e(k),w=>w.id,(w,o)=>{var x=We(),Y=s(x),z=s(Y),G=s(z),oe=s(G),H=t(oe,2),$e=s(H,!0);a(H);var De=t(H,2);Z(De,17,()=>e(o).tags.slice(0,3),ue,(n,l)=>{var d=Ue(),J=s(d,!0);a(d),E(()=>v(J,e(l))),_(n,d)}),a(G);var re=t(G,2),Ee=s(re,!0);a(re),a(z);var ne=t(z,2),I=s(ne),Fe=s(I);a(I);var le=t(I,2),Me=s(le);a(le),a(ne),a(Y);var Ae=t(Y,2);{var Ce=n=>{var l=Ve(),d=s(l),J=s(d,!0);a(d);var K=t(d,2),U=s(K),Ne=s(U);a(U);var V=t(U,2),Oe=s(V);a(V);var de=t(V,2),Re=s(de);a(de),a(K);var pe=t(K,2),W=s(pe),X=t(W,2),ve=t(X,2);a(pe),a(l),E((r,je,Le)=>{v(J,e(o).content),v(Ne,`Storage: ${r??""}%`),v(Oe,`Retrieval: ${je??""}%`),v(Re,`Created: ${Le??""}`)},[()=>(e(o).storageStrength*100).toFixed(1),()=>(e(o).retrievalStrength*100).toFixed(1),()=>new Date(e(o).createdAt).toLocaleDateString()]),p("click",W,r=>{r.stopPropagation(),f.memories.promote(e(o).id)}),p("keydown",W,r=>{r.key==="Enter"&&(r.stopPropagation(),f.memories.promote(e(o).id))}),p("click",X,r=>{r.stopPropagation(),f.memories.demote(e(o).id)}),p("keydown",X,r=>{r.key==="Enter"&&(r.stopPropagation(),f.memories.demote(e(o).id))}),p("click",ve,async r=>{r.stopPropagation(),await f.memories.delete(e(o).id),m()}),p("keydown",ve,async r=>{r.key==="Enter"&&(r.stopPropagation(),await f.memories.delete(e(o).id),m())}),_(n,l)};ce(Ae,n=>{var l;((l=e(T))==null?void 0:l.id)===e(o).id&&n(Ce)})}a(x),E((n,l)=>{var d;Ge(x,1,`text-left p-4 glass-subtle rounded-xl hover:bg-white/[0.04] transition-all duration-200 group ${((d=e(T))==null?void 0:d.id)===e(o).id?"!border-synapse/40 glow-synapse":""}`),_e(oe,`background: ${(Ie[e(o).nodeType]||"#8B95A5")??""}`),v($e,e(o).nodeType),v(Ee,e(o).content),_e(Fe,`width: ${e(o).retentionStrength*100}%; background: ${n??""}`),v(Me,`${l??""}%`)},[()=>ye(e(o).retentionStrength),()=>(e(o).retentionStrength*100).toFixed(0)]),p("click",x,()=>{var n;return u(T,((n=e(T))==null?void 0:n.id)===e(o).id?null:e(o),!0)}),_(w,x)}),a(c),_(i,c)};ce(Pe,i=>{e(F)?i(Se):i(Te,!1)})}a(M),E(i=>{v(we,`${e(k).length??""} results`),v(ke,`${i??""}%`)},[()=>(e(h)*100).toFixed(0)]),p("input",$,he),fe($,()=>e(P),i=>u(P,i)),p("change",y,m),He(y,()=>e(S),i=>u(S,i)),p("change",D,m),fe(D,()=>e(h),i=>u(h,i)),_(ge,M),Ye()}ze(["input","change","click","keydown"]);export{xt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.br b/apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.br new file mode 100644 index 0000000000000000000000000000000000000000..9b46fd818388113eca17e22fbb22048dc75769e4 GIT binary patch literal 2307 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.br b/apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.br deleted file mode 100644 index 28cfe5eb2e5713e8bb9da11130ac1d24cbe7a7ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2308 zcmV+f3H$aNwHYERG#$Wk7&}`Ql2;o^!OaLsX8ro+>O6ZnF-+>->W`opsjnMiB0Lod z5)I=LBm;JBZV@kzPwL)-TR$1c&t6%Z+Vmjar^;|@qd^z<7u-Bdj?3W1=UeIr zg4FhMCETWH(F7{1L-^B7qUr^Y)yeuX2B~@{y=?l!%@6Aj_}hwq)ycMFVDsqRwET+X z2g$;tDeG@Hqe-zRxGf2#2a`Ngk3PLW9&zGN!bOBpvOIiw@$5aVp3M)`?Q8Crnk5{9DXpM+~MYhzu$+&@&zd9h^{L>v{m1oecWEvZP29H!>wN((w%#DQbn8A*k9}ZH!O5i zsItb~?H6hQ>Zv&z;`KN*>QEc?K{?j2op@AsJ6Ngmw0-ZVZQ1VcL3R~l`>bscne+X* z?tjCgp%7-7x<+BiuH&z-yrVwmeo>?6*i(Bgbwu;n0;%3QOAak+VvpcQiwa87VmC6M zYJ4=R-sn{W4m1oRm3>VVXXZR0#zEFn4rFsv=`K?oVs7+z5M!NAn$1yf8Ff2S9Mpib z6(^~n^g6x1jT1R(JOgRB($z%nQL|7m$Xnc`u14@kK^wJlG%qlxYv3b+p@(3n z=7#&5lw)LZuJ+0{OnPke^$fMVqWKXRPPi2%R zax>Z4=Da0F^iFhM%~OV;zlQmGqa@5UdwC4cpyyD%Y`jB zx0%On<$8fgXq6M2B_kQRRg!U^=h%k>O184hW?+7_cg{){qoZb0kBu9d#SLPm z6xca08F0zZR3+jV$3cTZKhrhECMmYFjp~&kU!xwRdmLSNB#CuJS4dDkD#x3z7}K5K zPg9XK>sGn;#k~^pJ$P-?{5RE?$$zG0JPQm8BLDFQZ??_GYmMf=>HQD_6AT0#vP#WY zirnSi^L3mXEgIyvg-w6EIa@7WjCmC+EG*3<`rw#%(WtepXGTYlxP~95t))jffS!uA z3||}k$6g=j*USw?kPLi!04gBoHhVc5BhxO4Ap1A72zUL#WRdMlU1-fJv33by!J_>U z3igD*%@V*XK{wX(jPBVRM+y?{@w=y%u*6pM)$w$gr>`4{-a0QJfv>MAwn}|<9ZNv6 zBX+Ojzf8g}^z6nww_jFfasHRDbv+)2Fdb$u{?yaX*wvEIQV!TdJeU&p2FfJ#LcI9+ zljii*`uW?DJCKC|i=^ z%$X(JnU=#T>|pib0!z0fX4jbiJ*@r#x))H_#Ip3zJ#_@KJhDvC9ra+(v4PaUk%tK0 zGvI4s)G9SZL)eqIuHwi*m81pz1C<^*y((H~d8 z;%ORm?^zT|-?xnThP=5|LcPla;N(k&4MsdVM^VM-e6!jua0x}Ze7U+ z@(N-=HlwI`IIQR6dg37eR_uQ3%s5qxg=uzI|GWhsoS#ABr!Qx3V1&f$YvXg})tZ0Y zi7nEY663Kzy>H-NcOBbitJ&V!msdToKsTy~@?Ux=mBR7xUUI*IReJ#%0B~Kh_5E*_ znhwV=cqP%L(jTX4G2XN9rF!9!SW2NAN8H7dCOD2AW?p*Cu720%y`*zHudgX)HjLbS z8y6j6TL{L*M%X$dqybP0L#mtIC>Kp}T`36HAl?!vACZ*MpxS_RXU_wHkOKQwk0{jv zDa=|oa?E04Ed^$2_G1y08`vTGDqd<0UQ1^y|j6yQQ%l2&OnX00L2f-0hGePEF|SdIYsoM11Un3Gk;Dw`kR@9 zYHMDIrJANJ34(}U3&MC2lMJ3Ej6%+xEGJo2mA7ajA1iO3rB#gJRg4seylhUfYBrZ3 zSREDRLvoTBEFtJrUnc@%wpB}l#0*R)OFTms$$;<|U!J2Z5eR+6kG=Tkf3$+UW-&qc e-7Uz*CP+-nB2W=)f3p`H#>kVoF~Lk#+Ie@WrhN|p diff --git a/apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.gz b/apps/dashboard/build/_app/immutable/nodes/8.Cq7jwWnG.js.gz deleted file mode 100644 index 8b7d58d0b654859f149eba7984dd50100e49747d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2660 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 S5UO$GkADOC^Qw-v82|vOCl#Fl diff --git a/apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js.br b/apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js.br deleted file mode 100644 index 76953f829192de3afec66b36eea64190f16aff61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3013 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 GCIA3otH)gc diff --git a/apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js similarity index 93% rename from apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js rename to apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js index 6b5d886..700377e 100644 --- a/apps/dashboard/build/_app/immutable/nodes/9.19crbYuZ.js +++ b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js @@ -1,2 +1,2 @@ -import"../chunks/Bzak7iHL.js";import{o as ze}from"../chunks/CkyfbJUz.js";import{p as Je,t as w,a as We,d as r,e as t,g as s,s as S,h as m,r as e,G as b,f as Be,u as j}from"../chunks/C9Z4nxhR.js";import{d as He,a as X,s as p}from"../chunks/DP9qWekZ.js";import{i as u}from"../chunks/C2oj68pw.js";import{e as Z,i as ee}from"../chunks/kH-DTQyy.js";import{a as v,f as l,t as ue}from"../chunks/DPfxVJHQ.js";import{s as ge}from"../chunks/Co2v30Gm.js";import{s as fe}from"../chunks/BkopTN9z.js";import{s as Le,a as te}from"../chunks/DWr9YED7.js";import{a as T}from"../chunks/BcuCGYSa.js";import{m as Ue,a as Ye,i as qe}from"../chunks/BmeMLq0p.js";var Qe=l(' Running...',1),Xe=l('
Processed
'),Ze=l('
Decayed
'),et=l('
Embedded
'),tt=l('
'),st=l(' Dreaming...',1),at=l('
'),it=l('
Insights Discovered:
',1),dt=l('
Connections found:
'),rt=l('
Memories replayed:
'),ot=l('
'),nt=l('
'),vt=l('
'),lt=l('

Retention Distribution

'),ct=l('
'),xt=l(`

Settings & System

Memories
Avg Retention
WebSocket
v2.1
Vestige

Cognitive Operations

FSRS-6 Consolidation
Apply spaced-repetition decay, regenerate embeddings, run maintenance
Memory Dream Cycle
Replay memories, discover hidden connections, synthesize insights

Keyboard Shortcuts

About

V
Vestige v2.1 "Nuclear Dashboard"
Your AI's long-term memory system
29 cognitive modules
FSRS-6 spaced repetition
Nomic Embed v1.5 (256d)
Jina Reranker v1 Turbo
USearch HNSW (20x FAISS)
Local-first, zero cloud
Built with Rust + Axum + SvelteKit 2 + Svelte 5 + Three.js + Tailwind CSS 4
`);function Ct(_e,be){Je(be,!0);const ye=()=>te(Ue,"$memoryCount",I),P=()=>te(Ye,"$avgRetention",I),se=()=>te(qe,"$isConnected",I),[I,he]=Le();let E=S(!1),A=S(!1),y=S(null),g=S(null),we=S(null),$=S(null),ae=S(!0),Se=S(null);ze(()=>{N()});async function N(){m(ae,!0);try{const[a,o,c]=await Promise.all([T.stats().catch(()=>null),T.health().catch(()=>null),T.retentionDistribution().catch(()=>null)]);m(we,a,!0),m(Se,o,!0),m($,c,!0)}finally{m(ae,!1)}}async function ke(){m(E,!0),m(y,null);try{m(y,await T.consolidate(),!0),await N()}catch{}finally{m(E,!1)}}async function Ce(){m(A,!0),m(g,null);try{m(g,await T.dream(),!0),await N()}catch{}finally{m(A,!1)}}var K=xt(),V=t(K),Re=r(t(V),2);e(V);var z=r(V,2),J=t(z),ie=t(J),$e=t(ie,!0);e(ie),b(2),e(J);var W=r(J,2),B=t(W),Ae=t(B);e(B),b(2),e(W);var de=r(W,2),re=t(de),oe=t(re),ne=r(oe,2),De=t(ne,!0);e(ne),e(re),b(2),e(de),b(2),e(z);var H=r(z,2),L=r(t(H),2),U=t(L),O=r(t(U),2),Ge=t(O);{var Me=a=>{var o=Qe();b(),v(a,o)},Fe=a=>{var o=ue("Consolidate");v(a,o)};u(Ge,a=>{s(E)?a(Me):a(Fe,!1)})}e(O),e(U);var je=r(U,2);{var Te=a=>{var o=tt(),c=t(o),f=t(c);{var k=d=>{var i=Xe(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).nodesProcessed)),v(d,i)};u(f,d=>{s(y).nodesProcessed!==void 0&&d(k)})}var _=r(f,2);{var h=d=>{var i=Ze(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).decayApplied)),v(d,i)};u(_,d=>{s(y).decayApplied!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=et(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).embeddingsGenerated)),v(d,i)};u(C,d=>{s(y).embeddingsGenerated!==void 0&&d(G)})}e(c),e(o),v(a,o)};u(je,a=>{s(y)&&a(Te)})}e(L);var ve=r(L,2),Y=t(ve),D=r(t(Y),2),Ee=t(D);{var Ne=a=>{var o=st();b(),v(a,o)},Oe=a=>{var o=ue("Dream");v(a,o)};u(Ee,a=>{s(A)?a(Ne):a(Oe,!1)})}e(D),e(Y);var Pe=r(Y,2);{var Ie=a=>{var o=ot(),c=t(o);{var f=d=>{var i=it(),n=r(Be(i),2);Z(n,17,()=>s(g).insights,ee,(x,M)=>{var R=at(),F=t(R,!0);e(R),w(q=>p(F,q),[()=>typeof s(M)=="string"?s(M):JSON.stringify(s(M))]),v(x,R)}),v(d,i)},k=j(()=>s(g).insights&&Array.isArray(s(g).insights));u(c,d=>{s(k)&&d(f)})}var _=r(c,2);{var h=d=>{var i=dt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).connections_found)),v(d,i)};u(_,d=>{s(g).connections_found!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=rt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).memories_replayed)),v(d,i)};u(C,d=>{s(g).memories_replayed!==void 0&&d(G)})}e(o),v(a,o)};u(Pe,a=>{s(g)&&a(Ie)})}e(ve),e(H);var le=r(H,2);{var Ke=a=>{var o=lt(),c=r(t(o),2),f=t(c);{var k=h=>{var C=vt();Z(C,21,()=>s($).distribution,ee,(G,d,i)=>{const n=j(()=>Math.max(...s($).distribution.map(Q=>Q.count),1)),x=j(()=>s(d).count/s(n)*100),M=j(()=>i<2?"#ef4444":i<4?"#f59e0b":i<7?"#6366f1":"#10b981");var R=nt(),F=t(R),q=t(F,!0);e(F);var pe=r(F,2),Ve=r(pe,2);Ve.textContent=`${i*10}%`,e(R),w(Q=>{p(q,s(d).count),fe(pe,`height: ${Q??""}%; background: ${s(M)??""}; opacity: 0.7`)},[()=>Math.max(s(x),2)]),v(G,R)}),e(C),v(h,C)},_=j(()=>s($).distribution&&Array.isArray(s($).distribution));u(f,h=>{s(_)&&h(k)})}e(c),e(o),v(a,o)};u(le,a=>{s($)&&a(Ke)})}var ce=r(le,2),xe=r(t(ce),2),me=t(xe);Z(me,20,()=>[{key:"⌘ K",desc:"Command palette"},{key:"/",desc:"Focus search"},{key:"G",desc:"Go to Graph"},{key:"M",desc:"Go to Memories"},{key:"T",desc:"Go to Timeline"},{key:"F",desc:"Go to Feed"},{key:"E",desc:"Go to Explore"},{key:"S",desc:"Go to Stats"}],ee,(a,o)=>{var c=ct(),f=t(c),k=t(f,!0);e(f);var _=r(f,2),h=t(_,!0);e(_),e(c),w(()=>{p(k,o.key),p(h,o.desc)}),v(a,c)}),e(me),e(xe),e(ce),b(2),e(K),w(a=>{p($e,ye()),fe(B,`color: ${P()>.7?"#10b981":P()>.4?"#f59e0b":"#ef4444"}`),p(Ae,`${a??""}%`),ge(oe,1,`w-2.5 h-2.5 rounded-full ${se()?"bg-recall animate-pulse-glow":"bg-decay"}`),p(De,se()?"Online":"Offline"),O.disabled=s(E),D.disabled=s(A),ge(D,1,`px-4 py-2 bg-dream/20 border border-dream/40 text-dream-glow text-sm rounded-xl hover:bg-dream/30 transition disabled:opacity-50 flex items-center gap-2 +import"../chunks/Bzak7iHL.js";import{o as ze}from"../chunks/DUC-ssvh.js";import{p as Je,t as w,a as We,d as r,e as t,g as s,s as S,h as m,r as e,G as b,f as Be,u as j}from"../chunks/BBD-8XME.js";import{d as He,a as X,s as p}from"../chunks/DNn3Nckx.js";import{i as u}from"../chunks/RaRNNC-y.js";import{e as Z,i as ee}from"../chunks/C5a--lgk.js";import{a as v,f as l,t as ue}from"../chunks/CKcqngaU.js";import{s as ge}from"../chunks/CBWLjDtu.js";import{s as fe}from"../chunks/DBfx-YTU.js";import{s as Le,a as te}from"../chunks/BexJutgU.js";import{a as T}from"../chunks/BcuCGYSa.js";import{m as Ue,a as Ye,i as qe}from"../chunks/CruZBLYW.js";var Qe=l(' Running...',1),Xe=l('
Processed
'),Ze=l('
Decayed
'),et=l('
Embedded
'),tt=l('
'),st=l(' Dreaming...',1),at=l('
'),it=l('
Insights Discovered:
',1),dt=l('
Connections found:
'),rt=l('
Memories replayed:
'),ot=l('
'),nt=l('
'),vt=l('
'),lt=l('

Retention Distribution

'),ct=l('
'),xt=l(`

Settings & System

Memories
Avg Retention
WebSocket
v2.1
Vestige

Cognitive Operations

FSRS-6 Consolidation
Apply spaced-repetition decay, regenerate embeddings, run maintenance
Memory Dream Cycle
Replay memories, discover hidden connections, synthesize insights

Keyboard Shortcuts

About

V
Vestige v2.1 "Nuclear Dashboard"
Your AI's long-term memory system
29 cognitive modules
FSRS-6 spaced repetition
Nomic Embed v1.5 (256d)
Jina Reranker v1 Turbo
USearch HNSW (20x FAISS)
Local-first, zero cloud
Built with Rust + Axum + SvelteKit 2 + Svelte 5 + Three.js + Tailwind CSS 4
`);function Ct(_e,be){Je(be,!0);const ye=()=>te(Ue,"$memoryCount",I),P=()=>te(Ye,"$avgRetention",I),se=()=>te(qe,"$isConnected",I),[I,he]=Le();let E=S(!1),A=S(!1),y=S(null),g=S(null),we=S(null),$=S(null),ae=S(!0),Se=S(null);ze(()=>{N()});async function N(){m(ae,!0);try{const[a,o,c]=await Promise.all([T.stats().catch(()=>null),T.health().catch(()=>null),T.retentionDistribution().catch(()=>null)]);m(we,a,!0),m(Se,o,!0),m($,c,!0)}finally{m(ae,!1)}}async function ke(){m(E,!0),m(y,null);try{m(y,await T.consolidate(),!0),await N()}catch{}finally{m(E,!1)}}async function Ce(){m(A,!0),m(g,null);try{m(g,await T.dream(),!0),await N()}catch{}finally{m(A,!1)}}var K=xt(),V=t(K),Re=r(t(V),2);e(V);var z=r(V,2),J=t(z),ie=t(J),$e=t(ie,!0);e(ie),b(2),e(J);var W=r(J,2),B=t(W),Ae=t(B);e(B),b(2),e(W);var de=r(W,2),re=t(de),oe=t(re),ne=r(oe,2),De=t(ne,!0);e(ne),e(re),b(2),e(de),b(2),e(z);var H=r(z,2),L=r(t(H),2),U=t(L),O=r(t(U),2),Ge=t(O);{var Me=a=>{var o=Qe();b(),v(a,o)},Fe=a=>{var o=ue("Consolidate");v(a,o)};u(Ge,a=>{s(E)?a(Me):a(Fe,!1)})}e(O),e(U);var je=r(U,2);{var Te=a=>{var o=tt(),c=t(o),f=t(c);{var k=d=>{var i=Xe(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).nodesProcessed)),v(d,i)};u(f,d=>{s(y).nodesProcessed!==void 0&&d(k)})}var _=r(f,2);{var h=d=>{var i=Ze(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).decayApplied)),v(d,i)};u(_,d=>{s(y).decayApplied!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=et(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).embeddingsGenerated)),v(d,i)};u(C,d=>{s(y).embeddingsGenerated!==void 0&&d(G)})}e(c),e(o),v(a,o)};u(je,a=>{s(y)&&a(Te)})}e(L);var ve=r(L,2),Y=t(ve),D=r(t(Y),2),Ee=t(D);{var Ne=a=>{var o=st();b(),v(a,o)},Oe=a=>{var o=ue("Dream");v(a,o)};u(Ee,a=>{s(A)?a(Ne):a(Oe,!1)})}e(D),e(Y);var Pe=r(Y,2);{var Ie=a=>{var o=ot(),c=t(o);{var f=d=>{var i=it(),n=r(Be(i),2);Z(n,17,()=>s(g).insights,ee,(x,M)=>{var R=at(),F=t(R,!0);e(R),w(q=>p(F,q),[()=>typeof s(M)=="string"?s(M):JSON.stringify(s(M))]),v(x,R)}),v(d,i)},k=j(()=>s(g).insights&&Array.isArray(s(g).insights));u(c,d=>{s(k)&&d(f)})}var _=r(c,2);{var h=d=>{var i=dt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).connections_found)),v(d,i)};u(_,d=>{s(g).connections_found!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=rt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).memories_replayed)),v(d,i)};u(C,d=>{s(g).memories_replayed!==void 0&&d(G)})}e(o),v(a,o)};u(Pe,a=>{s(g)&&a(Ie)})}e(ve),e(H);var le=r(H,2);{var Ke=a=>{var o=lt(),c=r(t(o),2),f=t(c);{var k=h=>{var C=vt();Z(C,21,()=>s($).distribution,ee,(G,d,i)=>{const n=j(()=>Math.max(...s($).distribution.map(Q=>Q.count),1)),x=j(()=>s(d).count/s(n)*100),M=j(()=>i<2?"#ef4444":i<4?"#f59e0b":i<7?"#6366f1":"#10b981");var R=nt(),F=t(R),q=t(F,!0);e(F);var pe=r(F,2),Ve=r(pe,2);Ve.textContent=`${i*10}%`,e(R),w(Q=>{p(q,s(d).count),fe(pe,`height: ${Q??""}%; background: ${s(M)??""}; opacity: 0.7`)},[()=>Math.max(s(x),2)]),v(G,R)}),e(C),v(h,C)},_=j(()=>s($).distribution&&Array.isArray(s($).distribution));u(f,h=>{s(_)&&h(k)})}e(c),e(o),v(a,o)};u(le,a=>{s($)&&a(Ke)})}var ce=r(le,2),xe=r(t(ce),2),me=t(xe);Z(me,20,()=>[{key:"⌘ K",desc:"Command palette"},{key:"/",desc:"Focus search"},{key:"G",desc:"Go to Graph"},{key:"M",desc:"Go to Memories"},{key:"T",desc:"Go to Timeline"},{key:"F",desc:"Go to Feed"},{key:"E",desc:"Go to Explore"},{key:"S",desc:"Go to Stats"}],ee,(a,o)=>{var c=ct(),f=t(c),k=t(f,!0);e(f);var _=r(f,2),h=t(_,!0);e(_),e(c),w(()=>{p(k,o.key),p(h,o.desc)}),v(a,c)}),e(me),e(xe),e(ce),b(2),e(K),w(a=>{p($e,ye()),fe(B,`color: ${P()>.7?"#10b981":P()>.4?"#f59e0b":"#ef4444"}`),p(Ae,`${a??""}%`),ge(oe,1,`w-2.5 h-2.5 rounded-full ${se()?"bg-recall animate-pulse-glow":"bg-decay"}`),p(De,se()?"Online":"Offline"),O.disabled=s(E),D.disabled=s(A),ge(D,1,`px-4 py-2 bg-dream/20 border border-dream/40 text-dream-glow text-sm rounded-xl hover:bg-dream/30 transition disabled:opacity-50 flex items-center gap-2 ${s(A)?"glow-dream animate-pulse-glow":""}`)},[()=>(P()*100).toFixed(1)]),X("click",Re,N),X("click",O,ke),X("click",D,Ce),v(_e,K),We(),he()}He(["click"]);export{Ct as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br new file mode 100644 index 0000000000000000000000000000000000000000..84fc5aa877e6532f21b6859aab3767d3a6904975 GIT binary patch literal 3014 zcmV;%3pw-~rX~^9q=Er-9>&Jfro**cT+_aX1m%x%MhI0(Nic%_2uWrqo9qAl|K*fr zD>KHGtiICemI~VEjT=IMNRKuOnV;8q$^+PcOo*wvo8+m!hdq`08_U z-)%*Hs?w*jeNRD6Tf7>33Vj+)GvKG~#N0X1id4G2b1_fNDu87>N~)_kU%agL+IY7S+V-Uj`aOAh z7R{X(_y(e1N-$mxRJe7oz0TCSIOCda8s>bc*B^wuVA+lX@&8}o0qyp4OOdq=dXvxU zA0yeu(#s@ z&&{UQUbx%0j)jy$~izKlFO&v^(f`ujs#V z^{J9j6cEFgcvU(nm?(IP5e@UgUGNQrL%#s2Fk{;K?d}Ko+Y2$yb4w!Rj`RdmbAM_B zIQwxN7L=OH8!iR=SPHyZpl(!{lBHF<=p!a!v>pWuBJwf<$zyq7xalC{GluvMu3>rk}tfTN;A2R97bjh&HRf{q9-6}$wCrVX>sY0j$Zf45yIuEc`C6gMS^z+ z`51D@f-UJ5)Yt#(Glk7m&wm)$~f_CgW`qH zr^cS&Q8Z9#_h!y@D3wXpMdK|=aHamfFwb&kEe@oM3|`;?l{EdG0)oVx5PQB$AD@n; zio%<~`_C8f14xGryufagfb<#GenS?rPdQ?bbu$AC(SqYaY44~Ck`$CtEvrE33uM|0R+;?mq~FqtD&)XOATR%OTQ;{3+3)DJPG>X&xnLpvrmssaU4~MCxRp6y&%=y8p{B>Lu>dEP5M8@(szB_Hs2J%{Q2GYT zbzJxX=y_&|08I08A(8Y1fS+z3mb9S4A`Hd-Z7opR!Wz-ivqcN-VqL%wrx_4+LRgu6W<6wY8FOOzNaNz%67))8uOkCbefJ}&#eDSN zgT->?4k)n0p`PUbv<|hinlu#-HxeV8d9vG$>fkS#h^PtIuyVJPxlY143Lh|i$tf|W zOS5sDZ;$BJ*bFP9y<$>{w=ajh@5EI3^ zRqYUOQDQAb4MX5YF^9mAdTRJLD;y>VLrlyT!xE-lEXEAg z;;MBr*b0#dEVbZ~M_4`=P(uLM#^Jj&SZwWOjOm6P}ma#1XoV*~XM5cUdUfH{4h^2>kEG4}5#^0b_2-Kzw z5iabwSuz6C8{@g^4C)e8c*`bN3)3sjxKZ5kd1V(ERC0tE4meR{n@VWDZbVFbq{=7J ze&0PpR#lG&i&`&@CS2Zk0`Ij#z+st1B~;j?Sc`*?wm z?>>H3j2qu8J{m28H3XJc_Owt#d&HqWwJ-)j{HOX7G8v4_WZ#`|8!j+DCW zUrOiL;safQvk>1z1@@u--o&2CWmN)=7HNT39eGb*NiVIKumMv!*0|Z4SJAniV zHL#_anm{U9KuQ%YMfK8AA9)j#GzaAGp0V;O_6wDIkqBKT;R)8AO%$mwg=UBp5cSBT z2)phF>uSj2Thk1BED5)34*9rJEL5kcok;Xf>7y-|Sj<h+>A+72&N;Rr)C?#c#0)iS@fcvu_L?M@5g`Q{}oX2?b5A@|qXB$-Z!b=2(0DmMg& zsRfKk#Y-EGnqr~e;P`}D_(|Hs`~LyZ0evQ0|NV*|iXVC>Na<}K)LAM0O*GbEjwG{P z-g3O{d*vrr0MM(sf-g|LqaAF=R!CT)r6xxZP(=^tm^Y)$^db I=A|Y55BCY%5&!@I literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..856a655de5e874563213e207daf2443b86202fc9 GIT binary patch literal 3404 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/version.json b/apps/dashboard/build/_app/version.json index 10d0f4c..20252d2 100644 --- a/apps/dashboard/build/_app/version.json +++ b/apps/dashboard/build/_app/version.json @@ -1 +1 @@ -{"version":"1772569216424"} \ No newline at end of file +{"version":"1773441353786"} \ No newline at end of file diff --git a/apps/dashboard/build/_app/version.json.br b/apps/dashboard/build/_app/version.json.br index 40a86c3833f44242eee06c3ea4d1bd6ccf1bc880..7ac6ca9ca9d6ce130e133ef4fedbbe1d61efcba2 100644 GIT binary patch literal 29 lcmb1^V)$`1H>dWvudV^@R=30i&wcUj5z5SAHN}bs$jAtKLE^I4B`L) diff --git a/apps/dashboard/build/_app/version.json.gz b/apps/dashboard/build/_app/version.json.gz index 74640ff9ba139082d664fa46a976a3860e77e34d..c0d2794ed2246f7dbb5b2d01be6f2b1c4c032644 100644 GIT binary patch literal 47 zcmb2|=3oE;Cg#;)THd-^=gyoD-V|hHVs36`XlP<)YPQ`Vcoi!H$Db)Hq=Cu+AWRI( literal 47 zcmb2|=3oE;CgIg#THd-^=gyoD-V|hHVs36^y4l3Y#Msa%a1|><+B0Q7X`nIyAt?+C diff --git a/apps/dashboard/build/favicon.svg.gz b/apps/dashboard/build/favicon.svg.gz index 61b0904e2b195b2803d6069882799a179af3bef3..88ee5b2e85eaae12dd51e1ba3fff6f0f7b34fe3a 100644 GIT binary patch literal 457 zcmV;)0XF_0iwFP!000021GSV*Zo)7Sh4(#$8&s)XgxJmxP8C?Ri|%@dkl0|=jZqQ^ z+`cxpQ$j$6MI|I#(Y$Zo%(KXv-3si#Mb*r`b=z)UgP`lWX%|jqy$UddFi;g9*m2su z$^G1e0D=&!pSO4bAS)?r^hI6kyyUs~&Sq&UIGsx)Ahe5+%l?J{1Q= z9$;JuMT9xbQLfw6@{7*BZ7rTBs~7jd?|9j+m0}v3uGypSgHO7xa{($@(gyhc)o$?E z4J)l{XD0@7lNY>IHE^0*@F@UV05O1GZs$Lhld&A*EAntjFiZZDJNq~^%ThHCfZ#GE z!~U}|fY|of>VLF2++a2%c`P9%VpK)B6vl?9+|NY$Sik{ z&3V9POD_F>!Nc_Rnoe7~w{VrM6Bx1G_U~mw%O=)$V%R#Kp6!A;XAi@U&e=zw|HLL1 zjfZGGPLFo);T#%JHzL8M^hCU&O(V;2uUvhI4{j0FGySUccM literal 462 zcmV;<0Wtm`iwFP!000026Sb7hZk#X_h4*=iTaPNW3&1u%F%iz9U3AxXV89Sm7mo}X zn75BSw&^g;D9NI$YayTSo_mi)F&tZ%|H^*g=w%!aPf;{YQ#i$;(rrXB#?f$W5ga=) z{ZKPU7%;>XVv3$00E${PgE;^cx~#iW{xU`MBXl)KErM$1D8*k9R3~@PwptZHF^uW} zs%Zu>a%3);4?(4*(j4tdmZr@kif&&gcq7Q-ENh4t6w%t&*>vPx7geV#Db6NIW<8p! zIU)&yrjwGR9WHT6O4CNGKZ2uIEx+yB@BTwDb@lkd5eZY;8{h0CVlB)BhV^R0+%Tl|H-SKe-EN(p=#EO@ImJr|NrAjh*V3Tx8b^n28t<8 diff --git a/apps/dashboard/build/index.html b/apps/dashboard/build/index.html index 38a3b72..08a4155 100644 --- a/apps/dashboard/build/index.html +++ b/apps/dashboard/build/index.html @@ -8,23 +8,24 @@ - - - - - - - - - - - + + + + + + + + + + + + - - - - - + + + + + Vestige @@ -32,7 +33,7 @@
@@ -98,7 +98,7 @@
@@ -132,7 +132,7 @@ The dashboard runs automatically at `http://localhost:3927/dashboard` when the M │ 15 REST endpoints · WS event broadcast │ ├─────────────────────────────────────────────────────┤ │ MCP Server (stdio JSON-RPC) │ -│ 21 tools · 29 cognitive modules │ +│ 23 tools · 29 cognitive modules │ ├─────────────────────────────────────────────────────┤ │ Cognitive Engine │ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ @@ -196,7 +196,7 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen --- -## 🛠 21 MCP Tools +## 🛠 23 MCP Tools ### Context Packets | Tool | What It Does | @@ -241,6 +241,12 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen | `backup` / `export` / `gc` | Database backup, JSON export, garbage collection | | `restore` | Restore from JSON backup | +### Deep Reference (v2.0.4) +| Tool | What It Does | +|------|-------------| +| `deep_reference` | **Cognitive reasoning across memories.** 8-stage pipeline: FSRS-6 trust scoring, intent classification, spreading activation, temporal supersession, contradiction analysis, relation assessment, dream insight integration, and algorithmic reasoning chain generation. Returns trust-scored evidence with a pre-built reasoning scaffold. | +| `cross_reference` | Backward-compatible alias for `deep_reference`. | + --- ## Make Your AI Use Vestige Automatically diff --git a/SECURITY.md b/SECURITY.md index 08a53bf..cc46721 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,8 +4,8 @@ | Version | Supported | | ------- | ------------------ | -| 1.1.x | :white_check_mark: | -| 1.0.x | :x: | +| 2.0.x | :white_check_mark: | +| 1.x | :x: | ## Reporting a Vulnerability diff --git a/crates/vestige-core/Cargo.toml b/crates/vestige-core/Cargo.toml index ef29cd2..0e21883 100644 --- a/crates/vestige-core/Cargo.toml +++ b/crates/vestige-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vestige-core" -version = "2.0.3" +version = "2.0.4" edition = "2024" rust-version = "1.91" authors = ["Vestige Team"] diff --git a/crates/vestige-core/src/advanced/mod.rs b/crates/vestige-core/src/advanced/mod.rs index 8b41f6e..d74d46f 100644 --- a/crates/vestige-core/src/advanced/mod.rs +++ b/crates/vestige-core/src/advanced/mod.rs @@ -29,7 +29,7 @@ pub mod speculative; // Re-exports for convenient access pub use adaptive_embedding::{AdaptiveEmbedder, ContentType, EmbeddingStrategy, Language}; -pub use chains::{ChainStep, ConnectionType, MemoryChainBuilder, MemoryPath, ReasoningChain}; +pub use chains::{ChainStep, Connection, ConnectionType, MemoryChainBuilder, MemoryNode, MemoryPath, ReasoningChain}; pub use compression::{CompressedMemory, CompressionConfig, CompressionStats, MemoryCompressor}; pub use cross_project::{ ApplicableKnowledge, CrossProjectLearner, ProjectContext, UniversalPattern, diff --git a/crates/vestige-core/src/storage/migrations.rs b/crates/vestige-core/src/storage/migrations.rs index 851f65e..b5325b4 100644 --- a/crates/vestige-core/src/storage/migrations.rs +++ b/crates/vestige-core/src/storage/migrations.rs @@ -315,7 +315,10 @@ const MIGRATION_V4_UP: &str = r#" -- TEMPORAL KNOWLEDGE GRAPH (Like Zep's Graphiti) -- ============================================================================ --- Knowledge edges for temporal reasoning +-- DEPRECATED (v2.1.0): knowledge_edges is unused. All graph edges use +-- memory_connections (migration V3). This table was designed for bi-temporal +-- edge support but was never wired. Retained for schema compatibility with +-- existing databases. Do NOT add queries against this table. CREATE TABLE IF NOT EXISTS knowledge_edges ( id TEXT PRIMARY KEY, source_id TEXT NOT NULL, diff --git a/crates/vestige-core/src/storage/sqlite.rs b/crates/vestige-core/src/storage/sqlite.rs index f3a5681..52317da 100644 --- a/crates/vestige-core/src/storage/sqlite.rs +++ b/crates/vestige-core/src/storage/sqlite.rs @@ -227,6 +227,7 @@ impl Storage { .lock() .map_err(|_| StorageError::Init("Vector index lock poisoned".to_string()))?; + let mut load_failures = 0u32; for (node_id, embedding_bytes) in embeddings { if let Some(embedding) = Embedding::from_bytes(&embedding_bytes) { // Handle Matryoshka migration: old 768-dim → truncate to 256-dim @@ -236,10 +237,14 @@ impl Storage { embedding.vector }; if let Err(e) = index.add(&node_id, &vector) { + load_failures += 1; tracing::warn!("Failed to load embedding for {}: {}", node_id, e); } } } + if load_failures > 0 { + tracing::error!(count = load_failures, "Vector index: {} embeddings failed to load", load_failures); + } Ok(()) } @@ -399,7 +404,11 @@ impl Storage { superseded_id: None, similarity: None, prediction_error: Some(prediction_error), - reason: format!("Created new memory: {:?}. Related: {:?}", reason, related_memory_ids), + reason: if related_memory_ids.is_empty() { + format!("Created new memory: {:?}", reason) + } else { + format!("Created new memory: {:?}. Semantically similar (not linked): {:?}", reason, related_memory_ids) + }, }) } GateDecision::Update { target_id, similarity, update_type, prediction_error } => { @@ -667,7 +676,13 @@ impl Storage { /// Convert a row to KnowledgeNode fn row_to_node(row: &rusqlite::Row) -> rusqlite::Result { let tags_json: String = row.get("tags")?; - let tags: Vec = serde_json::from_str(&tags_json).unwrap_or_default(); + let tags: Vec = match serde_json::from_str(&tags_json) { + Ok(t) => t, + Err(e) => { + tracing::warn!(raw = %tags_json, "Failed to deserialize tags JSON, using empty: {}", e); + Vec::new() + } + }; let created_at: String = row.get("created_at")?; let updated_at: String = row.get("updated_at")?; @@ -955,6 +970,8 @@ impl Storage { pub fn strengthen_batch_on_access(&self, ids: &[&str]) -> Result<()> { for id in ids { self.strengthen_on_access(id)?; + // Also record access in memory_states for audit trail (Bug #1 fix) + let _ = self.record_memory_access(id); } Ok(()) } @@ -3223,6 +3240,42 @@ impl Storage { })) } + /// Get dream history (most recent first) + pub fn get_dream_history(&self, limit: i32) -> Result> { + let reader = self.reader.lock() + .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; + let mut stmt = reader.prepare( + "SELECT dreamed_at, duration_ms, memories_replayed, connections_found, + insights_generated, memories_strengthened, memories_compressed, + phase_nrem1_ms, phase_nrem3_ms, phase_rem_ms, phase_integration_ms, + summaries_generated, emotional_memories_processed, creative_connections_found + FROM dream_history ORDER BY dreamed_at DESC LIMIT ?1" + )?; + let records = stmt.query_map(params![limit], |row| { + let dreamed_at_str: String = row.get(0)?; + let dreamed_at = DateTime::parse_from_rfc3339(&dreamed_at_str) + .map(|dt| dt.with_timezone(&Utc)) + .unwrap_or_else(|_| Utc::now()); + Ok(DreamHistoryRecord { + dreamed_at, + duration_ms: row.get(1)?, + memories_replayed: row.get(2)?, + connections_found: row.get(3)?, + insights_generated: row.get(4)?, + memories_strengthened: row.get(5)?, + memories_compressed: row.get(6)?, + phase_nrem1_ms: row.get(7)?, + phase_nrem3_ms: row.get(8)?, + phase_rem_ms: row.get(9)?, + phase_integration_ms: row.get(10)?, + summaries_generated: row.get(11)?, + emotional_memories_processed: row.get(12)?, + creative_connections_found: row.get(13)?, + }) + })?.collect::, _>>()?; + Ok(records) + } + /// Count memories created since a given timestamp pub fn count_memories_since(&self, since: DateTime) -> Result { let reader = self.reader.lock() diff --git a/crates/vestige-mcp/Cargo.toml b/crates/vestige-mcp/Cargo.toml index 5676c72..f0c7133 100644 --- a/crates/vestige-mcp/Cargo.toml +++ b/crates/vestige-mcp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vestige-mcp" -version = "2.0.3" +version = "2.0.4" edition = "2024" description = "Cognitive memory MCP server for Claude - FSRS-6, spreading activation, synaptic tagging, 3D dashboard, and 130 years of memory research" authors = ["samvallad33"] @@ -32,7 +32,7 @@ path = "src/bin/cli.rs" # ============================================================================ # Includes: FSRS-6, spreading activation, synaptic tagging, hippocampal indexing, # memory states, context memory, importance signals, dreams, and more -vestige-core = { version = "2.0.3", path = "../vestige-core", default-features = false, features = ["bundled-sqlite"] } +vestige-core = { version = "2.0.4", path = "../vestige-core", default-features = false, features = ["bundled-sqlite"] } # ============================================================================ # MCP Server Dependencies diff --git a/crates/vestige-mcp/src/main.rs b/crates/vestige-mcp/src/main.rs index 09a607f..0fb5a86 100644 --- a/crates/vestige-mcp/src/main.rs +++ b/crates/vestige-mcp/src/main.rs @@ -307,7 +307,7 @@ async fn main() { Ok(token) => { let bind = std::env::var("VESTIGE_HTTP_BIND").unwrap_or_else(|_| "127.0.0.1".to_string()); eprintln!("Vestige HTTP transport: http://{}:{}/mcp", bind, http_port); - eprintln!("Auth token: {}...", &token[..8]); + eprintln!("Auth token: {}...", &token[..token.len().min(8)]); tokio::spawn(async move { if let Err(e) = protocol::http::start_http_transport( http_storage, diff --git a/crates/vestige-mcp/src/protocol/http.rs b/crates/vestige-mcp/src/protocol/http.rs index b02c0d8..d5369a2 100644 --- a/crates/vestige-mcp/src/protocol/http.rs +++ b/crates/vestige-mcp/src/protocol/http.rs @@ -108,7 +108,20 @@ pub async fn start_http_transport( ServiceBuilder::new() .layer(DefaultBodyLimit::max(MAX_BODY_SIZE)) .layer(ConcurrencyLimitLayer::new(CONCURRENCY_LIMIT)) - .layer(CorsLayer::permissive()), + .layer( + CorsLayer::new() + .allow_origin( + [ + format!("http://127.0.0.1:{}", port), + format!("http://localhost:{}", port), + ] + .into_iter() + .filter_map(|s| s.parse().ok()) + .collect::>(), + ) + .allow_methods([axum::http::Method::POST, axum::http::Method::DELETE, axum::http::Method::OPTIONS]) + .allow_headers([axum::http::header::CONTENT_TYPE, axum::http::header::AUTHORIZATION]) + ), ) .with_state(state); @@ -229,13 +242,13 @@ async fn post_mcp( match response { Some(resp) => { let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap()); + resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); (StatusCode::OK, resp_headers, Json(resp)).into_response() } None => { // Notifications return 202 let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap()); + resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); (StatusCode::ACCEPTED, resp_headers).into_response() } } @@ -275,7 +288,7 @@ async fn post_mcp( }; let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap()); + resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); match response { Some(resp) => (StatusCode::OK, resp_headers, Json(resp)).into_response(), diff --git a/crates/vestige-mcp/src/resources/memory.rs b/crates/vestige-mcp/src/resources/memory.rs index 1f3c696..1c52dd7 100644 --- a/crates/vestige-mcp/src/resources/memory.rs +++ b/crates/vestige-mcp/src/resources/memory.rs @@ -95,7 +95,7 @@ async fn read_recent(storage: &Arc, limit: i32) -> Result 200 { - format!("{}...", &n.content[..200]) + format!("{}...", &n.content[..n.content.floor_char_boundary(200)]) } else { n.content.clone() }, @@ -139,7 +139,7 @@ async fn read_decaying(storage: &Arc) -> Result { serde_json::json!({ "id": n.id, "summary": if n.content.len() > 200 { - format!("{}...", &n.content[..200]) + format!("{}...", &n.content[..n.content.floor_char_boundary(200)]) } else { n.content.clone() }, @@ -180,7 +180,7 @@ async fn read_due(storage: &Arc) -> Result { serde_json::json!({ "id": n.id, "summary": if n.content.len() > 200 { - format!("{}...", &n.content[..200]) + format!("{}...", &n.content[..n.content.floor_char_boundary(200)]) } else { n.content.clone() }, diff --git a/crates/vestige-mcp/src/server.rs b/crates/vestige-mcp/src/server.rs index 496d814..b2c30ce 100644 --- a/crates/vestige-mcp/src/server.rs +++ b/crates/vestige-mcp/src/server.rs @@ -159,7 +159,7 @@ impl McpServer { /// Handle tools/list request async fn handle_tools_list(&self) -> Result { - // v1.8: 19 tools. Deprecated tools still work via redirects in handle_tools_call. + // v2.0.4: 23 tools. Deprecated tools still work via redirects in handle_tools_call. let tools = vec![ // ================================================================ // UNIFIED TOOLS (v1.1+) @@ -293,6 +293,19 @@ impl McpServer { description: Some("Subgraph export for visualization. Input: center_id or query, depth (1-3), max_nodes. Returns nodes with force-directed layout positions and edges with weights. Powers memory graph visualization.".to_string()), input_schema: tools::graph::schema(), }, + // ================================================================ + // DEEP REFERENCE (v2.0.4+) — replaces cross_reference + // ================================================================ + ToolDescription { + name: "deep_reference".to_string(), + description: Some("Deep cognitive reasoning across memories. Combines FSRS-6 trust scoring, spreading activation, temporal supersession, dream insights, and contradiction analysis to build a complete understanding of a topic. Returns trust-scored evidence, fact evolution timeline, and a recommended answer. Use this when accuracy matters.".to_string()), + input_schema: tools::cross_reference::schema(), + }, + ToolDescription { + name: "cross_reference".to_string(), + description: Some("Alias for deep_reference. Connect the dots across memories with cognitive reasoning.".to_string()), + input_schema: tools::cross_reference::schema(), + }, ]; let result = ListToolsResult { tools }; @@ -644,6 +657,7 @@ impl McpServer { // ================================================================ "memory_health" => tools::health::execute(&self.storage, request.arguments).await, "memory_graph" => tools::graph::execute(&self.storage, request.arguments).await, + "deep_reference" | "cross_reference" => tools::cross_reference::execute(&self.storage, &self.cognitive, request.arguments).await, name => { return Err(JsonRpcError::method_not_found_with_message(&format!( @@ -1187,8 +1201,8 @@ mod tests { let result = response.result.unwrap(); let tools = result["tools"].as_array().unwrap(); - // v1.9: 21 tools (4 unified + 1 core + 2 temporal + 5 maintenance + 2 auto-save + 3 cognitive + 1 restore + 1 session_context + 2 autonomic) - assert_eq!(tools.len(), 21, "Expected exactly 21 tools in v1.9+"); + // v2.0.4: 23 tools (4 unified + 1 core + 2 temporal + 5 maintenance + 2 auto-save + 3 cognitive + 1 restore + 1 session_context + 2 autonomic + 1 deep_reference + 1 cross_reference alias) + assert_eq!(tools.len(), 23, "Expected exactly 23 tools in v2.0.4+"); let tool_names: Vec<&str> = tools .iter() @@ -1239,6 +1253,10 @@ mod tests { // Autonomic tools (v1.9) assert!(tool_names.contains(&"memory_health")); assert!(tool_names.contains(&"memory_graph")); + + // Deep reference + cross_reference alias (v2.0.4) + assert!(tool_names.contains(&"deep_reference")); + assert!(tool_names.contains(&"cross_reference")); } #[tokio::test] diff --git a/crates/vestige-mcp/src/tools/changelog.rs b/crates/vestige-mcp/src/tools/changelog.rs index e98adef..f615acb 100644 --- a/crates/vestige-mcp/src/tools/changelog.rs +++ b/crates/vestige-mcp/src/tools/changelog.rs @@ -140,6 +140,11 @@ fn execute_system_wide( .get_recent_state_transitions(limit) .map_err(|e| e.to_string())?; + // Get dream history (Bug #9 fix — dreams were invisible to audit trail) + let dreams = storage + .get_dream_history(limit) + .unwrap_or_default(); + // Build unified event list let mut events: Vec<(DateTime, Value)> = Vec::new(); @@ -174,6 +179,20 @@ fn execute_system_wide( )); } + for d in &dreams { + events.push(( + d.dreamed_at, + serde_json::json!({ + "type": "dream", + "timestamp": d.dreamed_at.to_rfc3339(), + "durationMs": d.duration_ms, + "memoriesReplayed": d.memories_replayed, + "connectionFound": d.connections_found, + "insightsGenerated": d.insights_generated, + }), + )); + } + // Sort by timestamp descending events.sort_by(|a, b| b.0.cmp(&a.0)); diff --git a/crates/vestige-mcp/src/tools/cross_reference.rs b/crates/vestige-mcp/src/tools/cross_reference.rs new file mode 100644 index 0000000..9327be7 --- /dev/null +++ b/crates/vestige-mcp/src/tools/cross_reference.rs @@ -0,0 +1,809 @@ +//! Deep Reference Tool (v2.0.4) +//! +//! Cognitive reasoning engine across memories. Combines: +//! 1. Broad retrieval (hybrid search + reranking) +//! 2. Spreading activation expansion (connected memories) +//! 3. FSRS-6 trust scoring (retention, stability, reps, lapses) +//! 4. Temporal supersession (newer = current truth) +//! 5. Contradiction analysis (trust-weighted) +//! 6. Dream insight integration (persisted insights) +//! 7. Structured synthesis (recommended answer + evidence) +//! +//! Research grounding: MAGMA (multi-graph), Kumiho (AGM belief revision), +//! InfMem (System-2 memory control), D-Mem (dual-process retrieval). +//! +//! Replaces cross_reference with full cognitive reasoning. cross_reference +//! is kept as a backward-compatible alias. + +use chrono::Utc; +use serde::Deserialize; +use serde_json::Value; +use std::sync::Arc; +use tokio::sync::Mutex; + +use crate::cognitive::CognitiveEngine; +use vestige_core::Storage; + +/// Input schema for deep_reference / cross_reference tool +pub fn schema() -> Value { + serde_json::json!({ + "type": "object", + "properties": { + "query": { + "type": "string", + "description": "The question, claim, or topic to reason about across all memories" + }, + "depth": { + "type": "integer", + "description": "How many memories to analyze (default: 20, max: 50). Higher = more thorough.", + "default": 20, + "minimum": 5, + "maximum": 50 + } + }, + "required": ["query"] + }) +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +struct DeepRefArgs { + query: String, + depth: Option, +} + +// ============================================================================ +// FSRS-6 Trust Score +// ============================================================================ + +/// Compute trust score from FSRS-6 memory state. +/// Higher = more trustworthy (frequently accessed, high retention, stable, few lapses). +fn compute_trust(retention: f64, stability: f64, reps: i32, lapses: i32) -> f64 { + let retention_factor = retention * 0.4; + let stability_factor = (stability / 30.0).min(1.0) * 0.2; + let reps_factor = (reps as f64 / 10.0).min(1.0) * 0.2; + let lapses_penalty = (1.0 - (lapses as f64 / 5.0)).max(0.0) * 0.2; + (retention_factor + stability_factor + reps_factor + lapses_penalty).clamp(0.0, 1.0) +} + +// ============================================================================ +// SYSTEM 1: Intent Classification (MAGMA-inspired query routing) +// ============================================================================ + +#[derive(Debug, Clone, PartialEq)] +enum QueryIntent { + FactCheck, // "Is X true?" → find support/contradiction evidence + Timeline, // "When did X happen?" → temporal ordering + pattern detection + RootCause, // "Why did X happen?" → causal chain backward + Comparison, // "How does X differ from Y?" → diff two memory clusters + Synthesis, // Default: "What do I know about X?" → cluster + best per cluster +} + +fn classify_intent(query: &str) -> QueryIntent { + let q = query.to_lowercase(); + let patterns: &[(QueryIntent, &[&str])] = &[ + (QueryIntent::RootCause, &["why did", "root cause", "what caused", "because of", "reason for", "why is", "why was"]), + (QueryIntent::Timeline, &["when did", "timeline", "history of", "over time", "how has", "evolution of", "sequence of"]), + (QueryIntent::Comparison, &["differ", "compare", "versus", " vs ", "difference between", "changed from"]), + (QueryIntent::FactCheck, &["is it true", "did i", "was there", "verify", "confirm", "is this correct", "should i use", "should we"]), + ]; + for (intent, keywords) in patterns { + if keywords.iter().any(|kw| q.contains(kw)) { + return intent.clone(); + } + } + QueryIntent::Synthesis +} + +// ============================================================================ +// SYSTEM 2: Relation Assessment (embedding similarity + sentiment + temporal) +// ============================================================================ + +#[derive(Debug, Clone)] +enum Relation { + Supports, + Contradicts, + Supersedes, + Irrelevant, +} + +#[derive(Debug, Clone)] +#[allow(dead_code)] +struct RelationAssessment { + relation: Relation, + confidence: f64, + reasoning: String, +} + +/// Assess the relationship between two memories using embedding similarity, +/// correction signals, temporal ordering, and trust comparison. +/// No LLM needed — pure algorithmic assessment. +fn assess_relation(a_content: &str, b_content: &str, a_trust: f64, b_trust: f64, + a_date: chrono::DateTime, b_date: chrono::DateTime, + topic_sim: f32) -> RelationAssessment { + // Irrelevant: different topics + if topic_sim < 0.15 { + return RelationAssessment { + relation: Relation::Irrelevant, + confidence: 1.0 - topic_sim as f64, + reasoning: format!("Different topics (similarity {:.2})", topic_sim), + }; + } + + let time_delta_days = (b_date - a_date).num_days().abs(); + let trust_diff = b_trust - a_trust; + let has_correction = appears_contradictory(a_content, b_content); + + // Supersession: same topic + newer + higher trust + if topic_sim > 0.4 && time_delta_days > 0 && trust_diff > 0.05 && !has_correction { + let (newer, older) = if b_date > a_date { ("B", "A") } else { ("A", "B") }; + return RelationAssessment { + relation: Relation::Supersedes, + confidence: topic_sim as f64 * (0.5 + trust_diff.min(0.5)), + reasoning: format!("{} supersedes {} (newer by {}d, trust +{:.0}%)", + newer, older, time_delta_days, trust_diff * 100.0), + }; + } + + // Contradiction: same topic + correction signals detected + if has_correction && topic_sim > 0.15 { + return RelationAssessment { + relation: Relation::Contradicts, + confidence: topic_sim as f64 * 0.8, + reasoning: format!("Contradiction detected (similarity {:.2}, correction signals present)", topic_sim), + }; + } + + // Support: same topic + no contradiction + if topic_sim > 0.3 { + return RelationAssessment { + relation: Relation::Supports, + confidence: topic_sim as f64, + reasoning: format!("Topically aligned (similarity {:.2}), consistent stance", topic_sim), + }; + } + + RelationAssessment { + relation: Relation::Irrelevant, + confidence: 0.3, + reasoning: "Weak relationship".to_string(), + } +} + +// ============================================================================ +// SYSTEM 3: Template Reasoning Chain Generator (no LLM needed) +// ============================================================================ + +/// Generate a natural language reasoning chain from structured evidence. +/// The AI reads this and validates/extends it — System 1 prepares, System 2 refines. +fn generate_reasoning_chain( + query: &str, + intent: &QueryIntent, + primary: &ScoredMemory, + relations: &[(String, f64, RelationAssessment)], // (preview, trust, relation) + confidence: f64, +) -> String { + let mut chain = String::new(); + + // Intent-specific opening + match intent { + QueryIntent::FactCheck => { + chain.push_str(&format!( + "FACT CHECK: \"{}\"\n\n", query + )); + } + QueryIntent::Timeline => { + chain.push_str(&format!( + "TIMELINE: \"{}\"\n\n", query + )); + } + QueryIntent::RootCause => { + chain.push_str(&format!( + "ROOT CAUSE ANALYSIS: \"{}\"\n\n", query + )); + } + QueryIntent::Comparison => { + chain.push_str(&format!( + "COMPARISON: \"{}\"\n\n", query + )); + } + QueryIntent::Synthesis => { + chain.push_str(&format!( + "SYNTHESIS: \"{}\"\n\n", query + )); + } + } + + // Primary finding + chain.push_str(&format!( + "PRIMARY FINDING (trust {:.0}%, {}): {}\n", + primary.trust * 100.0, + primary.updated_at.format("%b %d, %Y"), + primary.content.chars().take(150).collect::(), + )); + + // Superseded memories + let superseded: Vec<_> = relations.iter() + .filter(|(_, _, r)| matches!(r.relation, Relation::Supersedes)) + .collect(); + for (preview, trust, rel) in &superseded { + chain.push_str(&format!( + " SUPERSEDES (trust {:.0}%): \"{}\" — {}\n", + trust * 100.0, + preview.chars().take(80).collect::(), + rel.reasoning, + )); + } + + // Supporting evidence + let supporting: Vec<_> = relations.iter() + .filter(|(_, _, r)| matches!(r.relation, Relation::Supports)) + .collect(); + if !supporting.is_empty() { + chain.push_str(&format!("\nSUPPORTED BY {} MEMOR{}:\n", + supporting.len(), + if supporting.len() == 1 { "Y" } else { "IES" }, + )); + for (preview, trust, _) in supporting.iter().take(5) { + chain.push_str(&format!( + " + (trust {:.0}%): \"{}\"\n", + trust * 100.0, + preview.chars().take(80).collect::(), + )); + } + } + + // Contradicting evidence + let contradicting: Vec<_> = relations.iter() + .filter(|(_, _, r)| matches!(r.relation, Relation::Contradicts)) + .collect(); + if !contradicting.is_empty() { + chain.push_str(&format!("\nCONTRADICTING EVIDENCE ({}):\n", contradicting.len())); + for (preview, trust, rel) in contradicting.iter().take(3) { + chain.push_str(&format!( + " ! (trust {:.0}%): \"{}\" — {}\n", + trust * 100.0, + preview.chars().take(80).collect::(), + rel.reasoning, + )); + } + } + + // Confidence summary + chain.push_str(&format!("\nOVERALL CONFIDENCE: {:.0}%\n", confidence * 100.0)); + + chain +} + +// ============================================================================ +// Contradiction Detection (enhanced with relation assessment) +// ============================================================================ + +const NEGATION_PAIRS: &[(&str, &str)] = &[ + ("don't", "do"), ("never", "always"), ("avoid", "use"), + ("wrong", "right"), ("incorrect", "correct"), + ("deprecated", "recommended"), ("outdated", "current"), + ("removed", "added"), ("disabled", "enabled"), + ("not ", ""), ("no longer", ""), +]; + +const CORRECTION_SIGNALS: &[&str] = &[ + "actually", "correction", "update:", "updated:", "fixed", + "was wrong", "changed to", "now uses", "replaced by", + "superseded", "no longer", "instead of", "switched to", "migrated to", +]; + +fn appears_contradictory(a: &str, b: &str) -> bool { + let a_lower = a.to_lowercase(); + let b_lower = b.to_lowercase(); + + let a_words: std::collections::HashSet<&str> = a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let b_words: std::collections::HashSet<&str> = b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let shared_words = a_words.intersection(&b_words).count(); + + if shared_words < 2 { return false; } + + for (neg, _) in NEGATION_PAIRS { + if (a_lower.contains(neg) && !b_lower.contains(neg)) + || (b_lower.contains(neg) && !a_lower.contains(neg)) + { return true; } + } + for signal in CORRECTION_SIGNALS { + if a_lower.contains(signal) || b_lower.contains(signal) { return true; } + } + false +} + +fn topic_overlap(a: &str, b: &str) -> f32 { + let a_lower = a.to_lowercase(); + let b_lower = b.to_lowercase(); + let a_words: std::collections::HashSet<&str> = a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let b_words: std::collections::HashSet<&str> = b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + if a_words.is_empty() || b_words.is_empty() { return 0.0; } + let intersection = a_words.intersection(&b_words).count(); + let union = a_words.union(&b_words).count(); + if union == 0 { 0.0 } else { intersection as f32 / union as f32 } +} + +// ============================================================================ +// Scored Memory (used across pipeline stages) +// ============================================================================ + +#[allow(dead_code)] +struct ScoredMemory { + id: String, + content: String, + tags: Vec, + trust: f64, + updated_at: chrono::DateTime, + created_at: chrono::DateTime, + retention: f64, + combined_score: f32, +} + +// ============================================================================ +// Main Execute — 8-Stage Pipeline +// ============================================================================ + +pub async fn execute( + storage: &Arc, + cognitive: &Arc>, + args: Option, +) -> Result { + let args: DeepRefArgs = match args { + Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, + None => return Err("Missing arguments".to_string()), + }; + + if args.query.trim().is_empty() { + return Err("Query cannot be empty".to_string()); + } + + let depth = args.depth.unwrap_or(20).clamp(5, 50) as usize; + + // ==================================================================== + // STAGE 0: Intent Classification (MAGMA-inspired query routing) + // ==================================================================== + let intent = classify_intent(&args.query); + + // ==================================================================== + // STAGE 1: Broad Retrieval + Reranking + // ==================================================================== + let results = storage + .hybrid_search(&args.query, depth as i32, 0.3, 0.7) + .map_err(|e| e.to_string())?; + + if results.is_empty() { + return Ok(serde_json::json!({ + "query": args.query, + "status": "no_memories", + "confidence": 0.0, + "guidance": "No memories found. Use smart_ingest to add memories.", + "memoriesAnalyzed": 0, + })); + } + + let mut ranked = results; + if let Ok(mut cog) = cognitive.try_lock() { + let candidates: Vec<_> = ranked.iter().map(|r| (r.clone(), r.node.content.clone())).collect(); + if let Ok(reranked) = cog.reranker.rerank(&args.query, candidates, Some(depth)) { + ranked = reranked.into_iter().map(|rr| rr.item).collect(); + } + } + + // ==================================================================== + // STAGE 2: Spreading Activation Expansion + // ==================================================================== + let mut activation_expanded = 0usize; + let existing_ids: std::collections::HashSet = ranked.iter().map(|r| r.node.id.clone()).collect(); + + if let Ok(mut cog) = cognitive.try_lock() { + let mut expanded_ids = Vec::new(); + for r in ranked.iter().take(3) { + let activated = cog.activation_network.activate(&r.node.id, 1.0); + for a in activated.iter().take(3) { + if !existing_ids.contains(&a.memory_id) && !expanded_ids.contains(&a.memory_id) { + expanded_ids.push(a.memory_id.clone()); + } + } + } + // Fetch expanded memories from storage + for id in &expanded_ids { + if let Ok(Some(node)) = storage.get_node(id) { + // Create a minimal SearchResult-like entry + ranked.push(vestige_core::SearchResult { + node, + combined_score: 0.3, // lower score since these are expanded, not direct matches + keyword_score: None, + semantic_score: None, + match_type: vestige_core::MatchType::Semantic, + }); + activation_expanded += 1; + } + } + } + + // ==================================================================== + // STAGE 3: FSRS-6 Trust Scoring + // ==================================================================== + + let scored: Vec = ranked.iter().map(|r| { + let trust = compute_trust( + r.node.retention_strength, + r.node.stability, + r.node.reps, + r.node.lapses, + ); + ScoredMemory { + id: r.node.id.clone(), + content: r.node.content.clone(), + tags: r.node.tags.clone(), + trust, + updated_at: r.node.updated_at, + created_at: r.node.created_at, + retention: r.node.retention_strength, + combined_score: r.combined_score, + } + }).collect(); + + // ==================================================================== + // STAGE 4: Temporal Supersession + // ==================================================================== + let mut superseded: Vec = Vec::new(); + let mut superseded_ids: std::collections::HashSet = std::collections::HashSet::new(); + + // Sort by date descending for supersession + let mut by_date = scored.iter().collect::>(); + by_date.sort_by(|a, b| b.updated_at.cmp(&a.updated_at)); + + for i in 0..by_date.len() { + for j in (i + 1)..by_date.len() { + let newer = by_date[i]; + let older = by_date[j]; + let overlap = topic_overlap(&newer.content, &older.content); + if overlap > 0.3 && newer.trust > older.trust && !superseded_ids.contains(&older.id) { + superseded_ids.insert(older.id.clone()); + superseded.push(serde_json::json!({ + "id": older.id, + "preview": older.content.chars().take(150).collect::(), + "trust": (older.trust * 100.0).round() / 100.0, + "date": older.updated_at.to_rfc3339(), + "superseded_by": newer.id, + })); + } + } + } + + // ==================================================================== + // STAGE 5: Trust-Weighted Contradiction Analysis + // ==================================================================== + let mut contradictions: Vec = Vec::new(); + + for i in 0..scored.len() { + for j in (i + 1)..scored.len() { + let a = &scored[i]; + let b = &scored[j]; + let overlap = topic_overlap(&a.content, &b.content); + if overlap < 0.15 { continue; } + + let is_contradiction = appears_contradictory(&a.content, &b.content); + if !is_contradiction { continue; } + + // Only flag as real contradiction if BOTH have decent trust + let min_trust = a.trust.min(b.trust); + if min_trust < 0.3 { continue; } // Low-trust memory isn't worth flagging + + let (stronger, weaker) = if a.trust >= b.trust { (a, b) } else { (b, a) }; + contradictions.push(serde_json::json!({ + "stronger": { + "id": stronger.id, + "preview": stronger.content.chars().take(150).collect::(), + "trust": (stronger.trust * 100.0).round() / 100.0, + "date": stronger.updated_at.to_rfc3339(), + }, + "weaker": { + "id": weaker.id, + "preview": weaker.content.chars().take(150).collect::(), + "trust": (weaker.trust * 100.0).round() / 100.0, + "date": weaker.updated_at.to_rfc3339(), + }, + "topic_overlap": overlap, + })); + } + } + + // ==================================================================== + // STAGE 6: Dream Insight Integration + // ==================================================================== + let mut related_insights: Vec = Vec::new(); + if let Ok(insights) = storage.get_insights(20) { + let memory_ids: std::collections::HashSet<&str> = scored.iter().map(|s| s.id.as_str()).collect(); + for insight in insights { + let overlaps = insight.source_memories.iter() + .any(|src_id| memory_ids.contains(src_id.as_str())); + if overlaps { + related_insights.push(serde_json::json!({ + "insight": insight.insight, + "type": insight.insight_type, + "confidence": insight.confidence, + "source_memories": insight.source_memories, + })); + } + } + } + + // ==================================================================== + // STAGE 7: Relation Assessment (per-pair, using trust + temporal + similarity) + // ==================================================================== + let mut pair_relations: Vec<(String, f64, RelationAssessment)> = Vec::new(); + if let Some(primary) = scored.iter() + .filter(|s| !superseded_ids.contains(&s.id)) + .max_by(|a, b| a.trust.partial_cmp(&b.trust).unwrap_or(std::cmp::Ordering::Equal)) + { + for other in scored.iter().filter(|s| s.id != primary.id).take(15) { + let sim = topic_overlap(&primary.content, &other.content); + let rel = assess_relation( + &primary.content, &other.content, + primary.trust, other.trust, + primary.updated_at, other.updated_at, + sim, + ); + if !matches!(rel.relation, Relation::Irrelevant) { + pair_relations.push(( + other.content.chars().take(100).collect(), + other.trust, + rel, + )); + } + } + } + + // ==================================================================== + // STAGE 8: Synthesis + Reasoning Chain Generation + // ==================================================================== + // Find the recommended answer: highest trust, not superseded, most recent + let recommended = scored.iter() + .filter(|s| !superseded_ids.contains(&s.id)) + .max_by(|a, b| { + // Primary: trust. Secondary: date. + a.trust.partial_cmp(&b.trust) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| a.updated_at.cmp(&b.updated_at)) + }); + + // Build evidence list (top memories by trust, not superseded) + let mut non_superseded: Vec<&ScoredMemory> = scored.iter() + .filter(|s| !superseded_ids.contains(&s.id)) + .collect(); + non_superseded.sort_by(|a, b| b.trust.partial_cmp(&a.trust).unwrap_or(std::cmp::Ordering::Equal)); + let evidence: Vec = non_superseded.iter() + .take(10) + .enumerate() + .map(|(i, s)| serde_json::json!({ + "id": s.id, + "preview": s.content.chars().take(200).collect::(), + "trust": (s.trust * 100.0).round() / 100.0, + "date": s.updated_at.to_rfc3339(), + "role": if i == 0 { "primary" } else { "supporting" }, + })) + .collect(); + + // Build evolution timeline + let mut evolution: Vec = by_date.iter().rev() + .map(|s| serde_json::json!({ + "date": s.updated_at.format("%b %d, %Y").to_string(), + "preview": s.content.chars().take(100).collect::(), + "trust": (s.trust * 100.0).round() / 100.0, + })) + .collect(); + evolution.truncate(15); // cap timeline length + + // Confidence scoring + let base_confidence = recommended.map(|r| r.trust).unwrap_or(0.0); + let agreement_boost = (evidence.len() as f64 * 0.03).min(0.2); + let contradiction_penalty = contradictions.len() as f64 * 0.1; + let confidence = (base_confidence + agreement_boost - contradiction_penalty).clamp(0.0, 1.0); + + let status = if contradictions.is_empty() && confidence > 0.7 { + "resolved" + } else if !contradictions.is_empty() { + "contradictions_found" + } else if scored.is_empty() { + "no_evidence" + } else { + "partial_evidence" + }; + + let guidance = if let Some(rec) = recommended { + if contradictions.is_empty() { + format!( + "High confidence ({:.0}%). Recommended memory (trust {:.0}%, {}) is the most reliable source.", + confidence * 100.0, rec.trust * 100.0, rec.updated_at.format("%b %d, %Y") + ) + } else { + format!( + "WARNING: {} contradiction(s) detected. Recommended memory has trust {:.0}% but conflicts exist. Review contradictions below.", + contradictions.len(), rec.trust * 100.0 + ) + } + } else { + "No strong evidence found. Verify with external sources.".to_string() + }; + + // Auto-strengthen accessed memories (Testing Effect) + let ids: Vec<&str> = scored.iter().map(|s| s.id.as_str()).collect(); + let _ = storage.strengthen_batch_on_access(&ids); + + // Generate reasoning chain (the key differentiator — no LLM needed) + let reasoning_chain = if let Some(rec) = recommended { + generate_reasoning_chain(&args.query, &intent, rec, &pair_relations, confidence) + } else { + "No strong evidence found for reasoning.".to_string() + }; + + // Build response + let mut response = serde_json::json!({ + "query": args.query, + "intent": format!("{:?}", intent), + "status": status, + "confidence": (confidence * 100.0).round() / 100.0, + "reasoning": reasoning_chain, + "guidance": guidance, + "memoriesAnalyzed": scored.len(), + "activationExpanded": activation_expanded, + }); + + if let Some(rec) = recommended { + response["recommended"] = serde_json::json!({ + "answer_preview": rec.content.chars().take(300).collect::(), + "memory_id": rec.id, + "trust_score": (rec.trust * 100.0).round() / 100.0, + "date": rec.updated_at.to_rfc3339(), + }); + } + + if !evidence.is_empty() { response["evidence"] = serde_json::json!(evidence); } + if !contradictions.is_empty() { response["contradictions"] = serde_json::json!(contradictions); } + if !superseded.is_empty() { response["superseded"] = serde_json::json!(superseded); } + if !evolution.is_empty() { response["evolution"] = serde_json::json!(evolution); } + if !related_insights.is_empty() { response["related_insights"] = serde_json::json!(related_insights); } + + Ok(response) +} + +// ============================================================================ +// TESTS +// ============================================================================ + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_schema_structure() { + let s = schema(); + assert!(s["properties"]["query"].is_object()); + assert!(s["properties"]["depth"].is_object()); + assert_eq!(s["required"], serde_json::json!(["query"])); + } + + #[test] + fn test_trust_score_high() { + // High retention, high stability, many reps, no lapses → high trust + let trust = compute_trust(0.95, 60.0, 20, 0); + assert!(trust > 0.8, "Expected >0.8, got {}", trust); + } + + #[test] + fn test_trust_score_low() { + // Low retention, low stability, few reps, many lapses → low trust + let trust = compute_trust(0.2, 1.0, 1, 10); + assert!(trust < 0.3, "Expected <0.3, got {}", trust); + } + + #[test] + fn test_trust_score_medium() { + // Medium everything + let trust = compute_trust(0.6, 15.0, 5, 2); + assert!(trust > 0.4 && trust < 0.7, "Expected 0.4-0.7, got {}", trust); + } + + #[test] + fn test_trust_score_clamped() { + // Even extreme values stay in [0, 1] + assert!(compute_trust(1.0, 1000.0, 100, 0) <= 1.0); + assert!(compute_trust(0.0, 0.0, 0, 100) >= 0.0); + } + + #[test] + fn test_contradiction_requires_shared_words() { + assert!(!appears_contradictory("not sure about weather", "Rust is fast")); + } + + #[test] + fn test_contradiction_with_shared_context() { + assert!(appears_contradictory( + "Don't use FAISS for vector search in production", + "Use FAISS for vector search in production always" + )); + } + + #[test] + fn test_topic_overlap_similar() { + let overlap = topic_overlap("Vestige uses USearch for vector search", "Vestige vector search powered by USearch HNSW"); + assert!(overlap > 0.3); + } + + #[test] + fn test_topic_overlap_different() { + let overlap = topic_overlap("The weather is sunny today", "Rust compile times improving"); + assert!(overlap < 0.15); + } + + #[test] + fn test_depth_clamped() { + let s = schema(); + assert_eq!(s["properties"]["depth"]["minimum"], 5); + assert_eq!(s["properties"]["depth"]["maximum"], 50); + } + + // === Intent Classification Tests === + + #[test] + fn test_intent_fact_check() { + assert_eq!(classify_intent("Is it true that Vestige uses USearch?"), QueryIntent::FactCheck); + assert_eq!(classify_intent("Did I switch to port 3002?"), QueryIntent::FactCheck); + assert_eq!(classify_intent("Should I use prefix caching?"), QueryIntent::FactCheck); + } + + #[test] + fn test_intent_timeline() { + assert_eq!(classify_intent("When did the port change happen?"), QueryIntent::Timeline); + assert_eq!(classify_intent("How has the AIMO3 score evolved over time?"), QueryIntent::Timeline); + } + + #[test] + fn test_intent_root_cause() { + assert_eq!(classify_intent("Why did the build fail?"), QueryIntent::RootCause); + assert_eq!(classify_intent("What caused the score regression?"), QueryIntent::RootCause); + } + + #[test] + fn test_intent_comparison() { + assert_eq!(classify_intent("How does USearch differ from FAISS?"), QueryIntent::Comparison); + assert_eq!(classify_intent("Compare FSRS versus SM-2"), QueryIntent::Comparison); + } + + #[test] + fn test_intent_synthesis_default() { + assert_eq!(classify_intent("Tell me about Sam's projects"), QueryIntent::Synthesis); + assert_eq!(classify_intent("What is Vestige?"), QueryIntent::Synthesis); + } + + // === Relation Assessment Tests === + + #[test] + fn test_relation_irrelevant() { + let rel = assess_relation("Rust is fast", "The weather is nice", 0.8, 0.8, + Utc::now(), Utc::now(), 0.05); + assert!(matches!(rel.relation, Relation::Irrelevant)); + } + + #[test] + fn test_relation_supports() { + let rel = assess_relation( + "Vestige uses USearch for vector search", + "USearch provides fast HNSW indexing for Vestige", + 0.8, 0.7, Utc::now(), Utc::now(), 0.6); + assert!(matches!(rel.relation, Relation::Supports)); + } + + #[test] + fn test_relation_contradicts() { + let rel = assess_relation( + "Don't use FAISS for vector search in production anymore", + "Use FAISS for vector search in production always", + 0.8, 0.5, Utc::now(), Utc::now(), 0.7); + assert!(matches!(rel.relation, Relation::Contradicts)); + } +} diff --git a/crates/vestige-mcp/src/tools/dedup.rs b/crates/vestige-mcp/src/tools/dedup.rs index c982091..7985bd5 100644 --- a/crates/vestige-mcp/src/tools/dedup.rs +++ b/crates/vestige-mcp/src/tools/dedup.rs @@ -45,6 +45,7 @@ pub fn schema() -> Value { #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] struct DedupArgs { + #[serde(alias = "similarity_threshold")] similarity_threshold: Option, limit: Option, tags: Option>, diff --git a/crates/vestige-mcp/src/tools/dream.rs b/crates/vestige-mcp/src/tools/dream.rs index f84f8d5..253a367 100644 --- a/crates/vestige-mcp/src/tools/dream.rs +++ b/crates/vestige-mcp/src/tools/dream.rs @@ -6,7 +6,7 @@ use tokio::sync::Mutex; use chrono::Utc; use crate::cognitive::CognitiveEngine; -use vestige_core::{DreamHistoryRecord, LinkType, Storage}; +use vestige_core::{DreamHistoryRecord, InsightRecord, LinkType, Storage}; pub fn schema() -> serde_json::Value { serde_json::json!({ @@ -30,7 +30,8 @@ pub async fn execute( .as_ref() .and_then(|a| a.get("memory_count")) .and_then(|v| v.as_u64()) - .unwrap_or(50) as usize; + .unwrap_or(50) + .min(500) as usize; // Cap at 500 to prevent O(N^2) hang // v1.9.0: Waking SWR tagging — preferential replay of tagged memories (70/30 split) let tagged_nodes = storage.get_waking_tagged_memories(memory_count as i32) @@ -94,8 +95,28 @@ pub async fn execute( let all_connections = cog.dreamer.get_connections(); drop(cog); + // v2.1.0: Persist dream insights to database (Bug #4 fix) + let mut insights_persisted = 0u64; + for insight in &insights { + let record = InsightRecord { + id: insight.id.clone(), + insight: insight.insight.clone(), + source_memories: insight.source_memories.clone(), + confidence: insight.confidence, + novelty_score: insight.novelty_score, + insight_type: format!("{:?}", insight.insight_type), + generated_at: insight.generated_at, + tags: insight.tags.clone(), + feedback: None, + applied_count: 0, + }; + if storage.save_insight(&record).is_ok() { + insights_persisted += 1; + } + } + // v1.9.0: Persist only NEW connections from this dream (skip accumulated ones) - let new_connections = &all_connections[pre_dream_count..]; + let new_connections = all_connections.get(pre_dream_count..).unwrap_or(&[]); let mut connections_persisted = 0u64; { let now = Utc::now(); @@ -197,9 +218,11 @@ pub async fn execute( "novelty_score": i.novelty_score, })).collect::>(), "connectionsPersisted": connections_persisted, + "insightsPersisted": insights_persisted, "stats": { "new_connections_found": dream_result.new_connections_found, "connections_persisted": connections_persisted, + "insights_persisted": insights_persisted, "memories_strengthened": dream_result.memories_strengthened, "memories_compressed": dream_result.memories_compressed, "insights_generated": dream_result.insights_generated.len(), @@ -532,4 +555,55 @@ mod tests { persisted ); } + + #[tokio::test] + async fn test_dream_persists_insights() { + let (storage, _dir) = test_storage().await; + + // Create diverse tagged memories to encourage insight generation + let topics = [ + ("Rust borrow checker prevents data races", vec!["rust", "safety"]), + ("Rust ownership model ensures memory safety", vec!["rust", "safety"]), + ("Cargo manages Rust project dependencies", vec!["rust", "cargo"]), + ("Cargo.toml defines project configuration", vec!["rust", "cargo"]), + ("Unit tests use the #[test] attribute", vec!["rust", "testing"]), + ("Integration tests live in the tests directory", vec!["rust", "testing"]), + ("Clippy catches common Rust mistakes", vec!["rust", "tooling"]), + ("Rustfmt automatically formats code", vec!["rust", "tooling"]), + ]; + for (content, tags) in &topics { + storage.ingest(vestige_core::IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, + tags: tags.iter().map(|t| t.to_string()).collect(), + valid_from: None, valid_until: None, + }).unwrap(); + } + + let result = execute(&storage, &test_cognitive(), None).await.unwrap(); + assert_eq!(result["status"], "dreamed"); + + let response_insights = result["insights"].as_array().unwrap(); + let persisted_count = result["insightsPersisted"].as_u64().unwrap_or(0); + + // If insights were generated, they should be persisted + if !response_insights.is_empty() { + assert!(persisted_count > 0, "Generated insights should be persisted to database"); + let stored = storage.get_insights(100).unwrap(); + assert_eq!( + stored.len(), persisted_count as usize, + "All {} persisted insights should be retrievable", persisted_count + ); + // Verify insight fields + for insight in &stored { + assert!(!insight.id.is_empty(), "Insight ID should not be empty"); + assert!(!insight.insight.is_empty(), "Insight text should not be empty"); + assert!(insight.confidence >= 0.0 && insight.confidence <= 1.0); + assert!(insight.novelty_score >= 0.0); + assert!(insight.feedback.is_none(), "Fresh insight should have no feedback"); + assert_eq!(insight.applied_count, 0); + } + } + } } diff --git a/crates/vestige-mcp/src/tools/explore.rs b/crates/vestige-mcp/src/tools/explore.rs index 8b9e5af..1fddc49 100644 --- a/crates/vestige-mcp/src/tools/explore.rs +++ b/crates/vestige-mcp/src/tools/explore.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use tokio::sync::Mutex; use crate::cognitive::CognitiveEngine; +use vestige_core::advanced::{Connection, ConnectionType, MemoryChainBuilder, MemoryNode}; use vestige_core::Storage; pub fn schema() -> serde_json::Value { @@ -50,12 +51,24 @@ pub async fn execute( match action { "chain" => { let to_id = to.ok_or("'to' is required for chain action")?; - match cog.chain_builder.build_chain(from, to_id) { + let chain_result = cog.chain_builder.build_chain(from, to_id); + let from_owned = from.to_string(); + let to_owned = to_id.to_string(); + drop(cog); // release lock before potential storage fallback + + let chain_opt = if chain_result.is_some() { + chain_result + } else { + // Storage fallback: build temporary chain from persisted connections + build_chain_from_storage(storage, &from_owned, &to_owned) + }; + + match chain_opt { Some(chain) => { Ok(serde_json::json!({ "action": "chain", - "from": from, - "to": to_id, + "from": from_owned, + "to": to_owned, "steps": chain.steps.iter().map(|s| serde_json::json!({ "memory_id": s.memory_id, "memory_preview": s.memory_preview, @@ -70,8 +83,8 @@ pub async fn execute( None => { Ok(serde_json::json!({ "action": "chain", - "from": from, - "to": to_id, + "from": from_owned, + "to": to_owned, "steps": [], "message": "No chain found between these memories" })) @@ -82,6 +95,8 @@ pub async fn execute( let activation_assocs = cog.activation_network.get_associations(from); let hippocampal_assocs = cog.hippocampal_index.get_associations(from, 2) .unwrap_or_default(); + let from_owned = from.to_string(); + drop(cog); // release lock consistently (matches chain/bridges pattern) let mut all_associations: Vec = Vec::new(); @@ -106,10 +121,9 @@ pub async fn execute( // Fallback: if in-memory modules are empty, query storage directly if all_associations.is_empty() { - drop(cog); // release cognitive lock before storage call - if let Ok(connections) = storage.get_connections_for_memory(from) { + if let Ok(connections) = storage.get_connections_for_memory(&from_owned) { for conn in connections.iter().take(limit) { - let other_id = if conn.source_id == from { + let other_id = if conn.source_id == from_owned { &conn.target_id } else { &conn.source_id @@ -126,7 +140,7 @@ pub async fn execute( Ok(serde_json::json!({ "action": "associations", - "from": from, + "from": from_owned, "associations": all_associations, "count": all_associations.len(), })) @@ -134,11 +148,23 @@ pub async fn execute( "bridges" => { let to_id = to.ok_or("'to' is required for bridges action")?; let bridges = cog.chain_builder.find_bridge_memories(from, to_id); - let limited: Vec<_> = bridges.iter().take(limit).collect(); + let from_owned = from.to_string(); + let to_owned = to_id.to_string(); + drop(cog); // release lock before potential storage fallback + + let final_bridges = if !bridges.is_empty() { + bridges + } else { + // Storage fallback: build temporary graph and find bridges + let temp_builder = build_temp_chain_builder(storage, &from_owned, &to_owned); + temp_builder.find_bridge_memories(&from_owned, &to_owned) + }; + + let limited: Vec<_> = final_bridges.iter().take(limit).collect(); Ok(serde_json::json!({ "action": "bridges", - "from": from, - "to": to_id, + "from": from_owned, + "to": to_owned, "bridges": limited, "count": limited.len(), })) @@ -147,6 +173,73 @@ pub async fn execute( } } +/// Build a temporary MemoryChainBuilder from persisted connections for fallback queries. +fn build_temp_chain_builder(storage: &Arc, from_id: &str, to_id: &str) -> MemoryChainBuilder { + let mut builder = MemoryChainBuilder::new(); + + // Load connections involving either endpoint + let mut all_conns = Vec::new(); + if let Ok(conns) = storage.get_connections_for_memory(from_id) { + all_conns.extend(conns); + } + if let Ok(conns) = storage.get_connections_for_memory(to_id) { + all_conns.extend(conns); + } + + // Deduplicate edges and load referenced memory nodes + let mut seen_edges = std::collections::HashSet::new(); + all_conns.retain(|c| seen_edges.insert((c.source_id.clone(), c.target_id.clone()))); + + let mut seen_ids = std::collections::HashSet::new(); + for conn in &all_conns { + for id in [&conn.source_id, &conn.target_id] { + if seen_ids.insert(id.clone()) { + if let Ok(Some(node)) = storage.get_node(id) { + builder.add_memory(MemoryNode { + id: node.id.clone(), + content_preview: node.content.chars().take(100).collect(), + tags: node.tags.clone(), + connections: vec![], + }); + } + } + } + } + + // Add edges + for conn in &all_conns { + builder.add_connection(Connection { + from_id: conn.source_id.clone(), + to_id: conn.target_id.clone(), + connection_type: link_type_to_connection_type(&conn.link_type), + strength: conn.strength, + created_at: conn.created_at, + }); + } + + builder +} + +/// Build a chain from storage when in-memory chain_builder is empty. +fn build_chain_from_storage( + storage: &Arc, + from_id: &str, + to_id: &str, +) -> Option { + let builder = build_temp_chain_builder(storage, from_id, to_id); + builder.build_chain(from_id, to_id) +} + +/// Convert storage link_type string to ConnectionType enum. +fn link_type_to_connection_type(link_type: &str) -> ConnectionType { + match link_type { + "temporal" => ConnectionType::TemporalProximity, + "causal" => ConnectionType::Causal, + "part_of" => ConnectionType::PartOf, + _ => ConnectionType::SemanticSimilarity, + } +} + #[cfg(test)] mod tests { use super::*; @@ -351,4 +444,71 @@ mod tests { assert_eq!(associations[0]["source"], "persistent_graph"); assert_eq!(associations[0]["memory_id"], id2); } + + #[tokio::test] + async fn test_chain_storage_fallback() { + let (storage, _dir) = test_storage().await; + + // Create 3 memories: A -> B -> C + let make = |content: &str| vestige_core::IngestInput { + content: content.to_string(), node_type: "fact".to_string(), + source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], valid_from: None, valid_until: None, + }; + let id_a = storage.ingest(make("Memory A about databases")).unwrap().id; + let id_b = storage.ingest(make("Memory B about indexes")).unwrap().id; + let id_c = storage.ingest(make("Memory C about performance")).unwrap().id; + + // Save connections A->B and B->C to storage + let now = chrono::Utc::now(); + for (src, tgt) in [(&id_a, &id_b), (&id_b, &id_c)] { + storage.save_connection(&vestige_core::ConnectionRecord { + source_id: src.clone(), target_id: tgt.clone(), + strength: 0.9, link_type: "semantic".to_string(), + created_at: now, last_activated: now, activation_count: 1, + }).unwrap(); + } + + // Execute chain with empty cognitive engine — should fall back to storage + let args = serde_json::json!({ "action": "chain", "from": id_a, "to": id_c }); + let result = execute(&storage, &test_cognitive(), Some(args)).await; + assert!(result.is_ok()); + let value = result.unwrap(); + assert_eq!(value["action"], "chain"); + let steps = value["steps"].as_array().unwrap(); + assert!(!steps.is_empty(), "Chain should find path A->B->C via storage fallback"); + } + + #[tokio::test] + async fn test_bridges_storage_fallback() { + let (storage, _dir) = test_storage().await; + + // Create 3 memories: A -> B -> C (B is the bridge) + let make = |content: &str| vestige_core::IngestInput { + content: content.to_string(), node_type: "fact".to_string(), + source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], valid_from: None, valid_until: None, + }; + let id_a = storage.ingest(make("Bridge test memory A")).unwrap().id; + let id_b = storage.ingest(make("Bridge test memory B")).unwrap().id; + let id_c = storage.ingest(make("Bridge test memory C")).unwrap().id; + + let now = chrono::Utc::now(); + for (src, tgt) in [(&id_a, &id_b), (&id_b, &id_c)] { + storage.save_connection(&vestige_core::ConnectionRecord { + source_id: src.clone(), target_id: tgt.clone(), + strength: 0.9, link_type: "semantic".to_string(), + created_at: now, last_activated: now, activation_count: 1, + }).unwrap(); + } + + // Execute bridges with empty cognitive engine + let args = serde_json::json!({ "action": "bridges", "from": id_a, "to": id_c }); + let result = execute(&storage, &test_cognitive(), Some(args)).await; + assert!(result.is_ok()); + let value = result.unwrap(); + assert_eq!(value["action"], "bridges"); + let bridges = value["bridges"].as_array().unwrap(); + assert!(!bridges.is_empty(), "Should find B as bridge between A and C via storage fallback"); + } } diff --git a/crates/vestige-mcp/src/tools/memory_unified.rs b/crates/vestige-mcp/src/tools/memory_unified.rs index acd5240..e138b97 100644 --- a/crates/vestige-mcp/src/tools/memory_unified.rs +++ b/crates/vestige-mcp/src/tools/memory_unified.rs @@ -43,12 +43,17 @@ pub fn schema() -> Value { "properties": { "action": { "type": "string", - "enum": ["get", "delete", "state", "promote", "demote", "edit"], - "description": "Action to perform: 'get' retrieves full memory node, 'delete' removes memory, 'state' returns accessibility state, 'promote' increases retrieval strength (thumbs up), 'demote' decreases retrieval strength (thumbs down), 'edit' updates content in-place (preserves FSRS state)" + "enum": ["get", "get_batch", "delete", "state", "promote", "demote", "edit"], + "description": "Action to perform: 'get' retrieves full memory node, 'get_batch' retrieves multiple memories by IDs (use 'ids' array), 'delete' removes memory, 'state' returns accessibility state, 'promote' increases retrieval strength (thumbs up), 'demote' decreases retrieval strength (thumbs down), 'edit' updates content in-place (preserves FSRS state)" }, "id": { "type": "string", - "description": "The ID of the memory node" + "description": "The ID of the memory node (for single-memory actions)" + }, + "ids": { + "type": "array", + "items": { "type": "string" }, + "description": "Array of memory IDs (for get_batch action). Max 20 IDs per call." }, "reason": { "type": "string", @@ -59,7 +64,7 @@ pub fn schema() -> Value { "description": "New content for edit action. Replaces existing content, regenerates embedding, preserves FSRS state." } }, - "required": ["action", "id"] + "required": ["action"] }) } @@ -67,7 +72,8 @@ pub fn schema() -> Value { #[serde(rename_all = "camelCase")] struct MemoryArgs { action: String, - id: String, + id: Option, + ids: Option>, reason: Option, content: Option, } @@ -83,18 +89,34 @@ pub async fn execute( None => return Err("Missing arguments".to_string()), }; - // Validate UUID format - uuid::Uuid::parse_str(&args.id).map_err(|_| "Invalid memory ID format".to_string())?; + // get_batch uses 'ids' array, all other actions use 'id' + if args.action == "get_batch" { + let ids = args.ids.ok_or("get_batch requires 'ids' array")?; + if ids.is_empty() { + return Err("ids array cannot be empty".to_string()); + } + if ids.len() > 20 { + return Err("get_batch supports max 20 IDs per call".to_string()); + } + for id in &ids { + uuid::Uuid::parse_str(id).map_err(|_| format!("Invalid memory ID format: {}", id))?; + } + return execute_get_batch(storage, &ids).await; + } + + // All other actions require 'id' + let id = args.id.ok_or("This action requires 'id' parameter")?; + uuid::Uuid::parse_str(&id).map_err(|_| "Invalid memory ID format".to_string())?; match args.action.as_str() { - "get" => execute_get(storage, &args.id).await, - "delete" => execute_delete(storage, &args.id).await, - "state" => execute_state(storage, &args.id).await, - "promote" => execute_promote(storage, cognitive, &args.id, args.reason).await, - "demote" => execute_demote(storage, cognitive, &args.id, args.reason).await, - "edit" => execute_edit(storage, &args.id, args.content).await, + "get" => execute_get(storage, &id).await, + "delete" => execute_delete(storage, &id).await, + "state" => execute_state(storage, &id).await, + "promote" => execute_promote(storage, cognitive, &id, args.reason).await, + "demote" => execute_demote(storage, cognitive, &id, args.reason).await, + "edit" => execute_edit(storage, &id, args.content).await, _ => Err(format!( - "Invalid action '{}'. Must be one of: get, delete, state, promote, demote, edit", + "Invalid action '{}'. Must be one of: get, get_batch, delete, state, promote, demote, edit", args.action )), } @@ -140,6 +162,49 @@ async fn execute_get(storage: &Arc, id: &str) -> Result } } +/// Get multiple full memory nodes by ID (batch retrieval for expandable IDs) +async fn execute_get_batch(storage: &Arc, ids: &[String]) -> Result { + let mut results = Vec::with_capacity(ids.len()); + let mut found_count = 0; + + for id in ids { + match storage.get_node(id) { + Ok(Some(n)) => { + found_count += 1; + results.push(serde_json::json!({ + "id": n.id, + "content": n.content, + "nodeType": n.node_type, + "createdAt": n.created_at.to_rfc3339(), + "updatedAt": n.updated_at.to_rfc3339(), + "tags": n.tags, + "retentionStrength": n.retention_strength, + "source": n.source, + })); + } + Ok(None) => { + results.push(serde_json::json!({ + "id": id, + "found": false, + })); + } + Err(e) => { + results.push(serde_json::json!({ + "id": id, + "error": e.to_string(), + })); + } + } + } + + Ok(serde_json::json!({ + "action": "get_batch", + "requested": ids.len(), + "found": found_count, + "results": results, + })) +} + /// Delete a memory and return success status async fn execute_delete(storage: &Arc, id: &str) -> Result { let deleted = storage.delete_node(id).map_err(|e| e.to_string())?; @@ -388,10 +453,12 @@ mod tests { assert!(schema["properties"]["action"].is_object()); assert!(schema["properties"]["id"].is_object()); assert!(schema["properties"]["reason"].is_object()); - assert_eq!(schema["required"], serde_json::json!(["action", "id"])); - // Verify all 6 actions are in enum + assert_eq!(schema["required"], serde_json::json!(["action"])); + assert!(schema["properties"]["ids"].is_object()); // get_batch support + // Verify all 7 actions are in enum let actions = schema["properties"]["action"]["enum"].as_array().unwrap(); - assert_eq!(actions.len(), 6); + assert_eq!(actions.len(), 7); + assert!(actions.contains(&serde_json::json!("get_batch"))); assert!(actions.contains(&serde_json::json!("edit"))); assert!(actions.contains(&serde_json::json!("promote"))); assert!(actions.contains(&serde_json::json!("demote"))); diff --git a/crates/vestige-mcp/src/tools/mod.rs b/crates/vestige-mcp/src/tools/mod.rs index 99357cc..c621cf7 100644 --- a/crates/vestige-mcp/src/tools/mod.rs +++ b/crates/vestige-mcp/src/tools/mod.rs @@ -37,6 +37,9 @@ pub mod session_context; pub mod health; pub mod graph; +// v2.1: Cross-reference (connect the dots) +pub mod cross_reference; + // Deprecated/internal tools — not advertised in the public MCP tools/list, // but some functions are actively dispatched for backwards compatibility // and internal cognitive operations. #[allow(dead_code)] suppresses warnings diff --git a/crates/vestige-mcp/src/tools/search_unified.rs b/crates/vestige-mcp/src/tools/search_unified.rs index bf090cc..d8678ed 100644 --- a/crates/vestige-mcp/src/tools/search_unified.rs +++ b/crates/vestige-mcp/src/tools/search_unified.rs @@ -68,9 +68,15 @@ pub fn schema() -> Value { }, "token_budget": { "type": "integer", - "description": "Max tokens for response. Server truncates content to fit budget. Use memory(action='get') for full content of specific IDs.", + "description": "Max tokens for response. Server truncates content to fit budget. Use memory(action='get') for full content of specific IDs. With 1M context models, budgets up to 100K are practical.", "minimum": 100, - "maximum": 10000 + "maximum": 100000 + }, + "retrieval_mode": { + "type": "string", + "description": "precise: top results only (fast, token-efficient, skips activation/competition). balanced: full 7-stage cognitive pipeline (default). exhaustive: maximum recall with 5x overfetch, deep graph traversal, no competition suppression.", + "enum": ["precise", "balanced", "exhaustive"], + "default": "balanced" } }, "required": ["query"] @@ -82,13 +88,18 @@ pub fn schema() -> Value { struct SearchArgs { query: String, limit: Option, + #[serde(alias = "min_retention")] min_retention: Option, + #[serde(alias = "min_similarity")] min_similarity: Option, #[serde(alias = "detail_level")] detail_level: Option, + #[serde(alias = "context_topics")] context_topics: Option>, #[serde(alias = "token_budget")] token_budget: Option, + #[serde(alias = "retrieval_mode")] + retrieval_mode: Option, } /// Execute unified search with 7-stage cognitive pipeline. @@ -135,14 +146,32 @@ pub async fn execute( let min_retention = args.min_retention.unwrap_or(0.0).clamp(0.0, 1.0); let min_similarity = args.min_similarity.unwrap_or(0.5).clamp(0.0, 1.0); + // Validate retrieval_mode + let retrieval_mode = match args.retrieval_mode.as_deref() { + Some("precise") => "precise", + Some("exhaustive") => "exhaustive", + Some("balanced") | None => "balanced", + Some(invalid) => { + return Err(format!( + "Invalid retrieval_mode '{}'. Must be 'precise', 'balanced', or 'exhaustive'.", + invalid + )); + } + }; + // Favor semantic search — research shows 0.3/0.7 outperforms equal weights let keyword_weight = 0.3_f32; let semantic_weight = 0.7_f32; // ==================================================================== - // STAGE 1: Hybrid search with 3x over-fetch for reranking pool + // STAGE 1: Hybrid search with Nx over-fetch for reranking pool // ==================================================================== - let overfetch_limit = (limit * 3).min(100); // Cap at 100 to avoid excessive DB load + let overfetch_multiplier = match retrieval_mode { + "precise" => 1, // No overfetch — return exactly what's asked + "exhaustive" => 5, // Deep overfetch for maximum recall + _ => 3, // Balanced default + }; + let overfetch_limit = (limit * overfetch_multiplier).min(100); // Cap at 100 to avoid excessive DB load let results = storage .hybrid_search(&args.query, overfetch_limit, keyword_weight, semantic_weight) @@ -215,7 +244,7 @@ pub async fn execute( // Determine state from retention strength lifecycle.state = if result.node.retention_strength > 0.7 { MemoryState::Active - } else if result.node.retention_strength > 0.3 { + } else if result.node.retention_strength > 0.4 { MemoryState::Dormant } else if result.node.retention_strength > 0.1 { MemoryState::Silent @@ -275,9 +304,11 @@ pub async fn execute( // ==================================================================== // STAGE 5B: Retrieval competition (Anderson et al. 1994) + // Skipped in precise mode (no need) and exhaustive mode (want all results) // ==================================================================== let mut suppressed_count = 0_usize; - if filtered_results.len() > 1 + if retrieval_mode == "balanced" + && filtered_results.len() > 1 && let Ok(mut cog) = cognitive.try_lock() { let candidates: Vec = filtered_results @@ -321,21 +352,31 @@ pub async fn execute( // ==================================================================== // STAGE 6: Spreading activation (find associated memories) + // Skipped in precise mode. Deeper (5 results) in exhaustive mode. // ==================================================================== - let associations: Vec = if let Ok(mut cog) = cognitive.try_lock() { - if let Some(first) = filtered_results.first() { - let activated = cog.activation_network.activate(&first.node.id, 1.0); - activated - .iter() - .take(3) - .map(|a| { - serde_json::json!({ - "memoryId": a.memory_id, - "activation": a.activation, - "distance": a.distance, + let activation_take = match retrieval_mode { + "precise" => 0, // Skip entirely + "exhaustive" => 5, // Deeper graph traversal + _ => 3, // Balanced default + }; + let associations: Vec = if activation_take > 0 { + if let Ok(mut cog) = cognitive.try_lock() { + if let Some(first) = filtered_results.first() { + let activated = cog.activation_network.activate(&first.node.id, 1.0); + activated + .iter() + .take(activation_take) + .map(|a| { + serde_json::json!({ + "memoryId": a.memory_id, + "activation": a.activation, + "distance": a.distance, + }) }) - }) - .collect() + .collect() + } else { + vec![] + } } else { vec![] } @@ -401,7 +442,7 @@ pub async fn execute( let mut budget_expandable: Vec = Vec::new(); let mut budget_tokens_used: Option = None; if let Some(budget) = args.token_budget { - let budget = budget.clamp(100, 10000) as usize; + let budget = budget.clamp(100, 100000) as usize; let budget_chars = budget * 4; let mut used = 0; let mut budgeted = Vec::new(); @@ -428,11 +469,17 @@ pub async fn execute( let mut response = serde_json::json!({ "query": args.query, "method": "hybrid+cognitive", + "retrievalMode": retrieval_mode, "detailLevel": detail_level, "total": formatted.len(), "results": formatted, }); + // Helpful hint when no results found + if formatted.is_empty() { + response["hint"] = serde_json::json!("No memories found. Use smart_ingest to add memories, or try a broader query."); + } + // Include associations if any were found if !associations.is_empty() { response["associations"] = serde_json::json!(associations); @@ -499,7 +546,7 @@ fn format_search_result(r: &vestige_core::SearchResult, detail_level: &str) -> V "validUntil": r.node.valid_until.map(|dt| dt.to_rfc3339()), "matchType": format!("{:?}", r.match_type), }), - // "summary" (default) — backwards compatible + // "summary" (default) — includes dates so AI never has to guess when a memory is from _ => serde_json::json!({ "id": r.node.id, "content": r.node.content, @@ -509,6 +556,8 @@ fn format_search_result(r: &vestige_core::SearchResult, detail_level: &str) -> V "nodeType": r.node.node_type, "tags": r.node.tags, "retentionStrength": r.node.retention_strength, + "createdAt": r.node.created_at.to_rfc3339(), + "updatedAt": r.node.updated_at.to_rfc3339(), }), } } @@ -1004,10 +1053,11 @@ mod tests { let results = value["results"].as_array().unwrap(); if !results.is_empty() { let first = &results[0]; - // Summary should have content but not timestamps + // Summary should have content AND timestamps (v2.1: dates always visible) assert!(first["content"].is_string()); assert!(first["id"].is_string()); - assert!(first.get("createdAt").is_none() || first["createdAt"].is_null()); + assert!(first["createdAt"].is_string(), "summary must include createdAt"); + assert!(first["updatedAt"].is_string(), "summary must include updatedAt"); } } @@ -1106,6 +1156,6 @@ mod tests { let tb = &schema_value["properties"]["token_budget"]; assert!(tb.is_object()); assert_eq!(tb["minimum"], 100); - assert_eq!(tb["maximum"], 10000); + assert_eq!(tb["maximum"], 100000); } } diff --git a/crates/vestige-mcp/src/tools/session_context.rs b/crates/vestige-mcp/src/tools/session_context.rs index ada68aa..f93d681 100644 --- a/crates/vestige-mcp/src/tools/session_context.rs +++ b/crates/vestige-mcp/src/tools/session_context.rs @@ -27,10 +27,10 @@ pub fn schema() -> Value { }, "token_budget": { "type": "integer", - "description": "Max tokens for response (default: 1000). Server truncates content to fit budget.", + "description": "Max tokens for response (default: 1000). Server truncates content to fit budget. With 1M context models, budgets up to 100K are practical.", "default": 1000, "minimum": 100, - "maximum": 10000 + "maximum": 100000 }, "context": { "type": "object", @@ -105,7 +105,7 @@ pub async fn execute( None => SessionContextArgs::default(), }; - let token_budget = args.token_budget.unwrap_or(1000).clamp(100, 10000) as usize; + let token_budget = args.token_budget.unwrap_or(1000).clamp(100, 100000) as usize; let budget_chars = token_budget * 4; let include_status = args.include_status.unwrap_or(true); let include_intentions = args.include_intentions.unwrap_or(true); @@ -132,7 +132,8 @@ pub async fn execute( continue; } let summary = first_sentence(&r.node.content); - let line = format!("- {}", summary); + let date_str = r.node.updated_at.format("%b %d, %Y").to_string(); + let line = format!("- ({}) {}", date_str, summary); let line_len = line.len() + 1; // +1 for newline if char_count + line_len > budget_chars { @@ -510,7 +511,7 @@ mod tests { let s = schema(); let tb = &s["properties"]["token_budget"]; assert_eq!(tb["minimum"], 100); - assert_eq!(tb["maximum"], 10000); + assert_eq!(tb["maximum"], 100000); assert_eq!(tb["default"], 1000); } diff --git a/docs/integrations/windsurf.md b/docs/integrations/windsurf.md index 3ea7b45..cc9ba80 100644 --- a/docs/integrations/windsurf.md +++ b/docs/integrations/windsurf.md @@ -115,7 +115,7 @@ It remembers. ## Important: Tool Limit -Windsurf has a **hard cap of 100 tools** across all MCP servers. Vestige uses 19 tools, leaving plenty of room for other servers. +Windsurf has a **hard cap of 100 tools** across all MCP servers. Vestige uses 23 tools, leaving plenty of room for other servers. --- diff --git a/docs/integrations/xcode.md b/docs/integrations/xcode.md index 5e106a5..4d9909c 100644 --- a/docs/integrations/xcode.md +++ b/docs/integrations/xcode.md @@ -51,7 +51,7 @@ Quit Xcode completely (Cmd+Q) and reopen your project. ### 4. Verify -Type `/context` in the Agent panel. You should see `vestige` listed with 19 tools. +Type `/context` in the Agent panel. You should see `vestige` listed with 23 tools. --- diff --git a/docs/launch/reddit-cross-reference.md b/docs/launch/reddit-cross-reference.md new file mode 100644 index 0000000..e6e918a --- /dev/null +++ b/docs/launch/reddit-cross-reference.md @@ -0,0 +1,233 @@ +# Reddit Launch Posts — cross_reference Tool + +## Post 1: r/ClaudeAI (Primary) + +**Title:** `I built a tool that catches when Claude's memories contradict each other before it answers. It's been wrong 0 times since.` + +--- + +I've been building Vestige — an MCP memory server that gives Claude persistent memory across sessions. FSRS-6 spaced repetition (the Anki algorithm), 29 neuroscience-inspired modules, single Rust binary. 1,111 memories stored. It works. + +But last week it almost cost me hours of debugging. + +Claude confidently told me my AIMO3 competition notebook should use `--enable-prefix-caching` with vLLM. I trusted it. The notebook crashed. Scored 0/50. Burned a daily submission. + +The problem? I had TWO memories: +- **January**: "prefix caching crashes with our vLLM build" +- **March**: "prefix caching works with the new animsamuelk wheels" + +Claude found both. Picked the wrong one. Gave me a confident wrong answer based on the January memory. The March memory was correct — but Claude had no way to know they conflicted. + +So I built `cross_reference`. + +Now before answering any factual question, Claude calls: + +``` +cross_reference({ query: "should I use --enable-prefix-caching with vLLM?" }) +``` + +And gets back: + +```json +{ + "status": "contradictions_found", + "confidence": 0.35, + "guidance": "WARNING: 1 contradiction detected across 12 memories. + The newer memory is likely more accurate.", + "contradictions": [ + { + "newer": { + "date": "2026-03-18", + "preview": "Switched to animsamuelk wheels which support --enable-prefix-caching..." + }, + "older": { + "date": "2026-01-15", + "preview": "prefix caching crashed with our samvalladares vLLM build..." + }, + "recommendation": "Trust the newer memory. Consider demoting the older one." + } + ], + "timeline": [ /* 12 memories sorted newest-first */ ] +} +``` + +Claude sees the contradiction BEFORE answering. Trusts the March memory. Gets it right. + +**I've been using it for 2 days. It's caught contradictions I didn't even know I had.** Old project decisions that got reversed. Config values that changed. Library versions that got upgraded. All sitting in memory, waiting to give me wrong answers. + +### How it works under the hood: + +1. **Broad retrieval** — pulls up to 50 memories related to the query +2. **Cross-encoder reranking** — filters for quality (Jina Reranker v1 Turbo) +3. **Pairwise contradiction detection** — every memory pair checked for negation patterns ("don't" vs "do", "deprecated" vs "recommended") and correction signals ("now uses", "switched to", "replaced by") +4. **Topic gating** — only compares memories that share significant words (prevents false positives between unrelated memories) +5. **Confidence scoring** — agreements boost confidence, contradictions tank it, recency helps +6. **Timeline** — everything sorted newest-first so Claude sees the evolution +7. **Superseded list** — explicitly identifies which old memories should be demoted + +### The bigger picture: + +Context windows are now 1M tokens (Claude Opus 4.6, GPT-5.4). But bigger context doesn't fix this problem. The "Lost in the Middle" research shows accuracy drops from 92% to 78% at 1M tokens. More context = more chances for contradictions to slip through. + +Memory systems need to be SMARTER, not just bigger. That's what Vestige does — 29 cognitive modules implementing real neuroscience: + +- **FSRS-6** — memories naturally decay when unused, strengthen when accessed (21 parameters trained on 700M+ reviews) +- **Prediction Error Gating** — only stores what's genuinely new (no duplicates) +- **Dream consolidation** — replays memories to discover hidden connections (yes, like sleep) +- **Spreading activation** — search for "auth bug" and find the related JWT update from last week +- **cross_reference** — the new tool that catches contradictions before they become wrong answers + +### Stats: +- 22 MCP tools +- 746 tests, 0 failures +- Zero `unsafe` code +- Clean security audit (0 findings — AgentAudit verified) +- Single 22MB Rust binary — no Docker, no PostgreSQL, no cloud +- Works with Claude Code, Cursor, VS Code, Xcode 26.3, JetBrains, Windsurf + +### Install (30 seconds): +```bash +# macOS Apple Silicon +curl -L https://github.com/samvallad33/vestige/releases/latest/download/vestige-mcp-aarch64-apple-darwin.tar.gz | tar -xz +sudo mv vestige-mcp /usr/local/bin/ +claude mcp add vestige vestige-mcp -s user +``` + +Then add to your CLAUDE.md: +``` +Before answering factual questions, call cross_reference({ query: "the topic" }) +to verify your memories don't contradict each other. +``` + +That's it. Your AI now fact-checks itself. + +**GitHub:** https://github.com/samvallad33/vestige + +I searched every memory MCP server out there — Mem0 (47K stars), Hindsight, Zep, Letta, OMEGA, Solitaire, MuninnDB. Some detect contradictions at ingest time (when you save). Nobody else gives the AI an on-demand tool to verify its own memories before answering, with confidence scoring and guidance on which memory to trust. + +Happy to answer questions about the neuroscience, the architecture, or how to set it up. + +--- + +## Post 2: r/LocalLLaMA (Cross-post, 2h later) + +**Title:** `Your AI has 1000 memories. Some contradict each other. It doesn't know. I built the fix — 100% local, single Rust binary, zero cloud.` + +--- + +The problem nobody talks about with AI memory: + +You use a memory system. Over months, you accumulate 1000+ memories. Your project config changed 3 times. A library got deprecated. A decision got reversed. All those old memories are still there. + +When your AI searches memory, it finds 5 results. Two of them disagree. The AI picks one — maybe the wrong one — and gives you a confident answer based on outdated information. + +I built `cross_reference` to fix this. It's tool #22 in Vestige, my cognitive memory MCP server. + +``` +cross_reference({ query: "what database does the project use?" }) +``` + +Returns: +```json +{ + "status": "contradictions_found", + "confidence": 0.35, + "contradictions": [{ + "newer": { "date": "2026-03", "preview": "Migrated to PostgreSQL..." }, + "older": { "date": "2026-01", "preview": "Using SQLite for the backend..." } + }], + "guidance": "WARNING: Trust the newer memory." +} +``` + +The AI sees the conflict. Picks the right one. Every time. + +**What makes this different from RAG/vector search:** + +| | RAG | Vestige | +|---|---|---| +| Storage | Store everything | Prediction Error Gating — only stores what's new | +| Retrieval | Nearest neighbor | 7-stage cognitive pipeline with reranking | +| Contradictions | Returns both, hopes for the best | **Detects and flags before answering** | +| Decay | Nothing expires | FSRS-6 — memories fade naturally | +| Duplicates | Manual dedup | Self-healing via semantic comparison | + +**The stack:** +- Rust 2024 edition. Single 22MB binary. No Python, no Docker, no cloud. +- FSRS-6 spaced repetition (21 parameters, 700M+ reviews) +- 29 cognitive modules (spreading activation, synaptic tagging, dream consolidation, prediction error gating) +- 3D neural dashboard at localhost:3927 (Three.js, real-time WebSocket) +- MCP server — works with any AI that speaks MCP + +**100% local. Your data never leaves your machine.** + +```bash +curl -L https://github.com/samvallad33/vestige/releases/latest/download/vestige-mcp-aarch64-apple-darwin.tar.gz | tar -xz +sudo mv vestige-mcp /usr/local/bin/ +claude mcp add vestige vestige-mcp -s user +``` + +746 tests. Zero unsafe code. Clean security audit. AGPL-3.0. + +GitHub: https://github.com/samvallad33/vestige + +--- + +## Post 3: r/rust (Optional, technical audience) + +**Title:** `I built a 22MB Rust binary that gives AI agents a brain — FSRS-6, 29 cognitive modules, 3D dashboard, and a new contradiction detection tool. 746 tests, zero unsafe.` + +--- + +Vestige is a cognitive memory engine for AI agents. MCP server (stdio JSON-RPC + HTTP transport), SQLite WAL backend, USearch HNSW vector search, Nomic Embed v1.5 via fastembed (local ONNX, no API). + +The latest addition: `cross_reference` — pairwise contradiction detection across memories at retrieval time. The AI calls it before answering factual questions to verify its memories don't disagree. + +**Why Rust:** +- Single static binary (22MB with embedded SvelteKit dashboard via `include_dir!`) +- No runtime, no GC pauses during real-time search +- `tokio::sync::Mutex` for the cognitive engine, `std::sync::Mutex` for SQLite reader/writer split +- Zero `unsafe` blocks in the entire codebase +- `cargo test` runs 746 tests in 11 seconds + +**Architecture:** +``` +Axum 0.8 (dashboard + HTTP transport) + ↕ WebSocket event bus (tokio::broadcast, 1024 capacity) +MCP Server (stdio JSON-RPC) + → 22 tools dispatched via match on tool name + → Arc + Arc> +SQLite WAL + FTS5 + USearch HNSW + → fastembed 5.11 (Nomic Embed v1.5, 768D → 256D Matryoshka) + → Jina Reranker v1 Turbo (cross-encoder, 38M params) +``` + +**Key crates:** rusqlite 0.38, axum 0.8, tokio 1, fastembed 5.11, usearch 2, chrono 0.4, serde 1, uuid 1, include_dir 0.7 + +**What I learned building it:** +- `OnceLock, String>>` for lazy model initialization — the embedding model downloads ~130MB on first run, `OnceLock` ensures it only happens once and caches the error if it fails +- `floor_char_boundary()` saved me from a UTF-8 panic (content truncation with multi-byte chars) +- SQLite `PRAGMA journal_mode = WAL` + `synchronous = NORMAL` + `mmap_size = 268435456` gives surprisingly good concurrent read performance +- `try_lock()` pattern for cognitive features in search — if the lock is held (by dream consolidation), search falls back to simpler scoring instead of blocking + +Clean security audit. Parameterized SQL everywhere. CSP headers on the dashboard. Constant-time auth comparison (`subtle::ConstantTimeEq`). File permissions 0o600/0o700. + +GitHub: https://github.com/samvallad33/vestige +AGPL-3.0 | 746 tests | 79K+ LOC + +--- + +## Posting Strategy + +| Subreddit | When | Expected Engagement | +|-----------|------|-------------------| +| r/ClaudeAI | First — 12-14 UTC (US morning) | High — direct audience for MCP tools | +| r/LocalLLaMA | 2h after r/ClaudeAI | High — local-first angle resonates here | +| r/rust | Same day, evening UTC | Medium — technical deep dive audience | +| r/MachineLearning | Next day if first two do well | Lower but prestigious | + +**Title formula that works on Reddit:** Personal story + specific problem + "nobody else has this" + +**DO NOT do:** Product-name-first titles, marketing speak, "introducing X", "check out my project" + +**DO:** Lead with the PAIN ("my AI gave me wrong answers"), show the FIX (the JSON output), then reveal the tool. From 5b1127d630809e302886530555bdd99b14dd55f0 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Thu, 9 Apr 2026 17:06:24 -0500 Subject: [PATCH 06/49] fix: remove vestige-agent from workspace (not shipped), improve reasoning chain output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Removed vestige-agent and vestige-agent-py from workspace members (ARC-AGI-3 code, not part of Vestige release — caused CI failure) - Improved deep_reference reasoning chain: fuller output with arrows on supersession reasoning, longer primary finding preview, fallback message when no relations found, boosted relation detection for search results with high combined_score Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 1 + Cargo.toml | 2 -- .../src/lib/components/TimeSlider.svelte | 2 ++ .../src/lib/graph/__tests__/effects.test.ts | 9 +++--- apps/dashboard/src/lib/graph/effects.ts | 7 ++--- apps/dashboard/src/lib/graph/events.ts | 2 +- apps/dashboard/src/lib/graph/nodes.ts | 6 +++- apps/dashboard/src/lib/stores/websocket.ts | 4 +-- .../vestige-core/src/consolidation/phases.rs | 13 ++++---- .../vestige-mcp/src/tools/cross_reference.rs | 31 ++++++++++++------- 10 files changed, 43 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index a5523d3..4236e68 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,4 @@ apps/dashboard/node_modules/ # External repos (forks, submodules) # ============================================================================= fastembed-rs/ +.mcp.json diff --git a/Cargo.toml b/Cargo.toml index 83cccd2..89761ac 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,6 @@ resolver = "2" members = [ "crates/vestige-core", "crates/vestige-mcp", - "crates/vestige-agent", - "crates/vestige-agent-py", "tests/e2e", ] exclude = [ diff --git a/apps/dashboard/src/lib/components/TimeSlider.svelte b/apps/dashboard/src/lib/components/TimeSlider.svelte index 6d96318..acdc19a 100644 --- a/apps/dashboard/src/lib/components/TimeSlider.svelte +++ b/apps/dashboard/src/lib/components/TimeSlider.svelte @@ -51,6 +51,7 @@ } function playLoop() { + if (!playing) return; animFrameId = requestAnimationFrame((now) => { const deltaSeconds = (now - lastTime) / 1000; lastTime = now; @@ -78,6 +79,7 @@ } onDestroy(() => { + playing = false; cancelAnimationFrame(animFrameId); }); diff --git a/apps/dashboard/src/lib/graph/__tests__/effects.test.ts b/apps/dashboard/src/lib/graph/__tests__/effects.test.ts index dcadbe7..9c80986 100644 --- a/apps/dashboard/src/lib/graph/__tests__/effects.test.ts +++ b/apps/dashboard/src/lib/graph/__tests__/effects.test.ts @@ -245,11 +245,11 @@ describe('EffectManager', () => { expect(n1Pulses.length).toBeLessThanOrEqual(1); }); - it('applies scale bump to contacted nodes', () => { + it('adds pulse to contacted nodes instead of direct scale mutation', () => { const nodePositions = new Map([ ['bump', new Vector3(3, 0, 0)], ]); - const mesh = createMockMesh('bump', new Vector3(3, 0, 0)); + createMockMesh('bump', new Vector3(3, 0, 0)); effects.createRippleWave(new Vector3(0, 0, 0) as any); @@ -258,8 +258,9 @@ describe('EffectManager', () => { effects.update(nodeMeshMap, camera, nodePositions); } - // Scale should have been bumped (1.3x) - expect(mesh.scale.x).toBeGreaterThan(1.0); + // Ripple wave should add a pulse effect (not a direct scale mutation) + const bumpPulses = effects.pulseEffects.filter(p => p.nodeId === 'bump'); + expect(bumpPulses.length).toBeGreaterThan(0); }); it('completes and cleans up after 90 frames', () => { diff --git a/apps/dashboard/src/lib/graph/effects.ts b/apps/dashboard/src/lib/graph/effects.ts index 0e37a8e..1402476 100644 --- a/apps/dashboard/src/lib/graph/effects.ts +++ b/apps/dashboard/src/lib/graph/effects.ts @@ -335,11 +335,8 @@ export class EffectManager { rw.pulsedNodes.add(id); // Mini-pulse on contact this.addPulse(id, 0.8, new THREE.Color(0x00ffd1), 0.03); - // Mini scale bump on the mesh - const mesh = nodeMeshMap.get(id); - if (mesh) { - mesh.scale.multiplyScalar(1.3); - } + // Pulse handles the visual bump — no direct scale mutation + // (multiplyScalar was cumulative and fought with animation system) } }); } diff --git a/apps/dashboard/src/lib/graph/events.ts b/apps/dashboard/src/lib/graph/events.ts index f1d2c54..a554709 100644 --- a/apps/dashboard/src/lib/graph/events.ts +++ b/apps/dashboard/src/lib/graph/events.ts @@ -115,7 +115,7 @@ export function mapEventToEffects( id: data.id, label: (data.content ?? '').slice(0, 60), type: data.node_type ?? 'fact', - retention: data.retention ?? 0.9, + retention: Math.max(0, Math.min(1, data.retention ?? 0.9)), tags: data.tags ?? [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), diff --git a/apps/dashboard/src/lib/graph/nodes.ts b/apps/dashboard/src/lib/graph/nodes.ts index e4b879a..0bb6e39 100644 --- a/apps/dashboard/src/lib/graph/nodes.ts +++ b/apps/dashboard/src/lib/graph/nodes.ts @@ -205,7 +205,11 @@ export class NodeManager { private createTextSprite(text: string, color: string): THREE.Sprite { const canvas = document.createElement('canvas'); - const ctx = canvas.getContext('2d')!; + const ctx = canvas.getContext('2d'); + if (!ctx) { + const tex = new THREE.Texture(); + return new THREE.Sprite(new THREE.SpriteMaterial({ map: tex, transparent: true, opacity: 0 })); + } canvas.width = 512; canvas.height = 64; diff --git a/apps/dashboard/src/lib/stores/websocket.ts b/apps/dashboard/src/lib/stores/websocket.ts index 41827bd..c9985f1 100644 --- a/apps/dashboard/src/lib/stores/websocket.ts +++ b/apps/dashboard/src/lib/stores/websocket.ts @@ -45,8 +45,8 @@ function createWebSocketStore() { const events = [parsed, ...s.events].slice(0, MAX_EVENTS); return { ...s, events }; }); - } catch { - // Ignore malformed messages + } catch (e) { + console.warn('[vestige] Failed to parse WebSocket message:', e); } }; diff --git a/crates/vestige-core/src/consolidation/phases.rs b/crates/vestige-core/src/consolidation/phases.rs index 71f3724..bc50e56 100644 --- a/crates/vestige-core/src/consolidation/phases.rs +++ b/crates/vestige-core/src/consolidation/phases.rs @@ -380,9 +380,6 @@ impl DreamEngine { let mut strengthened_ids = Vec::new(); let replay_set: HashSet<&String> = replay_queue.iter().collect(); - let _triaged_map: HashMap<&str, &TriagedMemory> = triaged.iter() - .map(|m| (m.id.as_str(), m)) - .collect(); // Process replay queue in oscillation waves let wave_count = replay_queue.len().div_ceil(self.wave_batch_size); @@ -726,10 +723,12 @@ impl DreamEngine { let mut seen_pairs: HashSet<(String, String)> = HashSet::new(); insights.retain(|i| { if i.source_memory_ids.len() >= 2 { - let pair = ( - i.source_memory_ids[0].clone().min(i.source_memory_ids[1].clone()), - i.source_memory_ids[0].clone().max(i.source_memory_ids[1].clone()), - ); + let (a, b) = (&i.source_memory_ids[0], &i.source_memory_ids[1]); + let pair = if a <= b { + (a.clone(), b.clone()) + } else { + (b.clone(), a.clone()) + }; seen_pairs.insert(pair) } else { true diff --git a/crates/vestige-mcp/src/tools/cross_reference.rs b/crates/vestige-mcp/src/tools/cross_reference.rs index 9327be7..6cfc3f5 100644 --- a/crates/vestige-mcp/src/tools/cross_reference.rs +++ b/crates/vestige-mcp/src/tools/cross_reference.rs @@ -219,18 +219,18 @@ fn generate_reasoning_chain( "PRIMARY FINDING (trust {:.0}%, {}): {}\n", primary.trust * 100.0, primary.updated_at.format("%b %d, %Y"), - primary.content.chars().take(150).collect::(), + primary.content.chars().take(300).collect::(), )); - // Superseded memories + // Superseded memories — with reasoning arrows let superseded: Vec<_> = relations.iter() .filter(|(_, _, r)| matches!(r.relation, Relation::Supersedes)) .collect(); for (preview, trust, rel) in &superseded { chain.push_str(&format!( - " SUPERSEDES (trust {:.0}%): \"{}\" — {}\n", + " SUPERSEDES (trust {:.0}%): \"{}\"\n -> {}\n", trust * 100.0, - preview.chars().take(80).collect::(), + preview.chars().take(100).collect::(), rel.reasoning, )); } @@ -240,7 +240,7 @@ fn generate_reasoning_chain( .filter(|(_, _, r)| matches!(r.relation, Relation::Supports)) .collect(); if !supporting.is_empty() { - chain.push_str(&format!("\nSUPPORTED BY {} MEMOR{}:\n", + chain.push_str(&format!("SUPPORTED BY {} MEMOR{}:\n", supporting.len(), if supporting.len() == 1 { "Y" } else { "IES" }, )); @@ -248,7 +248,7 @@ fn generate_reasoning_chain( chain.push_str(&format!( " + (trust {:.0}%): \"{}\"\n", trust * 100.0, - preview.chars().take(80).collect::(), + preview.chars().take(100).collect::(), )); } } @@ -258,19 +258,23 @@ fn generate_reasoning_chain( .filter(|(_, _, r)| matches!(r.relation, Relation::Contradicts)) .collect(); if !contradicting.is_empty() { - chain.push_str(&format!("\nCONTRADICTING EVIDENCE ({}):\n", contradicting.len())); + chain.push_str(&format!("CONTRADICTING EVIDENCE ({}):\n", contradicting.len())); for (preview, trust, rel) in contradicting.iter().take(3) { chain.push_str(&format!( - " ! (trust {:.0}%): \"{}\" — {}\n", + " ! (trust {:.0}%): \"{}\"\n -> {}\n", trust * 100.0, - preview.chars().take(80).collect::(), + preview.chars().take(100).collect::(), rel.reasoning, )); } } - // Confidence summary - chain.push_str(&format!("\nOVERALL CONFIDENCE: {:.0}%\n", confidence * 100.0)); + // If no relations found, still provide useful output + if superseded.is_empty() && supporting.is_empty() && contradicting.is_empty() { + chain.push_str("NO CONTRADICTIONS DETECTED. Evidence is consistent.\n"); + } + + chain.push_str(&format!("OVERALL CONFIDENCE: {:.0}%\n", confidence * 100.0)); chain } @@ -541,12 +545,15 @@ pub async fn execute( .max_by(|a, b| a.trust.partial_cmp(&b.trust).unwrap_or(std::cmp::Ordering::Equal)) { for other in scored.iter().filter(|s| s.id != primary.id).take(15) { + // Use combined_score as a proxy for semantic similarity (already reranked) + // Fall back to topic_overlap for keyword-level comparison let sim = topic_overlap(&primary.content, &other.content); + let effective_sim = if other.combined_score > 0.2 { sim.max(0.3) } else { sim }; let rel = assess_relation( &primary.content, &other.content, primary.trust, other.trust, primary.updated_at, other.updated_at, - sim, + effective_sim, ); if !matches!(rel.relation, Relation::Irrelevant) { pair_relations.push(( From f97dc7d0846565f9ebb4b2c653246e277c4c518c Mon Sep 17 00:00:00 2001 From: NoahToKnow <124620394+NoahToKnow@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:09:37 -0600 Subject: [PATCH 07/49] fix(intention): accept snake_case in_minutes / file_pattern on TriggerSpec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The public JSON schema in schema() declares `in_minutes` and `file_pattern` in snake_case, but TriggerSpec uses `#[serde(rename_all = "camelCase")]` which makes serde expect `inMinutes` / `filePattern`. Snake_case inputs are silently dropped to None, so time-based intentions with `in_minutes` never fire (triggerAt becomes null) and file_pattern-only context intentions never match. Added `#[serde(alias = ...)]` so both naming conventions deserialize correctly — purely additive, existing camelCase callers unaffected. Two regression tests added, verified to FAIL without the aliases (negative control confirmed the snake_case duration test sees `triggerAt: null` and the file_pattern test sees an empty `triggered` array). Both pass with the fix. Full crate suite: 408/408 passing. Related to #25 (Bug #8 was half-fixed — check-side re-derivation works, but the set-side was still dropping the value before it could be persisted). --- .../src/tools/intention_unified.rs | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/crates/vestige-mcp/src/tools/intention_unified.rs b/crates/vestige-mcp/src/tools/intention_unified.rs index 3a22d93..b2d3369 100644 --- a/crates/vestige-mcp/src/tools/intention_unified.rs +++ b/crates/vestige-mcp/src/tools/intention_unified.rs @@ -152,8 +152,10 @@ struct TriggerSpec { #[serde(rename = "type")] trigger_type: Option, at: Option, + #[serde(alias = "in_minutes")] in_minutes: Option, codebase: Option, + #[serde(alias = "file_pattern")] file_pattern: Option, topic: Option, condition: Option, @@ -819,6 +821,77 @@ mod tests { assert!(value["triggerAt"].is_string()); } + #[tokio::test] + async fn test_set_action_with_duration_trigger_snake_case() { + // The public JSON schema (see schema() above) declares `in_minutes` in + // snake_case. The TriggerSpec struct uses `rename_all = "camelCase"` so + // without an explicit `#[serde(alias = "in_minutes")]` the snake_case + // input is silently dropped (becomes None), `triggerAt` becomes null, + // and the time-based intention never fires. + let (storage, _dir) = test_storage().await; + let args = serde_json::json!({ + "action": "set", + "description": "Check build status", + "trigger": { + "type": "time", + "in_minutes": 30 + } + }); + let result = execute(&storage, &test_cognitive(), Some(args)).await; + assert!(result.is_ok()); + + let value = result.unwrap(); + assert!( + value["triggerAt"].is_string(), + "snake_case in_minutes should derive triggerAt; got: {:?}", + value["triggerAt"] + ); + } + + #[tokio::test] + async fn test_set_action_with_file_pattern_snake_case() { + // The public JSON schema declares `file_pattern` in snake_case. Verify + // it survives deserialization by setting an intention with ONLY + // file_pattern (no codebase — otherwise the check-side codebase branch + // would short-circuit and mask a dropped file_pattern field). + // + // Note: file_pattern matching currently uses substring containment, not + // glob, so the "pattern" must be a plain substring of the file path. + let (storage, _dir) = test_storage().await; + let args = serde_json::json!({ + "action": "set", + "description": "Review test files", + "trigger": { + "type": "context", + "file_pattern": ".test.cjs" + } + }); + let result = execute(&storage, &test_cognitive(), Some(args)).await; + assert!( + result.is_ok(), + "set should succeed with snake_case file_pattern" + ); + + // Check should fire when a matching file is in context. + let check_args = serde_json::json!({ + "action": "check", + "context": { + "file": "tests/neural-cascade.test.cjs" + } + }); + let check = execute(&storage, &test_cognitive(), Some(check_args)) + .await + .unwrap(); + let triggered = check["triggered"].as_array().expect("triggered array"); + assert!( + !triggered.is_empty(), + "file_pattern must survive snake_case deserialization and match on file substring; \ + got triggered: {:?}, pending: {:?}", + check["triggered"], + check["pending"] + ); + } + #[tokio::test] async fn test_set_action_with_deadline() { let (storage, _dir) = test_storage().await; From 3239295ab8c8f62d7297f1f5cabd79281813b378 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Thu, 9 Apr 2026 17:37:41 -0500 Subject: [PATCH 08/49] fix: resolve clippy collapsible-if errors in explore.rs Collapsed nested if statements into single conditions using let-chains (if a && let Ok(b) = ...). Fixes CI clippy failures on both macOS and Ubuntu. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/vestige-mcp/src/tools/explore.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/crates/vestige-mcp/src/tools/explore.rs b/crates/vestige-mcp/src/tools/explore.rs index 1fddc49..50fdd24 100644 --- a/crates/vestige-mcp/src/tools/explore.rs +++ b/crates/vestige-mcp/src/tools/explore.rs @@ -120,8 +120,7 @@ pub async fn execute( all_associations.truncate(limit); // Fallback: if in-memory modules are empty, query storage directly - if all_associations.is_empty() { - if let Ok(connections) = storage.get_connections_for_memory(&from_owned) { + if all_associations.is_empty() && let Ok(connections) = storage.get_connections_for_memory(&from_owned) { for conn in connections.iter().take(limit) { let other_id = if conn.source_id == from_owned { &conn.target_id @@ -135,7 +134,6 @@ pub async fn execute( "source": "persistent_graph", })); } - } } Ok(serde_json::json!({ @@ -193,15 +191,13 @@ fn build_temp_chain_builder(storage: &Arc, from_id: &str, to_id: &str) let mut seen_ids = std::collections::HashSet::new(); for conn in &all_conns { for id in [&conn.source_id, &conn.target_id] { - if seen_ids.insert(id.clone()) { - if let Ok(Some(node)) = storage.get_node(id) { - builder.add_memory(MemoryNode { - id: node.id.clone(), - content_preview: node.content.chars().take(100).collect(), - tags: node.tags.clone(), - connections: vec![], - }); - } + if seen_ids.insert(id.clone()) && let Ok(Some(node)) = storage.get_node(id) { + builder.add_memory(MemoryNode { + id: node.id.clone(), + content_preview: node.content.chars().take(100).collect(), + tags: node.tags.clone(), + connections: vec![], + }); } } } From 9c022a0f542790c1c6eb4ef4fb0dcefaf2bbc83f Mon Sep 17 00:00:00 2001 From: NoahToKnow <124620394+NoahToKnow@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:09:56 -0600 Subject: [PATCH 09/49] fix(deep_reference): incorporate query relevance into recommended/confidence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Stage 8 `recommended` selector and the evidence sort both rank by FSRS-6 trust only, discarding the `combined_score` signal that the upstream hybrid_search + cross-encoder reranker just computed. Confidence is then derived from `recommended.trust + evidence_count`, neither of which moves with the query — so any query against the same corpus returns the same primary memory and the same confidence score. Empirical reproduction (15 deep_reference probes against an 11-memory corpus, 9 with a unique correct answer + 6 with no relevant memories): - Distinct primary memories returned : 1 / 15 - Confidence values returned : 1 distinct (0.82 for all) - Ground-truth accuracy on specific queries : 1 / 9 (11.1%) The single hit is coincidental: the always-returned memory happened to be the correct answer for one query. Random guessing across the 11-memory corpus would be ~9% baseline, so the tool is performing at random. Fix --- Replace trust-only ranking at three sites with a 50/50 composite of combined_score (query relevance) and FSRS-6 trust: let composite = |s: &ScoredMemory| s.combined_score as f64 * 0.5 + s.trust * 0.5; Used in: - cross_reference.rs:573 — `recommended` max_by - cross_reference.rs:589 — `non_superseded` evidence sort_by - cross_reference.rs:622 — `base_confidence` formula The 50/50 weighting is a design choice — see PR body for the knob to tweak if a different blend is preferred. The pre-existing updated_at tiebreaker is preserved. Tests ----- Two regression tests, both verified to FAIL on `main` and PASS with the fix via negative control (temporarily set the composite weights to 1.0 trust + 0.0 relevance and confirmed both tests fail again): - test_recommended_uses_query_relevance_not_just_trust Two-memory corpus, ingested in order so the off-topic memory wins the trust tiebreaker. Query targets the on-topic memory. The fix ensures `recommended` is the on-topic one. - test_confidence_varies_with_query_relevance Single-memory corpus. Identical execute() calls with a relevant query and an irrelevant query. The fix ensures the relevant query produces higher confidence. Full crate suite: 410 / 410 passing (was 408 + 2 new). Out of scope ------------ While running the live MCP probes I observed two further inconsistencies in `cross_reference.rs` that I cannot reproduce in cargo test (the synthetic test environment with mock embeddings does not trigger the required combined_score > 0.2 floor condition): - The `effective_sim` floor at line 551 fabricates contradictions between memories with no real topical overlap when one contains a CORRECTION_SIGNALS keyword. - The Stage 5 `contradictions` field (strict) and the Stage 7 `pair_relations` feeding the reasoning text (loose, post-floor) disagree, producing responses where `reasoning` claims N contradictions while `contradictions` is empty and `status` is "resolved". I have empirical data for both from live MCP usage but no reproducible cargo test, so they are intentionally not addressed in this PR. Happy to file them as a separate issue with the raw probe data if useful. --- .../vestige-mcp/src/tools/cross_reference.rs | 155 +++++++++++++++++- 1 file changed, 146 insertions(+), 9 deletions(-) diff --git a/crates/vestige-mcp/src/tools/cross_reference.rs b/crates/vestige-mcp/src/tools/cross_reference.rs index 6cfc3f5..257122b 100644 --- a/crates/vestige-mcp/src/tools/cross_reference.rs +++ b/crates/vestige-mcp/src/tools/cross_reference.rs @@ -568,21 +568,33 @@ pub async fn execute( // ==================================================================== // STAGE 8: Synthesis + Reasoning Chain Generation // ==================================================================== - // Find the recommended answer: highest trust, not superseded, most recent - let recommended = scored.iter() + // Composite score: half query relevance (combined_score from + // hybrid_search + reranker) and half FSRS-6 trust. Both signals belong + // in the recommended pick — relevance picks the right *topic*, trust + // picks the most reliable variant within that topic. + let composite = |s: &ScoredMemory| s.combined_score as f64 * 0.5 + s.trust * 0.5; + + // Find the recommended answer: highest composite, not superseded, most recent + let recommended = scored + .iter() .filter(|s| !superseded_ids.contains(&s.id)) .max_by(|a, b| { - // Primary: trust. Secondary: date. - a.trust.partial_cmp(&b.trust) + composite(a) + .partial_cmp(&composite(b)) .unwrap_or(std::cmp::Ordering::Equal) .then_with(|| a.updated_at.cmp(&b.updated_at)) }); - // Build evidence list (top memories by trust, not superseded) - let mut non_superseded: Vec<&ScoredMemory> = scored.iter() + // Build evidence list (top memories by composite, not superseded) + let mut non_superseded: Vec<&ScoredMemory> = scored + .iter() .filter(|s| !superseded_ids.contains(&s.id)) .collect(); - non_superseded.sort_by(|a, b| b.trust.partial_cmp(&a.trust).unwrap_or(std::cmp::Ordering::Equal)); + non_superseded.sort_by(|a, b| { + composite(b) + .partial_cmp(&composite(a)) + .unwrap_or(std::cmp::Ordering::Equal) + }); let evidence: Vec = non_superseded.iter() .take(10) .enumerate() @@ -605,8 +617,10 @@ pub async fn execute( .collect(); evolution.truncate(15); // cap timeline length - // Confidence scoring - let base_confidence = recommended.map(|r| r.trust).unwrap_or(0.0); + // Confidence scoring: derived from the same composite as `recommended`, + // so confidence actually moves with query relevance instead of being a + // function of trust + corpus size alone. + let base_confidence = recommended.map(composite).unwrap_or(0.0); let agreement_boost = (evidence.len() as f64 * 0.03).min(0.2); let contradiction_penalty = contradictions.len() as f64 * 0.1; let confidence = (base_confidence + agreement_boost - contradiction_penalty).clamp(0.0, 1.0); @@ -685,6 +699,129 @@ pub async fn execute( #[cfg(test)] mod tests { use super::*; + use crate::cognitive::CognitiveEngine; + use std::sync::Arc; + use tempfile::TempDir; + use tokio::sync::Mutex; + use vestige_core::Storage; + + fn test_cognitive() -> Arc> { + Arc::new(Mutex::new(CognitiveEngine::new())) + } + + async fn test_storage() -> (Arc, TempDir) { + let dir = TempDir::new().unwrap(); + let storage = Storage::new(Some(dir.path().join("test.db"))).unwrap(); + (Arc::new(storage), dir) + } + + async fn ingest_one(storage: &Arc, content: &str, tags: &[&str]) -> String { + storage + .ingest(vestige_core::IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: tags.iter().map(|s| s.to_string()).collect(), + valid_from: None, + valid_until: None, + }) + .unwrap() + .id + } + + // ======================================================================== + // BUG A: `recommended` is picked by FSRS trust only, ignoring query relevance. + // ======================================================================== + #[tokio::test] + async fn test_recommended_uses_query_relevance_not_just_trust() { + let (storage, _dir) = test_storage().await; + + let id_a = ingest_one( + &storage, + "PostgreSQL connection pooling with pgbouncer transaction mode \ + requires careful tuning of max_connections and pool_mode settings.", + &["postgres", "database"], + ) + .await; + + tokio::time::sleep(std::time::Duration::from_millis(10)).await; + + let _id_b = ingest_one( + &storage, + "Making sourdough bread requires a mature starter, long bulk \ + fermentation, and attention to dough hydration levels.", + &["baking", "bread"], + ) + .await; + + let args = serde_json::json!({ + "query": "PostgreSQL connection pooling pgbouncer max_connections" + }); + let result = execute(&storage, &test_cognitive(), Some(args)) + .await + .expect("execute should succeed"); + + assert_eq!( + result["recommended"]["memory_id"].as_str(), + Some(id_a.as_str()), + "Expected recommended={} (matches query). Got {:?}. \ + Root cause: lines 565-572 select `recommended` by trust only, \ + discarding the combined_score signal from hybrid_search + reranker.", + id_a, + result["recommended"]["memory_id"] + ); + } + + // ======================================================================== + // Confidence sanity: must vary with query relevance. + // ======================================================================== + #[tokio::test] + async fn test_confidence_varies_with_query_relevance() { + let (storage, _dir) = test_storage().await; + + ingest_one( + &storage, + "The Borrow Checker enforces Rust's ownership rules at compile time, \ + preventing data races and use-after-free without a garbage collector.", + &["rust"], + ) + .await; + + let relevant = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ + "query": "Rust borrow checker ownership compile time" + })), + ) + .await + .expect("execute should succeed"); + + let irrelevant = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ + "query": "18th century Dutch maritime trade routes" + })), + ) + .await + .expect("execute should succeed"); + + let rel_conf = relevant["confidence"].as_f64().unwrap_or(0.0); + let irr_conf = irrelevant["confidence"].as_f64().unwrap_or(0.0); + + assert!( + rel_conf > irr_conf, + "Confidence should be higher for a relevant query. Got \ + relevant={}, irrelevant={}. Currently `confidence` derives from \ + recommended.trust + evidence count (lines 602-605), both \ + invariant under query changes.", + rel_conf, + irr_conf + ); + } #[test] fn test_schema_structure() { From b5892fc7234d93e849cb3c08ebe0626edf8b6dad Mon Sep 17 00:00:00 2001 From: Matthias Queitsch Date: Sat, 11 Apr 2026 08:21:53 +0200 Subject: [PATCH 10/49] build: allow building on older glibc versions --- Cargo.lock | 136 +++------------------------------ crates/vestige-core/Cargo.toml | 12 ++- crates/vestige-mcp/Cargo.toml | 5 +- 3 files changed, 26 insertions(+), 127 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eed599a..38d2b64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2073,15 +2073,6 @@ dependencies = [ "web-time", ] -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - [[package]] name = "inotify" version = "0.11.0" @@ -2287,6 +2278,16 @@ dependencies = [ "windows-link", ] +[[package]] +name = "libloading" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" +dependencies = [ + "cfg-if", + "windows-link", +] + [[package]] name = "libm" version = "0.2.16" @@ -2476,15 +2477,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "metal" version = "0.29.0" @@ -2956,6 +2948,7 @@ version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5df903c0d2c07b56950f1058104ab0c8557159f2741782223704de9be73c3c" dependencies = [ + "libloading 0.9.0", "ndarray", "ort-sys", "smallvec", @@ -3206,69 +3199,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "pyo3" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5203598f366b11a02b13aa20cab591229ff0a89fd121a308a5df751d5fc9219" -dependencies = [ - "cfg-if", - "indoc", - "libc", - "memoffset", - "once_cell", - "portable-atomic", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99636d423fa2ca130fa5acde3059308006d46f98caac629418e53f7ebb1e9999" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78f9cf92ba9c409279bc3305b5409d90db2d2c22392d443a87df3a1adad59e33" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b999cb1a6ce21f9a6b147dcf1be9ffedf02e0043aec74dc390f3007047cecd9" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822ece1c7e1012745607d5cf0bcb2874769f0f7cb34c4cde03b9358eb9ef911a" -dependencies = [ - "heck", - "proc-macro2", - "pyo3-build-config", - "quote", - "syn", -] - [[package]] name = "qoi" version = "0.4.1" @@ -3989,12 +3919,6 @@ dependencies = [ "libc", ] -[[package]] -name = "target-lexicon" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca" - [[package]] name = "tempfile" version = "3.25.0" @@ -4370,7 +4294,7 @@ checksum = "76b761acf8af3494640d826a8609e2265e19778fb43306c7f15379c78c9b05b0" dependencies = [ "gemm 0.18.2", "half", - "libloading", + "libloading 0.8.9", "memmap2", "num", "num-traits", @@ -4442,12 +4366,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" -[[package]] -name = "unindent" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" - [[package]] name = "untrusted" version = "0.9.0" @@ -4585,30 +4503,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "vestige-agent" -version = "0.1.0" -dependencies = [ - "chrono", - "rand", - "serde", - "serde_json", - "tempfile", - "thiserror 2.0.18", - "tracing", - "uuid", - "xxhash-rust", -] - -[[package]] -name = "vestige-agent-py" -version = "0.1.0" -dependencies = [ - "pyo3", - "serde_json", - "vestige-agent", -] - [[package]] name = "vestige-core" version = "2.0.4" @@ -5235,12 +5129,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" -[[package]] -name = "xxhash-rust" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" - [[package]] name = "y4m" version = "0.8.0" diff --git a/crates/vestige-core/Cargo.toml b/crates/vestige-core/Cargo.toml index 0e21883..193ad84 100644 --- a/crates/vestige-core/Cargo.toml +++ b/crates/vestige-core/Cargo.toml @@ -22,11 +22,19 @@ bundled-sqlite = ["rusqlite/bundled"] encryption = ["rusqlite/bundled-sqlcipher"] # Core embeddings with fastembed (ONNX-based, local inference) -embeddings = ["dep:fastembed"] +# Downloads a pre-built ONNX Runtime binary at build time (requires glibc >= 2.38) +embeddings = ["dep:fastembed", "fastembed/ort-download-binaries-native-tls"] # HNSW vector search with USearch (20x faster than FAISS) vector-search = ["dep:usearch"] +# Use runtime-loaded ORT instead of the downloaded pre-built binary. +# Required on systems with glibc < 2.38 (Ubuntu 22.04, Debian 12, RHEL/Rocky 9). +# Mutually exclusive with the default `embeddings` feature's download strategy. +# Usage: --no-default-features --features ort-dynamic,vector-search,bundled-sqlite +# Runtime requirement: libonnxruntime.so must be on LD_LIBRARY_PATH or ORT_DYLIB_PATH set. +ort-dynamic = ["dep:fastembed", "fastembed/ort-load-dynamic", "fastembed/hf-hub-native-tls", "fastembed/image-models"] + # Nomic Embed Text v2 MoE (475M params, 305M active, Candle backend) # Requires: fastembed with nomic-v2-moe feature nomic-v2 = ["embeddings", "fastembed/nomic-v2-moe"] @@ -77,7 +85,7 @@ notify = "8" # ============================================================================ # nomic-embed-text-v1.5: 768 dimensions, 8192 token context, Matryoshka support # v5.11: Adds Nomic v2 MoE (nomic-v2-moe feature) + Qwen3 reranker (qwen3 feature) -fastembed = { version = "5.11", optional = true } +fastembed = { version = "5.11", default-features = false, features = ["hf-hub-native-tls", "image-models"], optional = true } # ============================================================================ # OPTIONAL: Vector Search (USearch - HNSW, 20x faster than FAISS) diff --git a/crates/vestige-mcp/Cargo.toml b/crates/vestige-mcp/Cargo.toml index f0c7133..f93ef2c 100644 --- a/crates/vestige-mcp/Cargo.toml +++ b/crates/vestige-mcp/Cargo.toml @@ -13,6 +13,9 @@ repository = "https://github.com/samvallad33/vestige" default = ["embeddings", "vector-search"] embeddings = ["vestige-core/embeddings"] vector-search = ["vestige-core/vector-search"] +# For systems with glibc < 2.38 — use runtime-loaded ORT instead of the downloaded pre-built binary. +# Usage: cargo install --path crates/vestige-mcp --no-default-features --features ort-dynamic,vector-search +ort-dynamic = ["vestige-core/ort-dynamic"] [[bin]] name = "vestige-mcp" @@ -32,7 +35,7 @@ path = "src/bin/cli.rs" # ============================================================================ # Includes: FSRS-6, spreading activation, synaptic tagging, hippocampal indexing, # memory states, context memory, importance signals, dreams, and more -vestige-core = { version = "2.0.4", path = "../vestige-core", default-features = false, features = ["bundled-sqlite"] } +vestige-core = { version = "2.0.4", path = "../vestige-core", default-features = false, features = ["bundled-sqlite", "embeddings", "vector-search"] } # ============================================================================ # MCP Server Dependencies From 5f4f2fe8a6fb967b962ebf18bbc863f14832add3 Mon Sep 17 00:00:00 2001 From: Aleksei Savin Date: Sat, 11 Apr 2026 22:44:03 +0300 Subject: [PATCH 11/49] feat(mcp): add VESTIGE_DASHBOARD_ENABLED with default false - Dashboard now disabled by default to reduce memory footprint - Enable with VESTIGE_DASHBOARD_ENABLED=true - Update --help text to document new env var --- crates/vestige-mcp/src/main.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/crates/vestige-mcp/src/main.rs b/crates/vestige-mcp/src/main.rs index b594b0e..3be0a17 100644 --- a/crates/vestige-mcp/src/main.rs +++ b/crates/vestige-mcp/src/main.rs @@ -48,6 +48,7 @@ use server::McpServer; struct Config { data_dir: Option, http_port: u16, + dashboard_enabled: bool, } /// Parse command-line arguments into a `Config`. @@ -59,6 +60,9 @@ fn parse_args() -> Config { .ok() .and_then(|s| s.parse().ok()) .unwrap_or(3928); + let dashboard_enabled = std::env::var("VESTIGE_DASHBOARD_ENABLED") + .map(|v| v.eq_ignore_ascii_case("true") || v == "1") + .unwrap_or(false); let mut i = 1; while i < args.len() { @@ -81,6 +85,7 @@ fn parse_args() -> Config { println!(" RUST_LOG Log level filter (e.g., debug, info, warn, error)"); println!(" VESTIGE_AUTH_TOKEN Override the bearer token for HTTP transport"); println!(" VESTIGE_HTTP_PORT HTTP transport port (default: 3928)"); + println!(" VESTIGE_DASHBOARD_ENABLED Enable dashboard (default: disabled)"); println!(" VESTIGE_DASHBOARD_PORT Dashboard port (default: 3927)"); println!(); println!("EXAMPLES:"); @@ -148,7 +153,7 @@ fn parse_args() -> Config { i += 1; } - Config { data_dir, http_port } + Config { data_dir, http_port, dashboard_enabled } } #[tokio::main] @@ -271,7 +276,7 @@ async fn main() { let (event_tx, _) = tokio::sync::broadcast::channel::(1024); // Spawn dashboard HTTP server alongside MCP server (now with CognitiveEngine access) - { + if config.dashboard_enabled { let dashboard_port = std::env::var("VESTIGE_DASHBOARD_PORT") .ok() .and_then(|s| s.parse::().ok()) @@ -294,6 +299,8 @@ async fn main() { } } }); + } else { + info!("Dashboard disabled by VESTIGE_DASHBOARD_ENABLED=false"); } // Start HTTP MCP transport (Streamable HTTP for Claude.ai / remote clients) From df6d819add8f5d2e7ba59dcdf0ef815d422ae067 Mon Sep 17 00:00:00 2001 From: Matthias Queitsch Date: Mon, 13 Apr 2026 19:15:31 +0200 Subject: [PATCH 12/49] feat: dream connection eviction uses composite score instead of FIFO --- crates/vestige-core/src/advanced/dreams.rs | 36 ++++++++++++++++++-- crates/vestige-mcp/src/dashboard/handlers.rs | 12 +++++-- crates/vestige-mcp/src/tools/dream.rs | 20 ++++++++--- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/crates/vestige-core/src/advanced/dreams.rs b/crates/vestige-core/src/advanced/dreams.rs index 88a86ce..a4ddac5 100644 --- a/crates/vestige-core/src/advanced/dreams.rs +++ b/crates/vestige-core/src/advanced/dreams.rs @@ -1076,6 +1076,9 @@ pub struct DiscoveredConnection { pub connection_type: DiscoveredConnectionType, /// Reasoning for this connection pub reasoning: String, + /// When this connection was discovered (used for recency scoring during eviction) + #[serde(default = "Utc::now")] + pub discovered_at: DateTime, } /// Types of connections discovered during dreaming @@ -1277,6 +1280,7 @@ impl MemoryDreamer { similarity, connection_type, reasoning, + discovered_at: Utc::now(), }); } } @@ -1699,10 +1703,38 @@ impl MemoryDreamer { fn store_connections(&self, connections: &[DiscoveredConnection]) { if let Ok(mut stored) = self.connections.write() { stored.extend(connections.iter().cloned()); - // Keep last 1000 connections + // Keep the 1000 highest-scoring connections using a composite score + // that balances quality (similarity) and recency (age-based decay). + // + // score = similarity * 0.6 + recency * 0.4 + // + // Recency uses exponential decay with a 7-day half-life: + // recency = 0.5 ^ (age_days / 7.0) + // + // This means: + // - A brand-new connection with similarity 0.5 scores 0.70 + // - A week-old connection with similarity 0.9 scores 0.74 + // - A month-old connection with similarity 0.9 scores 0.58 + // Strong old connections are retained longer than weak new ones, + // but eventually yield to fresh high-quality discoveries. let len = stored.len(); if len > 1000 { - stored.drain(0..(len - 1000)); + let now = Utc::now(); + stored.sort_unstable_by(|a, b| { + let score = |c: &DiscoveredConnection| -> f64 { + let age_days = now + .signed_duration_since(c.discovered_at) + .num_seconds() + .max(0) as f64 + / 86_400.0; + let recency = (0.5_f64).powf(age_days / 7.0); + c.similarity * 0.6 + recency * 0.4 + }; + score(b) + .partial_cmp(&score(a)) + .unwrap_or(std::cmp::Ordering::Equal) + }); + stored.truncate(1000); } } } diff --git a/crates/vestige-mcp/src/dashboard/handlers.rs b/crates/vestige-mcp/src/dashboard/handlers.rs index 375664a..af65cc6 100644 --- a/crates/vestige-mcp/src/dashboard/handlers.rs +++ b/crates/vestige-mcp/src/dashboard/handlers.rs @@ -539,17 +539,23 @@ pub async fn trigger_dream( // Run dream through CognitiveEngine let cog = cognitive.lock().await; - let pre_dream_count = cog.dreamer.get_connections().len(); + // Capture start time before the dream — composite-score eviction in store_connections + // reorders the buffer, making positional slicing (pre_dream_count..) unreliable. + let dream_start = Utc::now(); let dream_result = cog.dreamer.dream(&dream_memories).await; let insights = cog.dreamer.synthesize_insights(&dream_memories); let all_connections = cog.dreamer.get_connections(); drop(cog); // Persist new connections - let new_connections = &all_connections[pre_dream_count..]; + // Filter by timestamp — same approach as dream.rs to avoid positional index issues. + let new_connections: Vec<&vestige_core::DiscoveredConnection> = all_connections + .iter() + .filter(|c| c.discovered_at >= dream_start) + .collect(); let mut connections_persisted = 0u64; let now = Utc::now(); - for conn in new_connections { + for conn in new_connections.iter() { let link_type = match conn.connection_type { vestige_core::DiscoveredConnectionType::Semantic => "semantic", vestige_core::DiscoveredConnectionType::SharedConcept => "shared_concepts", diff --git a/crates/vestige-mcp/src/tools/dream.rs b/crates/vestige-mcp/src/tools/dream.rs index 253a367..ac9c479 100644 --- a/crates/vestige-mcp/src/tools/dream.rs +++ b/crates/vestige-mcp/src/tools/dream.rs @@ -89,7 +89,12 @@ pub async fn execute( }).collect(); let cog = cognitive.lock().await; - let pre_dream_count = cog.dreamer.get_connections().len(); + // Capture start time before the dream so we can identify newly discovered + // connections by timestamp rather than by buffer position. This is robust + // against the composite-score eviction sort in store_connections, which + // reorders the buffer and makes positional slicing (pre_dream_count..) + // unreliable. + let dream_start = Utc::now(); let dream_result = cog.dreamer.dream(&dream_memories).await; let insights = cog.dreamer.synthesize_insights(&dream_memories); let all_connections = cog.dreamer.get_connections(); @@ -115,12 +120,17 @@ pub async fn execute( } } - // v1.9.0: Persist only NEW connections from this dream (skip accumulated ones) - let new_connections = all_connections.get(pre_dream_count..).unwrap_or(&[]); + // Identify new connections from this dream by timestamp rather than buffer + // position — positional slicing is broken after composite-score eviction + // reorders the buffer. + let new_connections: Vec<&vestige_core::DiscoveredConnection> = all_connections + .iter() + .filter(|c| c.discovered_at >= dream_start) + .collect(); let mut connections_persisted = 0u64; { let now = Utc::now(); - for conn in new_connections { + for conn in new_connections.iter() { let link_type = match conn.connection_type { vestige_core::DiscoveredConnectionType::Semantic => "semantic", vestige_core::DiscoveredConnectionType::SharedConcept => "shared_concepts", @@ -162,7 +172,7 @@ pub async fn execute( // Hydrate live cognitive engine with newly persisted connections if connections_persisted > 0 { let mut cog = cognitive.lock().await; - for conn in new_connections { + for conn in new_connections.iter() { let link_type_enum = match conn.connection_type { vestige_core::DiscoveredConnectionType::Semantic => LinkType::Semantic, vestige_core::DiscoveredConnectionType::SharedConcept => LinkType::Semantic, From f3e25f75030a68da044f088a9b1fefcd1ec10ead Mon Sep 17 00:00:00 2001 From: Bot Date: Tue, 7 Apr 2026 15:32:28 -0500 Subject: [PATCH 13/49] fix: push type filters into SQL WHERE clause + expose in MCP search Type filtering (include_types/exclude_types) was applied post-fetch after the database LIMIT, which could return zero results when all top-N results were of the filtered type. This pushes type filters into the SQL WHERE clause in keyword_search_with_scores() so they apply before the limit. Semantic results still get post-fetch filtering as a safety net since the vector index cannot filter by type. Also adds hybrid_search_filtered() as the new primary method, with the original hybrid_search() delegating to it with no filters for backward compatibility. The MCP search tool now exposes include_types and exclude_types parameters. Includes 5 new test cases covering include, exclude, precedence, empty results, and backward compatibility. Co-Authored-By: Claude Opus 4.6 (1M context) --- Cargo.lock | 605 +++++++++--------- crates/vestige-core/src/storage/sqlite.rs | 251 +++++++- .../vestige-mcp/src/tools/search_unified.rs | 23 +- 3 files changed, 565 insertions(+), 314 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38d2b64..416a6f6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -72,9 +72,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -87,15 +87,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -122,9 +122,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arbitrary" @@ -298,9 +298,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "bitstream-io" @@ -343,9 +343,9 @@ checksum = "f4ad8f11f288f48ca24471bbd51ac257aaeaaa07adae295591266b792902ae64" [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytemuck" @@ -387,9 +387,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "candle-core" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15b675b80d994b2eadb20a4bbe434eabeb454eac3ee5e2b4cf6f147ee9be091" +checksum = "6bd9895436c1ba5dc1037a19935d084b838db066ff4e15ef7dded020b7c12a4a" dependencies = [ "byteorder", "candle-metal-kernels", @@ -408,15 +408,16 @@ dependencies = [ "rayon", "safetensors 0.7.0", "thiserror 2.0.18", - "yoke 0.8.1", + "tokenizers", + "yoke 0.8.2", "zip", ] [[package]] name = "candle-metal-kernels" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fdfe9d06de16ce49961e49084e5b79a75a9bdf157246e7c7b6328e87a7aa25d" +checksum = "4b6b5a4cae6b4e1ab0efcee4dc05272d11b374a3d1ba121b3a961e36be54ab60" dependencies = [ "half", "objc2", @@ -429,9 +430,9 @@ dependencies = [ [[package]] name = "candle-nn" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3045fa9e7aef8567d209a27d56b692f60b96f4d0569f4c3011f8ca6715c65e03" +checksum = "a9317a09d6530b758990ed7f625ac69ff43653bc9ee28b0464644ad1169ada87" dependencies = [ "candle-core", "candle-metal-kernels", @@ -447,9 +448,9 @@ dependencies = [ [[package]] name = "candle-ug" -version = "0.9.2" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d62be69068bf58987a45f690612739d8d2ea1bf508c1b87dc6815a019575d" +checksum = "ca0fc3167cbc99c8ec1be618cb620aa21dca95038f118c3579a79370e3dc5f77" dependencies = [ "ug", "ug-metal", @@ -472,9 +473,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.55" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -490,9 +491,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -531,9 +532,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.58" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63be97961acde393029492ce0be7a1af7e323e6bae9511ebfac33751be5e6806" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -541,9 +542,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.58" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f13174bda5dfd69d7e947827e5af4b0f2f94a4a3ee92912fba07a66150f21e2" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -553,9 +554,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -565,9 +566,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "codespan-reporting" @@ -588,9 +589,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "colored" @@ -639,6 +640,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -652,7 +663,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "libc", ] @@ -874,9 +885,9 @@ checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] name = "der" -version = "0.7.10" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b" dependencies = [ "pem-rfc7468", "zeroize", @@ -955,11 +966,11 @@ dependencies = [ [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "objc2", ] @@ -1094,9 +1105,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastembed" -version = "5.11.0" +version = "5.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4339d45a80579ab8305616a501eacdbf18fb0f7def7fa6e4c0b75941416d5b0" +checksum = "1f54fc1188b7f7eac8f47be2ab7b3a79ffd842cc8ff2e38316dd59ba4858890e" dependencies = [ "anyhow", "candle-core", @@ -1113,9 +1124,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fax" @@ -1164,9 +1175,9 @@ dependencies = [ [[package]] name = "float8" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719a903cc23e4a89e87962c2a80fdb45cdaad0983a89bd150bb57b4c8571a7d5" +checksum = "c2d1f04709a8ac06e8e8042875a3c466cc4832d3c1a18dbcb9dba3c6e83046bc" dependencies = [ "half", "num-traits", @@ -1254,30 +1265,30 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -1286,21 +1297,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-core", "futures-io", @@ -1309,7 +1320,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -1580,28 +1590,28 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] [[package]] name = "gif" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5df2ba84018d80c213569363bdcd0c64e6933c67fe4c1d60ecf822971a3c35e" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", "weezl", @@ -1613,11 +1623,11 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", "libgit2-sys", "log", - "openssl-probe", + "openssl-probe 0.1.6", "openssl-sys", "url", ] @@ -1678,6 +1688,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "hashlink" version = "0.11.0" @@ -1722,9 +1738,9 @@ dependencies = [ [[package]] name = "hmac-sha256" -version = "1.1.13" +version = "1.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f0ae375a85536cac3a243e3a9cda80a47910348abdea7e2c22f8ec556d586d" +checksum = "ec9d92d097f4749b64e8cc33d924d9f40a2d4eb91402b458014b781f5733d60f" [[package]] name = "http" @@ -1773,9 +1789,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1788,7 +1804,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1877,22 +1892,23 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", - "yoke 0.8.1", + "utf8_iter", + "yoke 0.8.2", "zerofrom", "zerovec", ] [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1903,9 +1919,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1917,15 +1933,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1937,20 +1953,20 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", "writeable", - "yoke 0.8.1", + "yoke 0.8.2", "zerofrom", "zerotrie", "zerovec", @@ -1991,9 +2007,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -2009,8 +2025,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core 0.5.1", - "zune-jpeg 0.5.12", + "zune-core", + "zune-jpeg", ] [[package]] @@ -2050,12 +2066,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -2075,11 +2091,11 @@ dependencies = [ [[package]] name = "inotify" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "inotify-sys", "libc", ] @@ -2106,15 +2122,15 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -2176,9 +2192,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jobserver" @@ -2192,10 +2208,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -2240,9 +2258,9 @@ checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" [[package]] name = "libc" -version = "0.2.181" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libfuzzer-sys" @@ -2296,11 +2314,10 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.10.0", "libc", ] @@ -2331,9 +2348,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.23" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" dependencies = [ "cc", "libc", @@ -2352,15 +2369,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -2483,7 +2500,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2526,9 +2543,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", @@ -2560,9 +2577,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.11" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -2570,14 +2587,14 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", "openssl", - "openssl-probe", + "openssl-probe 0.2.1", "openssl-sys", "schannel", "security-framework", @@ -2637,7 +2654,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "fsevent-sys", "inotify", "kqueue", @@ -2655,7 +2672,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -2780,9 +2797,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -2793,7 +2810,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "dispatch2", "objc2", ] @@ -2810,7 +2827,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "libc", "objc2", @@ -2823,7 +2840,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "block2", "dispatch2", "objc2", @@ -2833,9 +2850,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -2849,7 +2866,7 @@ version = "6.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336b9c63443aceef14bea841b899035ae3abe89b7c486aaf4c5bd8aafedac3f0" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "libc", "once_cell", "onig_sys", @@ -2884,11 +2901,11 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2915,19 +2932,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] -name = "openssl-src" -version = "300.5.5+3.5.5" +name = "openssl-probe" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "openssl-src" +version = "300.6.0+3.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e8cbfd3a4a8c8f089147fd7aaa33cf8c7450c4d09f8f80698a0cf093abeff4" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" dependencies = [ "cc", "libc", @@ -2953,7 +2976,7 @@ dependencies = [ "ort-sys", "smallvec", "tracing", - "ureq 3.2.0", + "ureq 3.3.0", ] [[package]] @@ -2964,7 +2987,7 @@ checksum = "06503bb33f294c5f1ba484011e053bfa6ae227074bdb841e9863492dc5960d4b" dependencies = [ "hmac-sha256", "lzma-rust2", - "ureq 3.2.0", + "ureq 3.3.0", ] [[package]] @@ -3010,9 +3033,9 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "pem-rfc7468" -version = "0.7.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +checksum = "a6305423e0e7738146434843d1694d621cce767262b2a86910beab705e4493d9" dependencies = [ "base64ct", ] @@ -3025,15 +3048,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkg-config" @@ -3071,11 +3088,11 @@ dependencies = [ [[package]] name = "png" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "crc32fast", "fdeflate", "flate2", @@ -3090,18 +3107,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3192,12 +3209,9 @@ checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" [[package]] name = "pxfm" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7186d3822593aa4393561d186d1393b3923e9d6163d3fbfd6e825e3e6cf3e6a8" -dependencies = [ - "num-traits", -] +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" [[package]] name = "qoi" @@ -3216,9 +3230,9 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -3230,10 +3244,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] -name = "rand" -version = "0.9.2" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166" dependencies = [ "rand_chacha", "rand_core", @@ -3305,9 +3325,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -3324,7 +3344,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -3376,7 +3396,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -3415,9 +3435,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" @@ -3464,9 +3484,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.52" +version = "0.8.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" [[package]] name = "ring" @@ -3498,7 +3518,7 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c93dd1c9683b438c392c492109cb702b8090b2bfc8fed6f6e4eb4523f17af3" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "chrono", "fallible-iterator", "fallible-streaming-iterator", @@ -3511,11 +3531,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "errno", "libc", "linux-raw-sys", @@ -3524,9 +3544,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "log", "once_cell", @@ -3548,9 +3568,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4" dependencies = [ "ring", "rustls-pki-types", @@ -3601,9 +3621,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -3622,12 +3642,12 @@ checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" [[package]] name = "security-framework" -version = "2.11.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.10.0", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -3635,9 +3655,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -3645,9 +3665,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "seq-macro" @@ -3759,9 +3779,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_helpers" @@ -3786,12 +3806,12 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3855,9 +3875,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.115" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -3890,7 +3910,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01198a2debb237c62b6826ec7081082d951f46dbb64b0e8c7649a452230d1dfc" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "byteorder", "enum-as-inner", "libc", @@ -3904,8 +3924,8 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.10.0", - "core-foundation", + "bitflags 2.11.0", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3921,12 +3941,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.25.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -3992,23 +4012,23 @@ dependencies = [ [[package]] name = "tiff" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ "fax", "flate2", "half", "quick-error", "weezl", - "zune-jpeg 0.4.21", + "zune-jpeg", ] [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4059,9 +4079,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.49.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -4076,9 +4096,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -4153,7 +4173,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "bytes", "futures-util", "http", @@ -4232,9 +4252,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -4329,9 +4349,9 @@ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization-alignments" @@ -4344,9 +4364,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -4394,9 +4414,9 @@ dependencies = [ [[package]] name = "ureq" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc97a28575b85cfedf2a7e7d3cc64b3e11bd8ac766666318003abbacc7a21fc" +checksum = "dea7109cdcd5864d4eeb1b58a1648dc9bf520360d7af16ec26d0a9354bafcfc0" dependencies = [ "base64 0.22.1", "der", @@ -4406,15 +4426,15 @@ dependencies = [ "rustls-pki-types", "socks", "ureq-proto", - "utf-8", + "utf8-zero", "webpki-root-certs", ] [[package]] name = "ureq-proto" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d81f9efa9df032be5934a46a068815a10a042b494b6a58cb0a1a97bb5467ed6f" +checksum = "e994ba84b0bd1b1b0cf92878b7ef898a5c1760108fe7b6010327e274917a808c" dependencies = [ "base64 0.22.1", "http", @@ -4436,9 +4456,9 @@ dependencies = [ [[package]] name = "usearch" -version = "2.23.0" +version = "2.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a03c05af8d678ec19f014c734ab667c20ea54128b4f9a1472cb470246a9b341" +checksum = "09657b7d3d88992d7475be6f345d3cb3b388d13c152dbd4742e0b955e3a2b632" dependencies = [ "cxx", "cxx-build", @@ -4450,6 +4470,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8-zero" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8c0a043c9540bae7c578c88f91dda8bd82e59ae27c21baca69c8b191aaf5a6e" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -4464,11 +4490,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.20.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -4612,9 +4638,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -4625,23 +4651,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4649,9 +4671,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -4662,9 +4684,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -4710,7 +4732,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", "hashbrown 0.15.5", "indexmap", "semver", @@ -4718,9 +4740,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -5093,7 +5115,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.10.0", + "bitflags 2.11.0", "indexmap", "log", "serde", @@ -5125,9 +5147,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "y4m" @@ -5149,12 +5171,12 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", - "yoke-derive 0.8.1", + "yoke-derive 0.8.2", "zerofrom", ] @@ -5172,9 +5194,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5184,18 +5206,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -5204,18 +5226,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5231,31 +5253,31 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", - "yoke 0.8.1", + "yoke 0.8.2", "zerofrom", ] [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ - "yoke 0.8.1", + "yoke 0.8.2", "zerofrom", "zerovec-derive", ] [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -5280,12 +5302,6 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - [[package]] name = "zune-core" version = "0.5.1" @@ -5303,18 +5319,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.21" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" dependencies = [ - "zune-core 0.4.12", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" -dependencies = [ - "zune-core 0.5.1", + "zune-core", ] diff --git a/crates/vestige-core/src/storage/sqlite.rs b/crates/vestige-core/src/storage/sqlite.rs index 52317da..cd0523c 100644 --- a/crates/vestige-core/src/storage/sqlite.rs +++ b/crates/vestige-core/src/storage/sqlite.rs @@ -1392,7 +1392,7 @@ impl Storage { Ok(similarity_results) } - /// Hybrid search + /// Hybrid search (delegates to hybrid_search_filtered with no type filters) #[cfg(all(feature = "embeddings", feature = "vector-search"))] pub fn hybrid_search( &self, @@ -1401,10 +1401,40 @@ impl Storage { keyword_weight: f32, semantic_weight: f32, ) -> Result> { - let keyword_results = self.keyword_search_with_scores(query, limit * 2)?; + self.hybrid_search_filtered(query, limit, keyword_weight, semantic_weight, None, None) + } + + /// Hybrid search with optional type filtering pushed into the storage layer. + /// + /// When `include_types` is `Some`, only nodes whose `node_type` matches one of + /// the given strings are returned. When `exclude_types` is `Some`, nodes whose + /// `node_type` matches are excluded. `include_types` takes precedence over + /// `exclude_types`. Both are case-sensitive and compared against the stored + /// `node_type` value. + #[cfg(all(feature = "embeddings", feature = "vector-search"))] + pub fn hybrid_search_filtered( + &self, + query: &str, + limit: i32, + keyword_weight: f32, + semantic_weight: f32, + include_types: Option<&[String]>, + exclude_types: Option<&[String]>, + ) -> Result> { + let has_type_filter = include_types.is_some() || exclude_types.is_some(); + // Over-fetch more aggressively when type filters are active so that + // after filtering we still have enough candidates to fill `limit`. + let overfetch_factor = if has_type_filter { 4 } else { 2 }; + + let keyword_results = self.keyword_search_with_scores( + query, + limit * overfetch_factor, + include_types, + exclude_types, + )?; let semantic_results = if self.embedding_service.is_ready() { - self.semantic_search_raw(query, limit * 2)? + self.semantic_search_raw(query, limit * overfetch_factor)? } else { vec![] }; @@ -1417,8 +1447,22 @@ impl Storage { let mut results = Vec::with_capacity(limit as usize); - for (node_id, combined_score) in combined.into_iter().take(limit as usize) { + for (node_id, combined_score) in combined.into_iter() { + if results.len() >= limit as usize { + break; + } if let Some(node) = self.get_node(&node_id)? { + // Apply type filtering for results that came from semantic search + // (keyword search already filters in SQL, but semantic search cannot) + if let Some(includes) = include_types { + if !includes.iter().any(|t| t == &node.node_type) { + continue; + } + } else if let Some(excludes) = exclude_types { + if excludes.iter().any(|t| t == &node.node_type) { + continue; + } + } let keyword_score = keyword_results .iter() .find(|(id, _)| id == &node_id) @@ -1486,23 +1530,71 @@ impl Storage { Ok(results) } - /// Keyword search returning scores + /// Keyword search returning scores, with optional type filtering in the SQL query. #[cfg(all(feature = "embeddings", feature = "vector-search"))] - fn keyword_search_with_scores(&self, query: &str, limit: i32) -> Result> { + fn keyword_search_with_scores( + &self, + query: &str, + limit: i32, + include_types: Option<&[String]>, + exclude_types: Option<&[String]>, + ) -> Result> { let sanitized_query = sanitize_fts5_query(query); + // Build the type filter clause and collect parameter values. + // We use numbered parameters: ?1 = query, ?2 = limit, ?3.. = type strings. + let mut type_clause = String::new(); + let type_values: Vec<&str>; + + if let Some(includes) = include_types { + if !includes.is_empty() { + let placeholders: Vec = (0..includes.len()) + .map(|i| format!("?{}", i + 3)) + .collect(); + type_clause = format!(" AND n.node_type IN ({})", placeholders.join(",")); + type_values = includes.iter().map(|s| s.as_str()).collect(); + } else { + type_values = vec![]; + } + } else if let Some(excludes) = exclude_types { + if !excludes.is_empty() { + let placeholders: Vec = (0..excludes.len()) + .map(|i| format!("?{}", i + 3)) + .collect(); + type_clause = format!(" AND n.node_type NOT IN ({})", placeholders.join(",")); + type_values = excludes.iter().map(|s| s.as_str()).collect(); + } else { + type_values = vec![]; + } + } else { + type_values = vec![]; + } + + let sql = format!( + "SELECT n.id, rank FROM knowledge_nodes n + JOIN knowledge_fts fts ON n.id = fts.id + WHERE knowledge_fts MATCH ?1{} + ORDER BY rank + LIMIT ?2", + type_clause + ); + let reader = self.reader.lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT n.id, rank FROM knowledge_nodes n - JOIN knowledge_fts fts ON n.id = fts.id - WHERE knowledge_fts MATCH ?1 - ORDER BY rank - LIMIT ?2", - )?; + let mut stmt = reader.prepare(&sql)?; + + // Build the parameter list: [query, limit, ...type_values] + let mut param_values: Vec> = Vec::new(); + param_values.push(Box::new(sanitized_query.clone())); + param_values.push(Box::new(limit)); + for tv in &type_values { + param_values.push(Box::new(tv.to_string())); + } + let params_ref: Vec<&dyn rusqlite::ToSql> = + param_values.iter().map(|p| p.as_ref()).collect(); let results: Vec<(String, f32)> = stmt - .query_map(params![sanitized_query, limit], |row| { + .query_map(params_ref.as_slice(), |row| { Ok((row.get::<_, String>(0)?, row.get::<_, f64>(1)? as f32)) })? .filter_map(|r| r.ok()) @@ -3836,4 +3928,135 @@ mod tests { // Static method should not panic even if no backups exist let _ = Storage::get_last_backup_timestamp(); } + + #[test] + fn test_keyword_search_with_include_types() { + let storage = create_test_storage(); + + // Ingest nodes of different types all containing the word "quantum" + storage.ingest(IngestInput { + content: "Quantum mechanics is fundamental to physics".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }).unwrap(); + storage.ingest(IngestInput { + content: "Quantum computing uses qubits for calculation".to_string(), + node_type: "concept".to_string(), + ..Default::default() + }).unwrap(); + storage.ingest(IngestInput { + content: "Quantum entanglement was demonstrated in the lab".to_string(), + node_type: "event".to_string(), + ..Default::default() + }).unwrap(); + + // Search with include_types = ["fact"] — should only return the fact + let include = vec!["fact".to_string()]; + let results = storage.hybrid_search_filtered( + "quantum", 10, 0.3, 0.7, + Some(&include), None, + ).unwrap(); + + assert!(!results.is_empty(), "should return at least one result"); + for r in &results { + assert_eq!(r.node.node_type, "fact", + "include_types=[fact] should only return facts, got: {}", r.node.node_type); + } + } + + #[test] + fn test_keyword_search_with_exclude_types() { + let storage = create_test_storage(); + + storage.ingest(IngestInput { + content: "Photosynthesis converts sunlight to energy".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }).unwrap(); + storage.ingest(IngestInput { + content: "Photosynthesis is a complex biochemical process".to_string(), + node_type: "reflection".to_string(), + ..Default::default() + }).unwrap(); + + // Search with exclude_types = ["reflection"] — should skip the reflection + let exclude = vec!["reflection".to_string()]; + let results = storage.hybrid_search_filtered( + "photosynthesis", 10, 0.3, 0.7, + None, Some(&exclude), + ).unwrap(); + + assert!(!results.is_empty(), "should return at least one result"); + for r in &results { + assert_ne!(r.node.node_type, "reflection", + "exclude_types=[reflection] should not return reflections"); + } + } + + #[test] + fn test_include_types_takes_precedence_over_exclude() { + let storage = create_test_storage(); + + storage.ingest(IngestInput { + content: "Gravity holds planets in orbit around stars".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }).unwrap(); + storage.ingest(IngestInput { + content: "Gravity waves were first detected by LIGO".to_string(), + node_type: "event".to_string(), + ..Default::default() + }).unwrap(); + + // When both are provided, include_types wins + let include = vec!["fact".to_string()]; + let exclude = vec!["fact".to_string()]; + let results = storage.hybrid_search_filtered( + "gravity", 10, 0.3, 0.7, + Some(&include), Some(&exclude), + ).unwrap(); + + // include_types takes precedence — facts should be returned + assert!(!results.is_empty()); + for r in &results { + assert_eq!(r.node.node_type, "fact"); + } + } + + #[test] + fn test_type_filter_with_no_matches_returns_empty() { + let storage = create_test_storage(); + + storage.ingest(IngestInput { + content: "DNA carries genetic information in cells".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }).unwrap(); + + // Search for a type that doesn't exist among matches + let include = vec!["person".to_string()]; + let results = storage.hybrid_search_filtered( + "DNA", 10, 0.3, 0.7, + Some(&include), None, + ).unwrap(); + + assert!(results.is_empty(), + "filtering for a non-matching type should return empty results"); + } + + #[test] + fn test_hybrid_search_backward_compat() { + // Ensure the original hybrid_search (no type filters) still works + let storage = create_test_storage(); + + storage.ingest(IngestInput { + content: "Neurons transmit electrical signals in the brain".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }).unwrap(); + + let results = storage.hybrid_search("neurons", 10, 0.3, 0.7).unwrap(); + assert!(!results.is_empty()); + assert!(results[0].node.content.contains("Neurons")); + } } diff --git a/crates/vestige-mcp/src/tools/search_unified.rs b/crates/vestige-mcp/src/tools/search_unified.rs index d8678ed..94ebc00 100644 --- a/crates/vestige-mcp/src/tools/search_unified.rs +++ b/crates/vestige-mcp/src/tools/search_unified.rs @@ -66,6 +66,16 @@ pub fn schema() -> Value { "items": { "type": "string" }, "description": "Optional topics for context-dependent retrieval boosting" }, + "exclude_types": { + "type": "array", + "items": { "type": "string" }, + "description": "Node types to exclude from results (e.g., ['reflection']). Reflections are excluded by default to prevent polluting factual queries." + }, + "include_types": { + "type": "array", + "items": { "type": "string" }, + "description": "If set, only return nodes of these types. Overrides exclude_types." + }, "token_budget": { "type": "integer", "description": "Max tokens for response. Server truncates content to fit budget. Use memory(action='get') for full content of specific IDs. With 1M context models, budgets up to 100K are practical.", @@ -96,6 +106,10 @@ struct SearchArgs { detail_level: Option, #[serde(alias = "context_topics")] context_topics: Option>, + #[serde(alias = "exclude_types")] + exclude_types: Option>, + #[serde(alias = "include_types")] + include_types: Option>, #[serde(alias = "token_budget")] token_budget: Option, #[serde(alias = "retrieval_mode")] @@ -174,7 +188,14 @@ pub async fn execute( let overfetch_limit = (limit * overfetch_multiplier).min(100); // Cap at 100 to avoid excessive DB load let results = storage - .hybrid_search(&args.query, overfetch_limit, keyword_weight, semantic_weight) + .hybrid_search_filtered( + &args.query, + overfetch_limit, + keyword_weight, + semantic_weight, + args.include_types.as_deref(), + args.exclude_types.as_deref(), + ) .map_err(|e| e.to_string())?; // Filter by min_retention and min_similarity first (cheap filters) From 51195cfb766e3f48e1cb5541e177cf0a77ec751f Mon Sep 17 00:00:00 2001 From: Bot Date: Tue, 7 Apr 2026 15:34:35 -0500 Subject: [PATCH 14/49] fix: add keyword-first search (Stage 0) with reranker bypass Exact keyword matches (e.g. unique proper nouns like "Valladares") were buried by semantic scoring in hybrid search. With a small limit, the exact match could be missing entirely from results. Adds a dedicated Stage 0 keyword-only pass (keyword_weight=1.0, semantic_weight=0.0) before the main hybrid search. Results with strong keyword scores (>= 0.8) are collected and merged into the hybrid results via dedup. In the reranker stage, these keyword-priority results bypass the cross-encoder entirely and receive a 2x score boost to survive downstream pipeline stages (temporal, FSRS, utility, competition). Bug inherited from Vestige 2.0.1. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../vestige-mcp/src/tools/search_unified.rs | 123 ++++++++++++++++-- 1 file changed, 109 insertions(+), 14 deletions(-) diff --git a/crates/vestige-mcp/src/tools/search_unified.rs b/crates/vestige-mcp/src/tools/search_unified.rs index 94ebc00..8cadbe2 100644 --- a/crates/vestige-mcp/src/tools/search_unified.rs +++ b/crates/vestige-mcp/src/tools/search_unified.rs @@ -177,6 +177,39 @@ pub async fn execute( let keyword_weight = 0.3_f32; let semantic_weight = 0.7_f32; + // ==================================================================== + // STAGE 0: Keyword-first search (dedicated keyword-only pass) + // ==================================================================== + // Run a small keyword-only search to guarantee strong keyword matches + // survive into the candidate pool, even with small limits/overfetch. + // Without this, exact keyword matches (e.g. unique proper nouns) get + // buried by semantic scoring in the hybrid search. + let keyword_first_limit = 10_i32; + let keyword_priority_threshold: f32 = 0.8; + + let keyword_first_results = storage + .hybrid_search_filtered( + &args.query, + keyword_first_limit, + 1.0, // keyword_weight = 1.0 (keyword-only) + 0.0, // semantic_weight = 0.0 + args.include_types.as_deref(), + args.exclude_types.as_deref(), + ) + .map_err(|e| e.to_string())?; + + // Collect keyword-priority results (keyword_score >= threshold) + let mut keyword_priority_ids: std::collections::HashSet = std::collections::HashSet::new(); + let mut keyword_priority_results: Vec = Vec::new(); + for r in keyword_first_results { + if r.keyword_score.unwrap_or(0.0) >= keyword_priority_threshold + && r.node.retention_strength >= min_retention + { + keyword_priority_ids.insert(r.node.id.clone()); + keyword_priority_results.push(r); + } + } + // ==================================================================== // STAGE 1: Hybrid search with Nx over-fetch for reranking pool // ==================================================================== @@ -214,25 +247,87 @@ pub async fn execute( }) .collect(); + // ==================================================================== + // Dedup: merge Stage 0 keyword-priority results into Stage 1 results + // ==================================================================== + for kp in &keyword_priority_results { + if let Some(existing) = filtered_results.iter_mut().find(|r| r.node.id == kp.node.id) { + // Preserve keyword_score from Stage 0 (keyword-only search is authoritative) + if kp.keyword_score.unwrap_or(0.0) > existing.keyword_score.unwrap_or(0.0) { + existing.keyword_score = kp.keyword_score; + } + if kp.combined_score > existing.combined_score { + existing.combined_score = kp.combined_score; + } + } else { + // New result from Stage 0 not in Stage 1 — add it + filtered_results.push(kp.clone()); + } + } + // ==================================================================== // STAGE 2: Reranker (BM25-like rescoring, trim to requested limit) // ==================================================================== - if let Ok(mut cog) = cognitive.try_lock() { - let candidates: Vec<_> = filtered_results - .iter() - .map(|r| (r.clone(), r.node.content.clone())) - .collect(); + // Keyword bypass: results with strong keyword matches (>= 0.8) skip the + // cross-encoder entirely and are placed above reranked results. This + // prevents the cross-encoder from burying exact/near-exact keyword hits + // (e.g. unique proper nouns) beneath semantically-similar but unrelated + // results. + { + let keyword_bypass_threshold: f32 = 0.8; + let limit_usize = limit as usize; - if let Ok(reranked) = cog.reranker.rerank(&args.query, candidates, Some(limit as usize)) { - // Replace filtered_results with reranked items (preserves original SearchResult) - filtered_results = reranked.into_iter().map(|rr| rr.item).collect(); - } else { - // Reranker failed — fall back to original order, just truncate - filtered_results.truncate(limit as usize); + // Partition: keyword bypass vs. candidates for reranking + let mut bypass_results: Vec = Vec::new(); + let mut rerank_candidates: Vec<(vestige_core::SearchResult, String)> = Vec::new(); + + for r in filtered_results.iter() { + if r.keyword_score.unwrap_or(0.0) >= keyword_bypass_threshold { + bypass_results.push(r.clone()); + } else { + rerank_candidates.push((r.clone(), r.node.content.clone())); + } } - } else { - // Couldn't acquire cognitive lock — truncate to limit - filtered_results.truncate(limit as usize); + + // Boost bypass results so they survive later pipeline stages + // (temporal, FSRS, utility, competition) and the final re-sort. + for r in bypass_results.iter_mut() { + r.combined_score *= 2.0; + } + + bypass_results.sort_by(|a, b| { + b.combined_score + .partial_cmp(&a.combined_score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + + // Rerank the remaining candidates + let reranked_results: Vec = if rerank_candidates.is_empty() { + Vec::new() + } else if let Ok(mut cog) = cognitive.try_lock() { + if let Ok(reranked) = cog.reranker.rerank(&args.query, rerank_candidates, Some(limit_usize)) { + reranked.into_iter().map(|rr| rr.item).collect() + } else { + // Reranker failed — fall back to original order for non-bypass candidates + filtered_results + .iter() + .filter(|r| r.keyword_score.unwrap_or(0.0) < keyword_bypass_threshold) + .cloned() + .collect() + } + } else { + // Couldn't acquire cognitive lock — use original order + filtered_results + .iter() + .filter(|r| r.keyword_score.unwrap_or(0.0) < keyword_bypass_threshold) + .cloned() + .collect() + }; + + // Merge: bypass first, then reranked, trim to limit + filtered_results = bypass_results; + filtered_results.extend(reranked_results); + filtered_results.truncate(limit_usize); } // ==================================================================== From 95bde93b4986973ba9ecf5f256b7dd97103983a8 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Tue, 14 Apr 2026 14:50:03 -0500 Subject: [PATCH 15/49] fix: clippy collapsible-if on hybrid_search type filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI failed on macOS + Ubuntu with clippy::collapsible_if on the else-if branch of the exclude_types filter. Collapse the inner `if` into the `let Some && ...` guard. Semantics preserved — the includes branch is left as-is to keep include/exclude mutually exclusive behavior. Co-Authored-By: Claude Opus 4.6 (1M context) --- crates/vestige-core/src/storage/sqlite.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/vestige-core/src/storage/sqlite.rs b/crates/vestige-core/src/storage/sqlite.rs index cd0523c..244e2ec 100644 --- a/crates/vestige-core/src/storage/sqlite.rs +++ b/crates/vestige-core/src/storage/sqlite.rs @@ -1458,10 +1458,10 @@ impl Storage { if !includes.iter().any(|t| t == &node.node_type) { continue; } - } else if let Some(excludes) = exclude_types { - if excludes.iter().any(|t| t == &node.node_type) { - continue; - } + } else if let Some(excludes) = exclude_types + && excludes.iter().any(|t| t == &node.node_type) + { + continue; } let keyword_score = keyword_results .iter() From 8178beb9613b6cc67d29c7c0991736a9d822be7e Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Tue, 14 Apr 2026 17:30:30 -0500 Subject: [PATCH 16/49] =?UTF-8?q?feat(v2.0.5):=20Intentional=20Amnesia=20?= =?UTF-8?q?=E2=80=94=20active=20forgetting=20via=20top-down=20inhibitory?= =?UTF-8?q?=20control?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First AI memory system to model forgetting as a neuroscience-grounded PROCESS rather than passive decay. Adds the `suppress` MCP tool (#24), Rac1 cascade worker, migration V10, and dashboard forgetting indicators. Based on: - Anderson, Hanslmayr & Quaegebeur (2025), Nat Rev Neurosci — right lateral PFC as the domain-general inhibitory controller; SIF compounds with each stopping attempt. - Cervantes-Sandoval et al. (2020), Front Cell Neurosci PMC7477079 — Rac1 GTPase as the active synaptic destabilization mechanism. What's new: * `suppress` MCP tool — each call compounds `suppression_count` and subtracts a `0.15 × count` penalty (saturating at 80%) from retrieval scores during hybrid search. Distinct from delete (removes) and demote (one-shot). * Rac1 cascade worker — background sweep piggybacks the 6h consolidation loop, walks `memory_connections` edges from recently-suppressed seeds, applies attenuated FSRS decay to co-activated neighbors. You don't just forget Jake — you fade the café, the roommate, the birthday. * 24h labile window — reversible via `suppress({id, reverse: true})` within 24 hours. Matches Nader reconsolidation semantics. * Migration V10 — additive-only (`suppression_count`, `suppressed_at` + partial indices). All v2.0.x DBs upgrade seamlessly on first launch. * Dashboard: `ForgettingIndicator.svelte` pulses when suppressions are active. 3D graph nodes dim to 20% opacity when suppressed. New WebSocket events: `MemorySuppressed`, `MemoryUnsuppressed`, `Rac1CascadeSwept`. Heartbeat carries `suppressed_count`. * Search pipeline: SIF penalty inserted into the accessibility stage so it stacks on top of passive FSRS decay. * Tool count bumped 23 → 24. Cognitive modules 29 → 30. Memories persist — they are INHIBITED, not erased. `memory.get(id)` returns full content through any number of suppressions. The 24h labile window is a grace period for regret. Also fixes issue #31 (dashboard graph view buggy) as a companion UI bug discovered during the v2.0.5 audit cycle: * Root cause: node glow `SpriteMaterial` had no `map`, so `THREE.Sprite` rendered as a solid-coloured 1×1 plane. Additive blending + `UnrealBloomPass(0.8, 0.4, 0.85)` amplified the square edges into hard-edged glowing cubes. * Fix: shared 128×128 radial-gradient `CanvasTexture` singleton used as the sprite map. Retuned bloom to `(0.55, 0.6, 0.2)`. Halved fog density (0.008 → 0.0035). Edges bumped from dark navy `0x4a4a7a` to brand violet `0x8b5cf6` with higher opacity. Added explicit `scene.background` and a 2000-point starfield for depth. * 21 regression tests added in `ui-fixes.test.ts` locking every invariant in (shared texture singleton, depthWrite:false, scale ×6, bloom magic numbers via source regex, starfield presence). Tests: 1,284 Rust (+47) + 171 Vitest (+21) = 1,455 total, 0 failed Clippy: clean across all targets, zero warnings Release binary: 22.6MB, `cargo build --release -p vestige-mcp` green Versions: workspace aligned at 2.0.5 across all 6 crates/packages Closes #31 --- CHANGELOG.md | 62 + Cargo.lock | 4 +- Cargo.toml | 2 +- README.md | 46 +- apps/dashboard/build/_app/env.js.gz | Bin 39 -> 39 bytes .../_app/immutable/assets/0.BChctYiF.css | 1 - .../_app/immutable/assets/0.BChctYiF.css.br | Bin 6712 -> 0 bytes .../_app/immutable/assets/0.BChctYiF.css.gz | Bin 7822 -> 0 bytes .../_app/immutable/assets/0.D08DCOSm.css | 1 + .../_app/immutable/assets/0.D08DCOSm.css.br | Bin 0 -> 6833 bytes .../_app/immutable/assets/0.D08DCOSm.css.gz | Bin 0 -> 7912 bytes .../_app/immutable/assets/5.BBx09UGv.css.gz | Bin 137 -> 138 bytes .../build/_app/immutable/chunks/B0IenmM-.js | 1 + .../_app/immutable/chunks/B0IenmM-.js.br | Bin 0 -> 646 bytes .../_app/immutable/chunks/B0IenmM-.js.gz | Bin 0 -> 672 bytes .../build/_app/immutable/chunks/B17metm1.js | 1 + .../_app/immutable/chunks/B17metm1.js.br | Bin 0 -> 283 bytes .../_app/immutable/chunks/B17metm1.js.gz | Bin 0 -> 319 bytes .../build/_app/immutable/chunks/B6fk3AxI.js | 1 + .../_app/immutable/chunks/B6fk3AxI.js.br | Bin 0 -> 651 bytes .../_app/immutable/chunks/B6fk3AxI.js.gz | Bin 0 -> 732 bytes .../_app/immutable/chunks/BBD-8XME.js.br | Bin 8695 -> 0 bytes .../_app/immutable/chunks/BBD-8XME.js.gz | Bin 9711 -> 0 bytes .../build/_app/immutable/chunks/BBOOwRwQ.js | 1 + .../_app/immutable/chunks/BBOOwRwQ.js.br | 3 + .../_app/immutable/chunks/BBOOwRwQ.js.gz | Bin 0 -> 559 bytes .../build/_app/immutable/chunks/BNytumrp.js | 1 + .../_app/immutable/chunks/BNytumrp.js.br | Bin 0 -> 312 bytes .../_app/immutable/chunks/BNytumrp.js.gz | Bin 0 -> 376 bytes .../build/_app/immutable/chunks/BOVu8he9.js | 1 + .../_app/immutable/chunks/BOVu8he9.js.br | Bin 0 -> 409 bytes .../_app/immutable/chunks/BOVu8he9.js.gz | Bin 0 -> 454 bytes .../build/_app/immutable/chunks/BPtVz5jm.js | 1 + .../_app/immutable/chunks/BPtVz5jm.js.br | Bin 0 -> 527 bytes .../_app/immutable/chunks/BPtVz5jm.js.gz | Bin 0 -> 569 bytes .../build/_app/immutable/chunks/BVZqxpRe.js | 1 - .../_app/immutable/chunks/BVZqxpRe.js.br | Bin 498 -> 0 bytes .../_app/immutable/chunks/BVZqxpRe.js.gz | Bin 562 -> 0 bytes .../_app/immutable/chunks/BcuCGYSa.js.gz | Bin 629 -> 624 bytes .../build/_app/immutable/chunks/BeSd-T80.js | 1 - .../_app/immutable/chunks/BeSd-T80.js.br | Bin 2625 -> 0 bytes .../_app/immutable/chunks/BeSd-T80.js.gz | Bin 2969 -> 0 bytes .../build/_app/immutable/chunks/BexJutgU.js | 1 - .../_app/immutable/chunks/BexJutgU.js.br | Bin 360 -> 0 bytes .../_app/immutable/chunks/BexJutgU.js.gz | Bin 393 -> 0 bytes .../chunks/{CBWLjDtu.js => BgOFZ9jq.js} | 2 +- .../_app/immutable/chunks/BgOFZ9jq.js.br | 1 + .../_app/immutable/chunks/BgOFZ9jq.js.gz | Bin 0 -> 211 bytes .../build/_app/immutable/chunks/BilMa3tw.js | 1 + .../_app/immutable/chunks/BilMa3tw.js.br | Bin 0 -> 1849 bytes .../_app/immutable/chunks/BilMa3tw.js.gz | Bin 0 -> 2013 bytes .../_app/immutable/chunks/Br8WXJxx.js.br | Bin 606 -> 0 bytes .../_app/immutable/chunks/Br8WXJxx.js.gz | Bin 655 -> 0 bytes .../build/_app/immutable/chunks/BxfT1SOA.js | 1 - .../_app/immutable/chunks/BxfT1SOA.js.br | Bin 413 -> 0 bytes .../_app/immutable/chunks/BxfT1SOA.js.gz | Bin 460 -> 0 bytes .../_app/immutable/chunks/Bzak7iHL.js.gz | Bin 96 -> 98 bytes .../build/_app/immutable/chunks/C-QujEl6.js | 1 - .../_app/immutable/chunks/C-QujEl6.js.br | Bin 511 -> 0 bytes .../_app/immutable/chunks/C-QujEl6.js.gz | Bin 585 -> 0 bytes .../build/_app/immutable/chunks/C3ZC25l2.js | 1 + .../_app/immutable/chunks/C3ZC25l2.js.br | Bin 0 -> 362 bytes .../_app/immutable/chunks/C3ZC25l2.js.gz | Bin 0 -> 395 bytes .../chunks/{gqVpgJ8U.js => C3lo34Tx.js} | 2 +- .../_app/immutable/chunks/C3lo34Tx.js.br | Bin 0 -> 881 bytes .../_app/immutable/chunks/C3lo34Tx.js.gz | Bin 0 -> 991 bytes .../build/_app/immutable/chunks/C4L78yoI.js | 2 + .../_app/immutable/chunks/C4L78yoI.js.br | Bin 0 -> 2994 bytes .../_app/immutable/chunks/C4L78yoI.js.gz | Bin 0 -> 3338 bytes .../build/_app/immutable/chunks/C5a--lgk.js | 1 - .../_app/immutable/chunks/C5a--lgk.js.br | Bin 1850 -> 0 bytes .../_app/immutable/chunks/C5a--lgk.js.gz | Bin 2010 -> 0 bytes .../_app/immutable/chunks/CBWLjDtu.js.br | Bin 172 -> 0 bytes .../_app/immutable/chunks/CBWLjDtu.js.gz | Bin 216 -> 0 bytes .../build/_app/immutable/chunks/CKcqngaU.js | 1 - .../_app/immutable/chunks/CKcqngaU.js.br | 2 - .../_app/immutable/chunks/CKcqngaU.js.gz | Bin 675 -> 0 bytes .../build/_app/immutable/chunks/CZ45jJaw.js | 1 - .../_app/immutable/chunks/CZ45jJaw.js.br | Bin 278 -> 0 bytes .../_app/immutable/chunks/CZ45jJaw.js.gz | Bin 338 -> 0 bytes .../build/_app/immutable/chunks/Ck7jSX2P.js | 1 + .../_app/immutable/chunks/Ck7jSX2P.js.br | Bin 0 -> 298 bytes .../_app/immutable/chunks/Ck7jSX2P.js.gz | Bin 0 -> 326 bytes .../build/_app/immutable/chunks/Ckx7gB9J.js | 1 + .../_app/immutable/chunks/Ckx7gB9J.js.br | Bin 0 -> 150 bytes .../_app/immutable/chunks/Ckx7gB9J.js.gz | Bin 0 -> 169 bytes .../build/_app/immutable/chunks/CruZBLYW.js | 1 - .../_app/immutable/chunks/CruZBLYW.js.br | Bin 603 -> 0 bytes .../_app/immutable/chunks/CruZBLYW.js.gz | Bin 689 -> 0 bytes .../build/_app/immutable/chunks/CzkEqL6J.js | 1 - .../_app/immutable/chunks/CzkEqL6J.js.br | Bin 522 -> 0 bytes .../_app/immutable/chunks/CzkEqL6J.js.gz | Bin 565 -> 0 bytes .../build/_app/immutable/chunks/D1BK9eoQ.js | 1 - .../_app/immutable/chunks/D1BK9eoQ.js.br | Bin 317 -> 0 bytes .../_app/immutable/chunks/D1BK9eoQ.js.gz | Bin 340 -> 0 bytes .../chunks/{DBfx-YTU.js => D2QmVWrb.js} | 2 +- .../_app/immutable/chunks/D2QmVWrb.js.br | Bin 0 -> 163 bytes .../_app/immutable/chunks/D2QmVWrb.js.gz | Bin 0 -> 198 bytes .../build/_app/immutable/chunks/DAhpUNCK.js | 1 + .../_app/immutable/chunks/DAhpUNCK.js.br | Bin 0 -> 197 bytes .../_app/immutable/chunks/DAhpUNCK.js.gz | Bin 0 -> 226 bytes .../chunks/{Br8WXJxx.js => DAj0p1rI.js} | 2 +- .../_app/immutable/chunks/DAj0p1rI.js.br | Bin 0 -> 609 bytes .../_app/immutable/chunks/DAj0p1rI.js.gz | Bin 0 -> 650 bytes .../_app/immutable/chunks/DBfx-YTU.js.br | Bin 179 -> 0 bytes .../_app/immutable/chunks/DBfx-YTU.js.gz | Bin 202 -> 0 bytes .../build/_app/immutable/chunks/DNn3Nckx.js | 2 - .../_app/immutable/chunks/DNn3Nckx.js.br | Bin 2987 -> 0 bytes .../_app/immutable/chunks/DNn3Nckx.js.gz | Bin 3349 -> 0 bytes .../build/_app/immutable/chunks/DUC-ssvh.js | 1 - .../_app/immutable/chunks/DUC-ssvh.js.br | Bin 230 -> 0 bytes .../_app/immutable/chunks/DUC-ssvh.js.gz | Bin 265 -> 0 bytes .../build/_app/immutable/chunks/DZuEJlJ5.js | 1 - .../_app/immutable/chunks/DZuEJlJ5.js.br | Bin 178 -> 0 bytes .../_app/immutable/chunks/DZuEJlJ5.js.gz | Bin 170 -> 0 bytes .../build/_app/immutable/chunks/D_N1HvA5.js | 1 + .../_app/immutable/chunks/D_N1HvA5.js.br | 2 + .../_app/immutable/chunks/D_N1HvA5.js.gz | Bin 0 -> 59 bytes .../build/_app/immutable/chunks/DeTA_5mp.js | 1 + .../_app/immutable/chunks/DeTA_5mp.js.br | Bin 0 -> 224 bytes .../_app/immutable/chunks/DeTA_5mp.js.gz | Bin 0 -> 267 bytes .../build/_app/immutable/chunks/DtXypsxD.js | 1 - .../_app/immutable/chunks/DtXypsxD.js.br | 2 - .../_app/immutable/chunks/DtXypsxD.js.gz | Bin 227 -> 0 bytes .../build/_app/immutable/chunks/DwA4GIGc.js | 1 + .../_app/immutable/chunks/DwA4GIGc.js.br | Bin 0 -> 7669 bytes .../_app/immutable/chunks/DwA4GIGc.js.gz | Bin 0 -> 8413 bytes .../build/_app/immutable/chunks/J2LZW-kP.js | 1 + .../_app/immutable/chunks/J2LZW-kP.js.br | Bin 0 -> 510 bytes .../_app/immutable/chunks/J2LZW-kP.js.gz | Bin 0 -> 582 bytes .../build/_app/immutable/chunks/RaRNNC-y.js | 1 - .../_app/immutable/chunks/RaRNNC-y.js.br | Bin 287 -> 0 bytes .../_app/immutable/chunks/RaRNNC-y.js.gz | Bin 322 -> 0 bytes .../build/_app/immutable/chunks/cIQD_rb4.js | 1 - .../_app/immutable/chunks/cIQD_rb4.js.br | Bin 7674 -> 0 bytes .../_app/immutable/chunks/cIQD_rb4.js.gz | Bin 8455 -> 0 bytes .../_app/immutable/chunks/gqVpgJ8U.js.br | Bin 883 -> 0 bytes .../_app/immutable/chunks/gqVpgJ8U.js.gz | Bin 1004 -> 0 bytes .../chunks/{BBD-8XME.js => nyjtQ1Ok.js} | 2 +- .../_app/immutable/chunks/nyjtQ1Ok.js.br | Bin 0 -> 8672 bytes .../_app/immutable/chunks/nyjtQ1Ok.js.gz | Bin 0 -> 9639 bytes .../build/_app/immutable/chunks/urMNLRPv.js | 1 + .../_app/immutable/chunks/urMNLRPv.js.br | Bin 0 -> 2612 bytes .../_app/immutable/chunks/urMNLRPv.js.gz | Bin 0 -> 2954 bytes .../_app/immutable/entry/app.C8-C7f17.js | 2 - .../_app/immutable/entry/app.C8-C7f17.js.br | Bin 3160 -> 0 bytes .../_app/immutable/entry/app.C8-C7f17.js.gz | Bin 3583 -> 0 bytes .../_app/immutable/entry/app.DzQ7RYYG.js | 2 + .../_app/immutable/entry/app.DzQ7RYYG.js.br | Bin 0 -> 3153 bytes .../_app/immutable/entry/app.DzQ7RYYG.js.gz | Bin 0 -> 3591 bytes .../_app/immutable/entry/start.CM2cmm4m.js | 1 + .../_app/immutable/entry/start.CM2cmm4m.js.br | Bin 0 -> 112 bytes .../_app/immutable/entry/start.CM2cmm4m.js.gz | Bin 0 -> 108 bytes .../_app/immutable/entry/start.DA6kJu-O.js | 1 - .../_app/immutable/entry/start.DA6kJu-O.js.br | Bin 107 -> 0 bytes .../_app/immutable/entry/start.DA6kJu-O.js.gz | Bin 108 -> 0 bytes .../build/_app/immutable/nodes/0.CrGZHYMq.js | 3 + .../_app/immutable/nodes/0.CrGZHYMq.js.br | Bin 0 -> 3180 bytes .../_app/immutable/nodes/0.CrGZHYMq.js.gz | Bin 0 -> 3646 bytes .../build/_app/immutable/nodes/0.tUYz2cuZ.js | 3 - .../_app/immutable/nodes/0.tUYz2cuZ.js.br | Bin 2832 -> 0 bytes .../_app/immutable/nodes/0.tUYz2cuZ.js.gz | Bin 3213 -> 0 bytes .../build/_app/immutable/nodes/1.CssKLfNx.js | 1 - .../_app/immutable/nodes/1.CssKLfNx.js.br | Bin 339 -> 0 bytes .../_app/immutable/nodes/1.CssKLfNx.js.gz | Bin 385 -> 0 bytes .../build/_app/immutable/nodes/1.DUm1yZ6r.js | 1 + .../_app/immutable/nodes/1.DUm1yZ6r.js.br | Bin 0 -> 353 bytes .../_app/immutable/nodes/1.DUm1yZ6r.js.gz | Bin 0 -> 397 bytes .../build/_app/immutable/nodes/10.CuqTW1-V.js | 1 + .../_app/immutable/nodes/10.CuqTW1-V.js.br | Bin 0 -> 2027 bytes .../_app/immutable/nodes/10.CuqTW1-V.js.gz | Bin 0 -> 2281 bytes .../build/_app/immutable/nodes/10.evd80og6.js | 1 - .../_app/immutable/nodes/10.evd80og6.js.br | Bin 2025 -> 0 bytes .../_app/immutable/nodes/10.evd80og6.js.gz | Bin 2265 -> 0 bytes .../nodes/{11.gY7s4Ta3.js => 11.C9Q0t9wJ.js} | 2 +- .../_app/immutable/nodes/11.C9Q0t9wJ.js.br | Bin 0 -> 1559 bytes .../_app/immutable/nodes/11.C9Q0t9wJ.js.gz | Bin 0 -> 1766 bytes .../_app/immutable/nodes/11.gY7s4Ta3.js.br | Bin 1551 -> 0 bytes .../_app/immutable/nodes/11.gY7s4Ta3.js.gz | Bin 1755 -> 0 bytes .../build/_app/immutable/nodes/2.1GJQ3fqu.js | 1 - .../_app/immutable/nodes/2.1GJQ3fqu.js.br | Bin 143 -> 0 bytes .../_app/immutable/nodes/2.1GJQ3fqu.js.gz | Bin 184 -> 0 bytes .../build/_app/immutable/nodes/2.CGw3wCmL.js | 1 + .../_app/immutable/nodes/2.CGw3wCmL.js.br | Bin 0 -> 168 bytes .../_app/immutable/nodes/2.CGw3wCmL.js.gz | Bin 0 -> 183 bytes .../build/_app/immutable/nodes/3.lMYbfdAF.js | 1 + .../_app/immutable/nodes/3.lMYbfdAF.js.br | Bin 0 -> 176 bytes .../_app/immutable/nodes/3.lMYbfdAF.js.gz | Bin 0 -> 215 bytes .../build/_app/immutable/nodes/3.qBGkDYYb.js | 1 - .../_app/immutable/nodes/3.qBGkDYYb.js.br | Bin 166 -> 0 bytes .../_app/immutable/nodes/3.qBGkDYYb.js.gz | Bin 199 -> 0 bytes .../_app/immutable/nodes/4.BYgf5djd.js.br | Bin 3021 -> 0 bytes .../_app/immutable/nodes/4.BYgf5djd.js.gz | Bin 3491 -> 0 bytes .../nodes/{4.BYgf5djd.js => 4.D5K4f9dC.js} | 2 +- .../_app/immutable/nodes/4.D5K4f9dC.js.br | Bin 0 -> 3038 bytes .../_app/immutable/nodes/4.D5K4f9dC.js.gz | Bin 0 -> 3514 bytes .../_app/immutable/nodes/5.DVWNDcwc.js.br | Bin 2952 -> 0 bytes .../_app/immutable/nodes/5.DVWNDcwc.js.gz | Bin 3349 -> 0 bytes .../nodes/{5.DVWNDcwc.js => 5.DxlkmHN2.js} | 6 +- .../_app/immutable/nodes/5.DxlkmHN2.js.br | Bin 0 -> 2967 bytes .../_app/immutable/nodes/5.DxlkmHN2.js.gz | Bin 0 -> 3371 bytes .../nodes/{6.CBsTT29y.js => 6.BEn_WCBk.js} | 376 ++--- .../_app/immutable/nodes/6.BEn_WCBk.js.br | Bin 0 -> 119867 bytes .../_app/immutable/nodes/6.BEn_WCBk.js.gz | Bin 0 -> 144787 bytes .../_app/immutable/nodes/6.CBsTT29y.js.br | Bin 119649 -> 0 bytes .../_app/immutable/nodes/6.CBsTT29y.js.gz | Bin 144193 -> 0 bytes .../nodes/{7.UPq6Ja2I.js => 7.404BTmXF.js} | 2 +- .../_app/immutable/nodes/7.404BTmXF.js.br | Bin 0 -> 2196 bytes .../_app/immutable/nodes/7.404BTmXF.js.gz | Bin 0 -> 2501 bytes .../_app/immutable/nodes/7.UPq6Ja2I.js.br | Bin 2199 -> 0 bytes .../_app/immutable/nodes/7.UPq6Ja2I.js.gz | Bin 2479 -> 0 bytes .../_app/immutable/nodes/8.B2QXJFjO.js.br | Bin 2307 -> 0 bytes .../_app/immutable/nodes/8.B2QXJFjO.js.gz | Bin 2640 -> 0 bytes .../nodes/{8.B2QXJFjO.js => 8.CJVG2CGC.js} | 2 +- .../_app/immutable/nodes/8.CJVG2CGC.js.br | Bin 0 -> 2311 bytes .../_app/immutable/nodes/8.CJVG2CGC.js.gz | Bin 0 -> 2653 bytes .../_app/immutable/nodes/9.B4Pp7ME7.js.br | Bin 3014 -> 0 bytes .../_app/immutable/nodes/9.B4Pp7ME7.js.gz | Bin 3404 -> 0 bytes .../nodes/{9.B4Pp7ME7.js => 9.BHweFYNs.js} | 4 +- .../_app/immutable/nodes/9.BHweFYNs.js.br | Bin 0 -> 3019 bytes .../_app/immutable/nodes/9.BHweFYNs.js.gz | Bin 0 -> 3425 bytes apps/dashboard/build/_app/version.json | 2 +- apps/dashboard/build/_app/version.json.br | Bin 29 -> 31 bytes apps/dashboard/build/_app/version.json.gz | Bin 47 -> 47 bytes apps/dashboard/build/favicon.svg.gz | Bin 457 -> 462 bytes apps/dashboard/build/index.html | 34 +- apps/dashboard/build/index.html.br | Bin 606 -> 608 bytes apps/dashboard/build/index.html.gz | Bin 790 -> 794 bytes apps/dashboard/build/manifest.json.gz | Bin 278 -> 278 bytes apps/dashboard/package.json | 2 +- .../lib/components/ForgettingIndicator.svelte | 25 + .../src/lib/graph/__tests__/edges.test.ts | 12 +- .../src/lib/graph/__tests__/setup.ts | 16 +- .../src/lib/graph/__tests__/three-mock.ts | 15 + .../src/lib/graph/__tests__/ui-fixes.test.ts | 236 +++ apps/dashboard/src/lib/graph/edges.ts | 19 +- apps/dashboard/src/lib/graph/nodes.ts | 58 +- apps/dashboard/src/lib/graph/scene.ts | 66 +- apps/dashboard/src/lib/stores/websocket.ts | 4 + apps/dashboard/src/lib/types/index.ts | 9 + apps/dashboard/src/routes/+layout.svelte | 8 +- crates/vestige-core/Cargo.toml | 2 +- crates/vestige-core/benches/search_bench.rs | 33 +- .../src/advanced/adaptive_embedding.rs | 2 +- crates/vestige-core/src/advanced/chains.rs | 6 +- .../vestige-core/src/advanced/compression.rs | 6 +- .../src/advanced/cross_project.rs | 81 +- crates/vestige-core/src/advanced/dreams.rs | 25 +- .../vestige-core/src/advanced/importance.rs | 22 +- crates/vestige-core/src/advanced/intent.rs | 7 +- crates/vestige-core/src/advanced/mod.rs | 15 +- .../src/advanced/prediction_error.rs | 94 +- .../src/advanced/reconsolidation.rs | 26 +- .../vestige-core/src/advanced/speculative.rs | 17 +- crates/vestige-core/src/codebase/context.rs | 123 +- crates/vestige-core/src/codebase/git.rs | 27 +- crates/vestige-core/src/codebase/patterns.rs | 29 +- .../src/codebase/relationships.rs | 4 +- crates/vestige-core/src/codebase/types.rs | 2 - crates/vestige-core/src/codebase/watcher.rs | 15 +- crates/vestige-core/src/consolidation/mod.rs | 9 +- .../vestige-core/src/consolidation/phases.rs | 241 ++-- crates/vestige-core/src/embeddings/mod.rs | 4 +- crates/vestige-core/src/fsrs/algorithm.rs | 3 +- crates/vestige-core/src/fsrs/mod.rs | 16 +- crates/vestige-core/src/fsrs/optimizer.rs | 2 +- crates/vestige-core/src/fsrs/scheduler.rs | 25 +- crates/vestige-core/src/fts.rs | 5 +- crates/vestige-core/src/lib.rs | 102 +- crates/vestige-core/src/memory/mod.rs | 2 - crates/vestige-core/src/memory/node.rs | 11 + .../src/neuroscience/active_forgetting.rs | 226 +++ .../src/neuroscience/context_memory.rs | 64 +- .../src/neuroscience/emotional_memory.rs | 194 ++- .../src/neuroscience/hippocampal_index.rs | 125 +- .../src/neuroscience/importance_signals.rs | 31 +- .../src/neuroscience/memory_states.rs | 13 +- crates/vestige-core/src/neuroscience/mod.rs | 57 +- .../src/neuroscience/predictive_retrieval.rs | 6 +- .../src/neuroscience/prospective_memory.rs | 52 +- .../src/neuroscience/spreading_activation.rs | 25 +- .../src/neuroscience/synaptic_tagging.rs | 1 - crates/vestige-core/src/search/hyde.rs | 48 +- crates/vestige-core/src/search/mod.rs | 14 +- crates/vestige-core/src/search/vector.rs | 6 +- crates/vestige-core/src/storage/migrations.rs | 42 +- crates/vestige-core/src/storage/sqlite.rs | 1266 ++++++++++++----- crates/vestige-mcp/Cargo.toml | 2 +- crates/vestige-mcp/src/bin/cli.rs | 239 +++- crates/vestige-mcp/src/bin/restore.rs | 12 +- crates/vestige-mcp/src/cognitive.rs | 137 +- crates/vestige-mcp/src/dashboard/events.rs | 21 + crates/vestige-mcp/src/dashboard/handlers.rs | 117 +- crates/vestige-mcp/src/dashboard/mod.rs | 25 +- crates/vestige-mcp/src/dashboard/state.rs | 9 +- .../vestige-mcp/src/dashboard/static_files.rs | 12 +- crates/vestige-mcp/src/dashboard/websocket.rs | 13 +- crates/vestige-mcp/src/main.rs | 67 +- crates/vestige-mcp/src/protocol/http.rs | 69 +- crates/vestige-mcp/src/protocol/types.rs | 6 +- crates/vestige-mcp/src/resources/memory.rs | 35 +- crates/vestige-mcp/src/server.rs | 639 ++++++--- crates/vestige-mcp/src/tools/changelog.rs | 23 +- crates/vestige-mcp/src/tools/checkpoint.rs | 6 +- crates/vestige-mcp/src/tools/codebase.rs | 17 +- .../vestige-mcp/src/tools/codebase_unified.rs | 41 +- crates/vestige-mcp/src/tools/context.rs | 35 +- .../vestige-mcp/src/tools/cross_reference.rs | 452 ++++-- crates/vestige-mcp/src/tools/dedup.rs | 13 +- crates/vestige-mcp/src/tools/dream.rs | 276 ++-- crates/vestige-mcp/src/tools/explore.rs | 242 ++-- crates/vestige-mcp/src/tools/feedback.rs | 64 +- crates/vestige-mcp/src/tools/graph.rs | 119 +- crates/vestige-mcp/src/tools/health.rs | 67 +- crates/vestige-mcp/src/tools/importance.rs | 21 +- crates/vestige-mcp/src/tools/ingest.rs | 48 +- .../src/tools/intention_unified.rs | 123 +- crates/vestige-mcp/src/tools/intentions.rs | 113 +- crates/vestige-mcp/src/tools/knowledge.rs | 10 +- crates/vestige-mcp/src/tools/maintenance.rs | 108 +- crates/vestige-mcp/src/tools/memory_states.rs | 38 +- .../vestige-mcp/src/tools/memory_unified.rs | 97 +- crates/vestige-mcp/src/tools/mod.rs | 5 +- crates/vestige-mcp/src/tools/predict.rs | 33 +- crates/vestige-mcp/src/tools/recall.rs | 17 +- crates/vestige-mcp/src/tools/restore.rs | 56 +- crates/vestige-mcp/src/tools/review.rs | 28 +- crates/vestige-mcp/src/tools/search.rs | 7 +- .../vestige-mcp/src/tools/search_unified.rs | 100 +- .../vestige-mcp/src/tools/session_context.rs | 172 ++- crates/vestige-mcp/src/tools/smart_ingest.rs | 155 +- crates/vestige-mcp/src/tools/stats.rs | 32 +- crates/vestige-mcp/src/tools/suppress.rs | 313 ++++ crates/vestige-mcp/src/tools/tagging.rs | 73 +- crates/vestige-mcp/src/tools/timeline.rs | 30 +- packages/vestige-init/package.json | 2 +- packages/vestige-mcp-npm/.gitignore | 2 + packages/vestige-mcp-npm/package.json | 2 +- tests/e2e/src/assertions/mod.rs | 11 +- tests/e2e/src/harness/db_manager.rs | 16 +- tests/e2e/src/mocks/fixtures.rs | 80 +- tests/e2e/src/mocks/mock_embedding.rs | 16 +- .../tests/cognitive/comparative_benchmarks.rs | 395 +++-- tests/e2e/tests/cognitive/dreams_tests.rs | 21 +- .../e2e/tests/cognitive/neuroscience_tests.rs | 258 +++- tests/e2e/tests/cognitive/psychology_tests.rs | 909 ++++++++++-- .../cognitive/spreading_activation_tests.rs | 197 ++- tests/e2e/tests/extreme/adversarial_tests.rs | 145 +- tests/e2e/tests/extreme/chaos_tests.rs | 65 +- tests/e2e/tests/extreme/mathematical_tests.rs | 26 +- .../e2e/tests/extreme/proof_of_superiority.rs | 183 ++- .../extreme/research_validation_tests.rs | 178 ++- .../tests/journeys/consolidation_workflow.rs | 65 +- tests/e2e/tests/journeys/import_export.rs | 73 +- .../tests/journeys/ingest_recall_review.rs | 28 +- .../e2e/tests/journeys/intentions_workflow.rs | 18 +- .../tests/journeys/spreading_activation.rs | 224 ++- tests/e2e/tests/mcp/protocol_tests.rs | 144 +- tests/e2e/tests/mcp/tool_tests.rs | 79 +- 359 files changed, 8277 insertions(+), 3416 deletions(-) delete mode 100644 apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css delete mode 100644 apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.br delete mode 100644 apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.gz create mode 100644 apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css create mode 100644 apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css.br create mode 100644 apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/B0IenmM-.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/B0IenmM-.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/B0IenmM-.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/B17metm1.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/B17metm1.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/B17metm1.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BNytumrp.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BNytumrp.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BNytumrp.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BexJutgU.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz rename apps/dashboard/build/_app/immutable/chunks/{CBWLjDtu.js => BgOFZ9jq.js} (76%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.gz rename apps/dashboard/build/_app/immutable/chunks/{gqVpgJ8U.js => C3lo34Tx.js} (80%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/C4L78yoI.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/C4L78yoI.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/C4L78yoI.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ck7jSX2P.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ck7jSX2P.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ck7jSX2P.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.gz rename apps/dashboard/build/_app/immutable/chunks/{DBfx-YTU.js => D2QmVWrb.js} (74%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.gz rename apps/dashboard/build/_app/immutable/chunks/{Br8WXJxx.js => DAj0p1rI.js} (94%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/DAj0p1rI.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DAj0p1rI.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/J2LZW-kP.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/J2LZW-kP.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/J2LZW-kP.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/RaRNNC-y.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/cIQD_rb4.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js.gz rename apps/dashboard/build/_app/immutable/chunks/{BBD-8XME.js => nyjtQ1Ok.js} (95%) create mode 100644 apps/dashboard/build/_app/immutable/chunks/nyjtQ1Ok.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/nyjtQ1Ok.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.C8-C7f17.js.gz create mode 100644 apps/dashboard/build/_app/immutable/entry/app.DzQ7RYYG.js create mode 100644 apps/dashboard/build/_app/immutable/entry/app.DzQ7RYYG.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/app.DzQ7RYYG.js.gz create mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js create mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.DA6kJu-O.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CrGZHYMq.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CrGZHYMq.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CrGZHYMq.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.tUYz2cuZ.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.CssKLfNx.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.DUm1yZ6r.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.DUm1yZ6r.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.DUm1yZ6r.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/10.CuqTW1-V.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/10.CuqTW1-V.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/10.CuqTW1-V.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/10.evd80og6.js.gz rename apps/dashboard/build/_app/immutable/nodes/{11.gY7s4Ta3.js => 11.C9Q0t9wJ.js} (85%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/11.C9Q0t9wJ.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/11.C9Q0t9wJ.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/11.gY7s4Ta3.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/2.1GJQ3fqu.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.CGw3wCmL.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.CGw3wCmL.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/2.CGw3wCmL.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.lMYbfdAF.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.lMYbfdAF.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.lMYbfdAF.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.qBGkDYYb.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/4.BYgf5djd.js.gz rename apps/dashboard/build/_app/immutable/nodes/{4.BYgf5djd.js => 4.D5K4f9dC.js} (95%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/4.D5K4f9dC.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/4.D5K4f9dC.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DVWNDcwc.js.gz rename apps/dashboard/build/_app/immutable/nodes/{5.DVWNDcwc.js => 5.DxlkmHN2.js} (52%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DxlkmHN2.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/5.DxlkmHN2.js.gz rename apps/dashboard/build/_app/immutable/nodes/{6.CBsTT29y.js => 6.BEn_WCBk.js} (76%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.BEn_WCBk.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.BEn_WCBk.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz rename apps/dashboard/build/_app/immutable/nodes/{7.UPq6Ja2I.js => 7.404BTmXF.js} (75%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js.gz rename apps/dashboard/build/_app/immutable/nodes/{8.B2QXJFjO.js => 8.CJVG2CGC.js} (89%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz rename apps/dashboard/build/_app/immutable/nodes/{9.B4Pp7ME7.js => 9.BHweFYNs.js} (83%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js.gz create mode 100644 apps/dashboard/src/lib/components/ForgettingIndicator.svelte create mode 100644 apps/dashboard/src/lib/graph/__tests__/ui-fixes.test.ts create mode 100644 crates/vestige-core/src/neuroscience/active_forgetting.rs create mode 100644 crates/vestige-mcp/src/tools/suppress.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index a98079f..9be1e86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,68 @@ All notable changes to Vestige will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.0.5] - 2026-04-14 — "Intentional Amnesia" + +Every AI memory system stores too much. Vestige now treats forgetting as a first-class, neuroscientifically-grounded primitive. This release adds **active forgetting** — top-down inhibitory control over memory retrieval, based on two 2025 papers that no other AI memory system has implemented. + +### Scientific grounding + +- **Anderson, M. C., Hanslmayr, S., & Quaegebeur, L. (2025).** *"Brain mechanisms underlying the inhibitory control of thought."* Nature Reviews Neuroscience. DOI: [10.1038/s41583-025-00929-y](https://www.nature.com/articles/s41583-025-00929-y). Establishes the right lateral PFC as the domain-general inhibitory controller, and Suppression-Induced Forgetting (SIF) as compounding with each stopping attempt. +- **Cervantes-Sandoval, I., Chakraborty, M., MacMullen, C., & Davis, R. L. (2020).** *"Rac1 Impairs Forgetting-Induced Cellular Plasticity in Mushroom Body Output Neurons."* Front Cell Neurosci. [PMC7477079](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/). Establishes Rac1 GTPase as the active synaptic destabilization mechanism — forgetting is a biological PROCESS, not passive decay. + +### Added + +#### `suppress` MCP Tool (NEW — Tool #24) +- **Top-down memory suppression.** Distinct from `memory.delete` (which removes) and `memory.demote` (which is a one-shot hit). Each `suppress` call compounds: `suppression_count` increments, and a `k × suppression_count` penalty (saturating at 80%) is subtracted from retrieval scores during hybrid search. +- **Rac1 cascade.** Background worker piggybacks the existing consolidation loop, walks `memory_connections` edges from recently-suppressed seeds, and applies attenuated FSRS decay to co-activated neighbors. You don't just forget "Jake" — you fade the café, the roommate, the birthday. +- **Reversible 24h labile window** — matches Nader reconsolidation semantics on a 24-hour axis. Pass `reverse: true` within 24h to undo. After that, it locks in. +- **Never deletes** — the memory persists and is still accessible via `memory.get(id)`. It's INHIBITED, not erased. + +#### `active_forgetting` Cognitive Module (NEW — #30) +- `crates/vestige-core/src/neuroscience/active_forgetting.rs` — stateless helper for SIF penalty computation, labile window tracking, and Rac1 cascade factors. +- 7 unit tests + 9 integration tests = 16 new tests. + +#### Migration V10 +- `ALTER TABLE knowledge_nodes ADD COLUMN suppression_count INTEGER DEFAULT 0` +- `ALTER TABLE knowledge_nodes ADD COLUMN suppressed_at TEXT` +- Partial indices on both columns for efficient sweep queries. +- Additive-only — backward compatible with all existing v2.0.x databases. + +#### Dashboard +- `ForgettingIndicator.svelte` — new status pill that pulses when suppressed memories exist. +- 3D graph nodes dim to 20% opacity and lose emissive glow when suppressed. +- New WebSocket events: `MemorySuppressed`, `MemoryUnsuppressed`, `Rac1CascadeSwept`. +- `Heartbeat` event now carries `suppressed_count` for live dashboard display. + +### Changed + +- `search` scoring pipeline now includes an SIF penalty applied after the accessibility filter. +- Consolidation worker (`VESTIGE_CONSOLIDATION_INTERVAL_HOURS`, default 6h) now runs `run_rac1_cascade_sweep` after each `run_consolidation` call. +- Tool count assertion bumped from 23 → 24. +- Workspace version bumped 2.0.4 → 2.0.5. + +### Tests + +- Rust: 1,284 passing (up from 1,237). Net +47 new tests for active forgetting, Rac1 cascade, migration V10. +- Dashboard (Vitest): 171 passing (up from 150). +21 regression tests locking in the issue #31 UI fix. +- Zero warnings, clippy clean across all targets. + +### Fixed + +- **Dashboard graph view rendered glowing squares instead of round halos** ([#31](https://github.com/samvallad33/vestige/issues/31)). Root cause: the node glow `THREE.SpriteMaterial` had no `map` set, so `Sprite` rendered as a solid-coloured 1×1 plane; additive blending plus `UnrealBloomPass(strength=0.8, radius=0.4, threshold=0.85)` then amplified the square edges into hard-edged glowing cubes. The aggressive `FogExp2(..., 0.008)` swallowed edges at depth and dark-navy `0x4a4a7a` lines were invisible against the fog. Fix bundled: + - Generated a shared 128×128 radial-gradient `CanvasTexture` (module-level singleton) and assigned it as `SpriteMaterial.map`. Gradient stops: `rgba(255,255,255,1.0) → rgba(255,255,255,0.7) → rgba(255,255,255,0.2) → rgba(255,255,255,0.0)`. Sprite now reads as a soft round halo; bloom diffuses cleanly. + - Retuned `UnrealBloomPass` to `(strength=0.55, radius=0.6, threshold=0.2)` — gentler, allows mid-tones to bloom instead of only blown-out highlights. + - Halved fog density `FogExp2(0x050510, 0.008) → FogExp2(0x0a0a1a, 0.0035)` so distant memories stay visible. + - Bumped edge color `0x4a4a7a → 0x8b5cf6` (brand violet). Opacity `0.1 + weight*0.5 → 0.25 + weight*0.5`, cap `0.6 → 0.8`. Added `depthWrite: false` so edges blend cleanly through fog. + - Added explicit `scene.background = 0x05050f` and a 2000-point starfield distributed on a spherical shell at radius 600–1000, additive-blended with subtle cool-white/violet vertex colors. + - Glow sprite scale bumped `size × 4 → size × 6` so the gradient has visible screen footprint. + - All node glow sprites share a single `CanvasTexture` instance (singleton cache — memory leak guard for large graphs). + - 21 regression tests added in `apps/dashboard/src/lib/graph/__tests__/ui-fixes.test.ts`. Hybrid strategy: runtime unit tests via the existing `three-mock.ts` (extended to propagate `map`/`color`/`depthWrite`/`blending` params and added `createRadialGradient` to the canvas context mock), plus source-level regex assertions on `scene.ts` and `nodes.ts` magic numbers so any accidental revert of fog/bloom/color/helper fails the suite immediately. +- `apps/dashboard/package.json` version stale at 2.0.3 — bumped to 2.0.5 to match the workspace. +- `packages/vestige-mcp-npm/.gitignore` missing `bin/vestige-restore` and `bin/vestige-restore.exe` entries — the other three binaries were already ignored as postinstall downloads. + +--- + ## [2.0.4] - 2026-04-09 — "Deep Reference" Context windows hit 1M tokens. Memory matters more than ever. This release removes artificial limits, adds contradiction detection, and hardens security. diff --git a/Cargo.lock b/Cargo.lock index 416a6f6..410e4d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4531,7 +4531,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vestige-core" -version = "2.0.4" +version = "2.0.5" dependencies = [ "chrono", "criterion", @@ -4566,7 +4566,7 @@ dependencies = [ [[package]] name = "vestige-mcp" -version = "2.0.4" +version = "2.0.5" dependencies = [ "anyhow", "axum", diff --git a/Cargo.toml b/Cargo.toml index 89761ac..b3008f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ exclude = [ ] [workspace.package] -version = "2.0.4" +version = "2.0.5" edition = "2024" license = "AGPL-3.0-only" repository = "https://github.com/samvallad33/vestige" diff --git a/README.md b/README.md index 9c7819a..f0aff79 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![GitHub stars](https://img.shields.io/github/stars/samvallad33/vestige?style=social)](https://github.com/samvallad33/vestige) [![Release](https://img.shields.io/github/v/release/samvallad33/vestige)](https://github.com/samvallad33/vestige/releases/latest) -[![Tests](https://img.shields.io/badge/tests-758%20passing-brightgreen)](https://github.com/samvallad33/vestige/actions) +[![Tests](https://img.shields.io/badge/tests-1284%20passing-brightgreen)](https://github.com/samvallad33/vestige/actions) [![License](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE) [![MCP Compatible](https://img.shields.io/badge/MCP-compatible-green)](https://modelcontextprotocol.io) @@ -14,21 +14,30 @@ Built on 130 years of memory research — FSRS-6 spaced repetition, prediction error gating, synaptic tagging, spreading activation, memory dreaming — all running in a single Rust binary with a 3D neural visualization dashboard. 100% local. Zero cloud. -[Quick Start](#quick-start) | [Dashboard](#-3d-memory-dashboard) | [How It Works](#-the-cognitive-science-stack) | [Tools](#-23-mcp-tools) | [Docs](docs/) +[Quick Start](#quick-start) | [Dashboard](#-3d-memory-dashboard) | [How It Works](#-the-cognitive-science-stack) | [Tools](#-24-mcp-tools) | [Docs](docs/)
--- -## What's New in v2.0 "Cognitive Leap" +## What's New in v2.0.5 "Intentional Amnesia" -- **3D Memory Dashboard** — SvelteKit + Three.js neural visualization with real-time WebSocket events, bloom post-processing, force-directed graph layout. Watch your AI's mind in real-time. -- **WebSocket Event Bus** — Every cognitive operation broadcasts events: memory creation, search, dreaming, consolidation, retention decay -- **HyDE Query Expansion** — Template-based Hypothetical Document Embeddings for dramatically improved search quality on conceptual queries -- **Nomic v2 MoE (experimental)** — fastembed 5.11 with optional Nomic Embed Text v2 MoE (475M params, 8 experts) + Metal GPU acceleration. Default: v1.5 (8192 token context) -- **Command Palette** — `Cmd+K` navigation, keyboard shortcuts, responsive mobile layout, PWA installable -- **FSRS Decay Visualization** — SVG retention curves with predicted decay at 1d/7d/30d, endangered memory alerts -- **29 cognitive modules** — 1,238 tests, 79,600+ LOC +The first AI memory system that can actively forget. New **`suppress`** tool applies top-down inhibitory control over retrieval — each call compounds a penalty (up to 80%), a background Rac1 worker fades co-activated neighbors over 72h, and it's reversible within a 24h labile window. **Never deletes** — the memory is inhibited, not erased. + +Based on [Anderson et al. 2025](https://www.nature.com/articles/s41583-025-00929-y) (Suppression-Induced Forgetting) and [Cervantes-Sandoval et al. 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/) (Rac1 synaptic cascade). **24 tools · 30 cognitive modules · 1,284 tests.** + +
+Earlier releases (v2.0 "Cognitive Leap" → v2.0.4 "Deep Reference") + +- **v2.0.4 — `deep_reference` Tool** — 8-stage cognitive reasoning pipeline with FSRS-6 trust scoring, intent classification, spreading activation, contradiction analysis, and pre-built reasoning chains. Token budgets raised 10K → 100K. CORS tightened. +- **v2.0 — 3D Memory Dashboard** — SvelteKit + Three.js neural visualization with real-time WebSocket events, bloom post-processing, force-directed graph layout. +- **v2.0 — WebSocket Event Bus** — Every cognitive operation broadcasts events: memory creation, search, dreaming, consolidation, retention decay. +- **v2.0 — HyDE Query Expansion** — Template-based Hypothetical Document Embeddings for dramatically improved search quality on conceptual queries. +- **v2.0 — Nomic v2 MoE (experimental)** — fastembed 5.11 with optional Nomic Embed Text v2 MoE (475M params, 8 experts) + Metal GPU acceleration. +- **v2.0 — Command Palette** — `Cmd+K` navigation, keyboard shortcuts, responsive mobile layout, PWA installable. +- **v2.0 — FSRS Decay Visualization** — SVG retention curves with predicted decay at 1d/7d/30d. + +
--- @@ -132,7 +141,7 @@ The dashboard runs automatically at `http://localhost:3927/dashboard` when the M │ 15 REST endpoints · WS event broadcast │ ├─────────────────────────────────────────────────────┤ │ MCP Server (stdio JSON-RPC) │ -│ 23 tools · 29 cognitive modules │ +│ 24 tools · 30 cognitive modules │ ├─────────────────────────────────────────────────────┤ │ Cognitive Engine │ │ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │ @@ -192,11 +201,13 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen **Autonomic Regulation** — Self-regulating memory health. Auto-promotes frequently accessed memories. Auto-GCs low-retention memories. Consolidation triggers on 6h staleness or 2h active use. +**Active Forgetting** *(v2.0.5)* — Top-down inhibitory control via the `suppress` tool, distinct from passive FSRS decay and from bottom-up retrieval-induced forgetting. Each call compounds (Suppression-Induced Forgetting), a background Rac1 cascade worker fades co-activated neighbors, and a 24-hour labile window allows reversal. The memory persists — it's **inhibited, not erased**. Based on [Anderson et al., 2025](https://www.nature.com/articles/s41583-025-00929-y) and [Cervantes-Sandoval et al., 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/). First AI memory system to implement this. + [Full science documentation ->](docs/SCIENCE.md) --- -## 🛠 23 MCP Tools +## 🛠 24 MCP Tools ### Context Packets | Tool | What It Does | @@ -247,6 +258,11 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen | `deep_reference` | **Cognitive reasoning across memories.** 8-stage pipeline: FSRS-6 trust scoring, intent classification, spreading activation, temporal supersession, contradiction analysis, relation assessment, dream insight integration, and algorithmic reasoning chain generation. Returns trust-scored evidence with a pre-built reasoning scaffold. | | `cross_reference` | Backward-compatible alias for `deep_reference`. | +### Active Forgetting (v2.0.5) +| Tool | What It Does | +|------|-------------| +| `suppress` | **Top-down active forgetting** — neuroscience-grounded inhibitory control over retrieval. Distinct from `memory.delete` (destroys the row) and `memory.demote` (one-shot ranking hit). Each call **compounds** a retrieval-score penalty (Anderson 2025 SIF), and a background Rac1 cascade worker fades co-activated neighbors over 72h (Davis 2020). Reversible within a 24-hour labile window via `reverse: true`. **The memory persists** — it is inhibited, not erased. | + --- ## Make Your AI Use Vestige Automatically @@ -278,7 +294,7 @@ At the start of every session: | Metric | Value | |--------|-------| | **Language** | Rust 2024 edition (MSRV 1.91) | -| **Codebase** | 79,600+ lines, 1,238 tests | +| **Codebase** | 80,000+ lines, 1,284 tests (364 core + 419 mcp + 497 e2e + 4 doctests) | | **Binary size** | ~20MB | | **Embeddings** | Nomic Embed Text v1.5 (768d → 256d Matryoshka, 8192 context) | | **Vector search** | USearch HNSW (20x faster than FAISS) | @@ -286,7 +302,7 @@ At the start of every session: | **Storage** | SQLite + FTS5 (optional SQLCipher encryption) | | **Dashboard** | SvelteKit 2 + Svelte 5 + Three.js + Tailwind CSS 4 | | **Transport** | MCP stdio (JSON-RPC 2.0) + WebSocket | -| **Cognitive modules** | 29 stateful (16 neuroscience, 11 advanced, 2 search) | +| **Cognitive modules** | 30 stateful (17 neuroscience, 11 advanced, 2 search) | | **First run** | Downloads embedding model (~130MB), then fully offline | | **Platforms** | macOS (ARM/Intel), Linux (x86_64), Windows | @@ -386,5 +402,5 @@ AGPL-3.0 — free to use, modify, and self-host. If you offer Vestige as a netwo

Built by @samvallad33
- 79,600+ lines of Rust · 29 cognitive modules · 130 years of memory research · one 22MB binary + 80,000+ lines of Rust · 30 cognitive modules · 130 years of memory research · one 22MB binary

diff --git a/apps/dashboard/build/_app/env.js.gz b/apps/dashboard/build/_app/env.js.gz index e9f837d74fcbfca45088443ef27bb6122326fbb6..e95cbd54bdfaef670fd0a5e539ab495db0c81e6d 100644 GIT binary patch delta 16 UcmY#a=aTQ{U;qIo;fY+b01y5F*Z=?k delta 16 UcmY#a=aTQ{U;qIo=80Ug01v(a$N&HU diff --git a/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css b/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css deleted file mode 100644 index cb69f97..0000000 --- a/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", "Fira Code", "SF Mono", monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-void:#050510;--color-deep:#10102a;--color-subtle:#2a2a5e;--color-muted:#4a4a7a;--color-dim:#7a7aaa;--color-text:#e0e0ff;--color-bright:#fff;--color-synapse:#6366f1;--color-synapse-glow:#818cf8;--color-dream:#a855f7;--color-dream-glow:#c084fc;--color-memory:#3b82f6;--color-recall:#10b981;--color-decay:#ef4444;--color-warning:#f59e0b}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.end\!{inset-inline-end:var(--spacing)!important}.top-0{top:calc(var(--spacing) * 0)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:calc(var(--spacing) * 0)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-\[-12px\]{margin-top:-12px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-96{width:calc(var(--spacing) * 96)}.w-\[90\%\]{width:90%}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-64{min-width:calc(var(--spacing) * 64)}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3\.5rem\]{min-width:3.5rem}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\!border-decay\/20{border-color:#ef444433!important}@supports (color:color-mix(in lab,red,red)){.\!border-decay\/20{border-color:color-mix(in oklab,var(--color-decay) 20%,transparent)!important}}.\!border-dream\/20{border-color:#a855f733!important}@supports (color:color-mix(in lab,red,red)){.\!border-dream\/20{border-color:color-mix(in oklab,var(--color-dream) 20%,transparent)!important}}.\!border-synapse\/20{border-color:#6366f133!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/20{border-color:color-mix(in oklab,var(--color-synapse) 20%,transparent)!important}}.\!border-synapse\/30{border-color:#6366f14d!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/30{border-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)!important}}.\!border-synapse\/40{border-color:#6366f166!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/40{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)!important}}.border-dream\/10{border-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.border-dream\/10{border-color:color-mix(in oklab,var(--color-dream) 10%,transparent)}}.border-dream\/20{border-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.border-dream\/20{border-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.border-dream\/30{border-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.border-dream\/30{border-color:color-mix(in oklab,var(--color-dream) 30%,transparent)}}.border-dream\/40{border-color:#a855f766}@supports (color:color-mix(in lab,red,red)){.border-dream\/40{border-color:color-mix(in oklab,var(--color-dream) 40%,transparent)}}.border-dream\/50{border-color:#a855f780}@supports (color:color-mix(in lab,red,red)){.border-dream\/50{border-color:color-mix(in oklab,var(--color-dream) 50%,transparent)}}.border-recall\/30{border-color:#10b9814d}@supports (color:color-mix(in lab,red,red)){.border-recall\/30{border-color:color-mix(in oklab,var(--color-recall) 30%,transparent)}}.border-subtle\/15{border-color:#2a2a5e26}@supports (color:color-mix(in lab,red,red)){.border-subtle\/15{border-color:color-mix(in oklab,var(--color-subtle) 15%,transparent)}}.border-subtle\/20{border-color:#2a2a5e33}@supports (color:color-mix(in lab,red,red)){.border-subtle\/20{border-color:color-mix(in oklab,var(--color-subtle) 20%,transparent)}}.border-synapse{border-color:var(--color-synapse)}.border-synapse\/10{border-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.border-synapse\/10{border-color:color-mix(in oklab,var(--color-synapse) 10%,transparent)}}.border-synapse\/30{border-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.border-synapse\/30{border-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)}}.border-synapse\/40{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.border-synapse\/40{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/40{border-color:#f59e0b66}@supports (color:color-mix(in lab,red,red)){.border-warning\/40{border-color:color-mix(in oklab,var(--color-warning) 40%,transparent)}}.border-warning\/50{border-color:#f59e0b80}@supports (color:color-mix(in lab,red,red)){.border-warning\/50{border-color:color-mix(in oklab,var(--color-warning) 50%,transparent)}}.border-t-dream{border-top-color:var(--color-dream)}.border-t-synapse{border-top-color:var(--color-synapse)}.border-t-warning{border-top-color:var(--color-warning)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-decay{background-color:var(--color-decay)}.bg-decay\/10{background-color:#ef44441a}@supports (color:color-mix(in lab,red,red)){.bg-decay\/10{background-color:color-mix(in oklab,var(--color-decay) 10%,transparent)}}.bg-decay\/20{background-color:#ef444433}@supports (color:color-mix(in lab,red,red)){.bg-decay\/20{background-color:color-mix(in oklab,var(--color-decay) 20%,transparent)}}.bg-deep{background-color:var(--color-deep)}.bg-dream{background-color:var(--color-dream)}.bg-dream\/5{background-color:#a855f70d}@supports (color:color-mix(in lab,red,red)){.bg-dream\/5{background-color:color-mix(in oklab,var(--color-dream) 5%,transparent)}}.bg-dream\/10{background-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.bg-dream\/10{background-color:color-mix(in oklab,var(--color-dream) 10%,transparent)}}.bg-dream\/20{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.bg-dream\/20{background-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.bg-recall{background-color:var(--color-recall)}.bg-recall\/10{background-color:#10b9811a}@supports (color:color-mix(in lab,red,red)){.bg-recall\/10{background-color:color-mix(in oklab,var(--color-recall) 10%,transparent)}}.bg-recall\/20{background-color:#10b98133}@supports (color:color-mix(in lab,red,red)){.bg-recall\/20{background-color:color-mix(in oklab,var(--color-recall) 20%,transparent)}}.bg-synapse{background-color:var(--color-synapse)}.bg-synapse\/10{background-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/10{background-color:color-mix(in oklab,var(--color-synapse) 10%,transparent)}}.bg-synapse\/15{background-color:#6366f126}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/15{background-color:color-mix(in oklab,var(--color-synapse) 15%,transparent)}}.bg-synapse\/20{background-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/20{background-color:color-mix(in oklab,var(--color-synapse) 20%,transparent)}}.bg-transparent{background-color:#0000}.bg-void{background-color:var(--color-void)}.bg-void\/60{background-color:#05051099}@supports (color:color-mix(in lab,red,red)){.bg-void\/60{background-color:color-mix(in oklab,var(--color-void) 60%,transparent)}}.bg-warning\/20{background-color:#f59e0b33}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-dream{--tw-gradient-from:var(--color-dream);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-synapse{--tw-gradient-to:var(--color-synapse);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-\[10vh\]{padding-top:10vh}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-14{padding-left:calc(var(--spacing) * 14)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-400{color:var(--color-amber-400)}.text-bright{color:var(--color-bright)}.text-decay{color:var(--color-decay)}.text-decay\/60{color:#ef444499}@supports (color:color-mix(in lab,red,red)){.text-decay\/60{color:color-mix(in oklab,var(--color-decay) 60%,transparent)}}.text-dim{color:var(--color-dim)}.text-dream{color:var(--color-dream)}.text-dream-glow{color:var(--color-dream-glow)}.text-memory{color:var(--color-memory)}.text-muted{color:var(--color-muted)}.text-muted\/50{color:#4a4a7a80}@supports (color:color-mix(in lab,red,red)){.text-muted\/50{color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.text-recall{color:var(--color-recall)}.text-subtle{color:var(--color-subtle)}.text-synapse{color:var(--color-synapse)}.text-synapse-glow{color:var(--color-synapse-glow)}.text-text{color:var(--color-text)}.text-warning{color:var(--color-warning)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.accent-synapse{accent-color:var(--color-synapse)}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(99\,102\,241\,0\.15\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#6366f126);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-synapse\/10{--tw-shadow-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.shadow-synapse\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-synapse) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-synapse\/20{--tw-shadow-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.shadow-synapse\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-synapse) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.placeholder\:text-muted::placeholder{color:var(--color-muted)}@media(hover:hover){.hover\:bg-decay\/20:hover{background-color:#ef444433}@supports (color:color-mix(in lab,red,red)){.hover\:bg-decay\/20:hover{background-color:color-mix(in oklab,var(--color-decay) 20%,transparent)}}.hover\:bg-decay\/30:hover{background-color:#ef44444d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-decay\/30:hover{background-color:color-mix(in oklab,var(--color-decay) 30%,transparent)}}.hover\:bg-dream\/20:hover{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.hover\:bg-dream\/20:hover{background-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.hover\:bg-dream\/30:hover{background-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-dream\/30:hover{background-color:color-mix(in oklab,var(--color-dream) 30%,transparent)}}.hover\:bg-recall\/30:hover{background-color:#10b9814d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-recall\/30:hover{background-color:color-mix(in oklab,var(--color-recall) 30%,transparent)}}.hover\:bg-synapse\/30:hover{background-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-synapse\/30:hover{background-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)}}.hover\:bg-warning\/30:hover{background-color:#f59e0b4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/30:hover{background-color:color-mix(in oklab,var(--color-warning) 30%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:text-dim:hover{color:var(--color-dim)}.hover\:text-text:hover{color:var(--color-text)}}.focus\:\!border-synapse\/40:focus{border-color:#6366f166!important}@supports (color:color-mix(in lab,red,red)){.focus\:\!border-synapse\/40:focus{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)!important}}.focus\:border-dream\/40:focus{border-color:#a855f766}@supports (color:color-mix(in lab,red,red)){.focus\:border-dream\/40:focus{border-color:color-mix(in oklab,var(--color-dream) 40%,transparent)}}.focus\:border-synapse\/40:focus{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.focus\:border-synapse\/40:focus{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-synapse\/20:focus{--tw-ring-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.focus\:ring-synapse\/20:focus{--tw-ring-color:color-mix(in oklab, var(--color-synapse) 20%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:pt-\[15vh\]{padding-top:15vh}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}}@media(min-width:64rem){.lg\:block{display:block}.lg\:w-56{width:calc(var(--spacing) * 56)}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing) * 3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing) * 3)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-synapse-glow::-webkit-slider-thumb{background-color:var(--color-synapse-glow)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-\[0_0_8px_rgba\(129\,140\,248\,0\.4\)\]::-webkit-slider-thumb{--tw-shadow:0 0 8px var(--tw-shadow-color,#818cf866);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}html{background:var(--color-void);color:var(--color-text);font-family:var(--font-mono)}body{min-height:100vh;margin:0;overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-subtle);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted)}.glass{-webkit-backdrop-filter:blur(20px)saturate(180%);background:#16163873;border:1px solid #6366f114;box-shadow:inset 0 1px #ffffff08,0 4px 24px #0000004d}.glass-subtle{-webkit-backdrop-filter:blur(12px)saturate(150%);background:#10102a66;border:1px solid #6366f10f;box-shadow:inset 0 1px #ffffff05,0 2px 12px #0003}.glass-sidebar{-webkit-backdrop-filter:blur(24px)saturate(180%);background:#0a0a1a99;border-right:1px solid #6366f11a;box-shadow:inset -1px 0 #ffffff05,4px 0 24px #0000004d}.glass-panel{-webkit-backdrop-filter:blur(24px)saturate(180%);background:#0a0a1acc;border:1px solid #6366f11a;box-shadow:inset 0 1px #ffffff08,0 8px 32px #0006}.glow-synapse{box-shadow:0 0 20px #6366f14d,0 0 60px #6366f11a}.glow-dream{box-shadow:0 0 20px #a855f74d,0 0 60px #a855f71a}.glow-memory{box-shadow:0 0 20px #3b82f64d,0 0 60px #3b82f61a}@keyframes pulse-glow{0%,to{opacity:1}50%{opacity:.5}}.animate-pulse-glow{animation:2s ease-in-out infinite pulse-glow}@keyframes orb-float-1{0%,to{transform:translate(0)scale(1)}25%{transform:translate(60px,-40px)scale(1.1)}50%{transform:translate(-30px,-80px)scale(.95)}75%{transform:translate(-60px,-20px)scale(1.05)}}@keyframes orb-float-2{0%,to{transform:translate(0)scale(1)}25%{transform:translate(-50px,30px)scale(1.08)}50%{transform:translate(40px,60px)scale(.92)}75%{transform:translate(20px,-40px)scale(1.03)}}@keyframes orb-float-3{0%,to{transform:translate(0)scale(1)}25%{transform:translate(30px,50px)scale(1.05)}50%{transform:translate(-60px,20px)scale(.98)}75%{transform:translate(40px,-30px)scale(1.1)}}.ambient-orb{filter:blur(80px);pointer-events:none;z-index:0;opacity:.35;border-radius:50%;position:fixed}.ambient-orb-1{background:radial-gradient(circle,#a855f766,#0000 70%);width:400px;height:400px;animation:20s ease-in-out infinite orb-float-1;top:-10%;right:-5%}.ambient-orb-2{background:radial-gradient(circle,#6366f159,#0000 70%);width:350px;height:350px;animation:25s ease-in-out infinite orb-float-2;bottom:-15%;left:-5%}.ambient-orb-3{background:radial-gradient(circle,#f59e0b33,#0000 70%);width:300px;height:300px;animation:22s ease-in-out infinite orb-float-3;top:40%;left:40%}.nav-active-border{position:relative}.nav-active-border:before{content:"";background:linear-gradient(180deg,var(--color-synapse),var(--color-dream),var(--color-synapse));background-size:100% 200%;border-radius:1px;width:2px;animation:3s ease-in-out infinite gradient-shift;position:absolute;top:4px;bottom:4px;left:0}@keyframes gradient-shift{0%,to{background-position:0 0}50%{background-position:0 100%}}@keyframes float{0%,to{transform:translateY(0)translate(0)}25%{transform:translateY(-10px)translate(5px)}50%{transform:translateY(-5px)translate(-5px)}75%{transform:translateY(-15px)translate(3px)}}.retention-critical{color:var(--color-decay)}.retention-low{color:var(--color-warning)}.retention-good{color:var(--color-recall)}.retention-strong{color:var(--color-synapse)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}.safe-bottom.svelte-12qhfyh{padding-bottom:env(safe-area-inset-bottom,0px)}@keyframes svelte-12qhfyh-page-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-page-in.svelte-12qhfyh{animation:svelte-12qhfyh-page-in .2s ease-out} diff --git a/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.br b/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.br deleted file mode 100644 index 6f955a047b7f7fe38d829de2048996861099c0d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6712 zcmV-88pq`uiltH1FiHx<$Uv}h0FY=84CpMdo2eH>8U;h-x=3)9<-Jen#CUCA7=Z&v zXmX01i`stUyCn_5Fgf-_5QY6<3eS>$Jm#mbT3^4~e2KxlZ0V!D(z*`^N}9;Lum~h& zTOQE={@1Lp-`5LMlLd0_xeE`dny(+}1r=keHNmAL#tAf2ah&244<<_c(^5al70J@I zf*Lx&VwA@G)cr1k>{Q^e{~BsX$4c`vAQ~kgbgX48tHEbFS5Ws_2(Q{| z2#KBDH#PQ0UA4}iU7V*Li!)yef4W_uyZt?si{s5n(yH4_)w{7+3(d4ZOMoG z6B2_zA&&cclvwyRMKK08&Rriw0A)GmX#-19TJmAoA&qM}w6e}Z!9r0?_U&;s!CnE-vS-QFP?#oCE^X$4 z%-7wF1kAPq)YEL57`jR?&gXZrNM%TPSGJOdXAWwUNr*W2JY{13?92jINXg}jYKzR_ zCYWY44#JFD2bVJ#FiUpvsNFtBlu~fgB-rIF-WOX7>dP%EKJkSaganz7(g(iu z%!+;-!%&tTjIR;3s<#IJOO2g=dmm6 zr(WqPp{94c&prjNa?(AX!hwo@Eaok|8mm-*CR)b3k}6LmP#3S0N|@iCcgtKY=+*Gi z*(YFbTAsbWi3tX*O^7*Yo0`fBQq%2oc@CisPhrWEgYX_SgdvUJS(#ZGmdceNM3iNRgz3dUF1MxH9DBfOVW~qYSmF00e+Dh|M zCCjOuPD!NDEpHxgTjkX@x(Q3UI?4S!rg=<H@Gj$6R5;bWCzYJREB(UVtnp% z)Oi?=$7|nh?zN~!ifYY)9`Tw|0`IWn9s!375Lc{4)_DQ}hkKp2v3jZIap2(Nt^2LY z?B>~ELp|(UyAXPH7!DvLveV5QpN!aS&}5QUl)2ruN4pmPHHJoP1a~W*eL5q|%aT`{ zH^TAm^dG|T#(h&$qIs()*)}WmLpy$+E;BbVI*PXlHE`9k$+#9#EMJ52nC28< z$cH6_D##v_!%6DaFU*g`3(jYu&D(qfifwUL5YTfc%1r^xI4D z6EBTA{^vmqho)t%;R_Xb{btRnR+$H)d$r@!+CDq0Jg>Z{yez(o@W`U+RzglcMYCFb zr&3887u=yXQhaB!2H}4d}-&)vddo(l4KXM?@b(@qNFO z=o6)g>+Fowij2UZCDUHgql1Y0%g@wc zF9=Ix{o)*<=8x%ZN<@2b1HG;Fol2AeRMDiW>UiOj6mB3#jGIcQMWHOMBmK)6(uGKm zJOSF2I(KdcZM!QwDq4iQ`K9##Jdo{({&{3sh{RHxa5~E)6TFukb!S8gBDyhNoFYW$ zo$3;8zD#q6#F_1&2egMe|HIGdGlhv&1X_C$jPU8{7#4b+k8jm)^zB+mVhkpO-KRnk1w2P!SIi`Zm?s^r1iCbutTP2433R%jceYhv^Ey`DYJ9$y%T-{>xg>QCS|xP1tN)shB8OoJ}e)|!4H`*&iM4N7=xnCeD<{FqNJJjhBEdSJHLh4Iwh_wQeg)UNc+z&KuHTmZ| z$I+a+i({%iJbuqw8spu@HyE~QR)5(ul}FS}kAtD7w}l5Y;NiQMXmTv7?GahcYIo5D zPTNPQTSH4H#_c1~X}tiY?StHDTX{^{538ef*mn$CGnSv+F5{Xg)ImwoKFoBtctYIt zQjsijB@$AN2uwj|={`r(7-!V(M7DoU?|=BR(-%))8LAjssncj8UQj*DL9H6G;^QE2 zyX=B{&IGq=P`f?^+^)D_FPIQk4OqGF2k8fI9asnno>-lQx^!Sxd-n$fH{<$9uv@?y z7g)^}c+EefUr7HYHT?XHeg##am-GH+2Oy6z<|`YHV=zrYDz}VZtI-9`0dk9BErhk0 z(LzQmP2d)`cWZwE6+`zsWCb9A$35E-z+L>?RG^nT-rNr!zoVE^>VaJLv{U(ztTUzV z>JDl39OxHi8J!ajKaK+2B^e**6W-(8kM+@=LLKX4_Cc};&pOj-Viz2xi$?$Lewx(izU!juznhPWV{5!1pyRyqe{q2fL}9R!f2WumVnbyKk~jE zLCV~)g=KM*fn6mN$r8gZsV%YQ`7h6NF-4X;gKCvrZtf@|o!iRA9WxOm2TZgFB&_v{viOwR>c!b1x0p>iBNf{&y;6H zDO;pT8qR*<2hqq{4fs7VB9Tbc1~35#ZbHx^=`Q%Y1n9Ol(P;y;51OPcDLWHlWhHVJ zsI#U0EqG1Q5f5$@-Uk7k(6kC|WIEXF@Q@0S|2Guy_FNKu5AYWdiGRoJzY&jn7lXa@ z^C+96q4y9P)FG@4^WVee&D4n5oTTx`A1_Cyt7 z%gRrxAwzgWjX`-9WwkrYL9G%(N2Z62eOdm)Og`YZv!$Ye#Y-`4LU%m5Li94OHjK+9 zd+-2Vm=Je0gv}(IAxgrsWxz}x|26p)J*P#(zovdg@6)33zovafpVOkrzh-Y@cNYv4CbaG6sXNTuRPb63#PwXaue=EB%)n(wE+Jcp`#E zEeTGKQ?04;M=y~j5}tSh^P!Wyp2`3c3Oz-tCt_PpAx&=13M28V(5DwgG{)S7#K?Io zipK9me*I1XwC%P&EedU-16bQ5PK&|<$1+KTOUN?v{K-&$hOzJEqLJ+74ZyakHlLvg zpl!2t^EH$MSlc3+Z=n*v+m_LM4|efp8%&$g?Ku1kg5>OXz@*Lt-k7G-?J6#BUGr=c zc+S}eOnR z+87aq1&fX`0k0QMr0P~+OeyGQVg6@MvGxm;))^H05?<;yW<=q^ZgMsQy8lKi#!~3% zsGZ$MNob5zD0h%+fWmScaO3fCxpazDjOb#yr$RD41?m&)ntVmSs>+>lcK?u9Q;Ky- zmbWdc(J%<>m$e}T6`n{E-4jR{E*%~w5p|@lPON#p9#70hF*YS3KNrPml`p8V0rLW< zb-plIdV>sKuE(gS;p?03Yebt=+eGXU=zWKt?-U{y9n}8Y`_{|Pakz8WV@ccGSDNwk6 zXH42`bfzO8zG&qkq|Y_x7_`rh?~v!tuk-NKFVG9@zod&lp1&uq*zmok9|P(3*@nOx zVU9?{Ij}`IL}cL-I3nCc6pPhl+4oYGS@{&MoRhc?!NXQYRbr4_f&6k*Fj&RPa3vH( zNQZL@hsF%=L2lx?8zLyr*$~Tt&(ua!2|z_%#<*qhz4306-N^4umn37gp#*o~MC zJxwn^0}WncNHvCMou=??!fV~rTUSqbuix-dZ}?o_=Pn#q#Bu4w`JhlY0Ouxj2p*Po z!fM@Nt)8$^Z`fR0Xcf92@7u=k1=d}R!kF=lE#WHD^C00RR#HFPL+r*j+T~s~L32bD ztc*Yz1QFpF2JAXUadIoIT;3>{6FBqsK|tv^ZaDYQqImpHAP+mEOidJlv}qbh16k87 zkOlIlc>qUNmaInC>{|J7&@*<+H@amv1n*#4IEAI30x1XORQBEmZoocBX;ukP4)%-O z=2wfP3sdfmnuX2D1mj3BQvB3{K~K?%ED25pTyf7d7s`+gjL9>j@Fhj?^c+`a-qIVx z`}4UP!(rIOUo`WC(C(9hq)9O;%{)nXoHD|82a}B{Drrr#2{pm6oZ=^I$W!KV>OA(c z7w3sc=Xz+$()Pn3VU-TJUFtPg?$uT30aXJ`r6^c%G_* z8keRSE@S{)$k6GoW7UrYB)+3Ov;-h8#EX;zM@IrhUaQO<-OM{w!xAvDX7yRE%Y>J) zc+pEo1-Voq;#doUph)AvDRd;I&ct1@_$IK^8X*vKf(Kj=PGnRyv2)!pNic!-Y#6j^ zzo)sz?GsL(da?yj-M>=PFijHkO;*m?C(dq1K`?ncuA4c$g z?K05QBTGY^E0_}q7F>4ZaVn1gFAS^p{^%F@b^J>CU+RCyWweKXo2D-T`=Uu-=q28B z{%Cn5&Y6`}XxoN5>2BGGd+;Efu3v7;nZK(x7yk)u{{@hV3OvpsVEi}G9p+DQDh@kp z@^Is2tDM9T0P}CMlYHwh_{6MA)`9Y?qRt#Xe=x9SvUjVz9!n#FTIKvqFlLQpJt*6# z8adxR5>%p;R~t8R9{t;f*r9R)*JPcxN(F^M=<{ z*#AwsObYqf!3BMq;@6dj?@!j6=~NY3nF8un{rM>m1vcW{)P{#-?hKC!xH~uic=JIp;=%DlUm% zcUDA)oKJrEc>EJ3J9iuzu8J^!Lf`C>D4J zPInszV27CU;|rWI9R`0shuM{DU&bg-TrPAf4ol{Ctr$kuf;FqrhtDt)s`CxC+&ATr zD0|&{$vmJa=YRiDLMF0aqD-63GCsB|ZE|ee=V{pBB7`U?nap;kl3Kyy1&8b%tw5tf zTu3=QWr2}2(8$MTNa&c&hb6h1yiu0su;(AxgDE1%g&F%)%Y-&ora<7bn z4*99yBqTJ~n!qAojS1C!kJM(sV0)Hx+P0dhOoE8fI)_)LB5?_fi5!i%b|$Gf+~ZXxT2Wcle^BHPW+@{|zPqnG%fy5Ipl5+mvx-;N_bneHlN zR5cUl@WFoWZeM?|yPRHtLGJcbX_q8?uc}(Ou>9z_AYXbKZ{_w{j4_5DI)~gu$kF5D zxW-p9tA6^i7y>e8*wF%Mger=8-0uM$)foGLxt1NYC%aT19ifLXrY{a+WlwMgFCMH( zsei|zBWIoDZ&`3rGghgWdTb{^-mt*man`qdrq6;rBoqY_!d;PS6!?aG)PNgV=(|)I zjQZY_bTZ=(q44YPDM~LA8JhT_G{YOUv- ztmU|BNaA^h8(-}SmvBVfm>CJD93Wk&L#k3FPWZaM4O!d8f8EMhj|&EdLoo5M#@n21 z7IYm7aKW}M59Jb`##u&XbWj!F;)0$g4-#Rq+*YS~6~j}!7xAKE3yBu?%9su!;U&Vs z9WrLVSc#SA_%hY|%j>UM{A(4$j!Ky|_|5M$_cV?9fL44@;qT}bgW7+T>TY%^;!>m> z8@%Wq;N8}>y?_o4*DU4QP(oLDMGVfZAkz2Z#;lT!dW!dyYA^hC|7uC(gYxmS2g8-y zpaAoAG6IVH8qo*5hj`0Q2?-?9YeXMXev_ki@zvaG_zzt&lur}>%1UC$X)DlK?RyGI zoH`hx@f=QNlMO}v&BW-TB8CT|lhM|jm{ z1zhJ_rrfO?MG|w5rL2!H_&KQ=0!0mcJ(aF*Jb9FjPd&|eg6nB--!vg@fF|}ZyRj45 zYlWU;X%lWT|GZI%{&PtFw_HB;3Mxm#`rAT9gTZ zxwr=h$S~(6|FWW%9DYhkC*b$wPg3=JGK$pSlUDTqzBD!p@Z^WE7oN04llsxvrohvz zH+Avv5w}aP-nY=}7k@2p*^|XII`Qn)?^ew>Sn=%L`*tq1*A1R+3gg+c$6bJLM&sGL z-<^V}!adFF9_@LJfeaA>b4^4Du7?A?1HoiL@uDnVJ6a#E(UPbWew%mYB)$rShwc4- zq+PgSjHlkmjYAguW=76^LZuk-SpuuzD=vbUsPWH6hdJq6XVgPDfS!Q63JHwCngb2f O<&dJ)u0jyP&!{aB2nkgH diff --git a/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.gz b/apps/dashboard/build/_app/immutable/assets/0.BChctYiF.css.gz deleted file mode 100644 index abec51e33f5ced84a4e4098446f2e043c56e1be8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7822 zcmV;99&zCxiwFP!000021MPk7ljFE?_xJo2yxrQ==t61vs?kuk>k?O7<&^CYaq_{n zbLFBWN}`t%8Isx=jiUcO-FP8E5&$V`&bh0^&y&4TGXC56Dx5T{nHL1nd=%vk1Xf5s{3)diWnn&NFyok8At2Ez4`Lrm{NfZ=m5^pGdmxmiH z*J+j(ASFFErB%sTw82LU{?|(Q7Kc)LnM%n;nL_)K=K-R$>8L}kr}as~UZwh-)GAu(dnNp{;bxQElFv<3zph^s1 zSg8;urpZJ$(%XV_&{)Pq=(_w=j6$lMog@*IB*%2SMfR6?Q|<#Rd+jFCEI)3y+isdX z!&P!>>A1?V`i@c2YE5gX+dM4FP8&OuPqsz$~){u zl)+ciAYq5ZZBr%4szOX|*SnZj#BVJncsD33yDCXhh!sFynpLu*SgUkZ`Bnf~L05^= z60cI_MPDaN>HzVbE-(sK;w__8yS8V=OHj`A|mj2oQ`lZVgNsBUDNQef^ovLtRVfG ztoIKKXSVoc%77(Sj&Fz+N0@*^Ee*Z_~CQxwcB$ESIVDte2f{J}B}`2RDa0;U#dFD~ka}+HyWB-pWenE!fO|%V9 zNl9nCWVTfIi!<9V!#+xd#k9IZ z`j*BUn05M=Z(9{{6Gd6@(Y9>M2`gf8T9q&=eRM)6^y|*=a4Ml1KYF1TKGxt3tVljS z0wt_z*cyY6kri2__oGBQT=E`~<#axV8C1&0xjUb4?KXY7OJKzRxUd)N?V`>xk3z^Z zT=@R>u}NhNYir?c*R|r&A6>UGpAeZ~0&^0H+HP?q#hn5fa!23_94awH2kWX5e> zgJ2uOBB_XyXkB9Qoysyjjuy8s4+$TO*ps7*a0y}%XhO1Q`yZ|72_)^C3 zt^PP^)+)5&lyys|Bk*I*8Jo0(4|v%JxbAIp@0fen+uO^b;UP1#Ji4eGVY_R@mRL>cOykeL z!)f01-=p0r33Jo~&LkzP%qGL5<{B3#yk4tX+DS8nn zio;r-pxAxQuNI_fgLUQE(cxMEEfFeoVSTzne{X^}>Vm6@82Ut5E5*BGfL$B53qiu8 z|EbXnKo7&c1~|-@@wW)2K`#ZJ)ghS9aEfq6+0cODC;oyCC5bMi^1(%hUMq{Ya%s~C zVnPN9{>L>SebhExp9)<3USOVpN(JGmOt0W#+vTt(Q&|Jr9H4(ZUp8@(K_4C@aRHh@ zpL9(V^OTr}=yTl3pxAQ*4n@tied5)_jU4JDaiMY!leB~cE_Q0%ci8Zv>H{)Y=Dor{Tm}yq-^7NFM zSccGlgrqu~pJt~8Hc}-Gi>D_*Kvx)BuyAs-X879DUg9u^${aV`FG1W6tm^2*PCc0Y z{Pm`tEY&-Ri-#`<`0ipDseUxS;1}^DdSO|8$oi|B1mGWF+=Y$WQ|iryW*EXM-vMWk zsvMbjnBk-2Ch!OtTH89>6HP9a?N`C`OkBj3_c_cmm^z2Ybrj&=kWm(%SsvWo%vO_- z7x0F(D5T$$jX#{Zirgo$uifdd1R zPf`r-icA1=_ z3rzB>*-^5m!yEnn`N-DfC#URBuXHja`_F@4EVx%?td80ErwYa+dl z8aF+IsZ{!478rlZ{f#^uXi~Rv>|w0ERk8R8ii#Ovu@=2$LM}3qrfw(6s{fnv&)#4kp#~@tj4!rU}p^ zkzeqoL?!(jA}6PSI#*a4k)_3dH_e-|IHdkbMk&)0{r{g*+?u`HI1asu|4 zYyr-oqT(XP=@9uZ($4|S<~oxkG17Gwu3&Bo7F??77pGij+ZenpbprW$o$=|}r8{Ap z!2kn&Vx2;NUuSeD!@AJD3gU&L^G`O)PK@sjYr=7_9LdHZ4Feg`8elfaHPP1@wEHFu z$2JM*`MW-tP&G4LOj%?`s#Xy(t_I^WjHkhPfFVu~$StoudD8qS&eP&h9-Uc(KsLoz zOJqn-k3^YCv@NIh^JnLRf8p*Rqj{9j!#UTX=74&e+ScWb%=TeN*g}F+6C6VDYJx`y zeogQR;rWaG{9`TVI;$MpmwNJi{Q-TP;RBAvl-=4u|2cD>FHuT!TvDOA*sGa+E?^ICY)4bBeGbf0HFPg6H_@PQMw z-4C@Ha*$k`3wHXk4n?~CNS7kLexyf{&tImtlf6Rw6F3M7l2?r~(td5!npIs)TC~l; zL#5kXyfX;yP_R1)>{75d2uw;XsnyW*4-SQjEs&sT`y-wCIssn~6d517Ya(uNFe1)% zSP%@K;#cc!0kcdYb&F17KFkVPII=99`?DZZx=VBQPrhHA7F2XjfDs(#{}q`m24*{$ zD^?`@ah*}=jrj)9dyGJdX>g9Mn#pTh`>dDllnZnqqg?Sc%ZBO9&qBk3)0nGF*lVY#iI z1ijFvPKQTbOMiiuu0uH#(-iImy=;<$E%$}CW?|w7Bxua_9tmkyFSwa5Ops_6 zjp&I9NBUZ%FCgbycFHRKM*P$z0tHR=U+5@JaDM3Gf z!2lAR2vs~tsFU4ivaR1hxP(LpHW;ArKRAIWKZ`y15x;`Q!Y^=t%;;YYs*U4d`a)^= z7gEF+Rl11jM6MdJnD}HYD-tWYCTe0xsApWPl3-N`EV(ozTOI#XE4Z~qd7~5>;#CP} z{6cn&9~YFEF>D|oF4bQ(Baf0b1y&v-E1|uKG#VeF&f8VBO(06}Vb1T5u)V?ry2PYyy)>}@`oh^(%j)zz?idRDK) zN}4>NXxrb!5W7G_NeClLN1yPe`YXVHz&Qh%6jO*$$0{K1XtLQ=1eC-9=xGsCi5MXA zbn3F{APD(7!|;K4d!B}5OXb3UvMFsq!>(y!4PHg%3(hs|`AV zf9O_Uh_f{yn`88{>`IuUK{*WLYA`Otcp41!zswam<00(!Z-`eifGuip5%1#!H%$~l z?tIOLD-Y&rBl)OG0RE{vil(&5q$v$OZGEy>6ya1Ov}>R9liBCIqkYb3``n+*KKC8% zb4T0f{bcre?`WSl+P?WuX5aiB?VFFbZ}F4aw|GbU7K81B$rZ$3!eC27Pbw!(1p9Yc z5f@7muuVC^avVIno*Yh?GUtmLaHcM;`Zx1vkufmBy*V+`fCd0psdRDEgt#-$au!bH zE^u+ffv~`6!e|jxF}9N$`kLsVWbweE9yo?=iM-M46&LDMgdV^vk%h|~!e zC9K;R#krl`5!f3h3=z?cu;XG@mnzDV?4}Hn#Grz(=kHh&i7kaSigjs3Jh5O?*A;fD zZi$uX%|H@3!B>w}$m_&#THzDocBYU82HHw&pz*lxVS_w_J{yp0s0}Q>SYibYM1BV= zlv(uH!T4^r#Fbm(ZQjokccdlmZI*a)OXl8=+#?3=JV zVNtVz-|{`WzR&mD(bbjf>TT}P)g7g)+o!81*L6O>M^|r@u3n$6zFgOZb&sz8C|!M} zuJp);q!G|F93vZnN@|a`lug$R=s_CzZ2gwH^kj`Qt{teP_H|-}4SEB=Pu)&;K-C@D z9jK%ZR9D?0uwJ<-Rn~2{IV7Dk9b!gy&PuUEhZVceM$PbkpT_Ssq)Rkb4&(P}{9Z$M zt+7CDX^b)96^xw#lNd&igpD*zDYnNj#-}r^679=19@)1m#SYb2-M^P~2oTq9-Orki z5&}=FBam}-I)jocr03&W1K+Mb|9$BkAP{*f808|%D?JBYfz@c*mvjy(&~@U?-IP}7 zu(hGAi`t3HO@*#E4;osbe9lt!;iK_^Ou49^(TIl%Y$&Sqg_3eet76rVbBIs0hL`CSN4xGx` z8uJu&LDd~m7doi})s@#qH5}-wLl_Qr%?Vt`!jW^s9JJYwT+^ zcGP7&q7`Yyj&-$BjT`eq>3Kl{!+RCm2*u5XoJ6n7NDZ5VV5${?F_ z2G2%3^bB!YyC|S{PU%0s##l%k%t0S2(j!BPl3Cin1c?31@L1FN3 z_DbWhnkVA5Az9gLZA<^*CqTQy&@M%L!_Xc@FNUEp{yIC;@U`YSU`-$!FxZ38HUkfp zZgcU@Ah^T8L&ZB>ygLZ)Qm{7&>{0MAMVK1%LEt$BF9v~GecHnc(B>s*4J$wNDrKcm z`TDbVSt(Sc{`6c{3YDTiK9`k3mFUmUWu;KYYUrFo7XzRR3WXD)a6ARZSdqgfCswkR z*n0a;!2#Ny4}+8Q4Oud^YwI zuM$sgfs@L|l;Ih4uEVTyNOp4h5aKmhdh6=UN_KIO%PtPXWw)*Xtz@gp{gz@^mHKO; zkX_s$yO7I%{<0wFeTAE{Fp`UFEXWc5SjH)l4{ zRQDD{W^Wt9x)Z#Z=+e2!Tj*1Sdp{@30T|v*k-J5QNT$d>*$l;`^9xFc$miI;94Z_+ zcvD|tdTHKf&Kiq|n6$5(l3`j>^M0}U5V<*?iNiG_jd6u5@aVY@F?^L1S(~hPt@K+} zv9>Xhs3gx7Vg zah}iuRS9s&ZM`Pm17V|6ve!<(!smZQDcJWLlUIuk(zRLg+%7zR7X9?l+ z!j1YS@pN039fEs-q9M-OnBpIO3`^k#stPN<#xOBkWZ~HaA+7twK|8TSWdv?BToCkk zv$_rn{ol7=y!MExi|d4DSvWpe3H_D2_6;Of1bc}to;^=&QQL6_H!~6=Krk*jP+$>%}w0_jS^ciTncH-k-__g ze7od!*UoD!O>UAmoNTtp|D#8Nz`TDlq#BSz8IwsXk=ia^CHZrzdT|@M`*_aC?dd_X zB@+QdMpJHF8{!0^)8xpLER!ba+BMtJn0@OW2gp(o$xnNh{e@d<$^`) zJV}d5?D~)?ob1I*RW;A7RAr8j$(YTX^VMwd>B?Srsrv^;Q48dVNuzS7xG0uYFwlQN zR*=S2{JdN0FQ_O~75n>c0Eupmxm3F2a|% z1=&Thd+a9z@-Iwx$$y^%F{qxVy<5Eg4LOVs-tXk$_E~Z3v8Wqz7-og5wSq^XE3Ft8 z;C@36qodtBdANO6+))>OIgCE0Tjx=q{ZyJU?riBTS&TnuTIV7h=~G%V?#$p#dE9Y; zu+FCn6V}*5W01$&G9Ztk0m*t>S|PYYXaD6!{ zkSKu0iu&DHQJ>syjtF?fVORht1j?u%|44RITxp{+s#xM87CS_g#kGC%JX|uOgTG?gZ}BLA;w!p@8nj zzCQ8w^qM|mtjJ-&nN}X-(wAdn3w=@TpxX{^p?el?p)bf5x`#XHsxoiwt1r}B%k&xN z`OjiooxF!ElxFw5=29`QTWUkGSLx>5cnA<5P^jNyZr>Lv6zV#M=S^23f6NH>>G?yT z^Xydyq+x-g4N(4aV5{lK!mV0QU%IM1QB-FdE)7%L!Ofw?MYRn^_RR22%L(5ld9dLv z+KF&T4OZTBd+shCUH-l`PD;oN*9PD9_QbYC+6s%-sg_eFjeBtLA0EQ8VcPK^G_8^t zDIzH8ca$WLr_bj~C9Q3rl0GPj@hBuH1(kFw1>sY}Mxif8PhX5yXoYt8^i67XaRihAU?yfm}$7$xta>UyoN@o-3uV=v_L!knXi^`^i0EF$(;*a(fvHDV%Z zE|4Iwg0l0QX(Y_t(Iqff*J)5@7WygWrq9whxG4!^I=)6{^1g6kkQ?}Ecq2~wQ{hEd zXp`ckt#zkA<*D!LcM5|ztD%>Ixgi`6-Nr{)APX6Y*{1ml9wbdeJa9zwtwR^9U5N*4 zLiQyd;J^{Qc_4+LWhO)#V*{Yr8K6;h85&&w2w&9j*%KVtdQ=FXQt6H;-STm&CbPu3 z&yp#|%9(B>uZ7waG})YshB#_NoNg&uuF4MgK08Pe`|ToA)(9zLN3>(1wu2Zwbz8L! zE%UGU+W&6cTAtz|MLMMYf@HBUI>UkaK zYuHk&+!Hhi&UnPWiN6zQ)x$CUA$(4j;(HRloF#oP4z#3w@6`X)RL~isAnlO+r>=so zFDOWV2nzbW3OY;vV!MqmyyJnkj*9LO75U8&5*5WVblYX<^s4BRG6a7IRnNmGe~#g| zX}HEmOxaD$ve!*JpkNh2W5tki`hvuV58@EiJ`)dP)F#?Vy)P2yk`yNnar{USJV@i< zWADv&4CC0cy31N9A6HR4^?~z!ye*fV*I;RxfhbnJ_$MhoOYBgZQdplNs9cG~2_|+A z@-*@clPH%|oVttp3-nQ9f2HcD{_-%zU{?VPQLoB=3ebK7On$2RDU{uWyNJezXs~UN zpagii8{hiV9CoR}^1}!9S%Dh4OVf?+kVK8dPzdP}gz6Z;4?JSPXuoQ70ZbXb1|Pov zuw<{0!^fR8a3+56^oCEKo-iByrK4{_*7!uv;jOvT0QLtq5(Sg@M2ELX@xaL#wh=A5b68~r>xeckIp{Ki`PNq7J|r`O^Y-tc zdBEm|2FfDBhjXAuMu)B)A>^^#h7*L=!Gk+T=Tg(XOW)z`xb%x~8?nfQS@A6b&nX<% z{;&P^yl=-XM8|Ir1PwtWAsZlRl8J7VhGGptuz|BfAJaw1+geJ!Cb*4r755;P3I~t4 g89}ADwXeNga&3$mcMgK<>-rD>0|;TT3X7!x08AT1OaK4? diff --git a/apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css b/apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css new file mode 100644 index 0000000..778c3e9 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css @@ -0,0 +1 @@ +/*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:"JetBrains Mono", "Fira Code", "SF Mono", monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0, 0, .2, 1) infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-void:#050510;--color-deep:#10102a;--color-subtle:#2a2a5e;--color-muted:#4a4a7a;--color-dim:#7a7aaa;--color-text:#e0e0ff;--color-bright:#fff;--color-synapse:#6366f1;--color-synapse-glow:#818cf8;--color-dream:#a855f7;--color-dream-glow:#c084fc;--color-memory:#3b82f6;--color-recall:#10b981;--color-decay:#ef4444;--color-warning:#f59e0b}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.end\!{inset-inline-end:var(--spacing)!important}.top-0{top:calc(var(--spacing) * 0)}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.right-0{right:calc(var(--spacing) * 0)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-1\/2{left:50%}.left-4{left:calc(var(--spacing) * 4)}.left-6{left:calc(var(--spacing) * 6)}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-\[-12px\]{margin-top:-12px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-96{width:calc(var(--spacing) * 96)}.w-\[90\%\]{width:90%}.w-full{width:100%}.w-px{width:1px}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-64{min-width:calc(var(--spacing) * 64)}.min-w-\[2rem\]{min-width:2rem}.min-w-\[3\.5rem\]{min-width:3.5rem}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\!border-decay\/20{border-color:#ef444433!important}@supports (color:color-mix(in lab,red,red)){.\!border-decay\/20{border-color:color-mix(in oklab,var(--color-decay) 20%,transparent)!important}}.\!border-dream\/20{border-color:#a855f733!important}@supports (color:color-mix(in lab,red,red)){.\!border-dream\/20{border-color:color-mix(in oklab,var(--color-dream) 20%,transparent)!important}}.\!border-synapse\/20{border-color:#6366f133!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/20{border-color:color-mix(in oklab,var(--color-synapse) 20%,transparent)!important}}.\!border-synapse\/30{border-color:#6366f14d!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/30{border-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)!important}}.\!border-synapse\/40{border-color:#6366f166!important}@supports (color:color-mix(in lab,red,red)){.\!border-synapse\/40{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)!important}}.border-\[\#A33FFF\]\/40{border-color:#a33fff66}.border-dream\/10{border-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.border-dream\/10{border-color:color-mix(in oklab,var(--color-dream) 10%,transparent)}}.border-dream\/20{border-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.border-dream\/20{border-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.border-dream\/30{border-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.border-dream\/30{border-color:color-mix(in oklab,var(--color-dream) 30%,transparent)}}.border-dream\/40{border-color:#a855f766}@supports (color:color-mix(in lab,red,red)){.border-dream\/40{border-color:color-mix(in oklab,var(--color-dream) 40%,transparent)}}.border-dream\/50{border-color:#a855f780}@supports (color:color-mix(in lab,red,red)){.border-dream\/50{border-color:color-mix(in oklab,var(--color-dream) 50%,transparent)}}.border-recall\/30{border-color:#10b9814d}@supports (color:color-mix(in lab,red,red)){.border-recall\/30{border-color:color-mix(in oklab,var(--color-recall) 30%,transparent)}}.border-subtle\/15{border-color:#2a2a5e26}@supports (color:color-mix(in lab,red,red)){.border-subtle\/15{border-color:color-mix(in oklab,var(--color-subtle) 15%,transparent)}}.border-subtle\/20{border-color:#2a2a5e33}@supports (color:color-mix(in lab,red,red)){.border-subtle\/20{border-color:color-mix(in oklab,var(--color-subtle) 20%,transparent)}}.border-synapse{border-color:var(--color-synapse)}.border-synapse\/10{border-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.border-synapse\/10{border-color:color-mix(in oklab,var(--color-synapse) 10%,transparent)}}.border-synapse\/30{border-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.border-synapse\/30{border-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)}}.border-synapse\/40{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.border-synapse\/40{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)}}.border-transparent{border-color:#0000}.border-warning\/40{border-color:#f59e0b66}@supports (color:color-mix(in lab,red,red)){.border-warning\/40{border-color:color-mix(in oklab,var(--color-warning) 40%,transparent)}}.border-warning\/50{border-color:#f59e0b80}@supports (color:color-mix(in lab,red,red)){.border-warning\/50{border-color:color-mix(in oklab,var(--color-warning) 50%,transparent)}}.border-t-dream{border-top-color:var(--color-dream)}.border-t-synapse{border-top-color:var(--color-synapse)}.border-t-warning{border-top-color:var(--color-warning)}.bg-\[\#A33FFF\]{background-color:#a33fff}.bg-\[\#A33FFF\]\/10{background-color:#a33fff1a}.bg-amber-400{background-color:var(--color-amber-400)}.bg-decay{background-color:var(--color-decay)}.bg-decay\/10{background-color:#ef44441a}@supports (color:color-mix(in lab,red,red)){.bg-decay\/10{background-color:color-mix(in oklab,var(--color-decay) 10%,transparent)}}.bg-decay\/20{background-color:#ef444433}@supports (color:color-mix(in lab,red,red)){.bg-decay\/20{background-color:color-mix(in oklab,var(--color-decay) 20%,transparent)}}.bg-deep{background-color:var(--color-deep)}.bg-dream{background-color:var(--color-dream)}.bg-dream\/5{background-color:#a855f70d}@supports (color:color-mix(in lab,red,red)){.bg-dream\/5{background-color:color-mix(in oklab,var(--color-dream) 5%,transparent)}}.bg-dream\/10{background-color:#a855f71a}@supports (color:color-mix(in lab,red,red)){.bg-dream\/10{background-color:color-mix(in oklab,var(--color-dream) 10%,transparent)}}.bg-dream\/20{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.bg-dream\/20{background-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.bg-recall{background-color:var(--color-recall)}.bg-recall\/10{background-color:#10b9811a}@supports (color:color-mix(in lab,red,red)){.bg-recall\/10{background-color:color-mix(in oklab,var(--color-recall) 10%,transparent)}}.bg-recall\/20{background-color:#10b98133}@supports (color:color-mix(in lab,red,red)){.bg-recall\/20{background-color:color-mix(in oklab,var(--color-recall) 20%,transparent)}}.bg-synapse{background-color:var(--color-synapse)}.bg-synapse\/10{background-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/10{background-color:color-mix(in oklab,var(--color-synapse) 10%,transparent)}}.bg-synapse\/15{background-color:#6366f126}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/15{background-color:color-mix(in oklab,var(--color-synapse) 15%,transparent)}}.bg-synapse\/20{background-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.bg-synapse\/20{background-color:color-mix(in oklab,var(--color-synapse) 20%,transparent)}}.bg-transparent{background-color:#0000}.bg-void{background-color:var(--color-void)}.bg-void\/60{background-color:#05051099}@supports (color:color-mix(in lab,red,red)){.bg-void\/60{background-color:color-mix(in oklab,var(--color-void) 60%,transparent)}}.bg-warning\/20{background-color:#f59e0b33}@supports (color:color-mix(in lab,red,red)){.bg-warning\/20{background-color:color-mix(in oklab,var(--color-warning) 20%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.bg-white\/\[0\.03\]{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.03\]{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.bg-white\/\[0\.04\]{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.04\]{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.bg-white\/\[0\.06\]{background-color:#ffffff0f}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.06\]{background-color:color-mix(in oklab,var(--color-white) 6%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-dream{--tw-gradient-from:var(--color-dream);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-synapse{--tw-gradient-to:var(--color-synapse);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-\[10vh\]{padding-top:10vh}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pl-14{padding-left:calc(var(--spacing) * 14)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#E4C8FF\]{color:#e4c8ff}.text-amber-400{color:var(--color-amber-400)}.text-bright{color:var(--color-bright)}.text-decay{color:var(--color-decay)}.text-decay\/60{color:#ef444499}@supports (color:color-mix(in lab,red,red)){.text-decay\/60{color:color-mix(in oklab,var(--color-decay) 60%,transparent)}}.text-dim{color:var(--color-dim)}.text-dream{color:var(--color-dream)}.text-dream-glow{color:var(--color-dream-glow)}.text-memory{color:var(--color-memory)}.text-muted{color:var(--color-muted)}.text-muted\/50{color:#4a4a7a80}@supports (color:color-mix(in lab,red,red)){.text-muted\/50{color:color-mix(in oklab,var(--color-muted) 50%,transparent)}}.text-recall{color:var(--color-recall)}.text-subtle{color:var(--color-subtle)}.text-synapse{color:var(--color-synapse)}.text-synapse-glow{color:var(--color-synapse-glow)}.text-text{color:var(--color-text)}.text-warning{color:var(--color-warning)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.accent-synapse{accent-color:var(--color-synapse)}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow\!{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a)!important;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(99\,102\,241\,0\.15\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#6366f126);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(163\,63\,255\,0\.15\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#a33fff26);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-synapse\/10{--tw-shadow-color:#6366f11a}@supports (color:color-mix(in lab,red,red)){.shadow-synapse\/10{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-synapse) 10%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-synapse\/20{--tw-shadow-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.shadow-synapse\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-synapse) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.placeholder\:text-muted::placeholder{color:var(--color-muted)}@media(hover:hover){.hover\:bg-decay\/20:hover{background-color:#ef444433}@supports (color:color-mix(in lab,red,red)){.hover\:bg-decay\/20:hover{background-color:color-mix(in oklab,var(--color-decay) 20%,transparent)}}.hover\:bg-decay\/30:hover{background-color:#ef44444d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-decay\/30:hover{background-color:color-mix(in oklab,var(--color-decay) 30%,transparent)}}.hover\:bg-dream\/20:hover{background-color:#a855f733}@supports (color:color-mix(in lab,red,red)){.hover\:bg-dream\/20:hover{background-color:color-mix(in oklab,var(--color-dream) 20%,transparent)}}.hover\:bg-dream\/30:hover{background-color:#a855f74d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-dream\/30:hover{background-color:color-mix(in oklab,var(--color-dream) 30%,transparent)}}.hover\:bg-recall\/30:hover{background-color:#10b9814d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-recall\/30:hover{background-color:color-mix(in oklab,var(--color-recall) 30%,transparent)}}.hover\:bg-synapse\/30:hover{background-color:#6366f14d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-synapse\/30:hover{background-color:color-mix(in oklab,var(--color-synapse) 30%,transparent)}}.hover\:bg-warning\/30:hover{background-color:#f59e0b4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/30:hover{background-color:color-mix(in oklab,var(--color-warning) 30%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}.hover\:bg-white\/\[0\.04\]:hover{background-color:#ffffff0a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.04\]:hover{background-color:color-mix(in oklab,var(--color-white) 4%,transparent)}}.hover\:text-dim:hover{color:var(--color-dim)}.hover\:text-text:hover{color:var(--color-text)}}.focus\:\!border-synapse\/40:focus{border-color:#6366f166!important}@supports (color:color-mix(in lab,red,red)){.focus\:\!border-synapse\/40:focus{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)!important}}.focus\:border-dream\/40:focus{border-color:#a855f766}@supports (color:color-mix(in lab,red,red)){.focus\:border-dream\/40:focus{border-color:color-mix(in oklab,var(--color-dream) 40%,transparent)}}.focus\:border-synapse\/40:focus{border-color:#6366f166}@supports (color:color-mix(in lab,red,red)){.focus\:border-synapse\/40:focus{border-color:color-mix(in oklab,var(--color-synapse) 40%,transparent)}}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-synapse\/20:focus{--tw-ring-color:#6366f133}@supports (color:color-mix(in lab,red,red)){.focus\:ring-synapse\/20:focus{--tw-ring-color:color-mix(in oklab, var(--color-synapse) 20%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:pt-\[15vh\]{padding-top:15vh}.md\:pb-0{padding-bottom:calc(var(--spacing) * 0)}}@media(min-width:64rem){.lg\:block{display:block}.lg\:w-56{width:calc(var(--spacing) * 56)}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\:\:-webkit-slider-thumb\]\:h-3::-webkit-slider-thumb{height:calc(var(--spacing) * 3)}.\[\&\:\:-webkit-slider-thumb\]\:w-3::-webkit-slider-thumb{width:calc(var(--spacing) * 3)}.\[\&\:\:-webkit-slider-thumb\]\:appearance-none::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none}.\[\&\:\:-webkit-slider-thumb\]\:rounded-full::-webkit-slider-thumb{border-radius:3.40282e38px}.\[\&\:\:-webkit-slider-thumb\]\:bg-synapse-glow::-webkit-slider-thumb{background-color:var(--color-synapse-glow)}.\[\&\:\:-webkit-slider-thumb\]\:shadow-\[0_0_8px_rgba\(129\,140\,248\,0\.4\)\]::-webkit-slider-thumb{--tw-shadow:0 0 8px var(--tw-shadow-color,#818cf866);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}html{background:var(--color-void);color:var(--color-text);font-family:var(--font-mono)}body{min-height:100vh;margin:0;overflow:hidden}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-subtle);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-muted)}.glass{-webkit-backdrop-filter:blur(20px)saturate(180%);background:#16163873;border:1px solid #6366f114;box-shadow:inset 0 1px #ffffff08,0 4px 24px #0000004d}.glass-subtle{-webkit-backdrop-filter:blur(12px)saturate(150%);background:#10102a66;border:1px solid #6366f10f;box-shadow:inset 0 1px #ffffff05,0 2px 12px #0003}.glass-sidebar{-webkit-backdrop-filter:blur(24px)saturate(180%);background:#0a0a1a99;border-right:1px solid #6366f11a;box-shadow:inset -1px 0 #ffffff05,4px 0 24px #0000004d}.glass-panel{-webkit-backdrop-filter:blur(24px)saturate(180%);background:#0a0a1acc;border:1px solid #6366f11a;box-shadow:inset 0 1px #ffffff08,0 8px 32px #0006}.glow-synapse{box-shadow:0 0 20px #6366f14d,0 0 60px #6366f11a}.glow-dream{box-shadow:0 0 20px #a855f74d,0 0 60px #a855f71a}.glow-memory{box-shadow:0 0 20px #3b82f64d,0 0 60px #3b82f61a}@keyframes pulse-glow{0%,to{opacity:1}50%{opacity:.5}}.animate-pulse-glow{animation:2s ease-in-out infinite pulse-glow}@keyframes orb-float-1{0%,to{transform:translate(0)scale(1)}25%{transform:translate(60px,-40px)scale(1.1)}50%{transform:translate(-30px,-80px)scale(.95)}75%{transform:translate(-60px,-20px)scale(1.05)}}@keyframes orb-float-2{0%,to{transform:translate(0)scale(1)}25%{transform:translate(-50px,30px)scale(1.08)}50%{transform:translate(40px,60px)scale(.92)}75%{transform:translate(20px,-40px)scale(1.03)}}@keyframes orb-float-3{0%,to{transform:translate(0)scale(1)}25%{transform:translate(30px,50px)scale(1.05)}50%{transform:translate(-60px,20px)scale(.98)}75%{transform:translate(40px,-30px)scale(1.1)}}.ambient-orb{filter:blur(80px);pointer-events:none;z-index:0;opacity:.35;border-radius:50%;position:fixed}.ambient-orb-1{background:radial-gradient(circle,#a855f766,#0000 70%);width:400px;height:400px;animation:20s ease-in-out infinite orb-float-1;top:-10%;right:-5%}.ambient-orb-2{background:radial-gradient(circle,#6366f159,#0000 70%);width:350px;height:350px;animation:25s ease-in-out infinite orb-float-2;bottom:-15%;left:-5%}.ambient-orb-3{background:radial-gradient(circle,#f59e0b33,#0000 70%);width:300px;height:300px;animation:22s ease-in-out infinite orb-float-3;top:40%;left:40%}.nav-active-border{position:relative}.nav-active-border:before{content:"";background:linear-gradient(180deg,var(--color-synapse),var(--color-dream),var(--color-synapse));background-size:100% 200%;border-radius:1px;width:2px;animation:3s ease-in-out infinite gradient-shift;position:absolute;top:4px;bottom:4px;left:0}@keyframes gradient-shift{0%,to{background-position:0 0}50%{background-position:0 100%}}@keyframes float{0%,to{transform:translateY(0)translate(0)}25%{transform:translateY(-10px)translate(5px)}50%{transform:translateY(-5px)translate(-5px)}75%{transform:translateY(-15px)translate(3px)}}.retention-critical{color:var(--color-decay)}.retention-low{color:var(--color-warning)}.retention-good{color:var(--color-recall)}.retention-strong{color:var(--color-synapse)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}.safe-bottom.svelte-12qhfyh{padding-bottom:env(safe-area-inset-bottom,0px)}@keyframes svelte-12qhfyh-page-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-page-in.svelte-12qhfyh{animation:svelte-12qhfyh-page-in .2s ease-out} diff --git a/apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css.br b/apps/dashboard/build/_app/immutable/assets/0.D08DCOSm.css.br new file mode 100644 index 0000000000000000000000000000000000000000..6878b3c41ad61120cd1c93dfd62d84b7c4001809 GIT binary patch literal 6833 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/assets/5.BBx09UGv.css.gz b/apps/dashboard/build/_app/immutable/assets/5.BBx09UGv.css.gz index 1e76ad06884dd0098a4242ca332556677d3d098e..8719f65e9aea72c5d919c1784343761b9307b8ea 100644 GIT binary patch delta 61 zcmeBV>|*4S@8)0t0Vd&zTwz+iI-adF*R^M5nz~pS+n?v!oh|aEr&}~gxI4J?v$uEF OPKK-d0&eUBss{iKaugo` delta 60 zcmeBT>}2GU@8)0t0Vd{&Tw$85pAwe6UKka{JMr9^^P3O7lVY`foYZ>d$fJt});function b(t){return(i==null?void 0:i.createHTML(t))??t}function L(t){var r=h("template");return r.innerHTML=b(t.replaceAll("","")),r.content}function a(t,r){var e=_;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function F(t,r){var e=(r&E)!==0,c=(r&g)!==0,n,m=!t.startsWith("");return()=>{if(u)return a(s,null),s;n===void 0&&(n=L(m?t:""+t),e||(n=l(n)));var o=c||p?document.importNode(n,!0):n.cloneNode(!0);if(e){var T=l(o),v=o.lastChild;a(T,v)}else a(o,o);return o}}function H(t=""){if(!u){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==N?(e.before(e=d()),x(e)):A(e),a(e,e),e}function O(){if(u)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function P(t,r){if(u){var e=_;((e.f&y)===0||e.nodes.end===null)&&(e.nodes.end=s),M();return}t!==null&&t.before(r)}export{P as a,a as b,O as c,F as f,H as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/B0IenmM-.js.br b/apps/dashboard/build/_app/immutable/chunks/B0IenmM-.js.br new file mode 100644 index 0000000000000000000000000000000000000000..28af03b0cb86f0cf174de4ef15bd0c601dad3d81 GIT binary patch literal 646 zcmV;10(t!#$pj$06*sQd^ms|46z@pEF_H^H-?WVfxqeS2wMK24ZfBYDrb!pam#r(k z06X85bepq9X&L6imL@2C$>Oq;Iwm26ZENjuaG^ccW_0=TwAMW^K2DQO3+!)XRyKyzHsj7R>Y4g_WLAT-6^PH|FPT5 z*&v0Z06QuwdG{v=5iP}bC$LoJB^xZpU=ZidNYTN$3{D4}hd6@=*?>m>gW@_=_~46h zX(g7P2hZhqLyEMgF4U6$G=PnyN2s?3j)hq|ny6MFn08zKaY0tR;_m^JXf(yCVgI<8 zEDiD?mNQ+0YDO)k4P^7STgr&q8;SO10f|fdO@V!F@Vk0&1uA6Z;Q`#FUxr+&i)NeG zy-w;uoLWpv|4GtjbP4>!aFJwI^S;&UD@9@&A$d17y0C1m?f}w$k2`qBS|$>L&Z!NB zh9!dBwSlEY*S6GC_*E3de}7=<0v4l)e9p|(`_^vGG?mG3F7LY4Q8}#1F3$4a8I_fu z%oVuw0yy+R&a^X1OUD`syo?TPZ(mJt+KFPx1p`bHq!iY}6TJ(N&)rQ$tx>O5uRZer zV5z~2hMZ(wYeath_u%*gQx1sw3m8-H!YBdOj5zPj)*yIfR#VB@WmYvOM(vF!0ksdt z^tVM&3UxWy(kjxyJHVgh#MI9&+|Xs})~bj;(f4q%lrf;KtnC6@vQx-4jE z6f31kgB-gtY`uFy$(N)>SD!STJAbfQu6&T4xf+-_SddvHR%CplC3Bs)q7L85{GWJ5 z<|grxW(jLDPl=Jt$HXm}{}OM>d`i3{Qzkx>`J8y!*1<1x^{?AL$=A2{Kh#sqi;W3` zx+uMiGH5hFtskwQ8#`MxQERuhcDnIRH5gCMcJ;GymH&ya&ub-N9fhmecEu5g!#@IE zIjAzQ5q|KtDYuZv4O`*S!DFF zET=N*!rurI@Au%e1&4^8RJ<qZ_hip0nvGmX^3onyuAwKO@6*N1Azik zX!}jYqrKmEl3b?s-4s~Ox%Pp9bp?p@42(Fr1V%Ez#7KNDd=L27&80e`Pn+l^_u=q+ z9n51QAcfz3-uq>Dl;=oY6USCXnbnG21%bM5I=qn9LobD{p_9M>Sk=QVYOTln{Xt!d zU3HKgo;BB5Bhu}uWGmTGm~z}pz?Pr8*XbcW8-`56obD6K{z{var a=!1;c((r,s=0)=>{a=!0,i(s,r)}),a||i(!1,null)},_)}export{N as i}; diff --git a/apps/dashboard/build/_app/immutable/chunks/B17metm1.js.br b/apps/dashboard/build/_app/immutable/chunks/B17metm1.js.br new file mode 100644 index 0000000000000000000000000000000000000000..89b5fe3f3158dd62e273b385f553b34a5bb5cfda GIT binary patch literal 283 zcmV+$0p$K0wE+l>lr9g{ZLOKIyTxQCMM$6RvoHrlt?(7*#){MQvVb9tQ)yJORP1Fu z8r1gm&;HiV!6eG$aw0znZ&=Ad>g2jpg_4PX`nO3$%E_=QeUOc_7CT(%1qyvYrC(@d zLAU)u#?R4m6*g}Ev-$FtZZ^8L!>eABoVT4H?e_n*D);**R(4CcFqrw}DdY7u!hBS6bIo`bM`H~8 z4I(9(GmX?t{sp}G+(de*q&A!6gWLdV{Y4={FxH15=V4&F!#@D>qwuxDa&yxFQp$J@ hd62HjfsDUEs_z|;8`{VL4kQjwG{WvveDLoKHvsxHku?AS literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/B17metm1.js.gz b/apps/dashboard/build/_app/immutable/chunks/B17metm1.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..37e28855e5ed3b2b50d95b9df41045990b8e6b10 GIT binary patch literal 319 zcmV-F0l@wriwFP!000026IGBwOT$1Ah421~q=zyKLrkckHjJf84_+#k+{+|x+O6qs z*xl4hn*T1FBI4;A-n=(6j5@Z)`o4_VMFkcC2Khd)#8to^`5~}Hehge9bKnYjOl^>> zz#Z~OU^CR#94E=G{yzBk?Cmo-xJji^y_$;HD-2KoJU99>B=jkqcwP}u%kE= zy_rr+5c!F1q)E%K=mcKimb%4$p8iD?Fj~>88jR>Gqn(c=wcxKwm#Z2i5iJ*v(s`&> z3rBG_chs_V@>P3~iR((|t{d=0,e(a=>({...a,connected:!0,error:null}))},n.onmessage=a=>{try{const s=JSON.parse(a.data);e(b=>{if(s.type==="Heartbeat")return{...b,lastHeartbeat:s};const v=[s,...b.events].slice(0,H);return{...b,events:v}})}catch(s){console.warn("[vestige] Failed to parse WebSocket message:",s)}},n.onclose=()=>{e(a=>({...a,connected:!1})),f(u)},n.onerror=()=>{e(a=>({...a,error:"WebSocket connection failed"}))}}catch(a){e(s=>({...s,error:String(a)}))}}function f(i){l&&clearTimeout(l);const u=Math.min(1e3*2**d,3e4);d++,l=setTimeout(()=>m(i),u)}function p(){l&&clearTimeout(l),n==null||n.close(),n=null,o({connected:!1,events:[],lastHeartbeat:null,error:null})}function w(){e(i=>({...i,events:[]}))}return{subscribe:t,connect:m,disconnect:p,clearEvents:w}}const r=y(),h=c(r,t=>t.connected),k=c(r,t=>t.events);c(r,t=>t.lastHeartbeat);const T=c(r,t=>{var o,e;return((e=(o=t.lastHeartbeat)==null?void 0:o.data)==null?void 0:e.memory_count)??0}),W=c(r,t=>{var o,e;return((e=(o=t.lastHeartbeat)==null?void 0:o.data)==null?void 0:e.avg_retention)??0}),E=c(r,t=>{var o,e;return((e=(o=t.lastHeartbeat)==null?void 0:o.data)==null?void 0:e.suppressed_count)??0});export{W as a,k as e,h as i,T as m,E as s,r as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.br b/apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.br new file mode 100644 index 0000000000000000000000000000000000000000..7aea3a95371e65ca88a627801640a5f66fbc7788 GIT binary patch literal 651 zcmV;60(AWwI0itBl-uBY<2YCs zFpk2>9GvZ+>`eX745rf<#EFdHm@oPwJFV>+r``Gnt}?$%@m!Z93HnPHpTp2BqGKm* z)|Cb`B&TbqlrJ+NpT~-KNg(HQh+6BMuxs6gM~P`(OqX)b4=@Q75QS$CLjK|pL9VNi z9IZgH3J$v9b$GKfEBI9k9Rw!ZuF#CyC;bQJ{OxH7tA9NL@;8TU?9wCJC15&s&r`w_ zX!aN*z+2tsjRW;P7as;a`F*iJ!f+8h*vnL+j3SRoV8n1ytg68&XD=aA7iI_{pp~Bm z!?HFTjNE+@6~3ryv-TT>(ahKKK9t literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.gz b/apps/dashboard/build/_app/immutable/chunks/B6fk3AxI.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..d89b3602091bf5b292088464fdc233754ecfef6d GIT binary patch literal 732 zcmV<20wet&iwFP!000026SY-sYuhjo{=Q$~nNg%xC`q$XW}}3`GP=RqK??m)N~_qH zM6E3uNsbpB{r4f;dFx(24EpKp(>;3bp1ZR}UMOwrG~gykNafAc&9%xy+WY+Jsb38A zSNdeaI8oBr;F6v9`|-S#i4{r)YlQ3Opf=^qBwEZMvc!Om6e)|8TZq81De^%Q5({bc zc0gbS(wgY*o@CtEOW@khfZIrxSw=u>rJF~G;|y#dS>w-Ild=Q)9EpxUD4E!7P$gul zDw?T;`vB@|V~m9#1{cF{{8*W&*LzpLj9MyVCC|Y{!;j||y~;dB{|a?J0>@&GkYr6( z!2#KEpX=3oq80OM>_dxBOD!@f=A-MzY@l zt&-uMtGmIE)x1e4^b&X3b6f*59oTf>sntR*5XVj6ZYbw|D6^B3Bm=H*L=LL7D8un~ zPQP=zq`8o20K?Ps)6Oh|d+e_03(ed0#n zT*R@RYDf;RaeVJB8X-gWUN!am(;01IHmJPk{YfeE6p~#o{s7%#tf7&+8xV5&@}2fy zzb8*-XH%38@U2q>m(ZbA$dOxVZ5K38Q>`jW_dY>Hb9A}Y97jRJ`}6Lv0m`+%44-Dh zuWDS~C@<97a<&S8sDRlw1i6XIRLz1PwHFYeQw!Qgsr9jw^!3enfdwIiUU1x8ptsdDyoI3a zl3Y)uV*Y)ba#q^@2b1-caQ(4$=CPs*&G)GCBlQ-7iawGZD+xh2V8C4t2Wzw^(LzgqyTu_-#6 z@5XT|Rp;hN*twTYmxT{i=Sfuwt%^TTT3gWWKJXg<13>7wx&RR4_S|_{u$PxHK3ORe z7iqLG`mIKx5v{^>^&YIR{{p3#VLx6r>kITUd|vv<(DTQm>3De)@4k;z6-U@sXh15Z zHzYQ=BIeRM{6piHxbtpVSsIa_@s8;B*T}h&#^+`83K;(!EO|FJ~EK{EE zbc!*o^8irPCOy1or!nQJq4Dyn`R)&h^)50XBrH3TfEh~ZRHW;~e^E}a&Jg<*X@5dW zr~Cdo;5sEjm+*Gohc@1)SOnc#$fZsEx+Iv(UTtL2P+AuqJm8+L6o%_^ z(Zg3IONm&q4N^E(TR5psB!QIqY&M`g6|z`LfsSB*7;&(FV^IEkI?i7MuO*-pMORnn zDF>e%J`exO&}F_k<=@qVuJnOKI5w3z|2mG%w^E)g^JY{D5_mn$e4i9A>t$>oH>EOE z7&fFyB=Iqe?2lr}O}->ms5i35R+YE52i#Wpy0tsFP$$tzw|pk?*NZ_ryncF`thF)z zcA2%wASs#FpHEYpJ>*j}O_R_Hby8BS+HTRdpT$u9Bf+GTZfD(YX;dLeuPuH*uIoY- zN^&F3KNZwjUq3dZ#A7GDo0{Z4nIB<#5}BbG`fpgI8?NbJ*{6ReN&ihRU(_zs-};fi z&fWZnKiqH&PaZl;k9(&B9iJup@7OR-KjCsL|NLgpNl%*=7Q)#8w#8Qd4uf43TpVg#5mKr zINK@SCJJBR{s2VWSsMWWidqIN`8-gF!Sq)$?`Q+2Krh%5Yt{2Ryu{8M^+UzRm3>q} z=44BE`ZbuO`P8T7f9A8;5UzaZU;30jEvNNA^(lIKJA8vrlW4QltUAjLqX-lqj~BPX zS_g`>mU9wKeInym|1CqY`YhIX*MDn2ULF+@==A_B?d3hu4Q27DYn$ZvhOpk)7)w4nO7{PW+pcYibSpF1EC zc^7pVFfWpTXPZMfC9!cW_c?^if?=HgyE>edW+xeUetl1GW{IBl4X^P6*UgLJb;yyC zuytvgQ)C-7+&kuL3=GFJdAKrc9eYg=P^W!@v$?y7Zz%&8ipHD)qOW_m(2jC9P+RW; zw&VqLI{v4D#{MwPNe1OPfxfUYClGN0GZ)5PTy#&QUKi@XR@&g?2}4_g%u|R{L)B~p z(*!J`VvkR9tnqF0uni-vS9yD`=KZ6NWPnRU%pu{ktrHp;OY^5>xNpMkTp`SkTZJ$G zI?8>?ON8m6V4!$lJC0Q#)^<=-n5Q$?U`8)yo)^rhzJkgXaW8uTBaDhC5C3G?R71); zn69Jh<;U5|*Uhh~vOWrJ(PqwJD7FY%?%eP`@bui>`~Y`_%7!2SYKamwTIxHONVYnI zx2kL14U&smlWTF} zt(pBG&>EKw6#C_S5CqgeAVUyQN`TSC_beOAiCHFoUZ$f42^elaV_AOop?Db^n9llT z5B*-hbQw*r2U@_4nbgg%{}WA|J7NuV-W+Se#7oRhpE)x53I`mmg5^Viuj5GYS|yz} z-rkjI7Iex1p~J^~i5d5N^>Y35JB@u_9{D|xrvHa==0#5kOp>^C*9dKpJKFdSVCscb z@u>FjTNtFU_O=1|cxeVAuW2K#<_CoOB z8@#i#@|0>Uq_u#dBPRcbT;lBQPf*2dY01UD1DoR9zDHG`B&CISu+nHlmLJGMtV_}w2^%PCeVgpc`wZns+{M7OJ$N1t0Y zsZ%OXJAwzui#@lLo(FxR{D{gUr$x`Jlp<(i&`&p7`&Oj%>;%-Bzh28^iL$ig$#+`g zs*9}BbiOd<+dCqz2fnS}kiRT+TXJ1DN9NzzbwGS&=E2h;~Id#E4Nq8s-XP_@i?YA~^ z$G5$_RBwyv(W~bJb|Yn80^`rxL2C_8lyATTqbe*M0kR3*_$2@saFq*#lL0qr8xxzY z{$4BpM`mB>m3B7=5m-;>c^*vydoMrewg^_R$E)~roI=T|?-*ua@rvwJlGq0urqvca z*D{j08_FsoLlfq0&VKk-;HbA0t_)oaC>CPHLxB0$q(-4dv%Ul?^F0>WciNbb3==sB zGPaCRM?N}g_4Qe(ZHFZ#H!Z+9|Fne|pVEUG=e;bdpE)tsBGo1y@p`Y1u+~$Obeykx-0F&ygX`4R2BqCul_mzSUpd!W>&|8X#*E z{HV2GR@bC-mOubb>Z2RhUiaYYI?Qc^Dv4@T_3{mBw_Iowhe9&c*f(ddqf&F~DesWZ z>gs%Zsy19m#}KJ*ZzAz1oph@pDj+%C#^T*h%n(5`O1{#IXHlUaQRjV_o zd;W+a50{u=3Wla7W5C6c3d`CV27F4uVB5|K`mgJgGMhbfyNG_)TgBjh=b8%fVbsQHH?4SpG@s@MZ7l`naXR-#vDTISu?^|=M-R&*;xlUF`t zBq2*bRv9`0M=rT4H-Io^)mtj)*DJ;{C8$f3L@Av)H)4J^f8 z2e@{%UdTs|jI`(91Qk239z|5Hq;ezB+xCkF6E{x$3MR13R_U)vw5oQ+SVFcY*(4R57~VHPa_nsVR4^!2?-J34d6H=~P5vpL9f&UEmiWr4@X0CB6p|@SC`W zusycoK!Fy2bWzkX6ZZIVo#anQxfU}Ae@SDTa!`V8+o*ok3tRKN*K_S($a=t*ajUL% z0nXs!0hqv$m;ou#F+M%%;*>mP6G_e78wgPPfY4s1|0}E8byUS&X}ECq8lh?nttO+= zI67JpL|TEh=+KD!MJVSw3B-d5@H>16>gJnJQD33F1ZH3$-HmptJWF~QaM)Z?iz zYiy!8z|G7cL4?~(8pxg z?E5J*5#!vtzlTbS;Ml_(=8LEchA7mp7XbD&8vnd-nInj`u+TnyuqQEnGr1!_}SfTLCWJeGxj~Ik80sI;8c(kHYL;S@ZqqQEdUON+1rc_ z@D8|FOD(hAtQ0catp-rpcQahYo+73_Zm$uc_$aqxYKWBjG2wNIcbRxwtmgsN-2)H2 zdUoN{0S4avo*3*!=jiQrD5G3gCM|U?^h1ZrO{O=4Z=|#EqUFl?Z~K-tFhClMDi7mI z$qN(^Q*Oe<-WrXMM^zs?DU@{*c-Fi|y|rUVO@o?C&2k!0ZjdR^RZIoSWq11?%63^=IGd3m$pMKLxlfib0tnCy#~`+> z+6F!6^k}FPDymch0ZJSA00!<=jaKLG39UVk-w_PFJevw}_s_L%s=au)Bli0B!fnqn zc-!$39U2g+9}Ml9bzPYBjI~-smk!XVW?(z8q zOB;{|LM&N;J+6X^2+RA_svNqNYSiszs-G~f>V*YjoVL9ejP`$Z)qBDsic}29zDrFo_ZgFuNS?>*c*VK|%?@^cJ)m2hXrPV;H!`JsI z_RL4y{G63Ku?y(Oc#f(lMRqPSUt8&g5J{CO=yTVKBV!VOg&QDB@+*=>=d~(ldml2@ z8Z20usO2egJxSV`W95V?Cg&c})_kA==F`~+PXr@Yy8}cv_q+u4ikKH3`^Pos;;L40 z?gpWzVhwxY^PuGXr?lp`QKR)8nyJUKX;__rvUCs72RI&Bc|34Q+JlqCr2)s(ab z)^qp|O2S*|UT7qoFY>gn0ZtwA0F)Z>$pWjM{hzsiQoU4HHxP3#J*{PMHkjv1`DOg@ znKQ3;xhT%4gGLF{EsE1cfaO+v$e{S3#$}dQ-1tTHqGkpT((TR^fZmm5)>7r zaBi>kv*Q_Nu(G;H_P@Es=w@=zH$CEQTTGZvVP74&v^ZdJO4*#nA>a%FrAY)--9fGSESMIU@P6& z{LFFBfAamnRyldB)P_$UMUr6!ub3Bp zb4~*&JfIM)S!jhbX;66or6XbQXU%sxpZ;uOMhdq9ZLkaA!!^;Bp(trcWWVEQaTQ}- z+=Y;;uzQLLt+=g-f4|%e<%I+K{&BKC_Ps69?sTi|? zD7&D;hrP0e2<}Y|8Ty#V*hRBX+zoUE4E0_4s8AY3oYOuQD|8so_x^2z?gayQ-uoT1 z5OChmB~Cp!yx0605uu#WXIn^Ru#S6a2E}9QV zj&Do{*AU^O7|4I#K;0GhLFro&(ATEyM_PD!rP2-D11(1$PgabBN!EU4 z8byuh=s#W$3`t-_%ndG2?VE@HLdicip&V(-VUk>M*L2>(IBmn3u-a?h9gB5wC=f9r znb1NrnXLHolXx0nt}U8|i#kWHfOf_2O}N22Ul}10sh34i`gbV+7(b9Pt2Q&)cnwM+ zA*`4!{h>SoLtHYfg-i+t99HVds8Qs1J*qUlgf~;EM{47jSbWGU*{6YBH?xCX7t_n$ zV!O0PTXbT~XRc*Fni8tifI?Uoun2AH!`Q-v0i~H*zeq>KFgHfyo(}>fgHR(i!D_D} zd8S(VztDP@GkxdK^q|Jbd0pYDqvcc$X4MfBvcom)*FLlU@O=*ATv*l1u8yL#i^De) zdd|Jps>4b%@byp*fV!k%Nn2^x84>A*iy88Oy>rLxPY7nP03tgtg#=TmXXl|C2Spy%l^-Rw4>&rm;{8pubHjkfAqx@9z)O&8DIu6wW+y&Bp ziZImjw>rM{LoQR6g3i2Y|h{8F*fH+R{n2WjM?2t z4wOQeMzUk3RneuJy{2<@>52AQ87}%mU=f;MI0WVz8uHO!;fDPXWrkIA>4L-vI+d&l z05bB+V@LyAy`CA_1U69%saNK>9@2iz5GMVkpCn5}8(NnWgQn34 zbwxLQydPdctwwf_l9oD%%j6bPlEpvJ@n*rmf=B_VZZ}X4kv0anPAU2sIpQ><6|R`< zz_B(TD~#7464t~d)d*=ukzE65vEtk4L=fxyP@v+A%iL{sq;=;p(H0L3*vih4LX*$9 zxdSo}1Tig(NcM5nV0E~lE!yMZKzNjTQ4#^z6pP2zC9Go?_Ie=XQ8^d@njWi|b2*{p zp+Qg<5_uPxqtLvGPWU#kb2R`mX@Pc5?wSbAgNJM&-58W#BwNDgKiZyg)ZVgPG4v&B zfge`&k&%|L{J%>yrksYfW;CcXxGGD*Dvet@C8Qx=SbUTVAL^vAM&mmWA(Zvl_weYL zj|AM502O*`15dCQ^W}B{fB%V4X?M2;Mu;ps(j|-Bj{?4^sr%MT{zk~iTCNmc`2tb~ zTQ32$d+|n=V=|R|LckfdiL%QJXHD4uZJ_%U=v#(UtS2+vp1?dT(&!@Ub*&dRo5`|X zJNAspl8F5LV-%`Gq6qEq=N8uZ(z_7vg4bIy)QDO9H5d15Sxj#(;?lEOD(*XM3QRYc z;2?#}2vXnBZ|VV#7{p+C4Y}K0=^@RmvI)s>*3`KYZVweZMFGvctTCm)tOPw}uI$M?-+gBY+; z-h}#SKJRbT?yN1$rd8b6;>8Z=E&K+%+L3{E3=%u66VKt`&|W7%1SlXE9kDv#`%H*S z1yxVMSE|41FfM>$zruaHBe#eUgWx_M?03YH#E}S(I`!<#{{P>|+NUUALT%FOf?h{- zDy&jGaFWW`DJCof{>8}#7}8`z7bEYqQ8&;{dvP&XlFlGcsm?%#b&C;*w6LkRs1*wY z(RraN4Z6v^p)#sTVxLw+cN8rnf}t6{iQovNrtOM)1AD|ZeATz-!yys_)AG05jMBWk zmfvqf=H(Ci{dnBQN6jAj;fWM-KB?6(SW8ILNN8C7opQa+{9ae}>=GVTpRouEtTN}A zu!Sjed;Q)3bgFWp1?(C1gFEqXC5O9jwON%E5th3gaktK)0@u@1W@nxSGf9AY4ZR2s z&?|P=;@#qsY!m>VvN4j*=uR^VRAH&(zDCDBfA(Od+-CNEG_SZ>&gepn&cqe3{f!Z{ z*6ns@n7)0$(#v58D~~`NnGUy&gGjIEMgNi(^Csa#jx%}26gZIO#aQ}Q#l@XWvJf>l z=;!A^lBFY(Zxn~Y5=9Z15F?OhEnPzsCsMIfq^x%Wh)uC}$TdT6Y<)o)s9)KNg zi>lw@anZqCcUjSGix&WP9)_qM;`RZ3NdXh zG;q}vf3N&A@(W}9q&%_?U+IB0BUSw*&rwzgu5vTJuuMqC<%x6O8TFl5X&?k zP=|UBN2X;FcM%YP;6-s;SibfzBH$j4^niKAf+_4+PCX@f@+!U}$5t!trN}b#lQ0*Q zAhzi-R%}po)hyM$g?gB&pSjt^#2VBxu3`lox|e%eOW6be&cPx({s>`KNRfvj@R=X# z*Qpd^AE*NH(4N6Vz>*XW^bGQP!6Vd$*?JcR@7)posK$NX<8pf~@|cT{@7D<4Rr3>6 z;@5got&fy2S1sEm@6RY3e#&I8^BLCv z^LyrD=i_HtL-lA%eNgNM0ND>!hDOwBW0fY-)28Cn42p@yg5RU1ytG0_tPLea@Tni_ z(uN+|3ay=Y+TNf8V(91>I>A$CP1?oVUI`YfvfCd%T40Ig@<<$<>hSZIiW!s?ACvZ8;IF`dk^ z$SOE}(E=T**SW}?m%;XDp`GnYmD{AbZKV%#+6|gltFX05n^ta*x+_YbmbqhR3E?KC V`l)Ig!@1UQ?Rx0jTHF2epBooS#d!b# diff --git a/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz b/apps/dashboard/build/_app/immutable/chunks/BBD-8XME.js.gz deleted file mode 100644 index d0c256e56bb1fb9466a307b1a40138d6895132db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9711 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 diff --git a/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js b/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js new file mode 100644 index 0000000..63d1cde --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js @@ -0,0 +1 @@ +import{T as i,W as d,X as n,Y as v,A as u,Z as h,_ as A,$ as g}from"./nyjtQ1Ok.js";const T=Symbol("is custom element"),l=Symbol("is html"),p=n?"link":"LINK";function S(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var a=r.value;t(r,"value",null),r.value=a}if(r.hasAttribute("checked")){var o=r.checked;t(r,"checked",null),r.checked=o}}};r.__on_r=e,u(e),h()}}function t(r,s,e,a){var o=L(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===p)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[A]=e),e==null?r.removeAttribute(s):typeof e!="string"&&M(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function L(r){return r.__attributes??(r.__attributes={[T]:r.nodeName.includes("-"),[l]:r.namespaceURI===d})}var c=new Map;function M(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var a,o=r,f=Element.prototype;f!==o;){a=g(o);for(var _ in a)a[_].set&&e.push(_);o=v(o)}return e}export{S as r,t as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js.br b/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js.br new file mode 100644 index 0000000..8ab7178 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BBOOwRwQ.js.br @@ -0,0 +1,3 @@ +@dUտeAz#0N +22cN(eMshXJ{КϹhy +`>5lk-?’`]7|\֖0N ܯΫ٫0ZQij;@elW&k~J'3IZ(:ku쭻AfNjVQ3FeoO!QF0dY+dFbJi7.Uo0RNXq`[TrXZ_t7rDLp>?- Ekx@gv\$PQ`ś(Q.$m9\wŐ ZPi ;$#&NS8i.ܪolE>h!TB*iwFP!000026J1kHZ`&{oz3*2z!eEGi=55y)T#&;K#o7*AJM1F}4Ar4y zwYFqXa<(Gze;?$;P21D6`N&5;f--IAIP7l|?GvMZM%bud5v=+hVW*Z6di5tlt%?Xs z^)|wGsMxh4dv71_!?%xLAF_Kd^3qu!l3ToaZ0}qnh4D$*`{3Gy8fwV~0jhb<)}d_# zs1EHyG{!!NxwyQz{vz_Kw`DNSCO48{Zz^eEztfy}oPAV;67W-u&iqJvoPAK7)!HvZ zU~|_8l47Tuo&+50G;%fu@*r8AIA!~$0d-@nxezZhK+z}a`Sxn~MJ+azvCPlUyN`J zPtw-);&{24-iyuv6BHn@lPXM}WtdgPMWbyu%0y|@6Pk#4%eQqeVEY)JW$D>%@wnoX z_Z~N_&ffxzya{xoF{d5#`5jZ&@|gB(KS3CAIylZv$yxM?Y?`7-1dr%aZOm2` zg^(UOkQ*h&G)p1<0W6MnQzn6w8zmgeE~ zgah%HW`u~{m4D{1zWe6+s+l)$TFy#4T=F@&*IuU2NB z@#?~Lb6M_`UJLmGcBvs)=&=2lLtF2%u0>$`zDIr|9!8N`Ds7aI4I>O~1kQJuQXcW1 z>2I2HCvLW7S$}g)gP&fh3so8|q$U^W(034fa8i5aRr6obT~7oj;ic WgvCx``aGZSfBgp`(Q3b)0ssKmbhcjr literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js b/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js new file mode 100644 index 0000000..50160c8 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js @@ -0,0 +1 @@ +import{Q as _,R as b,n as i,z as m,T as y,U as v,V as h}from"./nyjtQ1Ok.js";function E(e,l,u=l){var f=new WeakSet;_(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=t(e)?o(a):a,u(a),v!==null&&f.add(v),await b(),a!==(a=l())){var n=e.selectionStart,s=e.selectionEnd,d=e.value.length;if(e.value=a??"",s!==null){var c=e.value.length;n===s&&s===d&&c>d?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=n,e.selectionEnd=Math.min(s,c))}}}),(y&&e.defaultValue!==e.value||i(l)==null&&e.value)&&(u(t(e)?o(e.value):e.value),v!==null&&f.add(v)),m(()=>{var r=l();if(e===document.activeElement){var a=h??v;if(f.has(a))return}t(e)&&r===o(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function t(e){var l=e.type;return l==="number"||l==="range"}function o(e){return e===""?null:+e}export{E as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.br b/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.br new file mode 100644 index 0000000000000000000000000000000000000000..ec619dd50c7f437484195d0230f213fc8b2bed1d GIT binary patch literal 409 zcmV;K0cQRiGXo&ROqcc7RKbNtnp3_OX5)(b?r$>+n0&^8e9zyXs<{vNfI=L=n2tHS zeQzt+0xOn!zQAj44g5qx62X}6Jh%NyqB$IWd=2a{nCtfm3r(=rJGA->H~oXN{+p|p zm7i`jPPfhRYx=PrZ4R!mHCb}ds3$~vI}K8}Y|cFX6OP54gF0}Q)3hAzF;nd_?0p#F zqJAF73M0_}EY=MhjvU1A*d#YSv5B5DAe~|)YDQMqd=|CL{%*mdmH}*tEP|w&5Jrqs z9&)A!X;+zQtzndVPbXP7T&G~(JEw<>9`ruu>_$uB2 DiMz@8 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.gz b/apps/dashboard/build/_app/immutable/chunks/BOVu8he9.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..09d8515709cd9cce4cade729b7fe3b982216c4a1 GIT binary patch literal 454 zcmV;%0XhC3iwFP!000026Kzw$Zrd;nz3(d=9Rv{*H0+vy^(n`q=(=^sg0bn^tt)oq)>BXjst_V%%vaMombwmsA1Np2%$8XtBrq>4!nH}fWk4s|kKDoA-Qgzgv5qh@ie>|x{m~T*SpUm%*Q{F#wP_otdR+ia(*#-_r2LrJ3Qrx4W1}pb0$Pe7 zrHX0^@>Dye{J%g!w@SgXAfM8lBT3_RMQqsxLq%u?-dav4ST9OsiK_srsQw@Y^y`rL`gQxfaXJn^sjk8J19F>OBm0o1xmGc*GL0H^lX1poj5 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js b/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js new file mode 100644 index 0000000..5dc25d3 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js @@ -0,0 +1 @@ +import{B as m,C as D,P as T,g as P,c as B,h as b,D as M,F as N,G as Y,H as h,n as U,I as w,J as x,K as C,w as G,L as $,M as q,S as z,N as F}from"./nyjtQ1Ok.js";import{c as H}from"./C3ZC25l2.js";function Z(r,a,t,s){var o;var f=!w||(t&x)!==0,v=(t&h)!==0,O=(t&q)!==0,n=s,c=!0,I=()=>(c&&(c=!1,n=O?U(s):s),n),u;if(v){var R=z in r||F in r;u=((o=m(r,a))==null?void 0:o.set)??(R&&a in r?e=>r[a]=e:void 0)}var _,g=!1;v?[_,g]=H(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=I(),u&&(f&&D(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?I():(c=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&T)===0)return i;if(u){var A=r.$$legacy;return(function(e,S){return arguments.length>0?((!f||!S||A||g)&&u(S?i():e),e):i()})}var l=!1,d=((t&C)!==0?G:$)(()=>(l=!1,i()));v&&P(d);var L=N;return(function(e,S){if(arguments.length>0){const E=S?P(d):f&&v?B(e):e;return b(d,E),l=!0,n!==void 0&&(n=E),e}return M&&l||(L.f&Y)!==0?d.v:P(d)})}export{Z as p}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.br b/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.br new file mode 100644 index 0000000000000000000000000000000000000000..ba8788a7c24c057bb936d30918499ad627b72716 GIT binary patch literal 527 zcmV+q0`UDCz5^hP!nWD-yKLx_OV87nfaJslhY&t(Zz8(?faQ_i zwS;*!F~Gsm!Bp7F`aI|Iy@Bit&F5HkofJ`eG`~oaOz_!eBceet`b<)HUO9h39EY8M z)p0S#o7#ywW6Y5-=7uUVuGBH0i6Jd)XhTL|K?e?9xb#rNL5n^T44^TC&(PUi$lvY` zNAdIWe)~0g<{odm36Z!NZ6!wSdRzPcdwq)$_HI+>f{F1^oyz~<59X-zAA%XKwnE_( z+af6wBT}gWO=I9r~qh6$;GK3J;Xwmmz1tt&pt~z826^S1k)fFgHw$zzTRCf#!_=?`Q39ua`bE3y%TCKZYNOHr0P`Y zIZlN_!DuCjv59SPDs+-!wImBtKhk-kN?e6Q53%L}vH_^*P*@CX=(nmnNek%M5w*%_ zY<68pX5p($6fT$o-Hf?hDDc)S9?jyhregh&NaPK_jVuUJWLDP2H<~Zm7Tug0AjiMxgg`bb2dZYLqt>f zL!$BO?+gE#(eSLjTr3vE?rNe6_l|4cX^0oO69j+xhQQTN4uZV?L+Bq^Y~UvE2fLtU Rm)8AvMwqwb*D``@MgYlc3$FkG literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.gz b/apps/dashboard/build/_app/immutable/chunks/BPtVz5jm.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..c088fc63dfa068cabbe2bb2338e0d33d7aeba675 GIT binary patch literal 569 zcmV-90>=FxiwFP!000026LphYPuoBch2Q%tY!t0#q>&q_`eJLaAl%Y&D}e_X@Nma6TGzmaz4?C}|Gw)jz$^=j9NDrZ3>!5*CpE-4k9Q!Ln}x!|7m z1SfPLIHg0uH601&WCT|<7Cg}x!83gojOa;lNXLQ!od_OjB6y`!!9kal#bU$zXkH%b zZ<}Y|y@zTe$a;U)!_iyE=+n(;>vO(kJCer4bygVX21<&krV3ZfsC0@zz6rZeZ40$} zMwfX=ONLs_`}$1k$G$dPQOxd;#tg{Y5Gw^SyPIVAEWCmW{R+t-H9?lZvcKViU!BZ2 zW!oND1`PugybvFV%%;ina9LzCXXqDRrE3gBxKJvx-J#~~@;16-?e{&{iRhG4b~l4% zcsr%^j*md>NFVxB7SfcN`w68g_je6b9s^RN6eLRRNeNR#v^iwrI|(!UchvyuaG4OQd%~#@8JsNgxf z&KRIpBfIbL&>x_U7VKFDHYlaeVb%wB%%}ghlO^!C6=O75$&+k&-OXo$aDD71s{F_!2ENu HzXJdON)8%e literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js deleted file mode 100644 index 1a3227d..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js +++ /dev/null @@ -1 +0,0 @@ -import{J as i,N as d,O as n,Q as v,q as u,R as h,T as g,U as A}from"./BBD-8XME.js";const N=Symbol("is custom element"),T=Symbol("is html"),l=n?"link":"LINK";function S(r){if(i){var s=!1,e=()=>{if(!s){if(s=!0,r.hasAttribute("value")){var a=r.value;t(r,"value",null),r.value=a}if(r.hasAttribute("checked")){var o=r.checked;t(r,"checked",null),r.checked=o}}};r.__on_r=e,u(e),h()}}function t(r,s,e,a){var o=p(r);i&&(o[s]=r.getAttribute(s),s==="src"||s==="srcset"||s==="href"&&r.nodeName===l)||o[s]!==(o[s]=e)&&(s==="loading"&&(r[g]=e),e==null?r.removeAttribute(s):typeof e!="string"&&L(r).includes(s)?r[s]=e:r.setAttribute(s,e))}function p(r){return r.__attributes??(r.__attributes={[N]:r.nodeName.includes("-"),[T]:r.namespaceURI===d})}var c=new Map;function L(r){var s=r.getAttribute("is")||r.nodeName,e=c.get(s);if(e)return e;c.set(s,e=[]);for(var a,o=r,f=Element.prototype;f!==o;){a=A(o);for(var _ in a)a[_].set&&e.push(_);o=v(o)}return e}export{S as r,t as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.br deleted file mode 100644 index fa8002a320657e5feeee80ca64a7492825a45372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 498 zcmV{KRn@=GW%DpdfLUJ=fgNi(OGuQ&8C6PlEdAf9njD2cnBBk3-MwiJ zEf#CFVqU3y&jVW1_Bl778ZFO2K@iNR=9Epi`*)Ig%PPJA81W^%@-=+&8+`B$O!*Eb zd>?KnS-DVe?Ck8-)}PMz>oWuQtMh7hA-_MWB2-^1Ds6uP;yXIJ+71veBiyYklf%`@N4N1eIf;njJ4%N6p+jDpO7N z_=Na)Q+%q%$VVB$)KiQKl4Y%glC}FAi76$g^?pCT_EiFZU?83%rKFwkzQV?VJ@#!+VjPGx7gp*U8*OwE zsSh?c5tSi-j zWkCP`vf3PESSUgpHIqP1_Jbo3Tjd~Smt5c;d5)qymNjE)k@3vv@@`;g>%t{L1!Afp>%J13w@XN`q0l{+iY5)KL diff --git a/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz b/apps/dashboard/build/_app/immutable/chunks/BVZqxpRe.js.gz deleted file mode 100644 index 83e86b17958ec3067ed1ce9df8d3d864e79c423a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 562 zcmV-20?qv&iwFP!0000216@VpmLukZZ2)S5? zuow3sEZWSPibfwVFTY)U`F(p8{c$u-jCP(ZrM&jKXl@@qgRt|JlsBy5x` zxA5K;4~+*#52|c{@^hV%HtK-bGb?&d=%y^W=ozV6lzOj{7ldIz`tnq zfHZB}#x~mRjNVxZqG7;A&Uo9tcnbnffKY>Wjb`IwI%Q_#w%BP8ejLSd;iQz**@T`> z!>0p3{N)xhI-S}`n-rF+0t8EbIt8(blxI=kDBq=*Mx}+`V+FIDePD30GT4~g$U{XFDDndBDte=-9&l?y0WA%d^6V;M(}ZGn@YB#liys03}xx A+yDRo diff --git a/apps/dashboard/build/_app/immutable/chunks/BcuCGYSa.js.gz b/apps/dashboard/build/_app/immutable/chunks/BcuCGYSa.js.gz index 4a66d09f776958f504399f2f7f699430f2aee509..54fb9165a3c29a21f0399890f46d0cbc062b8746 100644 GIT binary patch literal 624 zcmV-$0+0P4iwFP!000026OB~gPunmMe&1gatZK3~ld!!^auuox`oM$+qU8yp)g)JP zEU`1&g;tUO_sLFLDt=5n-hKJ*zPs<7LM!VMm6J@iNXF7`RFN!Ks&J@P;wW&1Y<=P?Iv>>$7>+ zK%)(U6 z_6z3uJ;bW}P!^ZKcnLK)cpK$i1Fq7gAg9yw>3m8&#MU9-LzVPauk^VTw{YS?}z8X11o4GlPpGr z@d{+^s$IGd3F8hMs8NBSkbjR|w{5q`q?8*QdcWv%Z)972(7TJf2Pj+$%7rZiE0#xgl#X(L-oZ;+b++#nx3H|&=E=LDjht^cI~+3bdm5qa$qtlL@} z=+{l8wYtFg2rS{qP5$+0C@_5ZvIM`=rn=vJ&PK@^}(){EJ+g8 z(J8Lu15DH(YD=viA_))CTx+G{)%T0jXwqV0tgsu?WqXGuJlbwWryA@=%Lo%+Gp1dy z&+xW}T4@BQq(Wme;NJ%Aio=Y|$S2Qpb$PY`q4V-WXi=LOXkyjEYLvGz%?KIG+jy0Z z1t+a?#2veZP<20*h9OW^Km`_F&oZaXma53e$^2}-oRf~SMyp!A0Z51B9`NFPvGlM4 z-bVGgm!OWB&~WDMIPe zX*dzeocEP2cj5l%;udSDP=e#+Ujyq%J7#8u*c#9MjOSL1rhKP&=Qnqd+r;VhQ}9-< zv9h4!_!q-#M~DZU-zzMlBbwBradBkYC)|7RT+?g%pA`slM*j;9qTV$dPUNLW@YqyJ zLqBdJj8Qp;OJE3d^!)SDP+<7*c?ou-if#5|asJaSz88h-ZQQQiPW;9q117@l%oMZA z2atvNW!gFI_X-Nk?M~!yenloatF;v}AJ&PaPm%XY%KPh{L16ZFsR|3>_H$(4i@l=2 zjoHCnFDK}$-fTi&BX*ZPEcViFw@?lV;D?Ozo6aJP1|+Xnn<{( Pn|}BQ*RNk1`~(01UB5`Y diff --git a/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js b/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js deleted file mode 100644 index e64b77e..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js +++ /dev/null @@ -1 +0,0 @@ -var x=t=>{throw TypeError(t)};var B=(t,e,n)=>e.has(t)||x("Cannot "+n);var a=(t,e,n)=>(B(t,e,"read from private field"),n?n.call(t):e.get(t)),c=(t,e,n)=>e.has(t)?x("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{o as I}from"./DUC-ssvh.js";import{s as u,g as f,h as d}from"./BBD-8XME.js";import{w as G}from"./Br8WXJxx.js";new URL("sveltekit-internal://");function ae(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function oe(t){return t.split("%25").map(decodeURI).join("%25")}function ie(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function le({href:t}){return t.split("#")[0]}function W(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let s=r.length;for(;s;)e=e*33^r[--s]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function X(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&b.delete(U(t)),z(t,e));const b=new Map;function ce(t,e){const n=U(t,e),r=document.querySelector(n);if(r!=null&&r.textContent){r.remove();let{body:s,...l}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&b.set(n,{body:s,init:l,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(s=X(s)),Promise.resolve(new Response(s,l))}return window.fetch(t,e)}function ue(t,e,n){if(b.size>0){const r=U(t,n),s=b.get(r);if(s){if(performance.now()o)}function s(o){n=!1,e.set(o)}function l(o){let i;return e.subscribe(h=>{(i===void 0||n&&h!==i)&&o(i=h)})}return{notify:r,set:s,subscribe:l}}const D={v:()=>{}};function Re(){const{set:t,subscribe:e}=G(!1);let n;async function r(){clearTimeout(n);try{const s=await fetch(`${M}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!s.ok)return!1;const o=(await s.json()).version!==F;return o&&(t(!0),D.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function Q(t,e,n){return t.origin!==Y||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function Se(t){}const H=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...H];const Z=new Set([...H]);[...Z];let E,O,T;const ee=I.toString().includes("$$")||/function \w+\(\) \{\}/.test(I.toString());var _,m,w,p,v,y,A,R,C,S,P,k,V;ee?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},O={current:null},T={current:!1}):(E=new(C=class{constructor(){c(this,_,u({}));c(this,m,u(null));c(this,w,u(null));c(this,p,u({}));c(this,v,u({id:null}));c(this,y,u({}));c(this,A,u(-1));c(this,R,u(new URL("https://example.com")))}get data(){return f(a(this,_))}set data(e){d(a(this,_),e)}get form(){return f(a(this,m))}set form(e){d(a(this,m),e)}get error(){return f(a(this,w))}set error(e){d(a(this,w),e)}get params(){return f(a(this,p))}set params(e){d(a(this,p),e)}get route(){return f(a(this,v))}set route(e){d(a(this,v),e)}get state(){return f(a(this,y))}set state(e){d(a(this,y),e)}get status(){return f(a(this,A))}set status(e){d(a(this,A),e)}get url(){return f(a(this,R))}set url(e){d(a(this,R),e)}},_=new WeakMap,m=new WeakMap,w=new WeakMap,p=new WeakMap,v=new WeakMap,y=new WeakMap,A=new WeakMap,R=new WeakMap,C),O=new(P=class{constructor(){c(this,S,u(null))}get current(){return f(a(this,S))}set current(e){d(a(this,S),e)}},S=new WeakMap,P),T=new(V=class{constructor(){c(this,k,u(!1))}get current(){return f(a(this,k))}set current(e){d(a(this,k),e)}},k=new WeakMap,V),D.v=()=>T.current=!0);function Ue(t){Object.assign(E,t)}export{be as H,_e as N,ge as P,he as S,ye as a,J as b,Re as c,le as d,ie as e,pe as f,ve as g,ae as h,Q as i,N as j,oe as k,fe as l,ue as m,O as n,Y as o,E as p,ce as q,me as r,we as s,de as t,Ae as u,Ue as v,Se as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br b/apps/dashboard/build/_app/immutable/chunks/BeSd-T80.js.br deleted file mode 100644 index 73f5d6f42e75e3b3cae6fb19ae11178f31743e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 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 P`^SF(G-7^Gju`*|>9ELQ diff --git a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js deleted file mode 100644 index d76449b..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js +++ /dev/null @@ -1 +0,0 @@ -import{s as c,g as l}from"./Br8WXJxx.js";import{V as o,W as a,X as b,g as p,h as d,Y as g}from"./BBD-8XME.js";let s=!1,i=Symbol();function y(e,n,r){const u=r[n]??(r[n]={store:null,source:b(void 0),unsubscribe:a});if(u.store!==e&&!(i in r))if(u.unsubscribe(),u.store=e??null,e==null)u.source.v=void 0,u.unsubscribe=a;else{var t=!0;u.unsubscribe=c(e,f=>{t?u.source.v=f:d(u.source,f)}),t=!1}return e&&i in r?l(e):p(u.source)}function m(){const e={};function n(){o(()=>{for(var r in e)e[r].unsubscribe();g(e,i,{enumerable:!1,value:!0})})}return[e,n]}function N(e){var n=s;try{return s=!1,[e(),s]}finally{s=n}}export{y as a,N as c,m as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.br deleted file mode 100644 index 76f54267f5429dc39d175dcbe1d8a9af5e6e0827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 zcmV-u0hj(8dIDf%O=o+TDe03fIkcf4X)Li@zBEbsbn|~rKd=%z0Ey@ybfMRa)`<=G zh6A2OAx$?G=~d|4p{AN;?A$Yn!Bt&a!_pelYzAus@U-fB&qY{oe4kG4vaBYNM2*U* z4u;e)Ym^7JG&gEOO?QUEetvbr#^2kmwd|~t?SK~iZ^WgT)c5llgcKF1$C)a3)}D*D z>OMSxg{)~ZW6eq3fOrJ&gvLkOtFB-?H1ZDjZpK}kS#ED_SXc{X6^O3Gg#jtFV0n0e z2g1BTxOWd?+yfs|D&S!v3`2|M!j5e}asN36p()?%-2+fPjVEy3p(z@q5eG(}NN#WI zoPSt@V7!e@(U6pEfS(g#ZOGG=V>SaozSj~m3a~2#rCoGe-cDv9v>+{?8XAt)659bu zV;bAOL4zfowS`poaP$xIuxuzUlU;GvVbUEn+FatYYxKFMOIF6nNi@Wn8qz;GrVW<_ GOi}^tj;kF2 diff --git a/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz b/apps/dashboard/build/_app/immutable/chunks/BexJutgU.js.gz deleted file mode 100644 index a1c063eb27a0643f8d3a48de44b18ddcd95ef333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmV;40e1c$iwFP!00002165MXPQx$|yz><<2V_g8lp9K9A|bdS!37D5sveSbQ;ZzD zTH944%m0p@Kub^K$L#FvL-sp^E?81q((-Kv6+1Nj<^1LW?>?5#hr|5aUY2qqzGsHv z9~o-C%+O3>JN}hn!#^`@k0K9`*LTa8r%^l@pmY@nzkD`iLhd<>Wg0asTu zDv8tt85@88(P;{vm;$P5R0kn4vh+UYneWAvho41?x&&n*>}w=W%ogSOZ<~tg#C>qp zKb@}F(7!A1SY$j!-bMuHQIlkJvRNq#tk@l?EFOE*)4%qB2=UZAo!$+lEM@Er(rgN| z7BE=h`n=+Do4iRLK>HrBZWI)0BKunTbXde>>(|jL&0~Ga{hC~jRPEGSfOKt!?-iUv@EaFj`bOAEH8clxVh_2djbFeX9v9u diff --git a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js b/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js similarity index 76% rename from apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js rename to apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js index 0a9ca52..4ccb0ae 100644 --- a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js +++ b/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js @@ -1 +1 @@ -import{t as l}from"./C5a--lgk.js";import{J as e}from"./BBD-8XME.js";function u(s,c,r,f,p,i){var a=s.__className;if(e||a!==r||a===void 0){var t=l(r);(!e||t!==s.getAttribute("class"))&&(t==null?s.removeAttribute("class"):s.className=t),s.__className=r}return i}export{u as s}; +import{t as l}from"./BilMa3tw.js";import{T as e}from"./nyjtQ1Ok.js";function u(s,c,r,f,p,i){var a=s.__className;if(e||a!==r||a===void 0){var t=l(r);(!e||t!==s.getAttribute("class"))&&(t==null?s.removeAttribute("class"):s.className=t),s.__className=r}return i}export{u as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.br b/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.br new file mode 100644 index 0000000..f379f02 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.br @@ -0,0 +1 @@ +`Ĭ|brْgJh8ݾւZ(d!>cF5Q=ӌTA/~G&p<*+{Mg9V8=8#~8i3ШVv[`/_] \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.gz b/apps/dashboard/build/_app/immutable/chunks/BgOFZ9jq.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..12157ac3326b5d040199ea5f02fdc1e461e156e3 GIT binary patch literal 211 zcmV;^04)C>iwFP!000026J^g$O9L?w2H?BDBD;r@K!}PrmqGNdrQp59byiZdNtu~! zE6x6Q=@td?{_uW;ai2*}qCBfO50uB&T|b5R?C<2@cHDO1B3{n|e?w(bxrm{p zUP4Z)Xtup2JJ`Jq<}`Uy9@uTSee}#Pe#9;e8f*0p0M+UNV9McL-CVFh)MPr{V6D;s zu=_xH6ru1|1a-T_w8pGfS^!ds@qr!Tm?!+N?%Dm;f*AW}2hdC?g^~(09+!jVe30kv N>KhHwA@LId004$GX;}aO literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js b/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js new file mode 100644 index 0000000..5a45141 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js @@ -0,0 +1 @@ +import{ah as F,b as fe,an as ae,T as D,ac as L,ao as ie,a7 as le,g as W,a8 as ue,aa as se,ab as Z,ad as q,aj as z,ap as oe,aq as te,ar as $,U as ve,as as T,ai as y,at as de,al as ce,L as pe,a4 as _e,au as V,av as he,aw as ge,a2 as Ee,ax as j,ay as me,ae as ne,ag as re,az as B,A as Te,aA as Ae,aB as Ce,aC as we,af as Se,aD as Ie}from"./nyjtQ1Ok.js";function De(e,n){return n}function Ne(e,n,l){for(var t=[],g=n.length,s,u=n.length,c=0;c{if(s){if(s.pending.delete(E),s.done.add(E),s.pending.size===0){var o=e.outrogroups;U(V(s.done)),o.delete(s),o.size===0&&(e.outrogroups=null)}}else u-=1},!1)}if(u===0){var i=t.length===0&&l!==null;if(i){var v=l,r=v.parentNode;we(r),r.append(v),e.items.clear()}U(n,!i)}else s={pending:new Set(n),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(s)}function U(e,n=!0){for(var l=0;l{var f=l();return _e(f)?f:f==null?[]:V(f)}),o,d=!0;function C(){a.fallback=r,xe(a,o,u,n,t),r!==null&&(o.length===0?(r.f&T)===0?ne(r):(r.f^=T,M(r,null,u)):re(r,()=>{r=null}))}var I=fe(()=>{o=W(E);var f=o.length;let N=!1;if(D){var x=ue(u)===se;x!==(f===0)&&(u=Z(),L(u),q(!1),N=!0)}for(var _=new Set,w=ve,b=ce(),p=0;ps(u)):(r=y(()=>s(ee??(ee=F()))),r.f|=T)),f>_.size&&de(),D&&f>0&&L(Z()),!d)if(b){for(const[k,O]of c)_.has(k)||w.skip_effect(O.e);w.oncommit(C),w.ondiscard(()=>{})}else C();N&&q(!0),W(E)}),a={effect:I,items:c,outrogroups:null,fallback:r};d=!1,D&&(u=z)}function H(e){for(;e!==null&&(e.f&Ae)===0;)e=e.next;return e}function xe(e,n,l,t,g){var h,k,O,Y,X,G,J,K,P;var s=(t&Ce)!==0,u=n.length,c=e.items,i=H(e.effect.first),v,r=null,E,o=[],d=[],C,I,a,f;if(s)for(f=0;f0){var R=(t&ae)!==0&&u===0?l:null;if(s){for(f=0;f{var m,Q;if(E!==void 0)for(a of E)(Q=(m=a.nodes)==null?void 0:m.a)==null||Q.apply()})}function be(e,n,l,t,g,s,u,c){var i=(u&he)!==0?(u&ge)===0?Ee(l,!1,!1):j(l):null,v=(u&me)!==0?j(g):null;return{v:i,i:v,e:y(()=>(s(n,i??l,v??g,c),()=>{e.delete(t)}))}}function M(e,n,l){if(e.nodes)for(var t=e.nodes.start,g=e.nodes.end,s=n&&(n.f&T)===0?n.nodes.start:l;t!==null;){var u=Ie(t);if(s.before(t),t===g)return;t=u}}function A(e,n,l){n===null?e.effect.first=l:n.next=l,l===null?e.effect.last=n:l.prev=n}function Me(e,n,l){var t=e==null?"":""+e;return t===""?null:t}function ke(e,n){return e==null?null:String(e)}export{ke as a,He as e,De as i,Me as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.br b/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.br new file mode 100644 index 0000000000000000000000000000000000000000..3c741945fc238ab1ed4f94bcb3c8df5db0741840 GIT binary patch literal 1849 zcmV-92gdjt(hvZQ!nWD-gO{~#k|e`DLXuhY^QTpP{;P;dXO;r|H&1*#(IsqH zj|XhhXV{`OoYDnsn_hOq|8%ANm;Wy3Ut5#BT!xh}|EeIJQs$_3HECjWY>nvh7hiLt~XW<6>=gs%vNHU`Zm+mp<_9cmaj`7?&)T zVv`Qe9hQ;?RPNkwhDtwgX|4*hADFgpooUy(TlVyWBUco0(gIb<2x*i%(_z2fo|yQ{ zOKm(vXd#EOBPxc*@>+(f4FZj9x*c`vkkO1KXDIwL`+=+T~ov z7p%Zcq^bHRH7RM%eU8YQXT_O)dwQD-(B*S%-Y6KG)y3ZCVs}5O#OgK$YDLBA2}%1^ zX`(rm!on6VIA_I_ZiYyf%Qh7XTj~dx6g}_~W&k6YJM(A-_BAtY<|#8o+M`|_UhXNj|!k#x+!jIBL28~WZc=n-6;dK^FUOJw|~S^0;+_v8W?2V8@4fl8N8%{0 z3B%o~D3r*qQdJKkuf@QZ;ov7-l>M!1iuNEa%r+8-K;RTDX<3HXQ?!Gpo5)9?em!H( z33uGG!#)R`LS>m2GPV`^_elhT^_G*X>$GU)l!QJ8I>vg6Wje9RlP%Be5y&D#Fxk(_ zvZvIa$v_Yo*Y;2-5rpk2W(eg%nE?0M0aU?WKAZJxR$y-La+&`t zgPaHxg{`5GN)HDhggO3#pSnO%au(K)14G48F{; zlxHsR(Se_gK){RpZF(%#9^Gszk9CzZSp8ORhUOVTDRML5^Oyziypy!xkp_>fJ>L0R zs`c_mr&NSp3vkS2v&TVQq67}-$Uy0Gh@#c&YQiS-rX$T^Yrm3RXC|#DpSvse_VnWK zNttsCKp0CG?zG&)zI-zm)oH*&N!r;dnUH*a3Yq!4jINa$#d#>0TICWe{>rxg>a$${ z(I^+)>{Aip=)51joJA)#6j-k<@qPPMNK{%?E19UiBbG9g+b&+ZrHNPwZyb6=E{L~j~ zQrUCTuRZk5Y^9XDu4OUNA=0c}-0OXzj;aSoaO=)feO7)!^hKtf9JC&!r-cWc{?f}i zE6&mTV74qPO~IMWFA8l-!sE<@3c_h!IJ4iI&D*%A-e=>Qd4!h9VHp>)c5XbYo#YI( z_LoeTnx%~U`$um6#>Fo)%BsYhvaG%Qi&`Je>FYATocvWoNDl4^T-6pD)0g_V`MauZqxG2yy6tahI= nJwP6M0a@H|Rq;yUX^NhIUt7_frw{BtzeX7hbB^*g3Z};u`2V5* literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.gz b/apps/dashboard/build/_app/immutable/chunks/BilMa3tw.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..f094183be2e51a341e53cc970d159dc94edcd4d4 GIT binary patch literal 2013 zcmV<32O{_%iwFP!000026OC9~Z`(=^e&1hV2L}R)uv+I}fn7+M8a+u)o3=^XB<*Qy zc#W||*-B(d)h$jP|MvxFBwOxfcVA4-h%>{>M-Io)GE4JvtrtCA^!}u&kdR3y!f2*j zp{Jy0Lf?{3g+@&JpTfjUbD@8c{+G~-No!#WCT;fmLOKxomGqs^Z=^G!DU<#xOv$8k zVSb|zLTV;Cx#-=Jj)XpvE`Te^j2ubr2iqzgh^Mzd?Z~9T`=hfVdhNwcVW($ z^h%gJ(vL!yOqzvBn6$AWXVTw<`Ga1V^O>|^UNGrDggIf-C&D~1=}?#(CVeW*Id8%| zT^_i9Paf~e_eWRv?p<-*4{;rH**jCoXg2n9hBE?G&(~211)5(s<0OcZxf^iI zCBqp~;Rb2Kt_}h_Y9)&38!M#-xE2jk#co=ac{bi2KT{^P>U(7x`&;rF&! zIYi^Q0(a5-Ai-1p!7h5S8u;-sH+K2);UV5I@F*Trf*X-w-r?d^6MZUaPL0!y-IZdR znS(EMMv;QV(Tshi27At7zfz~ew-7PZh+f?|Dq}EM zk;zcSfPMqa2}6j(&=PGPePt{*=X3Yv! zx^*{~y-U?U5+|KnC#_V)P|1k}`>VcE5E=wJ4piz3AiaeO=_~Y)kS-;Zn>Lh_Ht_VI zYNn~0F(74X;Ah97pB<_rT%S75H#bQGzJ1Ij5mJ_kK$lu6RkAtco7vYMVKu%{=_ni1 zwJPC;GNgqHhGM2SbLU*bHTsJoEZo|0eiK4BNDDWzqevD^9p}NVlHxwfCLD%5D`DX> zq6Z5#WtdSgtUP8xGAqFW-Ox2TBOFbZL6b7z(& zMLD{st8p6kW;k&dx`2CpdU|lXR$jS`{)3w)vvj$PN;pB1Q4kd~od*^gn?HmxV5_&!JEXH4IxpCO z+ecRHCcG-!)Z*RZRVV8$NEdWZSM-@a(Mx(wZ|I$YNui*0PHfumUjj|Vqe#61cCAHj z80AHYR8yPhl*&~S$j=F#lcvx&w}a>%s(~LKSAHlkK2gai9Mid)!wH4rB@4uJbeTYJ zQ`T_+?iDPQHkdE4DHC-X1-*f{aCI~D^mOkoSr=6Gw_R_GoCxgrHuR)EpwAbKvLfq1rDZUn1YFm{gjU&7OZEI7EzCg>w>{8{! z+=SSRe39D*BGyG|;LsT>?PfXGNR~PdSjKE1{^V6DABCEa!WfC|$``x)W?ch1CrGS(=nlQt_rW@egC7<3M6uQAkWbE4cbaOs_gI{p?mr7_EL5(XA^H zN%zHP63V)-l-e}q>*afAYZKO80L7N=v3|5IJHlxnp&kyQ z{w~QPq`=LpVj-NsB5GhEO+=#wZco_D^wh4iT9~zs5rU+jrs4Yk%)?I4D4pf9?JVKb ze&4yp-KW;OOGJN9Uu>})eD|o50Q8@l- z_P*?7@9SMf_J7>xoq{*N-seqcpLedQ0UPsj$>%f^p@o6fa6-RqaBqFMWrfXZ1|#|@!!=JpmIo-xGKKa#hHcLy=r`@I(F zWg~qDb35H!)a%-dDDrAz&$c&EKtj=Q7*jnQ&S{3WG2LDtB}#X?)A6Ex(3w23X71j0 z&5T==IxlIy9di=M13>C>r$g=vd$C_`ao0Q&&gFQ64R^|6n#+(%rPLg)HGZk8j&3hn z-IAY|AQgLwy^&&ye-JVESmMR@TIxJvFSd`^#>i&n!GU*haL8>7B#Ipz*iN_Ht-jxX v9Jh;&*iD&7$s8CryfXh(+?!XsrdNhCof;a^g`wrf|J#26;zP2v(+~gvK|JO0 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br b/apps/dashboard/build/_app/immutable/chunks/Br8WXJxx.js.br deleted file mode 100644 index 7ef5f6f64488699f8b435859cfe24ce1a4434dc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 606 zcmV-k0-^mIW&}Xw(rNYARQkm1&aGqhgtc?|RY+VCATSORhlI2KY)*T5AuF6>8UQ;& z*SX5c30YwWKpN%^ewT-IG7Vwp?YEFtNILZ46UiFhQEi?*#j79tgT-Ri`}*hGy1%s_ zW4ec4L6IYkx4HzyJpL#Mx#?iG-8@9nL7=VIWt9__{;b-XNcNpIx6@QTM+z+KL;X)Z4lRt?E2$CPrZp##PShW-oA~%c0AhgR@qQjF z{)RerRqWErI3YzT_x2)gi|4_(jb`ld^(AARI>TZuiLbG<^vT0|A$eMR7fTWE`UDKLdBikH9uLA(i=kxVyDGU=NUFg4IruJ s^nUz_tU*l`szZaE;*V&aIMxVA&a3l01TCrLFM>1Y+Me#!tQroTW{Y@6LEy#-3xT~NB|e)2TrZ{7NSDjAL# z$F3HRs9}nUr4lFdOSl`pgmxJB#TT_0MSku!@a`@Zn%z}#E!58K(@Gn-WG&GZF=)4o z43JiF)7m{)Dlqj(8oO{aG`DP?+T{db@7V)ZTbpg?8Tfd=$S@sG*}VTSLq5=g76jrg zTSH5AnCwb}ZT)w4lbDw!SfnPl^3D6l7JeSZ97vku`#VP(@MsXfGjSd`h7Dr*u zu-3X3+{^CvMxRJ%5;;^%fj0mJ-FfI|9}m8R-R?4Wpk>7V z!D6}GA=OcI2JA1EmG3NM``e@P+~@QhR`7}s*uBCYspm(-V155#dp2JGVPrSfhxe}7 pqhktvf$P1*;SaJ7;+Aw1!j3+NVCmEFKk3si{{ho>xPNB^000=)N4)?5 diff --git a/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js b/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js deleted file mode 100644 index e56bc99..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js +++ /dev/null @@ -1 +0,0 @@ -import{H as m,I as _,m as b,l as i,J as y,K as v,M as h}from"./BBD-8XME.js";function E(e,l,u=l){var f=new WeakSet;m(e,"input",async r=>{var a=r?e.defaultValue:e.value;if(a=t(e)?o(a):a,u(a),v!==null&&f.add(v),await _(),a!==(a=l())){var d=e.selectionStart,s=e.selectionEnd,n=e.value.length;if(e.value=a??"",s!==null){var c=e.value.length;d===s&&s===n&&c>n?(e.selectionStart=c,e.selectionEnd=c):(e.selectionStart=d,e.selectionEnd=Math.min(s,c))}}}),(y&&e.defaultValue!==e.value||b(l)==null&&e.value)&&(u(t(e)?o(e.value):e.value),v!==null&&f.add(v)),i(()=>{var r=l();if(e===document.activeElement){var a=h??v;if(f.has(a))return}t(e)&&r===o(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function t(e){var l=e.type;return l==="number"||l==="range"}function o(e){return e===""?null:+e}export{E as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br b/apps/dashboard/build/_app/immutable/chunks/BxfT1SOA.js.br deleted file mode 100644 index dfe66fb6bad6f835035d67fa0e01e07542e1ffe7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmV;O0b>3eGXo%u(NbOOFduUHMa(SA|Z)jOn08!ekIWyjvik+T6PLwPZ)Cn69dfo z4fei6%1>jj@9rM1y8oY#c2Syvt;t999JrQ1ZznJMc5~+OFJBD`^lZRchSPGi zZKT?zvUT3#qJAF7@)qvXv!zEvH@N9Ff*Y z+%}4pOhh7y_B19q*=)1z0X;mPnfLt0?)v>;{p)Q8F6+fzf+x`@*a@AW6ZZ)Y;vvB(wh7v~ zu|rSf=bM|apT7Lqmhz_~c@s?KyTN27L!m`bn!k=4A{a`mYg4dGR#l1jtg7Ohf3xb#tS$If_MKr)RGiQA%mq78`rfgqZdEi*JEr-` zpf$)TWr3|mo?<7L|7R!{9bD(XMY!=`!gna^+cE;V2HwK{gp zkF0SWTbt1D(2{9dRu;@Nl5_2lYS;8d2`Q2jn~yl-@8yk@%d4344}Sm>BQBdX0{{TH CG~Ues diff --git a/apps/dashboard/build/_app/immutable/chunks/Bzak7iHL.js.gz b/apps/dashboard/build/_app/immutable/chunks/Bzak7iHL.js.gz index df094a80bb79ac49f3caa2241b9e86645b6f8ec6..f429ed1039a6cb41bb4c0947aa34a32b7011d313 100644 GIT binary patch delta 53 zcmYdD;*#&?U;qIo;fY)(DsSGJ27Nu1^Ev3WXj8DaiRo9N;2@JJK2uHB?qrbm_%$s7 Gs1g9dNfH78 delta 51 zcmYdF;F9m=U;qIo=80S;N)19Qt5UaBu6)XMaHXol#3NHgcvXW{eY5o#q&{d(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function k(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var _=e.querySelector(l)??e.querySelector("option:not([disabled])");n=_&&i(_)}f(n),v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=y??v;if(a.has(l))return}if(d(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),q(e)}function i(e){return"__value"in e?e.__value:e.value}export{k as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br b/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.br deleted file mode 100644 index 17877abbf9a5e57a55a612c2ba38f6dbd29db41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmV^Chmt7XyqvONDMR7beta;K-6+DSo+Zvust~W8*iY++_f#Gjk%{+UDXMPo}aRY#SvUf;Tt0YP2UcjzVX;uMEdmJ&(dX0DD z23en{Dbq#(yji)0oHCssv8G%1FCZ0idPbE)3qA}`HT7{sG@~q;G0)7kU$i6VfUX5i z0woV0XreltV}`R4_wY#jtuTWu~&SgcSy)IRM(y z@oWHfE->>TdlbJar!2qTLThg B@4x^6 diff --git a/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz b/apps/dashboard/build/_app/immutable/chunks/C-QujEl6.js.gz deleted file mode 100644 index e8fab48753e9c2caee31ed7e859b0b5f1834655d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmV-P0=E4hiwFP!0000217%a+Z__Xke&?@9EEL(2XVy2=$W%-WfuQ1H(m+&Ge!usgjHSsckHC?#(28i`MbOCySvD4XRJSb%7n`t-6mt`Z8A0enM_63$#nE}G8_6O znVv3_*$=HX9b#{;u0CA6{jt1eza1*upldIU&KeBV(w65la*!GDh+WTXOWX4wJGq7WcwtA~S6U%J*3PR zS%*}~^8`!HHrUhH?eMHvetAkCaNa&X+MM&=$R@iaMG@(rfS+{(5By?AhO^Xr3{wNk zHT=nz!HX3CRynXeSd0mOcS!R9wqEx_1t3Et%gh9b4~KdqRr6IkKhH0z3zfG3=~H-b zWfeTQf4q-Ud9d>p8mpnZfzWztV_73zZM2SLacuL%a(i5eow$mT>vs^_8}QU8{VpO< zy%G8sAR1z^gi|~$(CVcA4$aZL-ax&D2GMbG&o-<1>W+0{$7-Qee7Fx__cvpzvF~F@ z5h_Uu%E4HB&0k<5V6k`^L(>xH+IYN*>O`d?5rRmm`MM}1UPqN!6WZs~RTYI`qG@m+ z^;0v=CAACO;&J`JId4oII?$epIG!G^6(o-wHSZUTJ|P9$2p3r$4|9m2w8%g`p}r^r zKOf1MsQ(l6G_6SY%nyfniji@P10lotEO&LE?68f;{yNy>Es&y diff --git a/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js b/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js new file mode 100644 index 0000000..c72a64e --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js @@ -0,0 +1 @@ +import{s as c,g as l}from"./DAj0p1rI.js";import{a0 as o,a1 as f,a2 as b,g as p,h as d,a3 as g}from"./nyjtQ1Ok.js";let s=!1,i=Symbol();function y(e,n,r){const u=r[n]??(r[n]={store:null,source:b(void 0),unsubscribe:f});if(u.store!==e&&!(i in r))if(u.unsubscribe(),u.store=e??null,e==null)u.source.v=void 0,u.unsubscribe=f;else{var t=!0;u.unsubscribe=c(e,a=>{t?u.source.v=a:d(u.source,a)}),t=!1}return e&&i in r?l(e):p(u.source)}function m(){const e={};function n(){o(()=>{for(var r in e)e[r].unsubscribe();g(e,i,{enumerable:!1,value:!0})})}return[e,n]}function N(e){var n=s;try{return s=!1,[e(),s]}finally{s=n}}export{y as a,N as c,m as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.br b/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.br new file mode 100644 index 0000000000000000000000000000000000000000..0bea27f64443793c6684d6b99e54f248161138a2 GIT binary patch literal 362 zcmV-w0hRt6egYt5Q)l}xQ_?5tPT|cyJ;Tfah1$9VK2Kbe|AC+ET`EE&7o`&$?uG-N zMIp^HuLM^R-Nnv+V??PzaJXt0UcT^3YIbepLOdOW(amKaPm}p$*e?betL5>?CX^?G zsi$Bn6wcn1+JmVKU?w%OU}o1ZKa=<2t&uFf1^Wqg{D;KZsH^;W2SSGCXv>LNEWH)a zzs%41IV?I`vUsIDq9;!k@MfrEq?PH-SG5zlz6yQr`pj~2;zQ?k#+xG=56=*gz&XqL zc>+(Erva|QR8Y9)V{-Pm*7D%2WG*b(k2T=W5`=O-v&-{PRjw+y(xMz4(rPA7rGcEB zR60K&fuNeAZFDqQV_@h+*gE=HW13C?kk71;xOuoM1m$b~)AY7(K&T@t9~|lzBT;@r z0vRhmcIdFEvo9g@lRkI@d1N*WFZ6Q0vq0jWa$jtQiyx=bHM?NroNT4T?Y1DNH>m+* I#LaX106Vd=JOBUy literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.gz b/apps/dashboard/build/_app/immutable/chunks/C3ZC25l2.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..894fafe5071b0cd65ed72a66caef7c51cb52d36c GIT binary patch literal 395 zcmV;60d)Q!iwFP!000026ID`8YwIu&y!ThgJp>6B*KTh%swwo+OUvUOLk_aD&QqQ& z1$~4Xq5ocFCv9^Y#Lmvnj#f@5V|{c)I5NN?gG!?{(|!5y`f{vJwS6m(?!J{PQB;{? zK-3vW5RV!Awetl3GVDP-WjtJk^nCPx>W}}6kU~!!FKUqd?>zNJQPz$@4_+EgW{RM} zvN#y+JPF)x^{(q^1|FR^78@Ou0%w99u<7a9$UUhT1nola1}l4P#>84V(oil91?RZg z6jTzaiDhi5{Gw9^7beH9Thx*Bj4YJvobt@qIdId-#}<{tcovp;UR3REb)X1>KS$sF z(h<#`UY{UXV&HjECyPEnbWZFY(xYfj%(mcBEZ=rtbXG5utxDT{_u#-HP8EX}5D z)&UI-^+(? pbChnEMyZ8Tb97v%grCdZ%=sV$ysvjQWpJsz`vTRzfGd9j007?OywLyv literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js b/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js similarity index 80% rename from apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js rename to apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js index 76395b7..6e34d55 100644 --- a/apps/dashboard/build/_app/immutable/chunks/gqVpgJ8U.js +++ b/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js @@ -1 +1 @@ -var D=Object.defineProperty;var g=a=>{throw TypeError(a)};var F=(a,e,s)=>e in a?D(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var w=(a,e,s)=>F(a,typeof e!="symbol"?e+"":e,s),y=(a,e,s)=>e.has(a)||g("Cannot "+s);var t=(a,e,s)=>(y(a,e,"read from private field"),s?s.call(a):e.get(a)),l=(a,e,s)=>e.has(a)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,s),M=(a,e,s,i)=>(y(a,e,"write to private field"),i?i.call(a,s):e.set(a,s),s);import{K as x,a7 as C,a8 as k,a9 as J,aa as A,ab as B,J as K,ac as S,ad as j,ae as q}from"./BBD-8XME.js";var r,n,h,u,p,_,v;class G{constructor(e,s=!0){w(this,"anchor");l(this,r,new Map);l(this,n,new Map);l(this,h,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,()=>{var e=x;if(t(this,r).has(e)){var s=t(this,r).get(e),i=t(this,n).get(s);if(i)C(i),t(this,u).delete(s);else{var c=t(this,h).get(s);c&&(t(this,n).set(s,c.effect),t(this,h).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),i=c.effect)}for(const[f,o]of t(this,r)){if(t(this,r).delete(f),f===e)break;const d=t(this,h).get(o);d&&(k(d.effect),t(this,h).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,r).values()).includes(f)){var b=document.createDocumentFragment();j(o,b),b.append(A()),t(this,h).set(f,{effect:o,fragment:b})}else k(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!i?(t(this,u).add(f),J(o,d,!1)):d()}}});l(this,v,e=>{t(this,r).delete(e);const s=Array.from(t(this,r).values());for(const[i,c]of t(this,h))s.includes(i)||(k(c.effect),t(this,h).delete(i))});this.anchor=e,M(this,p,s)}ensure(e,s){var i=x,c=q();if(s&&!t(this,n).has(e)&&!t(this,h).has(e))if(c){var f=document.createDocumentFragment(),o=A();f.append(o),t(this,h).set(e,{effect:B(()=>s(o)),fragment:f})}else t(this,n).set(e,B(()=>s(this.anchor)));if(t(this,r).set(i,e),c){for(const[d,m]of t(this,n))d===e?i.unskip_effect(m):i.skip_effect(m);for(const[d,m]of t(this,h))d===e?i.unskip_effect(m.effect):i.skip_effect(m.effect);i.oncommit(t(this,_)),i.ondiscard(t(this,v))}else K&&(this.anchor=S),t(this,_).call(this)}}r=new WeakMap,n=new WeakMap,h=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{G as B}; +var D=Object.defineProperty;var g=a=>{throw TypeError(a)};var F=(a,e,s)=>e in a?D(a,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[e]=s;var w=(a,e,s)=>F(a,typeof e!="symbol"?e+"":e,s),y=(a,e,s)=>e.has(a)||g("Cannot "+s);var t=(a,e,s)=>(y(a,e,"read from private field"),s?s.call(a):e.get(a)),l=(a,e,s)=>e.has(a)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,s),M=(a,e,s,i)=>(y(a,e,"write to private field"),i?i.call(a,s):e.set(a,s),s);import{U as x,ae as j,af as k,ag as C,ah as A,ai as B,T as S,aj as T,ak as U,al as q}from"./nyjtQ1Ok.js";var r,n,h,u,p,_,v;class G{constructor(e,s=!0){w(this,"anchor");l(this,r,new Map);l(this,n,new Map);l(this,h,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,()=>{var e=x;if(t(this,r).has(e)){var s=t(this,r).get(e),i=t(this,n).get(s);if(i)j(i),t(this,u).delete(s);else{var c=t(this,h).get(s);c&&(t(this,n).set(s,c.effect),t(this,h).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),i=c.effect)}for(const[f,o]of t(this,r)){if(t(this,r).delete(f),f===e)break;const d=t(this,h).get(o);d&&(k(d.effect),t(this,h).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,r).values()).includes(f)){var b=document.createDocumentFragment();U(o,b),b.append(A()),t(this,h).set(f,{effect:o,fragment:b})}else k(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!i?(t(this,u).add(f),C(o,d,!1)):d()}}});l(this,v,e=>{t(this,r).delete(e);const s=Array.from(t(this,r).values());for(const[i,c]of t(this,h))s.includes(i)||(k(c.effect),t(this,h).delete(i))});this.anchor=e,M(this,p,s)}ensure(e,s){var i=x,c=q();if(s&&!t(this,n).has(e)&&!t(this,h).has(e))if(c){var f=document.createDocumentFragment(),o=A();f.append(o),t(this,h).set(e,{effect:B(()=>s(o)),fragment:f})}else t(this,n).set(e,B(()=>s(this.anchor)));if(t(this,r).set(i,e),c){for(const[d,m]of t(this,n))d===e?i.unskip_effect(m):i.skip_effect(m);for(const[d,m]of t(this,h))d===e?i.unskip_effect(m.effect):i.skip_effect(m.effect);i.oncommit(t(this,_)),i.ondiscard(t(this,v))}else S&&(this.anchor=T),t(this,_).call(this)}}r=new WeakMap,n=new WeakMap,h=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{G as B}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.br b/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.br new file mode 100644 index 0000000000000000000000000000000000000000..bc1593056ffa9bad65af1d8ac8d5437aa2a56c41 GIT binary patch literal 881 zcmV-%1CIO~#0UV4!nXOb$%b4chm1V=HGfvMgtL8<7i(em#5%Fgqsl*pUEDH1H9Tpz!2f@9YJXUdolW}oe4YMxxfGbxK((v}fNpbux|IWZNY@)-sObds zZs134a5TNd+9$F_{Lq(Lz2?W}& zWi0BV%d2(eR6W65)##V)uT70im0p@60-EDNIY~2IBVrMrW3OR#3fNn>Tgy(bnfQO zHhGD^^C2^GVrIiR=6m7)oQjQH?*u4Xw2_zi9H1IKw*+Dj?Ea94Kd$WNqiHrBg=wZ5 zj^)gv4Vc^Tto52**#^2s8p&v*9ZHP@K(Iv=H#QztAre?*pTLO4gqaYChKZ&Vc*UfH z7$|#p@mRsBBNz#DMg}0FMurN zHC%w2L?$x31~DM^I-Vw%Dbbj-B2Lupnp|}S%fp=4^0LUIt(G+%=!!Yl51^hx`V;x`)^q@u;>6Gh&HnT9i0h> z!Ac7PM70l55iN-tF(-P6OOpJamQadx5=8GLz!1Y>Nr7byObD!WP#2)!0yKwS-=g1T zIXtWhM~{d-U^zB09f>z$ov6qTCVdDZ9#%{z1$fYU(CFLIEdl28gL48e69ib zhz+KxEW?g4Q)wKl4i9}^)+fkK^Bn}#V7Aj_81uE;H{DEzXrp%0W^JRHopE?l{`{Xy H#VnoxA=jhY literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.gz b/apps/dashboard/build/_app/immutable/chunks/C3lo34Tx.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba6408a393e920825fcfb153050240bceba04083 GIT binary patch literal 991 zcmV<510eh#iwFP!000026NObxZ`(K!z3;D(buc*SKuxa}6eCSGJq7I|3HDGF22Bku z+7hXfloP|&e_v3xBs)R6r_nr-^YPx0+;SV;W#5-;59t(w7qvC8+~ zTV6Iab1lsHPx_U)F7C@1_nvX|yPAxQXp+TlS1nB$&*@Vf&%z4aoz;*O+%XP^!-~bX zTx;W__>+S!rXSa_UH2JV;&~*ksiNAdE%y{jMP(iXy17dPFH6Q@M#+ji;{aH`Pcc=|alT-oq&; zswTz@ zve#5e=1rP5IsO!Pa8VW*f* z*%&UU!NTlVfinLEk?)+_`$~>`DnJqEEus%65m@G*eOKjW_Y9E5P z(pc8%@Kd7sWn?sT3i}H_PPrwZ%(9GNX^C&rZflgkX~{sEPp53d@{gM^@Nsf|Odb-s z!(n7IXd(fG(O&6>hU}e+O0pYk`7Q}Vcvg6Kr8owVC@sn+r!Gb(#WKr{XgU^!CGP3& z!&7)1Ak8*|;y<1rqR<8O(9=1z?slXxnxe<}FgVo8JmXaH7d&f2JoL)lewT)F=Sl$en`2 zfo<3y#!~^bke#jtEACxqw2-699F?hC6_?@QIO)pAiY*^WA%8d5~GEwD&_ma7XTR0TsgsQ-osls zG4U9#tTTz921*xjd~<>WZELe|1&257f!C-nyyC)ZF1-4}TU>bCb1$XW?j`%yy-;oX N*MFNt+-$`N005fE{throw TypeError(t)};var Ie=(t,e,r)=>e in t?Ye(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var j=(t,e,r)=>Ie(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||ce("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),d=(t,e,r)=>e.has(t)?ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),a=(t,e,r,n)=>(re(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{aL as Me,g as Te,z as Ce,n as Pe,aM as ue,A as J,ax as Ee,aj as Y,T as I,F as x,aN as _e,b as Ve,a7 as xe,aa as Be,aO as pe,ai as F,ah as we,aP as se,ag as ie,ak as He,aQ as ge,aR as Le,aS as ve,aT as qe,aU as We,aV as Z,aW as G,aX as ye,aY as je,aZ as Re,k as Se,ar as ze,af as ae,ac as K,O as $e,ab as Ue,a_ as z,E as Je,a$ as Qe,b0 as Xe,b1 as Ze,a3 as Ge,b2 as ne,ao as Ke,ap as De,a9 as et,aD as tt,b3 as fe,ad as $,b4 as rt,aC as st,b5 as it,au as at,p as nt,aq as ft,b6 as ht,a as ot}from"./nyjtQ1Ok.js";import{b as dt}from"./B0IenmM-.js";function lt(t){let e=0,r=Ee(0),n;return()=>{Me()&&(Te(r),Ce(()=>(e===0&&(n=Pe(()=>t(()=>ue(r)))),e+=1,()=>{J(()=>{e-=1,e===0&&(n==null||n(),n=void 0,ue(r))})})))}}var ct=Je|Qe;function ut(t,e,r,n){new _t(t,e,r,n)}var m,W,w,C,g,R,T,E,S,P,A,B,H,L,D,ee,h,Ne,Ae,Oe,he,Q,X,oe;class _t{constructor(e,r,n,c){d(this,h);j(this,"parent");j(this,"is_pending",!1);j(this,"transform_error");d(this,m);d(this,W,I?Y:null);d(this,w);d(this,C);d(this,g);d(this,R,null);d(this,T,null);d(this,E,null);d(this,S,null);d(this,P,0);d(this,A,0);d(this,B,!1);d(this,H,new Set);d(this,L,new Set);d(this,D,null);d(this,ee,lt(()=>(a(this,D,Ee(s(this,P))),()=>{a(this,D,null)})));var i;a(this,m,e),a(this,w,r),a(this,C,f=>{var u=x;u.b=this,u.f|=_e,n(f)}),this.parent=x.b,this.transform_error=c??((i=this.parent)==null?void 0:i.transform_error)??(f=>f),a(this,g,Ve(()=>{if(I){const f=s(this,W);xe();const u=f.data===Be;if(f.data.startsWith(pe)){const l=JSON.parse(f.data.slice(pe.length));p(this,h,Ae).call(this,l)}else u?p(this,h,Oe).call(this):p(this,h,Ne).call(this)}else p(this,h,he).call(this)},ct)),I&&a(this,m,Y)}defer_effect(e){We(e,s(this,H),s(this,L))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,w).pending}update_pending_count(e){p(this,h,oe).call(this,e),a(this,P,s(this,P)+e),!(!s(this,D)||s(this,B))&&(a(this,B,!0),J(()=>{a(this,B,!1),s(this,D)&&ze(s(this,D),s(this,P))}))}get_effect_pending(){return s(this,ee).call(this),Te(s(this,D))}error(e){var r=s(this,w).onerror;let n=s(this,w).failed;if(!r&&!n)throw e;s(this,R)&&(ae(s(this,R)),a(this,R,null)),s(this,T)&&(ae(s(this,T)),a(this,T,null)),s(this,E)&&(ae(s(this,E)),a(this,E,null)),I&&(K(s(this,W)),$e(),K(Ue()));var c=!1,i=!1;const f=()=>{if(c){Ze();return}c=!0,i&&Xe(),s(this,E)!==null&&ie(s(this,E),()=>{a(this,E,null)}),p(this,h,X).call(this,()=>{se.ensure(),p(this,h,he).call(this)})},u=o=>{try{i=!0,r==null||r(o,f),i=!1}catch(l){z(l,s(this,g)&&s(this,g).parent)}n&&a(this,E,p(this,h,X).call(this,()=>{se.ensure();try{return F(()=>{var l=x;l.b=this,l.f|=_e,n(s(this,m),()=>o,()=>f)})}catch(l){return z(l,s(this,g).parent),null}}))};J(()=>{var o;try{o=this.transform_error(e)}catch(l){z(l,s(this,g)&&s(this,g).parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(u,l=>z(l,s(this,g)&&s(this,g).parent)):u(o)})}}m=new WeakMap,W=new WeakMap,w=new WeakMap,C=new WeakMap,g=new WeakMap,R=new WeakMap,T=new WeakMap,E=new WeakMap,S=new WeakMap,P=new WeakMap,A=new WeakMap,B=new WeakMap,H=new WeakMap,L=new WeakMap,D=new WeakMap,ee=new WeakMap,h=new WeakSet,Ne=function(){try{a(this,R,F(()=>s(this,C).call(this,s(this,m))))}catch(e){this.error(e)}},Ae=function(e){const r=s(this,w).failed;r&&a(this,E,F(()=>{r(s(this,m),()=>e,()=>()=>{})}))},Oe=function(){const e=s(this,w).pending;e&&(this.is_pending=!0,a(this,T,F(()=>e(s(this,m)))),J(()=>{var r=a(this,S,document.createDocumentFragment()),n=we();r.append(n),a(this,R,p(this,h,X).call(this,()=>(se.ensure(),F(()=>s(this,C).call(this,n))))),s(this,A)===0&&(s(this,m).before(r),a(this,S,null),ie(s(this,T),()=>{a(this,T,null)}),p(this,h,Q).call(this))}))},he=function(){try{if(this.is_pending=this.has_pending_snippet(),a(this,A,0),a(this,P,0),a(this,R,F(()=>{s(this,C).call(this,s(this,m))})),s(this,A)>0){var e=a(this,S,document.createDocumentFragment());He(s(this,R),e);const r=s(this,w).pending;a(this,T,F(()=>r(s(this,m))))}else p(this,h,Q).call(this)}catch(r){this.error(r)}},Q=function(){this.is_pending=!1;for(const e of s(this,H))ge(e,Le),ve(e);for(const e of s(this,L))ge(e,qe),ve(e);s(this,H).clear(),s(this,L).clear()},X=function(e){var r=x,n=Re,c=Se;Z(s(this,g)),G(s(this,g)),ye(s(this,g).ctx);try{return e()}catch(i){return je(i),null}finally{Z(r),G(n),ye(c)}},oe=function(e){var r;if(!this.has_pending_snippet()){this.parent&&p(r=this.parent,h,oe).call(r,e);return}a(this,A,s(this,A)+e),s(this,A)===0&&(p(this,h,Q).call(this),s(this,T)&&ie(s(this,T),()=>{a(this,T,null)}),s(this,S)&&(s(this,m).before(s(this,S)),a(this,S,null)))};const pt=["touchstart","touchmove"];function gt(t){return pt.includes(t)}const M=Symbol("events"),ke=new Set,de=new Set;function Tt(t,e,r){(e[M]??(e[M]={}))[t]=r}function Et(t){for(var e=0;e{throw k});throw N}}finally{t[M]=e,delete t.currentTarget,G(V),Z(q)}}}function wt(t,e){var r=e==null?"":typeof e=="object"?e+"":e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=r+"")}function vt(t,e){return Fe(t,e)}function Rt(t,e){ne(),e.intro=e.intro??!1;const r=e.target,n=I,c=Y;try{for(var i=Ke(r);i&&(i.nodeType!==De||i.data!==et);)i=tt(i);if(!i)throw fe;$(!0),K(i);const f=Fe(t,{...e,anchor:i});return $(!1),f}catch(f){if(f instanceof Error&&f.message.split(` +`).some(u=>u.startsWith("https://svelte.dev/e/")))throw f;return f!==fe&&console.warn("Failed to hydrate: ",f),e.recover===!1&&rt(),ne(),st(r),$(!1),vt(t,e)}finally{$(n),K(c)}}const U=new Map;function Fe(t,{target:e,anchor:r,props:n={},events:c,context:i,intro:f=!0,transformError:u}){ne();var o=void 0,l=it(()=>{var V=r??e.appendChild(we());ut(V,{pending:()=>{}},v=>{nt({});var _=Se;if(i&&(_.c=i),c&&(n.$$events=c),I&&dt(v,null),o=t(v,n)||{},I&&(x.nodes.end=Y,Y===null||Y.nodeType!==De||Y.data!==ft))throw ht(),fe;ot()},u);var q=new Set,N=v=>{for(var _=0;_{var O;for(var v of q)for(const b of[e,document]){var _=U.get(b),y=_.get(v);--y==0?(b.removeEventListener(v,me),_.delete(v),_.size===0&&U.delete(b)):_.set(v,y)}de.delete(N),V!==r&&((O=V.parentNode)==null||O.removeChild(V))}});return le.set(o,l),o}let le=new WeakMap;function St(t,e){const r=le.get(t);return r?(le.delete(t),r(e)):Promise.resolve()}export{Tt as a,Et as d,Rt as h,vt as m,wt as s,St as u}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C4L78yoI.js.br b/apps/dashboard/build/_app/immutable/chunks/C4L78yoI.js.br new file mode 100644 index 0000000000000000000000000000000000000000..17bcd569fdb8736369467343c489ab0be6dfb16b GIT binary patch literal 2994 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.pending.delete(E),s.done.add(E),s.pending.size===0){var o=e.outrogroups;V(X(s.done)),o.delete(s),o.size===0&&(e.outrogroups=null)}}else u-=1},!1)}if(u===0){var i=t.length===0&&l!==null;if(i){var v=l,a=v.parentNode;we(a),a.append(v),e.items.clear()}V(r,!i)}else s={pending:new Set(r),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(s)}function V(e,r=!0){for(var l=0;l{var f=l();return _e(f)?f:f==null?[]:X(f)}),o,d=!0;function A(){n.fallback=a,xe(n,o,u,r,t),a!==null&&(o.length===0?(a.f&C)===0?re(a):(a.f^=C,M(a,null,u)):ae(a,()=>{a=null}))}var I=fe(()=>{o=Q(E);var f=o.length;let N=!1;if(D){var x=ue(u)===se;x!==(f===0)&&(u=W(),q(u),L(!1),N=!0)}for(var _=new Set,w=ve,b=ce(),p=0;ps(u)):(a=y(()=>s(ee??(ee=F()))),a.f|=C)),f>_.size&&de(),D&&f>0&&q(W()),!d)if(b){for(const[k,O]of c)_.has(k)||w.skip_effect(O.e);w.oncommit(A),w.ondiscard(()=>{})}else A();N&&L(!0),Q(E)}),n={effect:I,items:c,outrogroups:null,fallback:a};d=!1,D&&(u=z)}function H(e){for(;e!==null&&(e.f&Te)===0;)e=e.next;return e}function xe(e,r,l,t,g){var h,k,O,Y,J,K,U,Z,G;var s=(t&Ae)!==0,u=r.length,c=e.items,i=H(e.effect.first),v,a=null,E,o=[],d=[],A,I,n,f;if(s)for(f=0;f0){var R=(t&ne)!==0&&u===0?l:null;if(s){for(f=0;f{var m,P;if(E!==void 0)for(n of E)(P=(m=n.nodes)==null?void 0:m.a)==null||P.apply()})}function be(e,r,l,t,g,s,u,c){var i=(u&he)!==0?(u&ge)===0?Ee(l,!1,!1):j(l):null,v=(u&me)!==0?j(g):null;return{v:i,i:v,e:y(()=>(s(r,i??l,v??g,c),()=>{e.delete(t)}))}}function M(e,r,l){if(e.nodes)for(var t=e.nodes.start,g=e.nodes.end,s=r&&(r.f&C)===0?r.nodes.start:l;t!==null;){var u=Ie(t);if(s.before(t),t===g)return;t=u}}function T(e,r,l){r===null?e.effect.first=l:r.next=l,l===null?e.effect.last=r:l.prev=r}function Me(e,r,l){var t=e==null?"":""+e;return t===""?null:t}function ke(e,r){return e==null?null:String(e)}export{ke as a,He as e,De as i,Me as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.br deleted file mode 100644 index ee6947961380d926e3f4e74e53e79da3ca9103a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1850 zcmV-A2gUds&=3HO!g23|OKY2W#2z8ZtY7&~s}@x3>>HkLgq?4BI?17Q6%q<*mC{E} zaQAEG-*dV7EBxx7Q<`om%{K}tSsbx|rd>@_dbf5*cG3k{2y>&rzS1P?OPAcM+?tfy z&_8n);juXQo-R>Q#m)DuO+&##Q z6Jr&b=@3hr8A~I%5zXTLmy-!ys$7hG74v8}Al)aS+FZ(0FL6#6jUV=pt1;t)WdY`B zfs>OtaxKbieYe^OhuxWY$(|OEcW9f7wQs%k1i-9IRK~JfsTpZ!#3LSh&z_es>zZ~t zE%b|1H)HinRl2cmd^J{E9acxK_F*eUkPW6iQKth4IcSAjke8UDzy6Nhw14x0j)VaH zrQS6yTQUEP7P;^OR7lKwPpACvZA~AxZVE8oTO~Yb)`ucF?slz`8*0Y4Uko*w(9h|7 zu69|Vuk{vBY}9mDQ?X)9!!g}wjX0yhuRJ=urxYpdHZi`{hJmik!^mq7F4HYgZE#m= zJ4OFsrqapVhCu@KrPJ|3JDLP$2D5n700Ohm=VSWe4OwO*i+NjIbJ95R}*j@5ES=Ib6Pp`mxo@0;4#UN%hw&r6K*oQXUpU#lI~_&X|CbyN ze!=RaE}G(r3ObkFe$9^&e+1`vCl^EdW$@_zjQ;YEPGf8~bjJk|v#Nur_ul;4BXJbh zh~aKm6bfWlsL+GSY0>j#IQUVQ$^O>!NM+lhf1gCaS#LF^y3UJMc1htjLWH%coJmZ>RmEcs%0Xt@ zjk?tZJ~{G}rx5U>ew!T&+M%1hDq~&g3{t(7nvr>)u#~uI@OhsZInqv2!bck1_nDDB zT}!rJy>w0>?plyzBAXcpbrA?1PLaW+%OXlvx2uWXF>l(1IZWwSwCl>G?c{TJ#oV4= z{5?r??f{5m>B61bKGv6SW}`ZVSSUz4Gh-8iug_s~cbCC6s8O7Tf>$eBqQkFf>#t9D z0fd8WaI;TFfTL zqZ`?$gN^}7UB!BCi{nU;o$nLA?^YP!M%RX%Nc53I=R#5sojOxcx2+KyXk!v&FXp5q zpiwJnA;BeyVU%dJJ6T({r|oMI_XmgK>sTJcbt9=R>(f%wS2Kw{w{PL2DG;kYQVmK} zb;n(W5Xlf{v@N4ZrEFqQ{)|Py)X3Eap{SA$P~mJV$)Z@+MY3ho{GteOH74ifsV_FA zGIP?ez4gsZrIfv{Wicv4q*=ST*H3OM zXLO)k*UME6y?n>#((lSA$M_WFw z3>qDdN=Cl=l6Vt5Dm`BUhBS&abW2m7VZ1hzQrsv1<3J os)y%XUO?tIwkm&>@GM8qzptxkzN8QAKEKZCjY^L4^$A{&D?hWGcK`qY diff --git a/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz b/apps/dashboard/build/_app/immutable/chunks/C5a--lgk.js.gz deleted file mode 100644 index fe9fcb797b2bf42e8e61d34d72d7ff40c101b873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2010 zcmV<02POC)iwFP!000021C3a1bK5o&{(iqg_H;PFWW%$k?Ol&FqVbEGIH{e~b`mEZ zodzO7i7`dee3NXM|NV9WlA;`^y)W7YxB&L$*~LQPB2BVlE#*MwgWq9FBv2q@Vqyhv ziJpM`mFOMFglLEYd&EQvW<>u4xlgpj4?h!=Bl8O}pF#eM=pP_Gq7NWbq6rGz5mO+O z5%UwgBU0fwC*~NW*5)2$LDa_&iWpD9G0{}PSE3XAP!e+uvLZUii6t>J1=mDJII$w; z8_0X23!L~jF&Q%dAx0weK+F+nwT^LoNX!*7N5mW=qt9I;^BXaj$ea*!s_Gz17Q6O8 zkB&}W{&syfvcKiKZcxTv5hn5AL@@;!UuUW)vv`oz-IsIy1tPuag_0=1 zA-DY`R<`tgGioLB@IeV7_V}7KNQAPJvdEHImXvAkeqz_mtmGV$cDtPTcA;gltu-Pp zqlnkFigGn5UyA)2cJ_IVYL%OFLQyn!nJuCnq1U-678;RCL?A_Fr!rG9x4lTojPd#t%U~zu=I~ss8!MeyEiq&T%Q%oR?YM?*-G{@cwir3i zwc~QWiQXp)p4i#jL@&YsMF*;}%Z)Hjml)!kXpHf%NkXX&F5WcJhXQ8MI8EDK3Wc$z zgU@6Np#kt(LK zLX&}r@N)yqiDCgC22NlCF}xW&*EmySsKG}&H<}+ZzK-ocM$uGyw?e{7u^6RFG^fDu zG@(RXB)u39nY07zm}@?xKsq$@UvUg)OoCRgL_-kH(!km1Tyx{QQxP<(C*n_puxl(x zI(K76oQs`(a?*)$(n^$ym2_gR+!d+HpBi&oN`ld%prI+(G|k7d~zK+D|m%F-m%Z5(vHvZl&Q%bFNyQw z<`&+MlVITSi9MG&yXB9MOS^C7d$iJB+DYssi$z$lLk=|Z!`zdZZ=g{(nU4^4&n*l6 zzQ=*kf-sK7+U(?xJF<2W_4}ka#j%(8ZhOLbKaDRDhd6;o-?;)GxPX(YcG_{%Z%dAMhK75lQJ4(E_|m5-CKXD%vND; zJkLA)3>E`K&z1~dJiP{E4hwS)b`#{5#!T`x!7?^gDMqtHeukw@yENi1K}*N%T*#r+ zA$CHSAAEkY4AM z&=~Pvun84LGwz~aiZCu!-I{o$O~fNI?TVaY`bDt!KZxo3UQEAW$qB;Ma}n)aiFqCG zkk2TT6>?@D%c^unqX2zq3-*EEFm0{&Z}!G8aiv&kqjefAv0CEn6iK`8<^EWMXM*6F z9CYP>LKr$@$<1U8D+<;|#@~{uT7`WSggbggHiD|?mIi& zy=}d_z?!io@^}3wnYq($vq7UlTdMuoN2#tPG3j3MCRxnpY3mG)sLuK5^{^*J)2i!< zx>ZkHZyJEK#UmuSVWF{E#(3}kiMg5{5s<7gJ6pv6q`lw zm=Dy;M)!D7@7kSi^~>07dhJVsmDb!iZiwv6+`_|=Vi7((=Cp;Li!Onbv}d`^VJA+8$^XLzD%OuOp?GXlHQjgDvSgHGp(F>~{_Yi8`c zkQo}$jWIXy0gzE$?sdq0VJC8n4tLEX;gpWo*s!Mx51}CxxOT>kHEtowo^DsIZrSrC zNJLI%ZX~?xz7x^+Sms3LTIxMw&$>r!V`Q^(ch}k7eWBVGh!or1HJxs;S$(_xIBpkf svCAUEl7Y=utycPfid+2;fP^=iDmc+JgfmTx+Wp7>0Fxgy#L*A{0I(F(&;S4c diff --git a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.br deleted file mode 100644 index c2bbca92d83d6bdb2c8815999c55f081195a30e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{@P5&>YugthfANgeS+rPJKD2VZykAC7XjuPrFOw6!3C)-_5n!nQO$S%}Z) zm{Corp!>2oBk}mR{K|gNNY6a)xH#Xo6z;=S$VUlah&m0x}U diff --git a/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz b/apps/dashboard/build/_app/immutable/chunks/CBWLjDtu.js.gz deleted file mode 100644 index a07511334865cc245134152580184303d66f0cba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmV;}04M(+iwFP!0000217*)KYr`-Q1>n8ELh%qJkku}QQgei)?Gk9`Zb5au;E!0XUdyM? z_qRzjxvM3lPG!xuwqzT7w85NvPs#(k&8Ci?`NOwZg+}A$;%5Lf1_1OaY}LaJ3q(z( z(zB7sNZ9RAmLe3svY;-en!=d*Tnj*#V_dK!Y*UZ_)ib-_vmnO)`2%PmluVrp1D>XV S`8tq?>h2r#x*B^E0RR9P5NgB# diff --git a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js deleted file mode 100644 index 7d2ed73..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js +++ /dev/null @@ -1 +0,0 @@ -import{aE as h,aa as d,ao as l,aF as p,w as _,aG as E,aH as g,J as u,ac as s,aI as y,a0 as M,aJ as N,a5 as x,aK as A}from"./BBD-8XME.js";var f;const i=((f=globalThis==null?void 0:globalThis.window)==null?void 0:f.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:t=>t});function b(t){return(i==null?void 0:i.createHTML(t))??t}function w(t){var r=h("template");return r.innerHTML=b(t.replaceAll("","")),r.content}function a(t,r){var e=_;e.nodes===null&&(e.nodes={start:t,end:r,a:null,t:null})}function H(t,r){var e=(r&E)!==0,c=(r&g)!==0,n,m=!t.startsWith("");return()=>{if(u)return a(s,null),s;n===void 0&&(n=w(m?t:""+t),e||(n=l(n)));var o=c||p?document.importNode(n,!0):n.cloneNode(!0);if(e){var v=l(o),T=o.lastChild;a(v,T)}else a(o,o);return o}}function O(t=""){if(!u){var r=d(t+"");return a(r,r),r}var e=s;return e.nodeType!==N?(e.before(e=d()),x(e)):A(e),a(e,e),e}function P(){if(u)return a(s,null),s;var t=document.createDocumentFragment(),r=document.createComment(""),e=d();return t.append(r,e),a(r,e),t}function R(t,r){if(u){var e=_;((e.f&y)===0||e.nodes.end===null)&&(e.nodes.end=s),M();return}t!==null&&t.before(r)}export{R as a,a as b,P as c,H as f,O as t}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br deleted file mode 100644 index b6e08e0..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.br +++ /dev/null @@ -1,2 +0,0 @@ -@dS,A\`ԗ)o9ZI9l<¶ -^UIB'1$L/eȘ`W?F .cx X a0Mx;x=4AQ鍳URG c6CJ,ұX,JM1XLtH͂A4c@q*LdOhO(&,iA5Ѓe[Z@D<> ]PѕH d1,gNCP#E!DH^3o0.RVsȒr$.J % )k͘Af )!A7{5T2gWtb'bmBVHpRnsLjMkbqHhj2EIfIz[,,x{T \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz b/apps/dashboard/build/_app/immutable/chunks/CKcqngaU.js.gz deleted file mode 100644 index 98846dfbd1ae3d863085d5955458e84d72a554e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmV;U0$lwciwFP!0000219eneZ`v>zec!KuJRn>B@OYUtC38_PY~6*ns*tv~$|MeC za%^NfPz3q!`|NOOH;sp!#QrYlJ3hFoSH}9CnDm6}EkTHY1qc&Rf%qJ71)BiRAie~g zfVc~|fNudB5P3ic;%mSyh*7{Ph`4_b;zPg}5Z?n{wWT$6!rotB-wr?inoihnmt<>U zdu5gz?R>A|gp_=t%v`A1vT~g3Myc`IR7G!;p4Zu?(uLX3xBDgYwsBq-v+YVcIvD(u z@FsxeRthg4jjHl3N!(g0FNcSS;nLSCfn67KH=F)QJ-_rV&B{jSzB0NuC!X%C^o`Y| zdds9@=RAy}IxUh3xSf6^3x=1aEH0*!cZPjs z$9|1<422mtObO?2mX#_pLDn#%tyE4TEd%Cs4yHY8@IX9I5*mi+H^RLnLve>X}%r&<;3BWE0_)wVpaFL_#Nn5uB(TZ1K;?NBjN3 zT@0%nEJx3ti>r>p^whHT{i8AcQ5TEH@e*&Rr*Lfuhhh0{Aw2_XiSg JZFI^60023`P)q;- diff --git a/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js b/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js deleted file mode 100644 index 631fc9b..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js +++ /dev/null @@ -1 +0,0 @@ -const e={fact:"#00A8FF",concept:"#9D00FF",event:"#FFB800",person:"#00FFD1",place:"#00D4FF",note:"#8B95A5",pattern:"#FF3CAC",decision:"#FF4757"},F={MemoryCreated:"#00FFD1",MemoryUpdated:"#00A8FF",MemoryDeleted:"#FF4757",MemoryPromoted:"#00FF88",MemoryDemoted:"#FF6B35",SearchPerformed:"#818CF8",DreamStarted:"#9D00FF",DreamProgress:"#B44AFF",DreamCompleted:"#C084FC",ConsolidationStarted:"#FFB800",ConsolidationCompleted:"#FF9500",RetentionDecayed:"#FF4757",ConnectionDiscovered:"#00D4FF",ActivationSpread:"#14E8C6",ImportanceScored:"#FF3CAC",Heartbeat:"#8B95A5"};export{F as E,e as N}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.br b/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.br deleted file mode 100644 index 1fc079b483dc688557f2b25021763dd510559da1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmV+x0qOo5Ndkb3!*p9bUkq~15>pS?>Q|D5!koPru=p05(OxB4cKZDOZ~e*QC|q`X z06N`S+BC`@1{h6Xi6;KPZ8jXNU;QG*TT|(En06(PwGRJL{nu+dfGL*J$_i%{mqXX3spF(O^hX2M&(x=GdvtF7l z*{iCQtOqqL73n0U*9*}B15(793tSsU&Z0S@K`LOwNy{V)iKvxwMYErIKQ#s!jhp~e zI_Z2WT-3VZSxBE|^T(OxaIN*BC*zlOxB2eYF}xhn%O_)*n)cVS@p99R1jY+ebfh>? c@e<1r2yoM9%;oX8KY85$rQY0Yp|?1{3hjP{kN^Mx diff --git a/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.gz b/apps/dashboard/build/_app/immutable/chunks/CZ45jJaw.js.gz deleted file mode 100644 index 0a36621b758f559f3788a941a3f28c5a9f50e040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>TYiwFP!00002167etZo)7Sh4(!LO1D`Uk$@>;kvLfGq7^FY0bDb*k%%X< zEmVZKd&hA?U=_{x@}B2Mqj7!$>&roD|B^g2R&XhkRHM<*2C}Re3j|JJLM>&<8B5X@ ztV7dTq^za{j!HvUS6MI^^r7VCGB0wHmG@vxmoO8BNYXv%+SM3Qw#XOBHI?hjJ2Ys| z!h-U!zsryOtKHvtY&G%4|a0klj-!0e!+NM+ZlnY6Y zikfM5UfF0ER?=a5;Kzb<#LFxzZd_o~4lN1BGf5K*+BP0*nt;Y0^M;i^$oGCJmwEW% zlWG&h3bZ;uOiNw^y3=Z>@dUP?IUb`R=@g%Bskb(s.s);if(n){let o=0,t={};const _=k(()=>{let c=!1;const a=s.s;for(const f in a)a[f]!==t[f]&&(t[f]=a[f],c=!0);return c&&o++,o});r=()=>p(_)}e.b.length&&g(()=>{u(s,r),l(e.b)}),i(()=>{const o=m(()=>e.m.map(v));return()=>{for(const t of o)typeof t=="function"&&t()}}),e.a.length&&i(()=>{u(s,r),l(e.a)})}function u(n,s){if(n.l.s)for(const e of n.l.s)p(e);s()}export{x as i}; diff --git a/apps/dashboard/build/_app/immutable/chunks/Ck7jSX2P.js.br b/apps/dashboard/build/_app/immutable/chunks/Ck7jSX2P.js.br new file mode 100644 index 0000000000000000000000000000000000000000..3260552ca7c8118dc3a4f131a9dd3bff7cedcca4 GIT binary patch literal 298 zcmV+_0oDE+1Ofnz!g2587LABF3{7X+R79P0`IO7TFBj0Nc+B;(+3DVCvraBFoJtb) zXcum31vtc%&UW4DuvkeL=b8+t%O8?M5uF7dTE263^> w(v;n&?eak?A|;1p{iXCk+&=OUC;z*rHb8D}mV)vI<{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.br b/apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.br new file mode 100644 index 0000000000000000000000000000000000000000..0d96ec62d0db28d7bac06b55102e10f00f3fdcf9 GIT binary patch literal 150 zcmV;H0BQdlxd4FV_<7$~5_C7XZ6C@GMZ7oh>3NiSu5DS+qP9F~i*rs7a<{SVb1Q=M zYs3Za{=%PgJ~212V)Q>n+oAST?7i*R{^VjLgr!~;WEK2a5S|*zIW~})xoO+>x!d3S zgzhzeg$$zv04LM_$|x^*n&g19*}Qpl{~nD=CaEeg6ah1B;u(813mg|nWWV9BVvjN6 E00C7?Qvd(} literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.gz b/apps/dashboard/build/_app/immutable/chunks/Ckx7gB9J.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ff3a718b9e7b8c030efa56461393406f8e3a3f1 GIT binary patch literal 169 zcmV;a09OAWiwFP!000026E)633WG2Zh2ecq5nRXwLQ1i_5QP@krO*r55J9UmA&IR; za`&Rr)!TeL{%&;S{d=0,e(o=>({...o,connected:!0,error:null}))},t.onmessage=o=>{try{const s=JSON.parse(o.data);e(b=>{if(s.type==="Heartbeat")return{...b,lastHeartbeat:s};const p=[s,...b.events].slice(0,y);return{...b,events:p}})}catch{}},t.onclose=()=>{e(o=>({...o,connected:!1})),f(u)},t.onerror=()=>{e(o=>({...o,error:"WebSocket connection failed"}))}}catch(o){e(s=>({...s,error:String(o)}))}}function f(r){a&&clearTimeout(a);const u=Math.min(1e3*2**d,3e4);d++,a=setTimeout(()=>m(r),u)}function w(){a&&clearTimeout(a),t==null||t.close(),t=null,c({connected:!1,events:[],lastHeartbeat:null,error:null})}function v(){e(r=>({...r,events:[]}))}return{subscribe:n,connect:m,disconnect:w,clearEvents:v}}const i=H(),k=l(i,n=>n.connected),T=l(i,n=>n.events);l(i,n=>n.lastHeartbeat);const g=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.memory_count)??0}),E=l(i,n=>{var c,e;return((e=(c=n.lastHeartbeat)==null?void 0:c.data)==null?void 0:e.avg_retention)??0});export{E as a,T as e,k as i,g as m,i as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.br deleted file mode 100644 index 24c2b1456be6c5f4188b81e200e4fbf093ea55da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K&Lg#|!lGpGN3UTH>Br}KdA(}=#r0ks_OVi#Ti|M$)tAYUlK6uWOU_B=lJ zur&REtqBoe1j5`c7Ypc>QuXd2GpGC8hr8+N-^BE1u7q@m3xuO+)Vs$! zhnoxk>BP#I1{;wJJhw}EIy>!bX|K%s0XCRlC4aOyBLB&M{&bW?t$sZM{+mPgwrGZ?1j=#hKSqpWhB?IcV%?Fh zHqyX3moqr7$vkRTj(S;3@#iTM-@mgEi+S<4m zg$#|*sy{lJ^I^AwZP{(^G@B*u${w0>V}mlbIMisQ&qcG z<0y=$vR305`Y)_I>OxS@32oK(OKWuLAhl1)RPjlr znkxwxdm@$E&;(UCUy81_okbZ&U{66JDz*T^P;kB)#-}b+UL)8nYM3Uo+F!%d)2)bf pT~Tf}ZvWQerNW$CT}Gy3EAN`g=*cP6cQ9RQM~2i*epi7rnkCatD$4)> diff --git a/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz b/apps/dashboard/build/_app/immutable/chunks/CruZBLYW.js.gz deleted file mode 100644 index 41facb8b073fa8d7c3a78a37d74b1773cf0117a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 689 zcmV;i0#5xOiwFP!000021GQA|Yuhjo{l34#4Wme{P|{|jn~fS61WIA;AcYP}X%+dB zYPF>x$#H|@|9z6}q)GSV!(g8-k?-Bzd-o)nFSK!08gUzCqzqwF&y3D{wEx9?y8V9n z@TTAOwodUJ>UjA1^sHan$M|olb;!VpoFU|k zhp9$OEz@WaJ8FQZtBLc(@d0DEFr8@e431uZ8((2(R+VQ1WwiZ(3QQc;N-sb$gxPuJ z2@*h>oui6Us>zOWgFSI@-5_(Ymd}BCL=_sea#(gbxxS(cZmcgx{U$h008M?8pW9Nm zT0jtHD}E0faD`E!>GaKBY~5{t!R{;x3AA0|J++w>fCglRlU;nb;YD5J+AAlXs=A$4 zWZFVY^baIYJTo%$y0n0X@vneZh~8GmsH+fMG2=3Wv=u#wWEzdC>%9*7yo*7UVAQ4U~fA1=CwrN-7RhR_ICZ^oTSoj{*_(@QS4mN?XZ~Kyq>l#{dL|P>5+b4mS=4Bm+CzX?%5P&>~ XAjv$0oX8N$I(hdKvES4mh6Mls$>mg! diff --git a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js deleted file mode 100644 index bca8b90..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js +++ /dev/null @@ -1 +0,0 @@ -import{n as L,o as D,P as T,g as P,c as B,h as b,v as Y,w as h,D as x,x as M,m as N,y as U,z as w,A as z,B as C,C as $,F as q,S as y,L as F}from"./BBD-8XME.js";import{c as G}from"./BexJutgU.js";function H(r,a,t,s){var o;var f=!U||(t&w)!==0,v=(t&M)!==0,E=(t&q)!==0,n=s,c=!0,g=()=>(c&&(c=!1,n=E?N(s):s),n),u;if(v){var O=y in r||F in r;u=((o=L(r,a))==null?void 0:o.set)??(O&&a in r?e=>r[a]=e:void 0)}var _,I=!1;v?[_,I]=G(()=>r[a]):_=r[a],_===void 0&&s!==void 0&&(_=g(),u&&(f&&D(),u(_)));var i;if(f?i=()=>{var e=r[a];return e===void 0?g():(c=!0,e)}:i=()=>{var e=r[a];return e!==void 0&&(n=void 0),e===void 0?n:e},f&&(t&T)===0)return i;if(u){var R=r.$$legacy;return(function(e,S){return arguments.length>0?((!f||!S||R||I)&&u(S?i():e),e):i()})}var l=!1,d=((t&z)!==0?C:$)(()=>(l=!1,i()));v&&P(d);var m=h;return(function(e,S){if(arguments.length>0){const A=S?P(d):f&&v?B(e):e;return b(d,A),l=!0,n!==void 0&&(n=A),e}return Y&&l||(m.f&x)!==0?d.v:P(d)})}export{H as p}; diff --git a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.br deleted file mode 100644 index 712779c7b84f8db243de0df2558c199b82005dee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522 zcmV+l0`>hHz5^hP!g23pSz5a+5k++O)A@UsO?gMZZ%W1eNT?7~`1F^F=-&gDM|xMV zR})Kt;iba8@K(Ohb1vT-$iC150HZD?I@slvxck0<&Bm=VIGgpe{SRFI(#g9!q<&iX|Dc6azF zUsm6~?|QZO+uLr1NL*|UCGO^5Irhu79AR%WO-|TY57nvt4gTOx&i-St!_&gpC$2@Z zN7P8eU}=kslbU>^;z{SZgq-)(zOJxZuoK>9Doup;pUuIEyHJvn zSuSZ^xt@KNcCa>EU4TK5lfkJ*=U*RB&&E=7YWm%CpylM(>h?ycd3Ga#swPzj)^i*f zV@4}MtVL{t15=XXv?LEwJ<@rgN?c7q5AhZO@&TC8p|lv-&~H^MNek%M5jD$bY<7#3 z^ukw}ESzu!x*b!QG0~dGV|I9~8QVN$GI=9zBMU+lnUr<;jTTF`K^Lb6Nb>(UIr)#r z|8Yw}oSd{sS}0H@l1^UR9!`F7HC$AvCEJzCP5;*(GRglMj49^1(A8zt`a0^;?YHr^d Mp>K{~%LvXj0qr*ZDF6Tf diff --git a/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz b/apps/dashboard/build/_app/immutable/chunks/CzkEqL6J.js.gz deleted file mode 100644 index 1b84b069abfb4187031bc8b9d4a6677f12f784e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pd#iwFP!0000219g*KPunmQhVS<)QdC*Cbe45@Q=)^_Phg^eD3yi~szU3e znNkPxMN5 z53htZj0juU5~i>rT)~bohd072^a*b;APiwh=)#2X0yDx6E(wz+%+k$?`(-c~eg5`i zI(C2NCw|=evmVZVRjBRvvWVukA}sZ?h*RyH^9%wgAQ$^8$eh%tXNaA7UGsvyiVk8A zDl~f9>M`k;R%^^*iJcxq$OWGAC1c!-znTwYdBt<#E zFOl;UFUf}xh`LM?S*7vH>3OM}t3pW0uNez$wN!YTJp_-aytYO()N}zCW?8?I4@N!W z87DhbC%gp`VS$M4494=#Z_O7NapTaakg*X-z7Rs#9Afev%GmDCx>vTFpQ)nEv>6>6 zNz=sRHVY*h@BcGCF0Btzz=uZKQwLxVN#Gqs zg1y=EmP4;AY_!~dGo=(1V>f)&2DZWVzwH?7e_IjzWvcVS>EldN3(su3k^^pBsAFJH zdul49~n)&7tg`vBdnb8#iRz*6YfxJZfq-qqg=soYQr9Zv0R0QJi2vzXJdO Dr$H8_ diff --git a/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js b/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js deleted file mode 100644 index 5cd86b3..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js +++ /dev/null @@ -1 +0,0 @@ -import{af as g,ag as d,ah as c,m,ai as i,aj as b,g as p,ak as h,B as k,al as v}from"./BBD-8XME.js";function x(t=!1){const a=g,e=a.l.u;if(!e)return;let o=()=>h(a.s);if(t){let n=0,s={};const _=k(()=>{let l=!1;const r=a.s;for(const f in r)r[f]!==s[f]&&(s[f]=r[f],l=!0);return l&&n++,n});o=()=>p(_)}e.b.length&&d(()=>{u(a,o),i(e.b)}),c(()=>{const n=m(()=>e.m.map(b));return()=>{for(const s of n)typeof s=="function"&&s()}}),e.a.length&&c(()=>{u(a,o),i(e.a)})}function u(t,a){if(t.l.s)for(const e of t.l.s)p(e);a()}v();export{x as i}; diff --git a/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br b/apps/dashboard/build/_app/immutable/chunks/D1BK9eoQ.js.br deleted file mode 100644 index f2a4f7bd67d146a060ac4c6dbad35169ef43d2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmV-D0mA+p5duJ*2X;)D7~)a8u*L{Rp23sF&% z@dJe#{8B4tVA{g{NaHV z5z1_9hASzx;H+P-xi>gB79;(^GC#g3C*zNOZL>_2}9u}&4;Akw~IwPgbgU&Z%I zYZrub5k*G}!^sV(L}v}>cD+VBgG!g^#SUg8_p&jz^cCla#2f`-2Uv?xgBdVSb|PBc zE?Xm8*-|g|a0M()_p3S970iPF=}lNTt+VU6GR~cVIV2lNH+cRJP60mOW;_ay1XCPY mn5=_4$wX2zdtpFP2tNx@=Cb^N%ks>#diVuq2v{T%0ssJs^qzqL diff --git a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js b/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js similarity index 74% rename from apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js rename to apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js index 0260b51..a9eaa89 100644 --- a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js +++ b/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js @@ -1 +1 @@ -import{a as y}from"./C5a--lgk.js";import{J as r}from"./BBD-8XME.js";function a(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{a as s}; +import{a as y}from"./BilMa3tw.js";import{T as r}from"./nyjtQ1Ok.js";function a(t,e,f,i){var l=t.__style;if(r||l!==e){var s=y(e);(!r||s!==t.getAttribute("style"))&&(s==null?t.removeAttribute("style"):t.style.cssText=s),t.__style=e}return i}export{a as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.br b/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.br new file mode 100644 index 0000000000000000000000000000000000000000..905824ea1ebf9aea1552e966e9ca754d60f25e6a GIT binary patch literal 163 zcmV;U09^kY{s2H^V4i&?Sql^32A*0L zll^&?kYPmdI2aolQ5p#WI2_|QGZHL}Fh$`wIT%J)W@{W}8{Vak{4U7yjMmW@C^mXE RqN@d3c13H#c3gY8Gyuy*NWuUB literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.gz b/apps/dashboard/build/_app/immutable/chunks/D2QmVWrb.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..356ab5c448880a38429363c9c332ad370e0c6c75 GIT binary patch literal 198 zcmV;%06G63iwFP!000026J^ga3&JoE1>oIZk#>*-N<`c&hv+UMxJ#6)MAKC6uGM1u z-^GeLxE;Lj@i<>zE0Tv(j#b+iRF$cntbACzncVD|)7-zs?j`6WVtbbDbaNR*QOBeB zDk`TX!>q`>c{Gkx0I~Z$OB*ovg{H0x2>`xBhE}7=bwXXo34quW%2I^s{a500N?as AH2?qr literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js b/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js new file mode 100644 index 0000000..91c75c2 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js @@ -0,0 +1 @@ +import{y as S,z as h,n as k,A,S as T}from"./nyjtQ1Ok.js";function t(r,i){return r===i||(r==null?void 0:r[T])===i}function x(r={},i,a,c){return S(()=>{var f,s;return h(()=>{f=s,s=[],k(()=>{r!==a(...s)&&(i(r,...s),f&&t(a(...f),r)&&i(null,...f))})}),()=>{A(()=>{s&&t(a(...s),r)&&i(null,...s)})}}),r}export{x as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.br b/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.br new file mode 100644 index 0000000000000000000000000000000000000000..73181a6b1fcba4b7968fa679a942f71c2684f8da GIT binary patch literal 197 zcmV;$06PC0Hvu5T&!5xRsEzL@uVmNUmI^g=0B~2p$!oeBkA^t4qR0m-il%Ru_k{nQ ziI|RKeZ50VqKC^eZ|t=(M-ljjPx(ZM`H71fdE0W_PyUFe{`l!Uv=xBchy?fLI}>KU zR~0!MB{^E$V{ahK#oDN@E(O_{%Nlp=aU_iAM23gu9~2j8AfU$W;=&5$e_4{0** z$#EPty&m03@SNb%>qVrc7XyjpPSeVB!PJ)mLWd-$6-1Tl)N-lMS*u`{9qPaWTTx~c literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.gz b/apps/dashboard/build/_app/immutable/chunks/DAhpUNCK.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..412d4a153064bd921a093687552d57fc70cc12ec GIT binary patch literal 226 zcmV<803H7yiwFP!000026J1bEZ^AGPz3*3K93oq?vhBLcO#A|b$_;Vo7!je6PELx- zO8)zlbn0OzKfe#ldhYt&NgVI0396=_JWk~EXlX@t2HRw%yDrR&zn|mgZQYu4SX8$6 zhv+)5A_zGgR+@3PzOF-vLA4In%wa@5daj@JOl%kkET zvJ|R6_B64U0|nmgshxItW^TY36Hse#AXG3}ts@k{A_;2kApb&zz=R2@e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const f=[];function z(e,t){return{subscribe:A(e,t).subscribe}}function A(e,t=a){let n=null;const r=new Set;function i(u){if(q(e,u)&&(e=u,n)){const o=!f.length;for(const s of r)s[1](),f.push(s,e);if(o){for(let s=0;s{r.delete(s),r.size===0&&n&&(n(),n=null)}}return{set:i,update:b,subscribe:l}}function B(e,t,n){const r=!Array.isArray(e),i=r?[e]:e;if(!i.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const b=t.length<2;return z(n,(l,u)=>{let o=!1;const s=[];let d=0,p=a;const y=()=>{if(d)return;p();const c=t(r?s[0]:s,l,u);b?l(c):p=typeof c=="function"?c:a},h=i.map((c,g)=>_(c,m=>{s[g]=m,d&=~(1<{d|=1<t=n)(),t}export{B as d,E as g,_ as s,A as w}; +import{a1 as a,n as w,am as q,o as x}from"./nyjtQ1Ok.js";function _(e,t,n){if(e==null)return t(void 0),n&&n(void 0),a;const r=w(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}const f=[];function z(e,t){return{subscribe:A(e,t).subscribe}}function A(e,t=a){let n=null;const r=new Set;function i(u){if(q(e,u)&&(e=u,n)){const o=!f.length;for(const s of r)s[1](),f.push(s,e);if(o){for(let s=0;s{r.delete(s),r.size===0&&n&&(n(),n=null)}}return{set:i,update:b,subscribe:l}}function B(e,t,n){const r=!Array.isArray(e),i=r?[e]:e;if(!i.every(Boolean))throw new Error("derived() expects stores as input, got a falsy value");const b=t.length<2;return z(n,(l,u)=>{let o=!1;const s=[];let d=0,p=a;const y=()=>{if(d)return;p();const c=t(r?s[0]:s,l,u);b?l(c):p=typeof c=="function"?c:a},h=i.map((c,g)=>_(c,m=>{s[g]=m,d&=~(1<{d|=1<t=n)(),t}export{B as d,E as g,_ as s,A as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DAj0p1rI.js.br b/apps/dashboard/build/_app/immutable/chunks/DAj0p1rI.js.br new file mode 100644 index 0000000000000000000000000000000000000000..5c5ab521721a08aea08e4e1f8791382ecc78443e GIT binary patch literal 609 zcmV-n0-pUFW&}Wt!nWD-#0yy~hZr%E?U>H?E?Zw=gN|nN+vtZ_k|WrQS*q%^zEg;M z_}o@f2Mu#(r8Fw7P^t3I|GD(P0S=5J`ns&rb~Zdbz=2*wDX2I2E|@|y0pWrfb_UIW zxTih{FC&~7wa-xT>cM)0e~;4%zv0%lZJJTGyYFfvH8Kn$PR@%E@g6kF!+>%{dgCF?xJ96!cAb2YHsE&v!f{`q_UW z3EC-w74*8HJ!o?VVg0a&T6G9}Gz*_j&}^Qrh*l%I&vNonQ*)V5#=K=5r;5eVvbTYs zfzo)saG?&4q3E+%O#7xHR!XPD{Ib-{$Dy1J>0ph3H{gFeS7 zFrHiV$l^Hzxf^b8QJi@lyFId6@stRv!c+ME7n~|`gg-Lpbr=|z0T_pS1eD0dJOcYl zt=ZGV#pi;Hf8O`f-Um^D^V2`@r~5|2wD0uF{h-gX21}p%f9i2)A7ftu-KYD{w-0kC z{Eyd7oc$1h7^pqo&uI2H)bXogm)f^#VCJfCe|B3u!^;{Ks`y&n45yB7AW6>#gWgv+ zws}Dm*)Z06CB{*(>tDjG>PIL~0<9660J#9UZv#8ag$l1JqJM_;JSt8(UNLttWf=CX>>t(QK8mN-~3GX`Vj46GAhNFelUhHxNE6nsNqYy8Xoz71< v=Lkxx`6K*K2U>;*X%#lh8p~qyEMr+fgiS{{? zC&_J7*Zb{*oH*%Dgemgz@sYGXcGiWVT&vQnl1wzOR34-KO*Wdhv2pgeO#d^dU*X64 z`~T@Lzs#E6R6$##o$P^u#3& ztpsJJF0L$%ysDoPZulDdsomco)MJu>a36UO=M2k>CT+#+!y#*|gR|Ew+bD-VUl)MX zq+Rb1;7Ksk4OkpvWGwD^mHE3Xfd9(hu*rRquL@{#|8-qpHox*}{M5s4q6Iw&;?3Ja zPd0XTp}~1iwzx@L)-`w}mwNp!%)Cw#FdRVB4nIChq=-jR{K2KQv=Zc>_*Igam;y*= z-EbUd%CRCq8boHeDY`?QKw{YRcB1)Jxg+vc${0 zcN{M2-hG=@dIv+$QXfT#GqSu`XIDLoEc$9*QOEOcpLkMCH&9=$A?si+QE>pb_4%sU zc#5#uZrehIn~uY&6WgeYc{wYz+*X@%qyy{pSatvv?UC=Fp`s(-4?f=)e55+zKd`>L z+auW|IRTF6k<}j@z2ohuEH74ciYs`*2OQqufYbp}Y-}7qZO;?P`6j}gAMf4pePDxt k6h?WQ{veN0+?t-E+0%10o*t&($(Vil3w_ja>1PB00HhvDjQ{`u literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.br deleted file mode 100644 index 8351992c9ca820571aa68e0d3b28177b7ad1ff75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmV;k08IZI{r~_Rhq2pa&6Q}nkMKqd^ZH978qr>goW31`4LHPgNqn84ZXqgavhJ=w z9OZ7`OX8$0Y|W#-ED9`yG`-<-*)mcdN-T-)t;h<8 zi`rljQSH=To$@-Ypk5Rbp5D}p+xM+h5OjbUxW!KLM9PG4;6F1GP4%=S@w^B@P?tHv hX0}0IF6!GLI_A^^kW~LQ=>8&T)8Abohx6Kt9sxFBS{MKT diff --git a/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz b/apps/dashboard/build/_app/immutable/chunks/DBfx-YTU.js.gz deleted file mode 100644 index d531b34cbc6ce682dacbd4c512ca385801fea99c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmV;*05$&~iwFP!0000217**#3c^4P2H@SNI6KH4wC5y<2R?&37UH2lb ziW9rC5LR*sVH!I1xLFk5us$4!YY(wYB{q#88UybonOcI1<*{throw TypeError(t)};var Ie=(t,e,r)=>e in t?ke(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var $=(t,e,r)=>Ie(t,typeof e!="symbol"?e+"":e,r),re=(t,e,r)=>e.has(t)||ce("Cannot "+r);var s=(t,e,r)=>(re(t,e,"read from private field"),r?r.call(t):e.get(t)),l=(t,e,r)=>e.has(t)?ce("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,r),a=(t,e,r,n)=>(re(t,e,"write to private field"),n?n.call(t,r):e.set(t,r),r),p=(t,e,r)=>(re(t,e,"access private method"),r);import{aL as Me,g as Ee,l as Ce,m as Pe,aM as ue,q as U,ax as Te,ac as k,J as I,w as q,aN as _e,b as Ve,a0 as qe,a3 as xe,aO as pe,ab as F,aa as we,aP as se,a9 as ie,ad as Be,aQ as ge,aR as He,aS as ve,aT as Le,aU as We,aV as X,aW as Z,aX as ye,aY as $e,aZ as Re,af as Se,ar as je,a8 as ae,a5 as K,G as ze,a4 as Je,a_ as j,E as Ue,a$ as Ge,b0 as Qe,b1 as Xe,Y as Ze,b2 as ne,ao as Ke,ap as De,a2 as et,aD as tt,b3 as fe,a6 as z,b4 as rt,aC as st,b5 as it,au as at,p as nt,aq as ft,b6 as ht,a as ot}from"./BBD-8XME.js";import{b as lt}from"./CKcqngaU.js";function dt(t){let e=0,r=Te(0),n;return()=>{Me()&&(Ee(r),Ce(()=>(e===0&&(n=Pe(()=>t(()=>ue(r)))),e+=1,()=>{U(()=>{e-=1,e===0&&(n==null||n(),n=void 0,ue(r))})})))}}var ct=Ue|Ge;function ut(t,e,r,n){new _t(t,e,r,n)}var m,W,w,C,g,R,E,T,S,P,A,x,B,H,D,ee,h,Ne,Ae,Oe,he,G,Q,oe;class _t{constructor(e,r,n,c){l(this,h);$(this,"parent");$(this,"is_pending",!1);$(this,"transform_error");l(this,m);l(this,W,I?k:null);l(this,w);l(this,C);l(this,g);l(this,R,null);l(this,E,null);l(this,T,null);l(this,S,null);l(this,P,0);l(this,A,0);l(this,x,!1);l(this,B,new Set);l(this,H,new Set);l(this,D,null);l(this,ee,dt(()=>(a(this,D,Te(s(this,P))),()=>{a(this,D,null)})));var i;a(this,m,e),a(this,w,r),a(this,C,f=>{var u=q;u.b=this,u.f|=_e,n(f)}),this.parent=q.b,this.transform_error=c??((i=this.parent)==null?void 0:i.transform_error)??(f=>f),a(this,g,Ve(()=>{if(I){const f=s(this,W);qe();const u=f.data===xe;if(f.data.startsWith(pe)){const d=JSON.parse(f.data.slice(pe.length));p(this,h,Ae).call(this,d)}else u?p(this,h,Oe).call(this):p(this,h,Ne).call(this)}else p(this,h,he).call(this)},ct)),I&&a(this,m,k)}defer_effect(e){We(e,s(this,B),s(this,H))}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!s(this,w).pending}update_pending_count(e){p(this,h,oe).call(this,e),a(this,P,s(this,P)+e),!(!s(this,D)||s(this,x))&&(a(this,x,!0),U(()=>{a(this,x,!1),s(this,D)&&je(s(this,D),s(this,P))}))}get_effect_pending(){return s(this,ee).call(this),Ee(s(this,D))}error(e){var r=s(this,w).onerror;let n=s(this,w).failed;if(!r&&!n)throw e;s(this,R)&&(ae(s(this,R)),a(this,R,null)),s(this,E)&&(ae(s(this,E)),a(this,E,null)),s(this,T)&&(ae(s(this,T)),a(this,T,null)),I&&(K(s(this,W)),ze(),K(Je()));var c=!1,i=!1;const f=()=>{if(c){Xe();return}c=!0,i&&Qe(),s(this,T)!==null&&ie(s(this,T),()=>{a(this,T,null)}),p(this,h,Q).call(this,()=>{se.ensure(),p(this,h,he).call(this)})},u=o=>{try{i=!0,r==null||r(o,f),i=!1}catch(d){j(d,s(this,g)&&s(this,g).parent)}n&&a(this,T,p(this,h,Q).call(this,()=>{se.ensure();try{return F(()=>{var d=q;d.b=this,d.f|=_e,n(s(this,m),()=>o,()=>f)})}catch(d){return j(d,s(this,g).parent),null}}))};U(()=>{var o;try{o=this.transform_error(e)}catch(d){j(d,s(this,g)&&s(this,g).parent);return}o!==null&&typeof o=="object"&&typeof o.then=="function"?o.then(u,d=>j(d,s(this,g)&&s(this,g).parent)):u(o)})}}m=new WeakMap,W=new WeakMap,w=new WeakMap,C=new WeakMap,g=new WeakMap,R=new WeakMap,E=new WeakMap,T=new WeakMap,S=new WeakMap,P=new WeakMap,A=new WeakMap,x=new WeakMap,B=new WeakMap,H=new WeakMap,D=new WeakMap,ee=new WeakMap,h=new WeakSet,Ne=function(){try{a(this,R,F(()=>s(this,C).call(this,s(this,m))))}catch(e){this.error(e)}},Ae=function(e){const r=s(this,w).failed;r&&a(this,T,F(()=>{r(s(this,m),()=>e,()=>()=>{})}))},Oe=function(){const e=s(this,w).pending;e&&(this.is_pending=!0,a(this,E,F(()=>e(s(this,m)))),U(()=>{var r=a(this,S,document.createDocumentFragment()),n=we();r.append(n),a(this,R,p(this,h,Q).call(this,()=>(se.ensure(),F(()=>s(this,C).call(this,n))))),s(this,A)===0&&(s(this,m).before(r),a(this,S,null),ie(s(this,E),()=>{a(this,E,null)}),p(this,h,G).call(this))}))},he=function(){try{if(this.is_pending=this.has_pending_snippet(),a(this,A,0),a(this,P,0),a(this,R,F(()=>{s(this,C).call(this,s(this,m))})),s(this,A)>0){var e=a(this,S,document.createDocumentFragment());Be(s(this,R),e);const r=s(this,w).pending;a(this,E,F(()=>r(s(this,m))))}else p(this,h,G).call(this)}catch(r){this.error(r)}},G=function(){this.is_pending=!1;for(const e of s(this,B))ge(e,He),ve(e);for(const e of s(this,H))ge(e,Le),ve(e);s(this,B).clear(),s(this,H).clear()},Q=function(e){var r=q,n=Re,c=Se;X(s(this,g)),Z(s(this,g)),ye(s(this,g).ctx);try{return e()}catch(i){return $e(i),null}finally{X(r),Z(n),ye(c)}},oe=function(e){var r;if(!this.has_pending_snippet()){this.parent&&p(r=this.parent,h,oe).call(r,e);return}a(this,A,s(this,A)+e),s(this,A)===0&&(p(this,h,G).call(this),s(this,E)&&ie(s(this,E),()=>{a(this,E,null)}),s(this,S)&&(s(this,m).before(s(this,S)),a(this,S,null)))};const pt=["touchstart","touchmove"];function gt(t){return pt.includes(t)}const M=Symbol("events"),Ye=new Set,le=new Set;function Et(t,e,r){(e[M]??(e[M]={}))[t]=r}function Tt(t){for(var e=0;e{throw Y});throw N}}finally{t[M]=e,delete t.currentTarget,Z(V),X(L)}}}function wt(t,e){var r=e==null?"":typeof e=="object"?e+"":e;r!==(t.__t??(t.__t=t.nodeValue))&&(t.__t=r,t.nodeValue=r+"")}function vt(t,e){return Fe(t,e)}function Rt(t,e){ne(),e.intro=e.intro??!1;const r=e.target,n=I,c=k;try{for(var i=Ke(r);i&&(i.nodeType!==De||i.data!==et);)i=tt(i);if(!i)throw fe;z(!0),K(i);const f=Fe(t,{...e,anchor:i});return z(!1),f}catch(f){if(f instanceof Error&&f.message.split(` -`).some(u=>u.startsWith("https://svelte.dev/e/")))throw f;return f!==fe&&console.warn("Failed to hydrate: ",f),e.recover===!1&&rt(),ne(),st(r),z(!1),vt(t,e)}finally{z(n),K(c)}}const J=new Map;function Fe(t,{target:e,anchor:r,props:n={},events:c,context:i,intro:f=!0,transformError:u}){ne();var o=void 0,d=it(()=>{var V=r??e.appendChild(we());ut(V,{pending:()=>{}},v=>{nt({});var _=Se;if(i&&(_.c=i),c&&(n.$$events=c),I&<(v,null),o=t(v,n)||{},I&&(q.nodes.end=k,k===null||k.nodeType!==De||k.data!==ft))throw ht(),fe;ot()},u);var L=new Set,N=v=>{for(var _=0;_{var O;for(var v of L)for(const b of[e,document]){var _=J.get(b),y=_.get(v);--y==0?(b.removeEventListener(v,me),_.delete(v),_.size===0&&J.delete(b)):_.set(v,y)}le.delete(N),V!==r&&((O=V.parentNode)==null||O.removeChild(V))}});return de.set(o,d),o}let de=new WeakMap;function St(t,e){const r=de.get(t);return r?(de.delete(t),r(e)):Promise.resolve()}export{Et as a,Tt as d,Rt as h,vt as m,wt as s,St as u}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br b/apps/dashboard/build/_app/immutable/chunks/DNn3Nckx.js.br deleted file mode 100644 index 6a034f795b11faa441fe7b160588e18044152f16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2987 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 diff --git a/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js b/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js deleted file mode 100644 index ae0844d..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js +++ /dev/null @@ -1 +0,0 @@ -import{ah as a,af as t,y as u,m as o}from"./BBD-8XME.js";function c(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function l(e){t===null&&c(),u&&t.l!==null?f(t).m.push(e):a(()=>{const n=o(e);if(typeof n=="function")return n})}function s(e){t===null&&c(),l(()=>()=>o(e))}function f(e){var n=e.l;return n.u??(n.u={a:[],b:[],m:[]})}export{s as a,l as o}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br b/apps/dashboard/build/_app/immutable/chunks/DUC-ssvh.js.br deleted file mode 100644 index 9e56a494c3aa28ac4d1d99bc5ac97f53dc204968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmVg;|JM9m^QV5?%VOF_SxyB)_2;}an0GkH{CMn}8!Kij zBn9j%iS?_)7BRkd>dq_V1+oY$551gBJpJ&A_b9)X(LXEZzW_j%oI6fP=(Kd4f^mI$ zyp2ggnK;02NS8h#6gGXRWL{_z6hV`VTdtM>27O{sJDlY|Cn1-dmX4J1xF5vaG&2dv g_^NfR+-}Ki2fe?%+@=Ab82w5%+6cr!2z-@xmK(Ro~CM`R$fk~%w9bGBFw+1#qV8z`@j$JeLl_qP-O4z$tH zD(sylib1(x=iQZ9xRR6i&NJE}j^R+(VFH7|FEG_mn_h#Om4UO182SsGl}q~;EYfoQ zBbtpUgs{<=qEM`?Vo@MBk9*W=h9w{P7(w?bpyPqf diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js deleted file mode 100644 index 9024538..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js +++ /dev/null @@ -1 +0,0 @@ -import{b as p,E as t}from"./BBD-8XME.js";import{B as c}from"./gqVpgJ8U.js";function E(r,s,...a){var e=new c(r);p(()=>{const n=s()??null;e.ensure(n,n&&(o=>n(o,...a)))},t)}export{E as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.br deleted file mode 100644 index f7a2906b559913812ceee3215699f01eeb634854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmV;j08RfJxd4DH3T*cjYX&E!$;I3cABtGq+XlMamMZv9LqWaL@wQ=YH$7RZlCfF0 zeTr5zfgov@u$`B!fCERTeX6k3JUx#x&$TTJTGW;&ZE?=&LGCuTeQrgNevP=mtyW`M zP4@R2B3eL6 gGH)In-=i@F6&`~`36RE#X=^(A1rn($x{5tC0GDG`@c;k- diff --git a/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz b/apps/dashboard/build/_app/immutable/chunks/DZuEJlJ5.js.gz deleted file mode 100644 index 741bb0f3ce1bd99bc9e6a80f615214495caa303f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmV;b09F4ViwFP!0000212xXE3c@fHh2h<&2oB|5h;c21v{39KI4Z6+q@~i{#3WUr z%y$h~6GM`_AA5i&Ai4km073jsPyhe` diff --git a/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js b/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js new file mode 100644 index 0000000..5dc253c --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js @@ -0,0 +1 @@ +import{x as a}from"./nyjtQ1Ok.js";a(); diff --git a/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.br b/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.br new file mode 100644 index 0000000..c8a4fda --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.br @@ -0,0 +1,2 @@ + import{x as a}from"./nyjtQ1Ok.js";a(); + \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.gz b/apps/dashboard/build/_app/immutable/chunks/D_N1HvA5.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..2dca75014b006cef8f1650224f2df22239d63252 GIT binary patch literal 59 zcmb2|=3oE;CgIa(bWiAOty~x2p%dn@##j5)`Or(3&#ykC#cA^8{I%0sVVnG}T-frA NiDC2gEsxZJS^%C688rX^ literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js b/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js new file mode 100644 index 0000000..4962a25 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js @@ -0,0 +1 @@ +import{m as u,k as t,I as l,n as o}from"./nyjtQ1Ok.js";function c(n){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function a(n){t===null&&c(),l&&t.l!==null?i(t).m.push(n):u(()=>{const e=o(n);if(typeof e=="function")return e})}function f(n){t===null&&c(),a(()=>()=>o(n))}function i(n){var e=n.l;return e.u??(e.u={a:[],b:[],m:[]})}export{f as a,a as o}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.br b/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.br new file mode 100644 index 0000000000000000000000000000000000000000..41a14c43d56d278c6aba352ce9009d937a6ef22d GIT binary patch literal 224 zcmV<603ZJwb^#z{%emcUDlJcW&J`{)J9*BX66m2d9XzMo4mQ-QE$G=6MbUJ?AN3#! z-|tLWWFzVQI#;rQX}DeTwbQISEiJg!t~k@!EdIdTtu%N_+WYyI%B0y^*u(=q8b(aR zlfx(2{_FI*=_zYT`qUd_1f*wy z{;@DS0D+gqE4XRbgaxp}`4*QG;+F1gg%^(W4=EBz4wW}(r4 a8(bXo@zUH3^X4!9G)jzu*wGwOO=|`EKyL~F literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.gz b/apps/dashboard/build/_app/immutable/chunks/DeTA_5mp.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..18730fe4c50240b146a5736f3a2e0533a0747490 GIT binary patch literal 267 zcmV+m0rdVKiwFP!000026J?OWYQr!PMDP6y)dwSik?GY&%_)bTO3xt#Rap@w^2$i7 zq{jH)iyTq{J?st)!y6bkj3LrIFr8R#E=8#MDB>F|5*8c7P{|gjGkv{%UgSAdz0GLI z1!RV!nCTS5jUn9FHpUQnbs`#5*S6^joVd9A z1j-Q^EKhy*f1h5Fq_>jBLjuf_Ya)Rn+*q<)vUYSzWFY1=yv->Ebz1LYs-|n R(f39BmtVE;LTz^e001m6dcObw literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js deleted file mode 100644 index 5063e44..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js +++ /dev/null @@ -1 +0,0 @@ -import{k as t,l as S,m as h,q,S as T}from"./BBD-8XME.js";function k(r,i){return r===i||(r==null?void 0:r[T])===i}function A(r={},i,a,c){return t(()=>{var f,s;return S(()=>{f=s,s=[],h(()=>{r!==a(...s)&&(i(r,...s),f&&k(a(...f),r)&&i(null,...f))})}),()=>{q(()=>{s&&k(a(...s),r)&&i(null,...s)})}}),r}export{A as b}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br deleted file mode 100644 index 6dbfbe3..0000000 --- a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.br +++ /dev/null @@ -1,2 +0,0 @@ -7 ,o*̾XK*QIk8*oc}CK!4 -nhشۈU7խ׼F@ 3r6JAF͑Q-3,vaA߉ PYkV(Fئ~HyFI$hGD@Z6Hv4<FrZATN-z -: \ No newline at end of file diff --git a/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz b/apps/dashboard/build/_app/immutable/chunks/DtXypsxD.js.gz deleted file mode 100644 index bc7dfd2ffc66324c562b1a6d678a1fb325f2adba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmV<90381xiwFP!0000216@!%kHRnv-tSlB7^*}v;YLIi5C}%5GMt1MdO$?z3+xmj zmHc;-6m>Xx`0VdtSvJ+JLE9B9CuX4xkUyM)VzD- z$TU#;VY8mqih$Jq0GEEoZ>4fBr6iFg-1s|U4?0N-9tAA`y=Hj01tKAwFNpbjzlH`o d{kKzadpo-GGyZ8A9`fhXuQ%lvH#Il`0091RX1o9Z diff --git a/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js b/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js new file mode 100644 index 0000000..f470a9d --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js @@ -0,0 +1 @@ +import{R as J,b8 as ee}from"./nyjtQ1Ok.js";import{w as ae}from"./DAj0p1rI.js";import{c as ne,H as N,N as B,r as mt,i as _t,b as L,s as C,p as x,n as ft,f as $t,g as ut,a as X,d as it,S as Nt,P as re,e as oe,h as se,o as Dt,j as q,k as ie,l as qt,m as ce,q as le,t as Kt,u as Pt,v as fe}from"./urMNLRPv.js";class wt{constructor(a,e){this.status=a,typeof e=="string"?this.body={message:e}:e?this.body=e:this.body={message:`Error: ${a}`}}toString(){return JSON.stringify(this.body)}}class vt{constructor(a,e){this.status=a,this.location=e}}class yt extends Error{constructor(a,e,r){super(r),this.status=a,this.text=e}}const ue=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/;function he(t){const a=[];return{pattern:t==="/"?/^\/$/:new RegExp(`^${pe(t).map(r=>{const n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(n)return a.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return a.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const s=r.split(/\[(.+?)\](?!\])/);return"/"+s.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ct(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ct(String.fromCharCode(...c.slice(2).split("-").map(_=>parseInt(_,16))));const h=ue.exec(c),[,u,w,f,d]=h;return a.push({name:f,matcher:d,optional:!!u,rest:!!w,chained:w?l===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ct(c)}).join("")}).join("")}/?$`),params:a}}function de(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function pe(t){return t.slice(1).split("/").filter(de)}function ge(t,a,e){const r={},n=t.slice(1),o=n.filter(i=>i!==void 0);let s=0;for(let i=0;ih).join("/"),s=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||e[c.matcher](l)){r[c.name]=l;const h=a[i+1],u=n[i+1];h&&!h.rest&&h.optional&&u&&c.chained&&(s=0),!h&&!u&&Object.keys(r).length===o.length&&(s=0);continue}if(c.optional&&c.chained){s++;continue}return}if(!s)return r}function ct(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function me({nodes:t,server_loads:a,dictionary:e,matchers:r}){const n=new Set(a);return Object.entries(e).map(([i,[c,l,h]])=>{const{pattern:u,params:w}=he(i),f={id:i,exec:d=>{const _=u.exec(d);if(_)return ge(_,w,r)},errors:[1,...h||[]].map(d=>t[d]),layouts:[0,...l||[]].map(s),leaf:o(c)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function o(i){const c=i<0;return c&&(i=~i),[c,t[i]]}function s(i){return i===void 0?i:[n.has(i),t[i]]}}function Ft(t,a=JSON.parse){try{return a(sessionStorage[t])}catch{}}function It(t,a,e=JSON.stringify){const r=e(a);try{sessionStorage[t]=r}catch{}}function _e(t){return t.filter(a=>a!=null)}function Et(t){return t instanceof wt||t instanceof yt?t.status:500}function we(t){return t instanceof yt?t.text:"Internal Error"}const ve=new Set(["icon","shortcut icon","apple-touch-icon"]),I=Ft(Kt)??{},M=Ft(qt)??{},P={url:Pt({}),page:Pt({}),navigating:ae(null),updated:ne()};function bt(t){I[t]=C()}function ye(t,a){let e=t+1;for(;I[e];)delete I[e],e+=1;for(e=a+1;M[e];)delete M[e],e+=1}function V(t,a=!1){return a?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Bt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}function Tt(){}let kt,ht,Q,U,dt,b;const Z=[],tt=[];let v=null;function pt(){var t;(t=v==null?void 0:v.fork)==null||t.then(a=>a==null?void 0:a.discard()),v=null}const G=new Map,Mt=new Set,Ee=new Set,F=new Set;let m={branch:[],error:null,url:null},Vt=!1,et=!1,Ot=!0,H=!1,K=!1,Ht=!1,St=!1,Yt,E,R,O;const at=new Set,Ct=new Map;async function Fe(t,a,e){var o,s,i,c,l;(o=globalThis.__sveltekit_1ysfr3o)!=null&&o.data&&globalThis.__sveltekit_1ysfr3o.data,document.URL!==location.href&&(location.href=location.href),b=t,await((i=(s=t.hooks).init)==null?void 0:i.call(s)),kt=me(t),U=document.documentElement,dt=a,ht=t.nodes[0],Q=t.nodes[1],ht(),Q(),E=(c=history.state)==null?void 0:c[N],R=(l=history.state)==null?void 0:l[B],E||(E=R=Date.now(),history.replaceState({...history.state,[N]:E,[B]:R},""));const r=I[E];function n(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}e?(n(),await Ce(dt,e)):(await D({type:"enter",url:mt(b.hash?Ne(new URL(location.href)):location.href),replace_state:!0}),n()),Oe()}function be(){Z.length=0,St=!1}function zt(t){tt.some(a=>a==null?void 0:a.snapshot)&&(M[t]=tt.map(a=>{var e;return(e=a==null?void 0:a.snapshot)==null?void 0:e.capture()}))}function Wt(t){var a;(a=M[t])==null||a.forEach((e,r)=>{var n,o;(o=(n=tt[r])==null?void 0:n.snapshot)==null||o.restore(e)})}function jt(){bt(E),It(Kt,I),zt(R),It(qt,M)}async function Gt(t,a,e,r){let n;a.invalidateAll&&pt(),await D({type:"goto",url:mt(t),keepfocus:a.keepFocus,noscroll:a.noScroll,replace_state:a.replaceState,state:a.state,redirect_count:e,nav_token:r,accept:()=>{a.invalidateAll&&(St=!0,n=[...Ct.keys()]),a.invalidate&&a.invalidate.forEach(Te)}}),a.invalidateAll&&J().then(J).then(()=>{Ct.forEach(({resource:o},s)=>{var i;n!=null&&n.includes(s)&&((i=o.refresh)==null||i.call(o))})})}async function ke(t){if(t.id!==(v==null?void 0:v.id)){pt();const a={};at.add(a),v={id:t.id,token:a,promise:Xt({...t,preload:a}).then(e=>(at.delete(a),e.type==="loaded"&&e.state.error&&pt(),e)),fork:null}}return v.promise}async function lt(t){var e;const a=(e=await ot(t,!1))==null?void 0:e.route;a&&await Promise.all([...a.layouts,a.leaf].filter(Boolean).map(r=>r[1]()))}async function Jt(t,a,e){var n;m=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(x,t.props.page),Yt=new b.root({target:a,props:{...t.props,stores:P,components:tt},hydrate:e,sync:!1}),await Promise.resolve(),Wt(R),e){const o={from:null,to:{params:m.params,route:{id:((n=m.route)==null?void 0:n.id)??null},url:new URL(location.href),scroll:I[E]??C()},willUnload:!1,type:"enter",complete:Promise.resolve()};F.forEach(s=>s(o))}et=!0}function nt({url:t,params:a,branch:e,status:r,error:n,route:o,form:s}){let i="never";if(L&&(t.pathname===L||t.pathname===L+"/"))i="always";else for(const f of e)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=se(t.pathname,i),t.search=t.search;const c={type:"loaded",state:{url:t,params:a,branch:e,error:n,route:o},props:{constructors:_e(e).map(f=>f.node.component),page:At(x)}};s!==void 0&&(c.props.form=s);let l={},h=!x,u=0;for(let f=0;fi(new URL(s))))return!0;return!1}function xt(t,a){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?a??null:null}function xe(t,a){if(!t)return new Set(a.searchParams.keys());const e=new Set([...t.searchParams.keys(),...a.searchParams.keys()]);for(const r of e){const n=t.searchParams.getAll(r),o=a.searchParams.getAll(r);n.every(s=>o.includes(s))&&o.every(s=>n.includes(s))&&e.delete(r)}return e}function Le({error:t,url:a,route:e,params:r}){return{type:"loaded",state:{error:t,url:a,route:e,params:r,branch:[]},props:{page:At(x),constructors:[]}}}async function Xt({id:t,invalidating:a,url:e,params:r,route:n,preload:o}){if((v==null?void 0:v.id)===t)return at.delete(v.token),v.promise;const{errors:s,layouts:i,leaf:c}=n,l=[...i,c];s.forEach(g=>g==null?void 0:g().catch(()=>{})),l.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));const h=m.url?t!==rt(m.url):!1,u=m.route?n.id!==m.route.id:!1,w=xe(m.url,e);let f=!1;const d=l.map(async(g,p)=>{var A;if(!g)return;const y=m.branch[p];return g[1]===(y==null?void 0:y.loader)&&!Re(f,u,h,w,(A=y.universal)==null?void 0:A.uses,r)?y:(f=!0,Rt({loader:g[1],url:e,params:r,route:n,parent:async()=>{var z;const T={};for(let j=0;j{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:xt(o)}),i={node:await Q(),loader:Q,universal:null,server:null,data:null};return nt({url:e,params:n,branch:[s,i],status:t,error:a,route:null})}catch(s){if(s instanceof vt)return Gt(new URL(s.location,location.href),{},0);throw s}}async function Ae(t){const a=t.href;if(G.has(a))return G.get(a);let e;try{const r=(async()=>{let n=await b.hooks.reroute({url:new URL(t),fetch:async(o,s)=>Se(o,s,t).promise})??t;if(typeof n=="string"){const o=new URL(t);b.hash?o.hash=n:o.pathname=n,n=o}return n})();G.set(a,r),e=await r}catch{G.delete(a);return}return e}async function ot(t,a){if(t&&!_t(t,L,b.hash)){const e=await Ae(t);if(!e)return;const r=Pe(e);for(const n of kt){const o=n.exec(r);if(o)return{id:rt(t),invalidating:a,route:n,params:oe(o),url:t}}}}function Pe(t){return ie(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function rt(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Qt({url:t,type:a,intent:e,delta:r,event:n,scroll:o}){let s=!1;const i=Ut(m,e,t,a,o??null);r!==void 0&&(i.navigation.delta=r),n!==void 0&&(i.navigation.event=n);const c={...i.navigation,cancel:()=>{s=!0,i.reject(new Error("navigation cancelled"))}};return H||Mt.forEach(l=>l(c)),s?null:i}async function D({type:t,url:a,popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s={},redirect_count:i=0,nav_token:c={},accept:l=Tt,block:h=Tt,event:u}){var j;const w=O;O=c;const f=await ot(a,!1),d=t==="enter"?Ut(m,f,a,t):Qt({url:a,type:t,delta:e==null?void 0:e.delta,intent:f,scroll:e==null?void 0:e.scroll,event:u});if(!d){h(),O===c&&(O=w);return}const _=E,g=R;l(),H=!0,et&&d.navigation.type!=="enter"&&P.navigating.set(ft.current=d.navigation);let p=f&&await Xt(f);if(!p){if(_t(a,L,b.hash))return await V(a,o);p=await Zt(a,{id:null},await Y(new yt(404,"Not Found",`Not found: ${a.pathname}`),{url:a,params:{},route:{id:null}}),404,o)}if(a=(f==null?void 0:f.url)||a,O!==c)return d.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await D({type:t,url:new URL(p.location,a),popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s,redirect_count:i+1,nav_token:c}),d.fulfil(void 0);return}p=await Lt({status:500,error:await Y(new Error("Redirect loop"),{url:a,params:{},route:{id:null}}),url:a,route:{id:null}})}else p.props.page.status>=400&&await P.updated.check()&&(await Bt(),await V(a,o));if(be(),bt(_),zt(g),p.props.page.url.pathname!==a.pathname&&(a.pathname=p.props.page.url.pathname),s=e?e.state:s,!e){const k=o?0:1,W={[N]:E+=k,[B]:R+=k,[Nt]:s};(o?history.replaceState:history.pushState).call(history,W,"",a),o||ye(E,R)}const y=f&&(v==null?void 0:v.id)===f.id?v.fork:null;v=null,p.props.page.state=s;let S;if(et){const k=(await Promise.all(Array.from(Ee,$=>$(d.navigation)))).filter($=>typeof $=="function");if(k.length>0){let $=function(){k.forEach(st=>{F.delete(st)})};k.push($),k.forEach(st=>{F.add(st)})}m=p.state,p.props.page&&(p.props.page.url=a);const W=y&&await y;W?S=W.commit():(Yt.$set(p.props),fe(p.props.page),S=(j=ee)==null?void 0:j()),Ht=!0}else await Jt(p,dt,!1);const{activeElement:A}=document;await S,await J(),await J();let T=null;if(Ot){const k=e?e.scroll:n?C():null;k?scrollTo(k.x,k.y):(T=a.hash&&document.getElementById(te(a)))?T.scrollIntoView():scrollTo(0,0)}const z=document.activeElement!==A&&document.activeElement!==document.body;!r&&!z&&$e(a,!T),Ot=!0,p.props.page&&Object.assign(x,p.props.page),H=!1,t==="popstate"&&Wt(R),d.fulfil(void 0),d.navigation.to&&(d.navigation.to.scroll=C()),F.forEach(k=>k(d.navigation)),P.navigating.set(ft.current=null)}async function Zt(t,a,e,r,n){return t.origin===Dt&&t.pathname===location.pathname&&!Vt?await Lt({status:r,error:e,url:t,route:a}):await V(t,n)}function Ie(){let t,a={element:void 0,href:void 0},e;U.addEventListener("mousemove",i=>{const c=i.target;clearTimeout(t),t=setTimeout(()=>{o(c,q.hover)},20)});function r(i){i.defaultPrevented||o(i.composedPath()[0],q.tap)}U.addEventListener("mousedown",r),U.addEventListener("touchstart",r,{passive:!0});const n=new IntersectionObserver(i=>{for(const c of i)c.isIntersecting&&(lt(new URL(c.target.href)),n.unobserve(c.target))},{threshold:0});async function o(i,c){const l=$t(i,U),h=l===a.element&&(l==null?void 0:l.href)===a.href&&c>=e;if(!l||h)return;const{url:u,external:w,download:f}=ut(l,L,b.hash);if(w||f)return;const d=X(l),_=u&&rt(m.url)===rt(u);if(!(d.reload||_))if(c<=d.preload_data){a={element:l,href:l.href},e=q.tap;const g=await ot(u,!1);if(!g)return;ke(g)}else c<=d.preload_code&&(a={element:l,href:l.href},e=c,lt(u))}function s(){n.disconnect();for(const i of U.querySelectorAll("a")){const{url:c,external:l,download:h}=ut(i,L,b.hash);if(l||h)continue;const u=X(i);u.reload||(u.preload_code===q.viewport&&n.observe(i),u.preload_code===q.eager&<(c))}}F.add(s),s()}function Y(t,a){if(t instanceof wt)return t.body;const e=Et(t),r=we(t);return b.hooks.handleError({error:t,event:a,status:e,message:r})??{message:r}}function Be(t,a={}){return t=new URL(mt(t)),t.origin!==Dt?Promise.reject(new Error("goto: invalid URL")):Gt(t,a,0)}function Te(t){if(typeof t=="function")Z.push(t);else{const{href:a}=new URL(t,location.href);Z.push(e=>e.href===a)}}function Oe(){var a;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let r=!1;if(jt(),!H){const n=Ut(m,void 0,null,"leave"),o={...n.navigation,cancel:()=>{r=!0,n.reject(new Error("navigation cancelled"))}};Mt.forEach(s=>s(o))}r?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&jt()}),(a=navigator.connection)!=null&&a.saveData||Ie(),U.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const r=$t(e.composedPath()[0],U);if(!r)return;const{url:n,external:o,target:s,download:i}=ut(r,L,b.hash);if(!n)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=X(r);if(!(r instanceof SVGAElement)&&n.protocol!==location.protocol&&!(n.protocol==="https:"||n.protocol==="http:")||i)return;const[h,u]=(b.hash?n.hash.replace(/^#/,""):n.href).split("#"),w=h===it(location);if(o||c.reload&&(!w||!u)){Qt({url:n,type:"link",event:e})?H=!0:e.preventDefault();return}if(u!==void 0&&w){const[,f]=m.url.href.split("#");if(f===u){if(e.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const d=r.ownerDocument.getElementById(decodeURIComponent(u));d&&(d.scrollIntoView(),d.focus())}return}if(K=!0,bt(E),t(n),!c.replace_state)return;K=!1}e.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await D({type:"link",url:n,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??n.href===location.href,event:e})}),U.addEventListener("submit",e=>{if(e.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if(((n==null?void 0:n.formTarget)||r.target)==="_blank"||((n==null?void 0:n.formMethod)||r.method)!=="get")return;const i=new URL((n==null?void 0:n.hasAttribute("formaction"))&&(n==null?void 0:n.formAction)||r.action);if(_t(i,L,!1))return;const c=e.target,l=X(c);if(l.reload)return;e.preventDefault(),e.stopPropagation();const h=new FormData(c,n);i.search=new URLSearchParams(h).toString(),D({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var r;if(!gt){if((r=e.state)!=null&&r[N]){const n=e.state[N];if(O={},n===E)return;const o=I[n],s=e.state[Nt]??{},i=new URL(e.state[re]??location.href),c=e.state[B],l=m.url?it(location)===it(m.url):!1;if(c===R&&(Ht||l)){s!==x.state&&(x.state=s),t(i),I[E]=C(),o&&scrollTo(o.x,o.y),E=n;return}const u=n-E;await D({type:"popstate",url:i,popped:{state:s,scroll:o,delta:u},accept:()=>{E=n,R=c},block:()=>{history.go(-u)},nav_token:O,event:e})}else if(!K){const n=new URL(location.href);t(n),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{K&&(K=!1,history.replaceState({...history.state,[N]:++E,[B]:R},"",location.href))});for(const e of document.querySelectorAll("link"))ve.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&P.navigating.set(ft.current=null)});function t(e){m.url=x.url=e,P.page.set(At(x)),P.page.notify()}}async function Ce(t,{status:a=200,error:e,node_ids:r,params:n,route:o,server_route:s,data:i,form:c}){Vt=!0;const l=new URL(location.href);let h;({params:n={},route:o={id:null}}=await ot(l,!1)||{}),h=kt.find(({id:f})=>f===o.id);let u,w=!0;try{const f=r.map(async(_,g)=>{const p=i[g];return p!=null&&p.uses&&(p.uses=je(p.uses)),Rt({loader:b.nodes[_],url:l,params:n,route:o,parent:async()=>{const y={};for(let S=0;S{const i=history.state;gt=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(i,"",t),a&&scrollTo(o,s),gt=!1})}else{const o=document.body,s=o.getAttribute("tabindex");o.tabIndex=-1,o.focus({preventScroll:!0,focusVisible:!1}),s!==null?o.setAttribute("tabindex",s):o.removeAttribute("tabindex")}const n=getSelection();if(n&&n.type!=="None"){const o=[];for(let s=0;s{if(n.rangeCount===o.length){for(let s=0;s{o=u,s=w});return i.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((l=t.route)==null?void 0:l.id)??null},url:t.url,scroll:C()},to:e&&{params:(a==null?void 0:a.params)??null,route:{id:((h=a==null?void 0:a.route)==null?void 0:h.id)??null},url:e,scroll:n},willUnload:!a,type:r,complete:i},fulfil:o,reject:s}}function At(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ne(t){const a=new URL(t);return a.hash=decodeURIComponent(t.hash),a}function te(t){let a;if(b.hash){const[,,e]=t.hash.split("#",3);a=e??""}else a=t.hash.slice(1);return decodeURIComponent(a)}export{Fe as a,Be as g,P as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br b/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br new file mode 100644 index 0000000000000000000000000000000000000000..a1159bfbc54fb075489718e3b5aacdf911a217df GIT binary patch literal 7669 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

V(H& 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

sJeMXNb>J*CMZ!cl78c(BjF7IRmofNH-;|y|cIV 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

'),Nt=n('
'),St=n('

Use "Remind me..." in conversation to create intentions.

'),kt=n(' '),Ot=n(' '),$t=n('

'),zt=n('
'),Ct=n('

No predictions yet. Use Vestige more to train the predictive model.

'),It=n(" "),Pt=n(' '),Tt=n('

'),Ut=n('
'),Dt=n('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){gt(et,!0);let z=T(Q([])),j=T(Q([])),A=T(!0),N=T("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={critical:"text-decay",high:"text-amber-400",normal:"text-dim",low:"text-muted"},rt={time:"⏰",context:"◎",event:"⚡"};ut(async()=>{await B()});async function B(){$(A,!0);try{const[r,i]=await Promise.all([Z.intentions(t(N)),Z.predict()]);$(z,r.intentions||[],!0),$(j,i.predictions||[],!0)}catch{}finally{$(A,!1)}}async function it(r){$(N,r,!0),await B()}function F(r){if(!r)return"";try{return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return r}}var G=Dt(),L=s(G),H=d(s(L),2),dt=s(H);e(H),e(L);var M=d(L,2),Y=d(s(M),2);U(Y,20,()=>["active","fulfilled","snoozed","cancelled","all"],D,(r,i)=>{var v=wt(),a=s(v,!0);e(v),u(x=>{q(v,1,`px-3 py-1.5 rounded-xl text-xs transition ${t(N)===i?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),l(a,x)},[()=>i.charAt(0).toUpperCase()+i.slice(1)]),yt("click",v,()=>it(i)),o(r,v)}),e(Y);var lt=d(Y,2);{var vt=r=>{var i=Nt();U(i,20,()=>Array(4),D,(v,a)=>{var x=Rt();o(v,x)}),e(i),o(r,i)},ot=r=>{var i=St(),v=d(s(i),2),a=s(v);e(v),ht(2),e(i),u(()=>l(a,`No ${t(N)==="all"?"":t(N)+" "}intentions.`)),o(r,i)},nt=r=>{var i=zt();U(i,21,()=>t(z),D,(v,a)=>{var x=$t(),f=s(x),h=s(f),C=s(h,!0);e(h);var g=d(h,2),S=s(g),I=s(S,!0);e(S);var b=d(S,2),y=s(b),P=s(y,!0);e(y);var w=d(y,2),E=s(w);e(w);var k=d(w,2),c=s(k);e(k);var p=d(k,2);{var O=m=>{var _=kt(),W=s(_);e(_),u(X=>l(W,`deadline: ${X??""}`),[()=>F(t(a).deadline)]),o(m,_)};R(p,m=>{t(a).deadline&&m(O)})}var V=d(p,2);{var mt=m=>{var _=Ot(),W=s(_);e(_),u(X=>l(W,`snoozed until ${X??""}`),[()=>F(t(a).snoozed_until)]),o(m,_)};R(V,m=>{t(a).snoozed_until&&m(mt)})}e(b),e(g);var K=d(g,2),_t=s(K,!0);e(K),e(f),e(x),u((m,_)=>{l(C,rt[t(a).trigger_type]||"◇"),l(I,t(a).content),q(y,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[t(a).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),l(P,t(a).status),q(w,1,`text-[10px] ${(st[t(a).priority]||"text-muted")??""}`),l(E,`${t(a).priority??""} priority`),l(c,`${t(a).trigger_type??""}: ${m??""}`),l(_t,_)},[()=>t(a).trigger_value.length>40?t(a).trigger_value.slice(0,37)+"...":t(a).trigger_value,()=>F(t(a).created_at)]),o(v,x)}),e(i),o(r,i)};R(lt,r=>{t(A)?r(vt):t(z).length===0?r(ot,1):r(nt,!1)})}e(M);var J=d(M,2),pt=d(s(J),2);{var xt=r=>{var i=Ct();o(r,i)},ct=r=>{var i=Ut();U(i,21,()=>t(j),D,(v,a,x)=>{var f=Tt(),h=s(f);h.textContent=x+1;var C=d(h,2),g=s(C),S=s(g,!0);e(g);var I=d(g,2),b=s(I),y=s(b,!0);e(b);var P=d(b,2);{var w=c=>{var p=It(),O=s(p);e(p),u(V=>l(O,`${V??""}% retention`),[()=>(Number(t(a).retention)*100).toFixed(0)]),o(c,p)};R(P,c=>{t(a).retention&&c(w)})}var E=d(P,2);{var k=c=>{var p=Pt(),O=s(p);e(p),u(()=>l(O,`${t(a).predictedNeed??""} need`)),o(c,p)};R(E,c=>{t(a).predictedNeed&&c(k)})}e(I),e(C),e(f),u(()=>{l(S,t(a).content),l(y,t(a).nodeType)}),o(v,f)}),e(i),o(r,i)};R(pt,r=>{t(j).length===0?r(xt):r(ct,!1)})}e(J),e(G),u(()=>l(dt,`${t(z).length??""} intentions`)),o(tt,G),ft()}bt(["click"]);export{Wt as component}; +import"../chunks/Bzak7iHL.js";import{o as ut}from"../chunks/DeTA_5mp.js";import{p as gt,s as T,c as Q,t as u,a as ft,d,e as s,h as $,g as t,r as e,O as ht}from"../chunks/nyjtQ1Ok.js";import{d as bt,s as l,a as yt}from"../chunks/C4L78yoI.js";import{i as R}from"../chunks/B17metm1.js";import{e as U,i as D}from"../chunks/BilMa3tw.js";import{a as o,f as n}from"../chunks/B0IenmM-.js";import{s as q}from"../chunks/BgOFZ9jq.js";import{a as Z}from"../chunks/BcuCGYSa.js";var wt=n(""),Rt=n('
'),Nt=n('
'),Ot=n('

Use "Remind me..." in conversation to create intentions.

'),St=n(' '),kt=n(' '),$t=n('

'),zt=n('
'),Ct=n('

No predictions yet. Use Vestige more to train the predictive model.

'),It=n(" "),Pt=n(' '),Tt=n('

'),Ut=n('
'),Dt=n('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){gt(et,!0);let z=T(Q([])),j=T(Q([])),A=T(!0),N=T("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={critical:"text-decay",high:"text-amber-400",normal:"text-dim",low:"text-muted"},rt={time:"⏰",context:"◎",event:"⚡"};ut(async()=>{await B()});async function B(){$(A,!0);try{const[r,i]=await Promise.all([Z.intentions(t(N)),Z.predict()]);$(z,r.intentions||[],!0),$(j,i.predictions||[],!0)}catch{}finally{$(A,!1)}}async function it(r){$(N,r,!0),await B()}function F(r){if(!r)return"";try{return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return r}}var L=Dt(),G=s(L),H=d(s(G),2),dt=s(H);e(H),e(G);var M=d(G,2),Y=d(s(M),2);U(Y,20,()=>["active","fulfilled","snoozed","cancelled","all"],D,(r,i)=>{var v=wt(),a=s(v,!0);e(v),u(x=>{q(v,1,`px-3 py-1.5 rounded-xl text-xs transition ${t(N)===i?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),l(a,x)},[()=>i.charAt(0).toUpperCase()+i.slice(1)]),yt("click",v,()=>it(i)),o(r,v)}),e(Y);var lt=d(Y,2);{var vt=r=>{var i=Nt();U(i,20,()=>Array(4),D,(v,a)=>{var x=Rt();o(v,x)}),e(i),o(r,i)},ot=r=>{var i=Ot(),v=d(s(i),2),a=s(v);e(v),ht(2),e(i),u(()=>l(a,`No ${t(N)==="all"?"":t(N)+" "}intentions.`)),o(r,i)},nt=r=>{var i=zt();U(i,21,()=>t(z),D,(v,a)=>{var x=$t(),f=s(x),h=s(f),C=s(h,!0);e(h);var g=d(h,2),O=s(g),I=s(O,!0);e(O);var b=d(O,2),y=s(b),P=s(y,!0);e(y);var w=d(y,2),E=s(w);e(w);var S=d(w,2),c=s(S);e(S);var p=d(S,2);{var k=m=>{var _=St(),W=s(_);e(_),u(X=>l(W,`deadline: ${X??""}`),[()=>F(t(a).deadline)]),o(m,_)};R(p,m=>{t(a).deadline&&m(k)})}var V=d(p,2);{var mt=m=>{var _=kt(),W=s(_);e(_),u(X=>l(W,`snoozed until ${X??""}`),[()=>F(t(a).snoozed_until)]),o(m,_)};R(V,m=>{t(a).snoozed_until&&m(mt)})}e(b),e(g);var K=d(g,2),_t=s(K,!0);e(K),e(f),e(x),u((m,_)=>{l(C,rt[t(a).trigger_type]||"◇"),l(I,t(a).content),q(y,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[t(a).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),l(P,t(a).status),q(w,1,`text-[10px] ${(st[t(a).priority]||"text-muted")??""}`),l(E,`${t(a).priority??""} priority`),l(c,`${t(a).trigger_type??""}: ${m??""}`),l(_t,_)},[()=>t(a).trigger_value.length>40?t(a).trigger_value.slice(0,37)+"...":t(a).trigger_value,()=>F(t(a).created_at)]),o(v,x)}),e(i),o(r,i)};R(lt,r=>{t(A)?r(vt):t(z).length===0?r(ot,1):r(nt,!1)})}e(M);var J=d(M,2),pt=d(s(J),2);{var xt=r=>{var i=Ct();o(r,i)},ct=r=>{var i=Ut();U(i,21,()=>t(j),D,(v,a,x)=>{var f=Tt(),h=s(f);h.textContent=x+1;var C=d(h,2),g=s(C),O=s(g,!0);e(g);var I=d(g,2),b=s(I),y=s(b,!0);e(b);var P=d(b,2);{var w=c=>{var p=It(),k=s(p);e(p),u(V=>l(k,`${V??""}% retention`),[()=>(Number(t(a).retention)*100).toFixed(0)]),o(c,p)};R(P,c=>{t(a).retention&&c(w)})}var E=d(P,2);{var S=c=>{var p=Pt(),k=s(p);e(p),u(()=>l(k,`${t(a).predictedNeed??""} need`)),o(c,p)};R(E,c=>{t(a).predictedNeed&&c(S)})}e(I),e(C),e(f),u(()=>{l(O,t(a).content),l(y,t(a).nodeType)}),o(v,f)}),e(i),o(r,i)};R(pt,r=>{t(j).length===0?r(xt):r(ct,!1)})}e(J),e(L),u(()=>l(dt,`${t(z).length??""} intentions`)),o(tt,L),ft()}bt(["click"]);export{Wt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br b/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br new file mode 100644 index 0000000000000000000000000000000000000000..584d9376fddb964d3fca31257d34717e8e1cb1eb GIT binary patch literal 2196 zcmV;F2y6En_!l6Y18&O<&wgKXT^)s@LWoQ#6dKfYDoZd6>jgDcQmRyy>KNHk+brJa3!teV1GF&G4B(MWHG|G=Ve$ zfBU~>PO^W}i;l;bREIK=C-eXOo0qv(vqxWAO{+VTzDH?YMFvYykvtp8zJNX$2yUJ`w@WGYi5bFN7 z&&TWJvj_rbmP7nYj%r8iL^zoxZu-}T%h7i)Y9U~Ig4_P%;o{FuTz?nAg0H{BP4y4E zufZ34hptH&xjDTB|UT*l8&% z!yq$+%&Q?x^7QV9G4Y8=?@g&hu-LzjBp8zd&jhj-e%JK;ww>3uk3W%C$lz-cO(JF% zi4fbqM?tvuoTN^7_f41Ca`5+8@La=n#Pv`kin8f2_!fjO)QN;H%ig=K!m1@PA|-%t zc)ktm`2 z%GXnJ6c1u96x7siK~vfvnGrsMzsXj-fk_-p8=Q}HNk5kiRM+&4K8r0wPfC`%%qcW& z@SQBi7I$8$W9)%PL*}IwKk&KaezcPdcRN5ige6aR_T(Rn(9}fuz08`n-Kl-Lw|pLeJ@ zBfDCR3J$IobUvn;l1ev@p4^Kqtj%%$l}1hnC!p+ z!<~Fp(S8?|{+3Wm6AtXYnkTzIopX9iHF|qA6+C)Bjav$l+cpOBA|P|y|C*bO&$|-V z7}t}55?z-j=>7C1OWD$$4mIa&&)RIp`k#CpepAgaQci8B0nuU0wQ37NXk_^p(7f!l zh@DgPG;F_qW*4+|GS4h8)$NGgl^3O%wJ7R76IY5jRF{s@IR3`SY5Mqtu46P}dd?0C-{KA<-&5P_(|E1^BA6 z2O5YXrw0tf&0P^EfRP;ga~#T+hsR?(IB(I7Ata}C0drA+CFYfLAc;AejzkXsx1ZNvSnIP3eTJUi zbj})UvG5h&oi~r}=H&+IiRfth2TBQY+DY>PUMt4sg>*&)0hoUap4`_Iv6#)TuAEII zI(K3C5GSj{ooMJ#se8^kIXm%PuolssxA-fHPD=Lz$M+;PmZ%gu%!f zHw<8dGU#}~>`g=lJi^F`!XE()u8M_gXlbo-S;NO-8&^(D>ohoSdXPO~*k;JO; zG(=~`rNA=XP^BZcvb^WT7rz|NLTo&Ty(1pBdZx@Xds{&>T#M;mLfxz;gNS@Qr0C83 zzr1_Om8TTo$Q0dAXZEC&C=#BOV$GM4qM~DBf`J%21Z5WtnEtnwl18Xu8Pvz>e_0*o zv0AsgZXv~wTYiKtuJiR=xx=5URqz}Y^eV5?gTC;TiyQ~KttLSs4W>(7^|JK9`Ib=%v$h&VyfSUROi*@Xslr{YtCz=X WrF}u*;^EX;)g7nTYE)Z?JJu&vnL$nf literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz b/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..7959a81a1d4a1f66096f8a5ba1bea6752927174e GIT binary patch literal 2501 zcmV;$2|D&4iwFP!000026SY`Na~ru4zUNoKD8&oJ7>bnSM?`@tTYhO*ueD@*ZIwy} zXFv|5c^Lp7Bbw*ECC9DGE%zMqoBT^sjTsJyq!g3>?px4~Jiw zbq<(-L(j5+NjNhsgu@!^!@)8Q2g#1%5U%W&YPJhho!?>IRNQ%6f1}Rt%c^GKmkpx`AW= zbp_c!e*O8cS6^3Le_lcQgS|JOPK84bg+?RG6M}cT18dWygLc--Gfde#So&!vP($QL z!WfQ2uk{4=;oLKWu8kzp=^zPY;Ef|B5)}(8y=)K}i90*%ff{yxqU>nJjmd;Bz1-WV zp^jHjR*tRb%fw2JvfOKJAa^HFG48D3w#E^PyWS>BGvOLvoEG7jOe6~%p0}FW_@azNOA&khC>>#72Usw@zK5yfyI{4plE2K`x~o=;3G793 zjFgqJ@r)JPqQ1zy%|*<}dxk>qS>+?@qi)|Dh04nH^Jb&Db%APb%Bo!rj8(mScIlW$ zeFyYRs8w?9HC+%zjg}~REflN78v$miY$h(8!9P5!>~ciT$4HCJ#j^p`1;M$5%@T)h zyS#7K(ar<+SMZ-j@na9SB*6Kr`}v8on|t-m-jDj`*?()B&D-1NUsc;Ir5$&UQj}>K zDBp=5<aPSS?h7Y$z-E5EcU&EjG%2F@F}yfGInEkv+)>r{1lYk52G6P=n&7A*2;d7{g;s#$A}bDGE~b8ybZ&L7z}4vP>oh z-yKmUm{wh#4{n2I)_a1wsSc#}?CiwkiO7sxZ#B{XJ2|e7GC)UC2Iiib`4|d|@^pY= z=QEKqK#3gNrGz|K5`MckNStQSM@y__($Y!a5^33kCT&O3q8oljekJD@l(MV&>2rQY z9yBRC;%5X4S4m9UewrAIgyoas)^-_hk-B26bo=#GE+u!fiCJ$D^;8teptRP~7saS5 z&T3}m4Y2Y>;>(&ZetU|cOMHxzKxSXEVc463)6w##v5Ls z`pRM!t7Ks1{Kj+^PPwI?PT_OofWNeavNzn21Ipg=fEeR_WJERmQ0V8DG@-WdvrOte zVI-lCRKrBdm!w56D9bIuex&?s%!V$L$`VB>ONnMfI)xH^DoPMp9zeoryGWSjy3C#8 zN0vZ2)T|uOwH7(qqLAbv6SE|b`8xonWC%RLw<>m0bjs4Y!(%AM(A8QwS-8TKRS7NG zD2)dMwu8XG9HsNTyAtnWybafnFv8Q?2ig}p-!!RjdQ(Nwa#2`vvl_t~Fzazc#*~HJ zkRD}w+>o#oO;{wW&jS(y?_+LApR#>!$Z-idE+AbVkYj-4+>kD1C)|*{gyaQe!~>E8 zT-0{jwE_ZwvHBl{9a z5x|S%Hd>qfw!4d+n4E}S6H5eb%m5&ml*H_kPTTKD#=!dm;NioVT+=CaJ^q0QB&)c@ zwnpaqZZc)dqCsL+bQhr#bm>5gtUk}n+syVVh}8sB{7e&E3R|eaSCiDT z7Twk)vF@P^ayl%O^fM30At))cZgBlfEAfx(V`i_IfyDsw>nrb92GG@P0I~6G1oikC zbWbsR+F=7~wO5FZj~}%hmA%>c>2pK&$|+PzyVU*uO!r-G$bLD6N=UbWobZ5js~ASy zFBxQf9~fM7Lo$G8&>|n8f3KnVA6$w5jI=CA?yPyq(EwiVii%XL^e?TZdq%xhV;PWU zQ6QgXt|TYSpS5#k@$jKfMzbmNiU;JRB6(UPd9q5fcvxK5bXpMXVp*0KZ2dX~^>*OK${E#QK-<=Fjj{L%da@27E=CNi

U~e`4<2H(iP*0 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br b/apps/dashboard/build/_app/immutable/nodes/7.UPq6Ja2I.js.br deleted file mode 100644 index bc143fd52ee07eba89fe52990d84f0bd153d2f3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2199 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 tTR^A>L7H_1y~3Ha;H>qR{{ZA&kE%No- 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js b/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js similarity index 89% rename from apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js rename to apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js index 47f865c..2521bcd 100644 --- a/apps/dashboard/build/_app/immutable/nodes/8.B2QXJFjO.js +++ b/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js @@ -1,4 +1,4 @@ -import"../chunks/Bzak7iHL.js";import{o as qe}from"../chunks/DUC-ssvh.js";import{p as Be,s as b,c as Qe,t as E,g as e,a as Ye,d as t,e as s,h as u,r as a}from"../chunks/BBD-8XME.js";import{d as ze,a as p,s as v}from"../chunks/DNn3Nckx.js";import{i as ce}from"../chunks/RaRNNC-y.js";import{e as Z,i as ue}from"../chunks/C5a--lgk.js";import{a as _,f as g}from"../chunks/CKcqngaU.js";import{r as xe}from"../chunks/BVZqxpRe.js";import{s as Ge}from"../chunks/CBWLjDtu.js";import{s as _e}from"../chunks/DBfx-YTU.js";import{b as fe}from"../chunks/BxfT1SOA.js";import{b as He}from"../chunks/C-QujEl6.js";import{a as f}from"../chunks/BcuCGYSa.js";import{N as Ie}from"../chunks/CZ45jJaw.js";var Je=g('

'),Ke=g('
'),Ue=g(' '),Ve=g('

Promote Demote Delete
'),We=g(''),Xe=g('
'),Ze=g(`
diff --git a/crates/vestige-core/Cargo.toml b/crates/vestige-core/Cargo.toml index 193ad84..212cde6 100644 --- a/crates/vestige-core/Cargo.toml +++ b/crates/vestige-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vestige-core" -version = "2.0.4" +version = "2.0.5" edition = "2024" rust-version = "1.91" authors = ["Vestige Team"] diff --git a/crates/vestige-core/benches/search_bench.rs b/crates/vestige-core/benches/search_bench.rs index b27f286..c10ef9d 100644 --- a/crates/vestige-core/benches/search_bench.rs +++ b/crates/vestige-core/benches/search_bench.rs @@ -3,10 +3,10 @@ //! Benchmarks for core search operations using Criterion. //! Run with: cargo bench -p vestige-core -use criterion::{criterion_group, criterion_main, Criterion, black_box}; -use vestige_core::search::hyde::{classify_intent, expand_query, centroid_embedding}; -use vestige_core::search::{reciprocal_rank_fusion, linear_combination, sanitize_fts5_query}; +use criterion::{Criterion, black_box, criterion_group, criterion_main}; use vestige_core::embeddings::cosine_similarity; +use vestige_core::search::hyde::{centroid_embedding, classify_intent, expand_query}; +use vestige_core::search::{linear_combination, reciprocal_rank_fusion, sanitize_fts5_query}; fn bench_classify_intent(c: &mut Criterion) { let queries = [ @@ -29,7 +29,9 @@ fn bench_classify_intent(c: &mut Criterion) { fn bench_expand_query(c: &mut Criterion) { c.bench_function("expand_query", |b| { b.iter(|| { - black_box(expand_query("What is spaced repetition and how does FSRS work?")); + black_box(expand_query( + "What is spaced repetition and how does FSRS work?", + )); }) }); } @@ -37,11 +39,7 @@ fn bench_expand_query(c: &mut Criterion) { fn bench_centroid_embedding(c: &mut Criterion) { // Simulate 4 embeddings of 256 dimensions let embeddings: Vec> = (0..4) - .map(|i| { - (0..256) - .map(|j| ((i * 256 + j) as f32).sin()) - .collect() - }) + .map(|i| (0..256).map(|j| ((i * 256 + j) as f32).sin()).collect()) .collect(); c.bench_function("centroid_256d_4vecs", |b| { @@ -61,7 +59,11 @@ fn bench_rrf_fusion(c: &mut Criterion) { c.bench_function("rrf_50x50", |b| { b.iter(|| { - black_box(reciprocal_rank_fusion(&keyword_results, &semantic_results, 60.0)); + black_box(reciprocal_rank_fusion( + &keyword_results, + &semantic_results, + 60.0, + )); }) }); } @@ -76,7 +78,12 @@ fn bench_linear_combination(c: &mut Criterion) { c.bench_function("linear_combo_50x50", |b| { b.iter(|| { - black_box(linear_combination(&keyword_results, &semantic_results, 0.3, 0.7)); + black_box(linear_combination( + &keyword_results, + &semantic_results, + 0.3, + 0.7, + )); }) }); } @@ -84,7 +91,9 @@ fn bench_linear_combination(c: &mut Criterion) { fn bench_sanitize_fts5(c: &mut Criterion) { c.bench_function("sanitize_fts5_query", |b| { b.iter(|| { - black_box(sanitize_fts5_query("hello world \"exact phrase\" OR special-chars!@#")); + black_box(sanitize_fts5_query( + "hello world \"exact phrase\" OR special-chars!@#", + )); }) }); } diff --git a/crates/vestige-core/src/advanced/adaptive_embedding.rs b/crates/vestige-core/src/advanced/adaptive_embedding.rs index d4b39d3..001c191 100644 --- a/crates/vestige-core/src/advanced/adaptive_embedding.rs +++ b/crates/vestige-core/src/advanced/adaptive_embedding.rs @@ -766,6 +766,6 @@ fn main() -> Result<(), std::io::Error> { embedder.embed_auto("Another text sample."); let stats = embedder.stats(); - assert!(stats.len() > 0); + assert!(!stats.is_empty()); } } diff --git a/crates/vestige-core/src/advanced/chains.rs b/crates/vestige-core/src/advanced/chains.rs index 9d6e59a..8df1fff 100644 --- a/crates/vestige-core/src/advanced/chains.rs +++ b/crates/vestige-core/src/advanced/chains.rs @@ -300,7 +300,11 @@ impl MemoryChainBuilder { } // Sort by score (descending) - all_paths.sort_by(|a, b| b.score.partial_cmp(&a.score).unwrap_or(std::cmp::Ordering::Equal)); + all_paths.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); // Return top paths all_paths.into_iter().take(10).collect() diff --git a/crates/vestige-core/src/advanced/compression.rs b/crates/vestige-core/src/advanced/compression.rs index 0a53664..d5358b4 100644 --- a/crates/vestige-core/src/advanced/compression.rs +++ b/crates/vestige-core/src/advanced/compression.rs @@ -445,7 +445,11 @@ impl MemoryCompressor { } // Sort by importance and deduplicate - facts.sort_by(|a, b| b.importance.partial_cmp(&a.importance).unwrap_or(std::cmp::Ordering::Equal)); + facts.sort_by(|a, b| { + b.importance + .partial_cmp(&a.importance) + .unwrap_or(std::cmp::Ordering::Equal) + }); self.deduplicate_facts(facts) } diff --git a/crates/vestige-core/src/advanced/cross_project.rs b/crates/vestige-core/src/advanced/cross_project.rs index 126463c..f48b964 100644 --- a/crates/vestige-core/src/advanced/cross_project.rs +++ b/crates/vestige-core/src/advanced/cross_project.rs @@ -432,10 +432,11 @@ impl CrossProjectLearner { // Check each trigger for trigger in &pattern.pattern.triggers { if let Some((matches, reason)) = self.check_trigger(trigger, context) - && matches { - match_scores.push(trigger.confidence); - match_reasons.push(reason); - } + && matches + { + match_scores.push(trigger.confidence); + match_reasons.push(reason); + } } if match_scores.is_empty() { @@ -547,10 +548,11 @@ impl CrossProjectLearner { let success_rate = success_count as f64 / total_count as f64; if let Ok(mut patterns) = self.patterns.write() - && let Some(pattern) = patterns.get_mut(pattern_id) { - pattern.success_rate = success_rate; - pattern.application_count = total_count as u32; - } + && let Some(pattern) = patterns.get_mut(pattern_id) + { + pattern.success_rate = success_rate; + pattern.application_count = total_count as u32; + } } fn extract_patterns_from_category( @@ -595,38 +597,39 @@ impl CrossProjectLearner { let pattern_id = format!("auto-{}-{}", category_to_string(&category), keyword); if let Ok(mut patterns) = self.patterns.write() - && !patterns.contains_key(&pattern_id) { - patterns.insert( - pattern_id.clone(), - UniversalPattern { - id: pattern_id, - pattern: CodePattern { - name: format!("{} pattern", keyword), - category: category.clone(), - description: format!( - "Pattern involving '{}' observed in {} projects", - keyword, - projects.len() - ), - example: None, - triggers: vec![PatternTrigger { - trigger_type: TriggerType::Topic, - value: keyword.clone(), - confidence: 0.5, - }], - benefits: vec![], - considerations: vec![], - }, - projects_seen_in: projects.iter().map(|s| s.to_string()).collect(), - success_rate: 0.5, // Default until validated - applicability: format!("When working with {}", keyword), - confidence: 0.5, - first_seen: Utc::now(), - last_seen: Utc::now(), - application_count: 0, + && !patterns.contains_key(&pattern_id) + { + patterns.insert( + pattern_id.clone(), + UniversalPattern { + id: pattern_id, + pattern: CodePattern { + name: format!("{} pattern", keyword), + category: category.clone(), + description: format!( + "Pattern involving '{}' observed in {} projects", + keyword, + projects.len() + ), + example: None, + triggers: vec![PatternTrigger { + trigger_type: TriggerType::Topic, + value: keyword.clone(), + confidence: 0.5, + }], + benefits: vec![], + considerations: vec![], }, - ); - } + projects_seen_in: projects.iter().map(|s| s.to_string()).collect(), + success_rate: 0.5, // Default until validated + applicability: format!("When working with {}", keyword), + confidence: 0.5, + first_seen: Utc::now(), + last_seen: Utc::now(), + application_count: 0, + }, + ); + } } } } diff --git a/crates/vestige-core/src/advanced/dreams.rs b/crates/vestige-core/src/advanced/dreams.rs index a4ddac5..d01d8e2 100644 --- a/crates/vestige-core/src/advanced/dreams.rs +++ b/crates/vestige-core/src/advanced/dreams.rs @@ -455,9 +455,10 @@ impl ConsolidationScheduler { // Strengthen connections between sequentially replayed memories for window in replay.sequence.windows(2) { if let [id_a, id_b] = window - && graph.strengthen_connection(id_a, id_b, 0.1) { - strengthened += 1; - } + && graph.strengthen_connection(id_a, id_b, 0.1) + { + strengthened += 1; + } } // Also strengthen based on discovered patterns @@ -704,11 +705,12 @@ impl ConnectionGraph { for (a, b) in [(from_id, to_id), (to_id, from_id)] { if let Some(connections) = self.connections.get_mut(a) - && let Some(conn) = connections.iter_mut().find(|c| c.target_id == b) { - conn.strength = (conn.strength + boost).min(2.0); - conn.last_strengthened = now; - strengthened = true; - } + && let Some(conn) = connections.iter_mut().find(|c| c.target_id == b) + { + conn.strength = (conn.strength + boost).min(2.0); + conn.last_strengthened = now; + strengthened = true; + } } strengthened @@ -1481,9 +1483,10 @@ impl MemoryDreamer { // Try to generate insight from this cluster if let Some(insight) = self.generate_insight_from_cluster(&cluster_memories) - && insight.novelty_score >= self.config.min_novelty { - insights.push(insight); - } + && insight.novelty_score >= self.config.min_novelty + { + insights.push(insight); + } if insights.len() >= self.config.max_insights { break; diff --git a/crates/vestige-core/src/advanced/importance.rs b/crates/vestige-core/src/advanced/importance.rs index 3579626..6c06376 100644 --- a/crates/vestige-core/src/advanced/importance.rs +++ b/crates/vestige-core/src/advanced/importance.rs @@ -232,9 +232,10 @@ impl ImportanceTracker { // Store context with event if let Ok(mut events) = self.recent_events.write() && let Some(event) = events.last_mut() - && event.memory_id == memory_id { - event.context = Some(context.to_string()); - } + && event.memory_id == memory_id + { + event.context = Some(context.to_string()); + } } /// Apply importance decay to all memories @@ -339,7 +340,11 @@ impl ImportanceTracker { /// Get memories sorted by importance pub fn get_top_by_importance(&self, limit: usize) -> Vec { let mut scores = self.get_all_scores(); - scores.sort_by(|a, b| b.final_score.partial_cmp(&a.final_score).unwrap_or(std::cmp::Ordering::Equal)); + scores.sort_by(|a, b| { + b.final_score + .partial_cmp(&a.final_score) + .unwrap_or(std::cmp::Ordering::Equal) + }); scores.truncate(limit); scores } @@ -355,7 +360,9 @@ impl ImportanceTracker { scores.sort_by(|a, b| { let a_neglect = a.base_importance - a.usage_importance; let b_neglect = b.base_importance - b.usage_importance; - b_neglect.partial_cmp(&a_neglect).unwrap_or(std::cmp::Ordering::Equal) + b_neglect + .partial_cmp(&a_neglect) + .unwrap_or(std::cmp::Ordering::Equal) }); scores.truncate(limit); @@ -446,7 +453,10 @@ mod tests { assert_eq!(score.retrieval_count, 3); assert_eq!(score.helpful_count, 3); // 0.1 * 1.15^3 = ~0.152, so should be > initial 0.1 - assert!(score.usage_importance > 0.1, "Should be boosted from baseline"); + assert!( + score.usage_importance > 0.1, + "Should be boosted from baseline" + ); } #[test] diff --git a/crates/vestige-core/src/advanced/intent.rs b/crates/vestige-core/src/advanced/intent.rs index 61cfacc..a59cb2e 100644 --- a/crates/vestige-core/src/advanced/intent.rs +++ b/crates/vestige-core/src/advanced/intent.rs @@ -562,9 +562,10 @@ impl IntentDetector { } ActionType::FileOpened | ActionType::FileEdited => { if let Some(file) = &action.file - && let Some(name) = file.file_name() { - suspected_area = name.to_string_lossy().to_string(); - } + && let Some(name) = file.file_name() + { + suspected_area = name.to_string_lossy().to_string(); + } } _ => {} } diff --git a/crates/vestige-core/src/advanced/mod.rs b/crates/vestige-core/src/advanced/mod.rs index d74d46f..fdbdfe4 100644 --- a/crates/vestige-core/src/advanced/mod.rs +++ b/crates/vestige-core/src/advanced/mod.rs @@ -29,7 +29,10 @@ pub mod speculative; // Re-exports for convenient access pub use adaptive_embedding::{AdaptiveEmbedder, ContentType, EmbeddingStrategy, Language}; -pub use chains::{ChainStep, Connection, ConnectionType, MemoryChainBuilder, MemoryNode, MemoryPath, ReasoningChain}; +pub use chains::{ + ChainStep, Connection, ConnectionType, MemoryChainBuilder, MemoryNode, MemoryPath, + ReasoningChain, +}; pub use compression::{CompressedMemory, CompressionConfig, CompressionStats, MemoryCompressor}; pub use cross_project::{ ApplicableKnowledge, CrossProjectLearner, ProjectContext, UniversalPattern, @@ -58,14 +61,14 @@ pub use dreams::{ }; pub use importance::{ImportanceDecayConfig, ImportanceScore, ImportanceTracker, UsageEvent}; pub use intent::{ActionType, DetectedIntent, IntentDetector, MaintenanceType, UserAction}; -pub use reconsolidation::{ - AccessContext, AccessTrigger, AppliedModification, ChangeSummary, LabileState, MemorySnapshot, - Modification, ReconsolidatedMemory, ReconsolidationManager, ReconsolidationStats, - RelationshipType, RetrievalRecord, -}; pub use prediction_error::{ CandidateMemory, CreateReason, EvaluationIntent, GateDecision, GateStats, MergeStrategy, PredictionErrorConfig, PredictionErrorGate, SimilarityResult, SupersedeReason, UpdateType, cosine_similarity, }; +pub use reconsolidation::{ + AccessContext, AccessTrigger, AppliedModification, ChangeSummary, LabileState, MemorySnapshot, + Modification, ReconsolidatedMemory, ReconsolidationManager, ReconsolidationStats, + RelationshipType, RetrievalRecord, +}; pub use speculative::{PredictedMemory, PredictionContext, SpeculativeRetriever, UsagePattern}; diff --git a/crates/vestige-core/src/advanced/prediction_error.rs b/crates/vestige-core/src/advanced/prediction_error.rs index d458fd1..3693d77 100644 --- a/crates/vestige-core/src/advanced/prediction_error.rs +++ b/crates/vestige-core/src/advanced/prediction_error.rs @@ -123,9 +123,15 @@ impl GateDecision { /// Get the prediction error score pub fn prediction_error(&self) -> f32 { match self { - Self::Create { prediction_error, .. } => *prediction_error, - Self::Update { prediction_error, .. } => *prediction_error, - Self::Supersede { prediction_error, .. } => *prediction_error, + Self::Create { + prediction_error, .. + } => *prediction_error, + Self::Update { + prediction_error, .. + } => *prediction_error, + Self::Supersede { + prediction_error, .. + } => *prediction_error, Self::Merge { avg_similarity, .. } => 1.0 - avg_similarity, } } @@ -368,7 +374,11 @@ impl PredictionErrorGate { .collect(); // Sort by similarity (highest first) - similarities.sort_by(|a, b| b.similarity.partial_cmp(&a.similarity).unwrap_or(std::cmp::Ordering::Equal)); + similarities.sort_by(|a, b| { + b.similarity + .partial_cmp(&a.similarity) + .unwrap_or(std::cmp::Ordering::Equal) + }); // Take top candidates let top_candidates: Vec<_> = similarities @@ -394,8 +404,9 @@ impl PredictionErrorGate { if let Some(c) = candidate { // If similar and the existing memory was demoted, supersede it if best.similarity >= self.config.similarity_threshold - && c.was_demoted - && self.config.auto_supersede_demoted { + && c.was_demoted + && self.config.auto_supersede_demoted + { self.stats.supersedes += 1; return GateDecision::Supersede { old_memory_id: c.id.clone(), @@ -406,8 +417,8 @@ impl PredictionErrorGate { } // Check for correction (similar but contradictory) - if best.similarity >= self.config.correction_threshold - && best.appears_contradictory { + if best.similarity >= self.config.correction_threshold && best.appears_contradictory + { self.stats.supersedes += 1; return GateDecision::Supersede { old_memory_id: c.id.clone(), @@ -418,7 +429,8 @@ impl PredictionErrorGate { } // Regular update for similar content - if best.similarity >= self.config.similarity_threshold && self.config.prefer_updates { + if best.similarity >= self.config.similarity_threshold && self.config.prefer_updates + { self.stats.updates += 1; return GateDecision::Update { target_id: best.memory_id.clone(), @@ -442,7 +454,10 @@ impl PredictionErrorGate { self.stats.merges += 1; return GateDecision::Merge { - memory_ids: merge_candidates.iter().map(|s| s.memory_id.clone()).collect(), + memory_ids: merge_candidates + .iter() + .map(|s| s.memory_id.clone()) + .collect(), avg_similarity, strategy: MergeStrategy::Combine, }; @@ -501,7 +516,10 @@ impl PredictionErrorGate { self.evaluate(new_content, new_embedding, candidates) } } - EvaluationIntent::Supersede { old_memory_id, reason } => { + EvaluationIntent::Supersede { + old_memory_id, + reason, + } => { if let Some(c) = candidates.iter().find(|c| c.id == old_memory_id) { let similarity = cosine_similarity(new_embedding, &c.embedding); self.stats.supersedes += 1; @@ -515,9 +533,7 @@ impl PredictionErrorGate { self.evaluate(new_content, new_embedding, candidates) } } - EvaluationIntent::Auto => { - self.evaluate(new_content, new_embedding, candidates) - } + EvaluationIntent::Auto => self.evaluate(new_content, new_embedding, candidates), } } @@ -596,7 +612,10 @@ pub enum EvaluationIntent { /// Force update of specific memory ForceUpdate { target_id: String }, /// Force supersede of specific memory - Supersede { old_memory_id: String, reason: SupersedeReason }, + Supersede { + old_memory_id: String, + reason: SupersedeReason, + }, } // ============================================================================ @@ -680,18 +699,22 @@ mod tests { // Create embeddings with controlled similarity based on seed // Seeds close to each other = similar vectors // Seeds far apart = different vectors - (0..384).map(|i| { - let base = (i as f32 / 384.0) * std::f32::consts::PI * 2.0; - (base * seed).sin() - }).collect() + (0..384) + .map(|i| { + let base = (i as f32 / 384.0) * std::f32::consts::PI * 2.0; + (base * seed).sin() + }) + .collect() } fn make_orthogonal_embedding() -> Vec { // Create an embedding that's orthogonal to seed=1.0 - (0..384).map(|i| { - let base = (i as f32 / 384.0) * std::f32::consts::PI * 2.0; - (base + std::f32::consts::PI / 2.0).sin() // 90 degree phase shift - }).collect() + (0..384) + .map(|i| { + let base = (i as f32 / 384.0) * std::f32::consts::PI * 2.0; + (base + std::f32::consts::PI / 2.0).sin() // 90 degree phase shift + }) + .collect() } fn make_candidate(id: &str, seed: f32) -> CandidateMemory { @@ -728,7 +751,13 @@ mod tests { let decision = gate.evaluate("New content", &embedding, &[]); - assert!(matches!(decision, GateDecision::Create { reason: CreateReason::FirstMemory, .. })); + assert!(matches!( + decision, + GateDecision::Create { + reason: CreateReason::FirstMemory, + .. + } + )); } #[test] @@ -762,7 +791,10 @@ mod tests { // Should supersede the demoted memory if similarity is above threshold // If not superseding, it should at least update - assert!(matches!(decision, GateDecision::Supersede { .. } | GateDecision::Update { .. })); + assert!(matches!( + decision, + GateDecision::Supersede { .. } | GateDecision::Update { .. } + )); } #[test] @@ -812,7 +844,13 @@ mod tests { EvaluationIntent::ForceCreate, ); - assert!(matches!(decision, GateDecision::Create { reason: CreateReason::ExplicitCreate, .. })); + assert!(matches!( + decision, + GateDecision::Create { + reason: CreateReason::ExplicitCreate, + .. + } + )); } #[test] @@ -825,7 +863,9 @@ mod tests { "Updated content", &embedding, &[candidate], - EvaluationIntent::ForceUpdate { target_id: "mem-1".to_string() }, + EvaluationIntent::ForceUpdate { + target_id: "mem-1".to_string(), + }, ); assert!(matches!(decision, GateDecision::Update { .. })); diff --git a/crates/vestige-core/src/advanced/reconsolidation.rs b/crates/vestige-core/src/advanced/reconsolidation.rs index 7b201e2..83bc39e 100644 --- a/crates/vestige-core/src/advanced/reconsolidation.rs +++ b/crates/vestige-core/src/advanced/reconsolidation.rs @@ -517,13 +517,14 @@ impl ReconsolidationManager { } if let Some(state) = self.labile_memories.get_mut(memory_id) - && state.is_within_window(self.labile_window) { - let success = state.add_modification(modification); - if success { - self.stats.total_modifications += 1; - } - return success; + && state.is_within_window(self.labile_window) + { + let success = state.add_modification(modification); + if success { + self.stats.total_modifications += 1; } + return success; + } false } @@ -690,13 +691,14 @@ impl ReconsolidationManager { if let Ok(history) = self.retrieval_history.read() { for record in history.iter() { if record.memory_id == memory_id - && let Some(context) = &record.context { - for co_id in &context.co_retrieved { - if co_id != memory_id { - *co_retrieved.entry(co_id.clone()).or_insert(0) += 1; - } + && let Some(context) = &record.context + { + for co_id in &context.co_retrieved { + if co_id != memory_id { + *co_retrieved.entry(co_id.clone()).or_insert(0) += 1; } } + } } } @@ -921,7 +923,7 @@ mod tests { #[test] fn test_relationship_types() { - let relationships = vec![ + let relationships = [ RelationshipType::Supports, RelationshipType::Contradicts, RelationshipType::Elaborates, diff --git a/crates/vestige-core/src/advanced/speculative.rs b/crates/vestige-core/src/advanced/speculative.rs index 7b9442e..eebe947 100644 --- a/crates/vestige-core/src/advanced/speculative.rs +++ b/crates/vestige-core/src/advanced/speculative.rs @@ -193,7 +193,11 @@ impl SpeculativeRetriever { // Deduplicate and sort by confidence predictions = self.deduplicate_predictions(predictions); - predictions.sort_by(|a, b| b.confidence.partial_cmp(&a.confidence).unwrap_or(std::cmp::Ordering::Equal)); + predictions.sort_by(|a, b| { + b.confidence + .partial_cmp(&a.confidence) + .unwrap_or(std::cmp::Ordering::Equal) + }); predictions.truncate(MAX_PREDICTIONS); // Filter by minimum confidence @@ -266,11 +270,12 @@ impl SpeculativeRetriever { // Update file-memory associations if let Some(file) = file_context - && let Ok(mut map) = self.file_memory_map.write() { - map.entry(file.to_string()) - .or_insert_with(Vec::new) - .push(memory_id.to_string()); - } + && let Ok(mut map) = self.file_memory_map.write() + { + map.entry(file.to_string()) + .or_insert_with(Vec::new) + .push(memory_id.to_string()); + } } /// Get cached predictions diff --git a/crates/vestige-core/src/codebase/context.rs b/crates/vestige-core/src/codebase/context.rs index a8ff103..170d556 100644 --- a/crates/vestige-core/src/codebase/context.rs +++ b/crates/vestige-core/src/codebase/context.rs @@ -587,9 +587,10 @@ impl ContextCapture { // Java Spring if let Ok(content) = fs::read_to_string(self.project_root.join("pom.xml")) - && content.contains("spring") { - frameworks.push(Framework::Spring); - } + && content.contains("spring") + { + frameworks.push(Framework::Spring); + } // Ruby Rails if self.file_exists("config/routes.rb") { @@ -613,36 +614,40 @@ impl ContextCapture { fn detect_project_name(&self) -> Result> { // Try Cargo.toml if let Ok(content) = fs::read_to_string(self.project_root.join("Cargo.toml")) - && let Some(name) = self.extract_toml_value(&content, "name") { - return Ok(Some(name)); - } + && let Some(name) = self.extract_toml_value(&content, "name") + { + return Ok(Some(name)); + } // Try package.json if let Ok(content) = fs::read_to_string(self.project_root.join("package.json")) - && let Some(name) = self.extract_json_value(&content, "name") { - return Ok(Some(name)); - } + && let Some(name) = self.extract_json_value(&content, "name") + { + return Ok(Some(name)); + } // Try pyproject.toml if let Ok(content) = fs::read_to_string(self.project_root.join("pyproject.toml")) - && let Some(name) = self.extract_toml_value(&content, "name") { - return Ok(Some(name)); - } + && let Some(name) = self.extract_toml_value(&content, "name") + { + return Ok(Some(name)); + } // Try go.mod if let Ok(content) = fs::read_to_string(self.project_root.join("go.mod")) && let Some(line) = content.lines().next() - && line.starts_with("module ") { - let name = line - .trim_start_matches("module ") - .split('/') - .next_back() - .unwrap_or("") - .to_string(); - if !name.is_empty() { - return Ok(Some(name)); - } - } + && line.starts_with("module ") + { + let name = line + .trim_start_matches("module ") + .split('/') + .next_back() + .unwrap_or("") + .to_string(); + if !name.is_empty() { + return Ok(Some(name)); + } + } // Fall back to directory name Ok(self @@ -729,17 +734,18 @@ impl ContextCapture { for test_dir in test_dirs { let test_path = self.project_root.join(test_dir); if test_path.exists() - && let Ok(entries) = fs::read_dir(&test_path) { - for entry in entries.filter_map(|e| e.ok()) { - let entry_path = entry.path(); - if let Some(entry_stem) = entry_path.file_stem() { - let entry_stem = entry_stem.to_string_lossy(); - if entry_stem.contains(&stem) { - related.push(entry_path); - } + && let Ok(entries) = fs::read_dir(&test_path) + { + for entry in entries.filter_map(|e| e.ok()) { + let entry_path = entry.path(); + if let Some(entry_stem) = entry_path.file_stem() { + let entry_stem = entry_stem.to_string_lossy(); + if entry_stem.contains(&stem) { + related.push(entry_path); } } } + } } // For Rust, look for mod.rs in same directory @@ -794,38 +800,40 @@ impl ContextCapture { // For Rust, use the parent directory name relative to src/ if path.extension().map(|e| e == "rs").unwrap_or(false) && let Ok(relative) = path.strip_prefix(&self.project_root) - && let Ok(src_relative) = relative.strip_prefix("src") { - // Get the module path - let components: Vec<_> = src_relative - .parent()? - .components() - .map(|c| c.as_os_str().to_string_lossy().to_string()) - .collect(); + && let Ok(src_relative) = relative.strip_prefix("src") + { + // Get the module path + let components: Vec<_> = src_relative + .parent()? + .components() + .map(|c| c.as_os_str().to_string_lossy().to_string()) + .collect(); - if !components.is_empty() { - return Some(components.join("::")); - } - } + if !components.is_empty() { + return Some(components.join("::")); + } + } // For TypeScript/JavaScript, use the parent directory if path .extension() .map(|e| e == "ts" || e == "tsx" || e == "js" || e == "jsx") .unwrap_or(false) - && let Ok(relative) = path.strip_prefix(&self.project_root) { - // Skip src/ or lib/ prefix - let relative = relative - .strip_prefix("src") - .or_else(|_| relative.strip_prefix("lib")) - .unwrap_or(relative); + && let Ok(relative) = path.strip_prefix(&self.project_root) + { + // Skip src/ or lib/ prefix + let relative = relative + .strip_prefix("src") + .or_else(|_| relative.strip_prefix("lib")) + .unwrap_or(relative); - if let Some(parent) = relative.parent() { - let module = parent.to_string_lossy().replace('/', "."); - if !module.is_empty() { - return Some(module); - } + if let Some(parent) = relative.parent() { + let module = parent.to_string_lossy().replace('/', "."); + if !module.is_empty() { + return Some(module); } } + } None } @@ -865,10 +873,11 @@ impl ContextCapture { let trimmed = line.trim(); if (trimmed.starts_with(&format!("{} ", key)) || trimmed.starts_with(&format!("{}=", key))) - && let Some(value) = trimmed.split('=').nth(1) { - let value = value.trim().trim_matches('"').trim_matches('\''); - return Some(value.to_string()); - } + && let Some(value) = trimmed.split('=').nth(1) + { + let value = value.trim().trim_matches('"').trim_matches('\''); + return Some(value.to_string()); + } } None } diff --git a/crates/vestige-core/src/codebase/git.rs b/crates/vestige-core/src/codebase/git.rs index 2b7e21d..ea4fdae 100644 --- a/crates/vestige-core/src/codebase/git.rs +++ b/crates/vestige-core/src/codebase/git.rs @@ -275,9 +275,10 @@ impl GitAnalyzer { files.push(path.to_path_buf()); } if let Some(path) = delta.old_file().path() - && !files.contains(&path.to_path_buf()) { - files.push(path.to_path_buf()); - } + && !files.contains(&path.to_path_buf()) + { + files.push(path.to_path_buf()); + } } } @@ -408,7 +409,11 @@ impl GitAnalyzer { } // Sort by strength - relationships.sort_by(|a, b| b.strength.partial_cmp(&a.strength).unwrap_or(std::cmp::Ordering::Equal)); + relationships.sort_by(|a, b| { + b.strength + .partial_cmp(&a.strength) + .unwrap_or(std::cmp::Ordering::Equal) + }); Ok(relationships) } @@ -492,9 +497,10 @@ impl GitAnalyzer { .unwrap_or_else(Utc::now); if let Some(since_time) = since - && commit_time < since_time { - continue; - } + && commit_time < since_time + { + continue; + } let message = commit.message().map(|m| m.to_string()).unwrap_or_default(); @@ -541,7 +547,12 @@ impl GitAnalyzer { let symptom = if let Some(colon_byte_pos) = first_line.find(':') { // Convert byte position to char position for safe slicing let colon_char_pos = first_line[..colon_byte_pos].chars().count(); - first_line.chars().skip(colon_char_pos + 1).collect::().trim().to_string() + first_line + .chars() + .skip(colon_char_pos + 1) + .collect::() + .trim() + .to_string() } else { first_line.to_string() }; diff --git a/crates/vestige-core/src/codebase/patterns.rs b/crates/vestige-core/src/codebase/patterns.rs index ae9e972..e6835b0 100644 --- a/crates/vestige-core/src/codebase/patterns.rs +++ b/crates/vestige-core/src/codebase/patterns.rs @@ -210,18 +210,23 @@ impl PatternDetector { for pattern in relevant_patterns { if let Some(confidence) = self.calculate_match_confidence(code, &code_lower, pattern) - && confidence >= 0.3 { - matches.push(PatternMatch { - pattern: pattern.clone(), - confidence, - location: None, // Would need line-level analysis - suggestions: self.generate_suggestions(pattern, code), - }); - } + && confidence >= 0.3 + { + matches.push(PatternMatch { + pattern: pattern.clone(), + confidence, + location: None, // Would need line-level analysis + suggestions: self.generate_suggestions(pattern, code), + }); + } } // Sort by confidence - matches.sort_by(|a, b| b.confidence.partial_cmp(&a.confidence).unwrap_or(std::cmp::Ordering::Equal)); + matches.sort_by(|a, b| { + b.confidence + .partial_cmp(&a.confidence) + .unwrap_or(std::cmp::Ordering::Equal) + }); Ok(matches) } @@ -325,7 +330,11 @@ impl PatternDetector { } // Sort by relevance - suggestions.sort_by(|a, b| b.relevance.partial_cmp(&a.relevance).unwrap_or(std::cmp::Ordering::Equal)); + suggestions.sort_by(|a, b| { + b.relevance + .partial_cmp(&a.relevance) + .unwrap_or(std::cmp::Ordering::Equal) + }); Ok(suggestions) } diff --git a/crates/vestige-core/src/codebase/relationships.rs b/crates/vestige-core/src/codebase/relationships.rs index 8430756..b2a8644 100644 --- a/crates/vestige-core/src/codebase/relationships.rs +++ b/crates/vestige-core/src/codebase/relationships.rs @@ -630,9 +630,7 @@ mod tests { let related = tracker.get_related_files(Path::new("src/main.rs")).unwrap(); assert!(!related.is_empty()); - assert!(related - .iter() - .any(|r| r.path == PathBuf::from("src/lib.rs"))); + assert!(related.iter().any(|r| r.path == Path::new("src/lib.rs"))); } #[test] diff --git a/crates/vestige-core/src/codebase/types.rs b/crates/vestige-core/src/codebase/types.rs index 802ad29..4abbff1 100644 --- a/crates/vestige-core/src/codebase/types.rs +++ b/crates/vestige-core/src/codebase/types.rs @@ -221,7 +221,6 @@ pub enum DecisionStatus { Deprecated, } - // ============================================================================ // BUG FIX // ============================================================================ @@ -273,7 +272,6 @@ pub enum BugSeverity { Trivial, } - // ============================================================================ // CODE PATTERN // ============================================================================ diff --git a/crates/vestige-core/src/codebase/watcher.rs b/crates/vestige-core/src/codebase/watcher.rs index 187bb72..c69ad81 100644 --- a/crates/vestige-core/src/codebase/watcher.rs +++ b/crates/vestige-core/src/codebase/watcher.rs @@ -10,13 +10,13 @@ use std::collections::HashSet; use std::path::{Path, PathBuf}; -use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; +use std::sync::atomic::{AtomicBool, Ordering}; use std::time::Duration; use chrono::{DateTime, Utc}; use notify::{Config, Event, EventKind, RecommendedWatcher, RecursiveMode, Watcher}; -use tokio::sync::{broadcast, mpsc, RwLock}; +use tokio::sync::{RwLock, broadcast, mpsc}; use super::patterns::PatternDetector; use super::relationships::RelationshipTracker; @@ -576,11 +576,12 @@ impl ManualEventHandler { // Detect patterns if self.config.detect_patterns - && let Ok(content) = std::fs::read_to_string(path) { - let language = CodebaseWatcher::detect_language(path); - let detector = self.detector.read().await; - let _ = detector.detect_patterns(&content, &language); - } + && let Ok(content) = std::fs::read_to_string(path) + { + let language = CodebaseWatcher::detect_language(path); + let detector = self.detector.read().await; + let _ = detector.detect_patterns(&content, &language); + } Ok(()) } diff --git a/crates/vestige-core/src/consolidation/mod.rs b/crates/vestige-core/src/consolidation/mod.rs index dbae9b2..8a7aa94 100644 --- a/crates/vestige-core/src/consolidation/mod.rs +++ b/crates/vestige-core/src/consolidation/mod.rs @@ -7,12 +7,11 @@ //! - Prune very weak memories (optional) //! - 4-Phase biologically-accurate dream cycle (v2.0) -mod sleep; pub mod phases; +mod sleep; -pub use sleep::SleepConsolidation; pub use phases::{ - DreamEngine, DreamPhase, FourPhaseDreamResult, PhaseResult, - TriagedMemory, TriageCategory, CreativeConnection, CreativeConnectionType, - DreamInsight, + CreativeConnection, CreativeConnectionType, DreamEngine, DreamInsight, DreamPhase, + FourPhaseDreamResult, PhaseResult, TriageCategory, TriagedMemory, }; +pub use sleep::SleepConsolidation; diff --git a/crates/vestige-core/src/consolidation/phases.rs b/crates/vestige-core/src/consolidation/phases.rs index bc50e56..abf6019 100644 --- a/crates/vestige-core/src/consolidation/phases.rs +++ b/crates/vestige-core/src/consolidation/phases.rs @@ -18,7 +18,7 @@ use std::time::Instant; use chrono::{DateTime, Utc}; use crate::memory::KnowledgeNode; -use crate::neuroscience::emotional_memory::{EmotionalMemory, EmotionCategory}; +use crate::neuroscience::emotional_memory::{EmotionCategory, EmotionalMemory}; use crate::neuroscience::importance_signals::ImportanceSignals; use crate::neuroscience::synaptic_tagging::SynapticTaggingSystem; @@ -197,13 +197,11 @@ impl DreamEngine { phases.push(phase2); // ==================== PHASE 3: REM (Creative) ==================== - let (connections, emotional_processed, phase3) = - self.phase_rem(&triaged, emotional_memory); + let (connections, emotional_processed, phase3) = self.phase_rem(&triaged, emotional_memory); phases.push(phase3); // ==================== PHASE 4: Integration ==================== - let (insights, phase4) = - self.phase_integration(&connections, &triaged); + let (insights, phase4) = self.phase_integration(&connections, &triaged); phases.push(phase4); FourPhaseDreamResult { @@ -262,26 +260,31 @@ impl DreamEngine { } // Sort by importance (highest first) - triaged.sort_by(|a, b| b.importance.partial_cmp(&a.importance).unwrap_or(std::cmp::Ordering::Equal)); + triaged.sort_by(|a, b| { + b.importance + .partial_cmp(&a.importance) + .unwrap_or(std::cmp::Ordering::Equal) + }); // Build replay queue: 70% high-value, 30% random noise floor let high_value_count = (triaged.len() as f64 * self.high_value_ratio).ceil() as usize; let random_count = triaged.len().saturating_sub(high_value_count); - let mut replay_queue: Vec = triaged.iter() + let mut replay_queue: Vec = triaged + .iter() .take(high_value_count) .map(|m| m.id.clone()) .collect(); // Add random noise floor from the remaining memories if random_count > 0 { - let remaining: Vec<&TriagedMemory> = triaged.iter() - .skip(high_value_count) - .collect(); + let remaining: Vec<&TriagedMemory> = triaged.iter().skip(high_value_count).collect(); // Simple deterministic shuffle using content hash let mut noise: Vec<&TriagedMemory> = remaining; noise.sort_by_key(|m| { - let hash: u64 = m.id.bytes().fold(0u64, |acc, b| acc.wrapping_mul(31).wrapping_add(b as u64)); + let hash: u64 = + m.id.bytes() + .fold(0u64, |acc, b| acc.wrapping_mul(31).wrapping_add(b as u64)); hash }); for m in noise.iter().take(random_count) { @@ -307,7 +310,9 @@ impl DreamEngine { actions.push(format!( "Replay queue: {} high-value + {} noise = {} total", high_value_count.min(triaged.len()), - replay_queue.len().saturating_sub(high_value_count.min(triaged.len())), + replay_queue + .len() + .saturating_sub(high_value_count.min(triaged.len())), replay_queue.len() )); @@ -333,16 +338,25 @@ impl DreamEngine { emotion: &EmotionCategory, ) -> TriageCategory { // High emotional content - if matches!(emotion, EmotionCategory::Frustration | EmotionCategory::Urgency | EmotionCategory::Joy | EmotionCategory::Surprise) - && node.sentiment_magnitude > 0.4 { - return TriageCategory::Emotional; - } + if matches!( + emotion, + EmotionCategory::Frustration + | EmotionCategory::Urgency + | EmotionCategory::Joy + | EmotionCategory::Surprise + ) && node.sentiment_magnitude > 0.4 + { + return TriageCategory::Emotional; + } // Future-relevant (intentions, TODOs) let content_lower = node.content.to_lowercase(); - if content_lower.contains("todo") || content_lower.contains("remind") - || content_lower.contains("intention") || content_lower.contains("next time") - || content_lower.contains("plan to") { + if content_lower.contains("todo") + || content_lower.contains("remind") + || content_lower.contains("intention") + || content_lower.contains("next time") + || content_lower.contains("plan to") + { return TriageCategory::FutureRelevant; } @@ -403,7 +417,8 @@ impl DreamEngine { actions.push(format!( "Processed {} waves of {} memories", - wave_count, replay_queue.len() + wave_count, + replay_queue.len() )); actions.push(format!( "Strengthened {} memories via synaptic tagging", @@ -459,7 +474,11 @@ impl DreamEngine { // Group memories by primary tag for cross-domain pairing let mut tag_groups: HashMap> = HashMap::new(); for tm in triaged { - let primary_tag = tm.tags.first().cloned().unwrap_or_else(|| "untagged".to_string()); + let primary_tag = tm + .tags + .first() + .cloned() + .unwrap_or_else(|| "untagged".to_string()); tag_groups.entry(primary_tag).or_default().push(tm); } @@ -487,7 +506,11 @@ impl DreamEngine { if similarity > self.min_insight_confidence { let conn_type = self.classify_connection(mem_a, mem_b, similarity); let insight = self.generate_connection_insight( - mem_a, mem_b, &tag_keys[i], &tag_keys[j], conn_type, + mem_a, + mem_b, + &tag_keys[i], + &tag_keys[j], + conn_type, ); connections.push(CreativeConnection { @@ -531,7 +554,10 @@ impl DreamEngine { // Pattern extraction: find repeated patterns across memories let pattern_count = self.extract_patterns(triaged, &mut connections); if pattern_count > 0 { - actions.push(format!("Pattern extraction: {} shared patterns found", pattern_count)); + actions.push(format!( + "Pattern extraction: {} shared patterns found", + pattern_count + )); } let phase = PhaseResult { @@ -545,11 +571,13 @@ impl DreamEngine { } fn content_similarity(&self, a: &str, b: &str) -> f64 { - let words_a: HashSet<&str> = a.split_whitespace() + let words_a: HashSet<&str> = a + .split_whitespace() .map(|w| w.trim_matches(|c: char| !c.is_alphanumeric())) .filter(|w| w.len() > 3) .collect(); - let words_b: HashSet<&str> = b.split_whitespace() + let words_b: HashSet<&str> = b + .split_whitespace() .map(|w| w.trim_matches(|c: char| !c.is_alphanumeric())) .filter(|w| w.len() > 3) .collect(); @@ -598,8 +626,16 @@ impl DreamEngine { tag_b: &str, conn_type: CreativeConnectionType, ) -> String { - let a_summary = if a.content.len() > 60 { &a.content[..60] } else { &a.content }; - let b_summary = if b.content.len() > 60 { &b.content[..60] } else { &b.content }; + let a_summary = if a.content.len() > 60 { + &a.content[..60] + } else { + &a.content + }; + let b_summary = if b.content.len() > 60 { + &b.content[..60] + } else { + &b.content + }; match conn_type { CreativeConnectionType::CrossDomain => { @@ -638,7 +674,9 @@ impl DreamEngine { let mut bigram_index: HashMap<(String, String), Vec> = HashMap::new(); for (idx, tm) in triaged.iter().enumerate() { - let words: Vec = tm.content.split_whitespace() + let words: Vec = tm + .content + .split_whitespace() .map(|w| w.to_lowercase()) .filter(|w| w.len() > 3) .collect(); @@ -656,18 +694,21 @@ impl DreamEngine { pattern_count += 1; // Create a connection between the first and last memory sharing this pattern if let (Some(&first), Some(&last)) = (indices.first(), indices.last()) - && first != last { - connections.push(CreativeConnection { - memory_a_id: triaged[first].id.clone(), - memory_b_id: triaged[last].id.clone(), - insight: format!( - "Shared pattern '{} {}' found across {} memories", - bigram.0, bigram.1, indices.len() - ), - confidence: (indices.len() as f64 / triaged.len() as f64).min(1.0), - connection_type: CreativeConnectionType::CrossDomain, - }); - } + && first != last + { + connections.push(CreativeConnection { + memory_a_id: triaged[first].id.clone(), + memory_b_id: triaged[last].id.clone(), + insight: format!( + "Shared pattern '{} {}' found across {} memories", + bigram.0, + bigram.1, + indices.len() + ), + confidence: (indices.len() as f64 / triaged.len() as f64).min(1.0), + connection_type: CreativeConnectionType::CrossDomain, + }); + } } } @@ -692,7 +733,8 @@ impl DreamEngine { let mut actions = Vec::new(); // Validate connections: keep only those above threshold - let valid_connections: Vec<&CreativeConnection> = connections.iter() + let valid_connections: Vec<&CreativeConnection> = connections + .iter() .filter(|c| c.confidence >= self.validation_threshold) .collect(); @@ -739,7 +781,9 @@ impl DreamEngine { insights.sort_by(|a, b| { let score_a = a.confidence * a.novelty; let score_b = b.confidence * b.novelty; - score_b.partial_cmp(&score_a).unwrap_or(std::cmp::Ordering::Equal) + score_b + .partial_cmp(&score_a) + .unwrap_or(std::cmp::Ordering::Equal) }); // Cap at 20 insights @@ -753,7 +797,10 @@ impl DreamEngine { } else { triaged.iter().map(|m| m.retention_strength).sum::() / triaged.len() as f64 }; - actions.push(format!("Average retention across dreamed memories: {:.2}", avg_retention)); + actions.push(format!( + "Average retention across dreamed memories: {:.2}", + avg_retention + )); let phase = PhaseResult { phase: DreamPhase::Integration, @@ -840,6 +887,8 @@ mod tests { temporal_level: None, has_embedding: None, embedding_model: None, + suppression_count: 0, + suppressed_at: None, } } @@ -863,13 +912,15 @@ mod tests { let importance = ImportanceSignals::new(); let mut synaptic = SynapticTaggingSystem::new(); - let memories: Vec = (0..10).map(|i| { - make_test_node( - &format!("mem-{}", i), - &format!("Test memory content for dream cycle number {}", i), - &["test"], - ) - }).collect(); + let memories: Vec = (0..10) + .map(|i| { + make_test_node( + &format!("mem-{}", i), + &format!("Test memory content for dream cycle number {}", i), + &["test"], + ) + }) + .collect(); let result = engine.run(&memories, &mut emotional, &importance, &mut synaptic); @@ -890,7 +941,11 @@ mod tests { let memories = vec![ make_emotional_node("emo-1", "Critical production crash error panic!", 0.9), - make_test_node("future-1", "TODO: remind me to add caching next time", &["planning"]), + make_test_node( + "future-1", + "TODO: remind me to add caching next time", + &["planning"], + ), make_test_node("standard-1", "The function returns a string", &["docs"]), ]; @@ -915,13 +970,15 @@ mod tests { let mut emotional = EmotionalMemory::new(); let importance = ImportanceSignals::new(); - let memories: Vec = (0..20).map(|i| { - make_test_node( - &format!("mem-{}", i), - &format!("Memory with varying importance content {}", i), - &["test"], - ) - }).collect(); + let memories: Vec = (0..20) + .map(|i| { + make_test_node( + &format!("mem-{}", i), + &format!("Memory with varying importance content {}", i), + &["test"], + ) + }) + .collect(); let (_triaged, queue, _phase) = engine.phase_nrem1(&memories, &mut emotional, &importance); @@ -934,8 +991,8 @@ mod tests { let engine = DreamEngine::new(); let mut synaptic = SynapticTaggingSystem::new(); - let triaged: Vec = (0..10).map(|i| { - TriagedMemory { + let triaged: Vec = (0..10) + .map(|i| TriagedMemory { id: format!("mem-{}", i), content: format!("Test memory {}", i), importance: 0.5, @@ -945,8 +1002,8 @@ mod tests { retention_strength: 0.7, emotional_valence: 0.0, is_flashbulb: false, - } - }).collect(); + }) + .collect(); let replay_queue: Vec = triaged.iter().map(|m| m.id.clone()).collect(); @@ -1031,7 +1088,10 @@ mod tests { assert_eq!(phase.phase, DreamPhase::Rem); // Should find connection via shared "error handling" and "pattern" words - assert!(!connections.is_empty(), "Should find cross-domain error handling pattern"); + assert!( + !connections.is_empty(), + "Should find cross-domain error handling pattern" + ); } #[test] @@ -1039,23 +1099,25 @@ mod tests { let engine = DreamEngine::new(); let mut emotional = EmotionalMemory::new(); - let triaged = vec![ - TriagedMemory { - id: "angry-1".to_string(), - content: "Critical production error crashed the entire system".to_string(), - importance: 0.8, - category: TriageCategory::Emotional, - tags: vec!["incident".to_string()], - created_at: Utc::now(), - retention_strength: 0.9, - emotional_valence: -0.8, - is_flashbulb: false, - }, - ]; + let triaged = vec![TriagedMemory { + id: "angry-1".to_string(), + content: "Critical production error crashed the entire system".to_string(), + importance: 0.8, + category: TriageCategory::Emotional, + tags: vec!["incident".to_string()], + created_at: Utc::now(), + retention_strength: 0.9, + emotional_valence: -0.8, + is_flashbulb: false, + }]; - let (_connections, emotional_processed, _phase) = engine.phase_rem(&triaged, &mut emotional); + let (_connections, emotional_processed, _phase) = + engine.phase_rem(&triaged, &mut emotional); - assert_eq!(emotional_processed, 1, "Negative emotional memory should be processed"); + assert_eq!( + emotional_processed, 1, + "Negative emotional memory should be processed" + ); } #[test] @@ -1120,7 +1182,11 @@ mod tests { "error handling with Result type pattern", "error handling with try-catch pattern", ); - assert!(sim > 0.2, "Similar content should have >0.2 Jaccard: {}", sim); + assert!( + sim > 0.2, + "Similar content should have >0.2 Jaccard: {}", + sim + ); let dissim = engine.content_similarity( "Rust memory management with ownership", @@ -1151,16 +1217,19 @@ mod tests { let importance = ImportanceSignals::new(); let mut synaptic = SynapticTaggingSystem::new(); - let memories: Vec = (0..5).map(|i| { - make_test_node(&format!("m{}", i), &format!("Content {}", i), &["test"]) - }).collect(); + let memories: Vec = (0..5) + .map(|i| make_test_node(&format!("m{}", i), &format!("Content {}", i), &["test"])) + .collect(); let result = engine.run(&memories, &mut emotional, &importance, &mut synaptic); for phase in &result.phases { // Duration should be non-negative (might be 0ms for fast operations) assert!(phase.duration_ms < 10000); - assert!(!phase.actions.is_empty(), "Each phase should report actions"); + assert!( + !phase.actions.is_empty(), + "Each phase should report actions" + ); } } @@ -1170,7 +1239,11 @@ mod tests { let mut emotional = EmotionalMemory::new(); let importance = ImportanceSignals::new(); - let mut node = make_test_node("flash-1", "CRITICAL: Production server crash! Emergency rollback needed immediately!", &["incident"]); + let mut node = make_test_node( + "flash-1", + "CRITICAL: Production server crash! Emergency rollback needed immediately!", + &["incident"], + ); node.sentiment_magnitude = 0.9; let (triaged, _queue, phase) = engine.phase_nrem1(&[node], &mut emotional, &importance); diff --git a/crates/vestige-core/src/embeddings/mod.rs b/crates/vestige-core/src/embeddings/mod.rs index 29eb300..5d89c10 100644 --- a/crates/vestige-core/src/embeddings/mod.rs +++ b/crates/vestige-core/src/embeddings/mod.rs @@ -15,8 +15,8 @@ mod local; pub(crate) use local::get_cache_dir; pub use local::{ - cosine_similarity, dot_product, euclidean_distance, matryoshka_truncate, Embedding, - EmbeddingError, EmbeddingService, BATCH_SIZE, EMBEDDING_DIMENSIONS, MAX_TEXT_LENGTH, + BATCH_SIZE, EMBEDDING_DIMENSIONS, Embedding, EmbeddingError, EmbeddingService, MAX_TEXT_LENGTH, + cosine_similarity, dot_product, euclidean_distance, matryoshka_truncate, }; pub use code::CodeEmbedding; diff --git a/crates/vestige-core/src/fsrs/algorithm.rs b/crates/vestige-core/src/fsrs/algorithm.rs index 5973e08..2e85832 100644 --- a/crates/vestige-core/src/fsrs/algorithm.rs +++ b/crates/vestige-core/src/fsrs/algorithm.rs @@ -348,7 +348,8 @@ mod tests { #[test] fn test_fsrs6_constants() { assert_eq!(FSRS6_WEIGHTS.len(), 21); - assert!(FSRS6_WEIGHTS[20] > 0.0 && FSRS6_WEIGHTS[20] < 1.0); + let w20 = FSRS6_WEIGHTS[20]; + assert!(w20 > 0.0 && w20 < 1.0); } #[test] diff --git a/crates/vestige-core/src/fsrs/mod.rs b/crates/vestige-core/src/fsrs/mod.rs index 36a0ddc..f882c66 100644 --- a/crates/vestige-core/src/fsrs/mod.rs +++ b/crates/vestige-core/src/fsrs/mod.rs @@ -19,6 +19,14 @@ mod optimizer; mod scheduler; pub use algorithm::{ + DEFAULT_DECAY, + DEFAULT_RETENTION, + // Constants + FSRS6_WEIGHTS, + MAX_DIFFICULTY, + MAX_STABILITY, + MIN_DIFFICULTY, + MIN_STABILITY, apply_sentiment_boost, fuzz_interval, initial_difficulty, @@ -38,14 +46,6 @@ pub use algorithm::{ retrievability_with_decay, same_day_stability, same_day_stability_with_weights, - DEFAULT_DECAY, - DEFAULT_RETENTION, - // Constants - FSRS6_WEIGHTS, - MAX_DIFFICULTY, - MAX_STABILITY, - MIN_DIFFICULTY, - MIN_STABILITY, }; pub use scheduler::{ diff --git a/crates/vestige-core/src/fsrs/optimizer.rs b/crates/vestige-core/src/fsrs/optimizer.rs index 90d5be0..59fcacf 100644 --- a/crates/vestige-core/src/fsrs/optimizer.rs +++ b/crates/vestige-core/src/fsrs/optimizer.rs @@ -3,7 +3,7 @@ //! Personalizes FSRS parameters based on user review history. //! Uses gradient-free optimization to minimize prediction error. -use super::algorithm::{retrievability_with_decay, FSRS6_WEIGHTS}; +use super::algorithm::{FSRS6_WEIGHTS, retrievability_with_decay}; use chrono::{DateTime, Utc}; // ============================================================================ diff --git a/crates/vestige-core/src/fsrs/scheduler.rs b/crates/vestige-core/src/fsrs/scheduler.rs index 1c7edc7..e5ab0d6 100644 --- a/crates/vestige-core/src/fsrs/scheduler.rs +++ b/crates/vestige-core/src/fsrs/scheduler.rs @@ -7,11 +7,10 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use super::algorithm::{ - apply_sentiment_boost, fuzz_interval, initial_difficulty_with_weights, - initial_stability_with_weights, next_difficulty_with_weights, + DEFAULT_RETENTION, FSRS6_WEIGHTS, MAX_STABILITY, apply_sentiment_boost, fuzz_interval, + initial_difficulty_with_weights, initial_stability_with_weights, next_difficulty_with_weights, next_forget_stability_with_weights, next_interval_with_decay, next_recall_stability_with_weights, retrievability_with_decay, same_day_stability_with_weights, - DEFAULT_RETENTION, FSRS6_WEIGHTS, MAX_STABILITY, }; // ============================================================================ @@ -243,13 +242,11 @@ impl FSRSScheduler { // Apply sentiment boost if self.enable_sentiment_boost && let Some(sentiment) = sentiment_boost - && sentiment > 0.0 { - new_state.stability = apply_sentiment_boost( - new_state.stability, - sentiment, - self.max_sentiment_boost, - ); - } + && sentiment > 0.0 + { + new_state.stability = + apply_sentiment_boost(new_state.stability, sentiment, self.max_sentiment_boost); + } let mut interval = next_interval_with_decay(new_state.stability, self.params.desired_retention, w20) @@ -436,9 +433,11 @@ mod tests { #[test] fn test_custom_parameters() { - let mut params = FSRSParameters::default(); - params.desired_retention = 0.85; - params.enable_fuzz = false; + let params = FSRSParameters { + desired_retention: 0.85, + enable_fuzz: false, + ..FSRSParameters::default() + }; let scheduler = FSRSScheduler::new(params); let card = scheduler.new_card(); diff --git a/crates/vestige-core/src/fts.rs b/crates/vestige-core/src/fts.rs index c3d0752..e4cadfb 100644 --- a/crates/vestige-core/src/fts.rs +++ b/crates/vestige-core/src/fts.rs @@ -84,10 +84,7 @@ mod tests { #[test] fn test_sanitize_fts5_query_special_chars() { assert_eq!(sanitize_fts5_query("hello* world"), "\"hello world\""); - assert_eq!( - sanitize_fts5_query("content:secret"), - "\"content secret\"" - ); + assert_eq!(sanitize_fts5_query("content:secret"), "\"content secret\""); assert_eq!(sanitize_fts5_query("^boost"), "\"boost\""); } diff --git a/crates/vestige-core/src/lib.rs b/crates/vestige-core/src/lib.rs index d0bcd0b..306b2d2 100644 --- a/crates/vestige-core/src/lib.rs +++ b/crates/vestige-core/src/lib.rs @@ -114,20 +114,27 @@ pub mod neuroscience; // Memory types pub use memory::{ - ConsolidationResult, EmbeddingResult, IngestInput, KnowledgeNode, MatchType, MemoryStats, - NodeType, RecallInput, SearchMode, SearchResult, SimilarityResult, TemporalRange, + ConsolidationResult, // GOD TIER 2026: New types - EdgeType, KnowledgeEdge, MemoryScope, MemorySystem, + EdgeType, + EmbeddingResult, + IngestInput, + KnowledgeEdge, + KnowledgeNode, + MatchType, + MemoryScope, + MemoryStats, + MemorySystem, + NodeType, + RecallInput, + SearchMode, + SearchResult, + SimilarityResult, + TemporalRange, }; // FSRS-6 algorithm pub use fsrs::{ - initial_difficulty, - initial_stability, - next_interval, - // Core functions for advanced usage - retrievability, - retrievability_with_decay, FSRSParameters, FSRSScheduler, FSRSState, @@ -135,6 +142,12 @@ pub use fsrs::{ PreviewResults, Rating, ReviewResult, + initial_difficulty, + initial_stability, + next_interval, + // Core functions for advanced usage + retrievability, + retrievability_with_decay, }; // Storage layer @@ -146,9 +159,8 @@ pub use storage::{ // Consolidation (sleep-inspired memory processing) pub use consolidation::SleepConsolidation; pub use consolidation::{ - DreamEngine, DreamPhase, FourPhaseDreamResult, PhaseResult, - TriagedMemory, TriageCategory, CreativeConnection, CreativeConnectionType, - DreamInsight, + CreativeConnection, CreativeConnectionType, DreamEngine, DreamInsight, DreamPhase, + FourPhaseDreamResult, PhaseResult, TriageCategory, TriagedMemory, }; // Advanced features (bleeding edge 2026) @@ -162,6 +174,8 @@ pub use advanced::{ AdaptiveEmbedder, ApplicableKnowledge, AppliedModification, + // Prediction Error Gating (solves bad vs good similar memory problem) + CandidateMemory, ChainStep, ChangeSummary, CompressedMemory, @@ -175,16 +189,20 @@ pub use advanced::{ // Sleep consolidation (automatic background consolidation) ConsolidationScheduler, ContentType, + CreateReason, // Cross-project learning CrossProjectLearner, DetectedIntent, + DiscoveredConnection, + DiscoveredConnectionType, DreamConfig, // DreamMemory - input type for dreaming DreamMemory, - DiscoveredConnection, - DiscoveredConnectionType, DreamResult, EmbeddingStrategy, + EvaluationIntent, + GateDecision, + GateStats, ImportanceDecayConfig, ImportanceScore, // Importance tracking @@ -204,11 +222,14 @@ pub use advanced::{ MemoryPath, MemoryReplay, MemorySnapshot, + MergeStrategy, Modification, Pattern, PatternType, PredictedMemory, PredictionContext, + PredictionErrorConfig, + PredictionErrorGate, ProjectContext, ReasoningChain, ReconsolidatedMemory, @@ -217,25 +238,16 @@ pub use advanced::{ ReconsolidationStats, RelationshipType, RetrievalRecord, + SimilarityResult as PredictionSimilarityResult, // Speculative retrieval SpeculativeRetriever, + SupersedeReason, SynthesizedInsight, UniversalPattern, + UpdateType, UsageEvent, UsagePattern, UserAction, - // Prediction Error Gating (solves bad vs good similar memory problem) - CandidateMemory, - CreateReason, - EvaluationIntent, - GateDecision, - GateStats, - MergeStrategy, - PredictionErrorConfig, - PredictionErrorGate, - SimilarityResult as PredictionSimilarityResult, - SupersedeReason, - UpdateType, }; // Codebase memory (Vestige's killer differentiator) @@ -315,14 +327,20 @@ pub use neuroscience::{ ContextReinstatement, ContextWeights, DecayFunction, + // Emotional Memory (Brown & Kulik 1977, Bower 1981, LaBar & Cabeza 2006) + EmotionCategory, EmotionalContext, + EmotionalEvaluation, EmotionalMarker, + EmotionalMemory, + EmotionalMemoryStats, EncodingContext, FullMemory, // Hippocampal Indexing (Teyler & Rudy, 2007) HippocampalIndex, HippocampalIndexConfig, HippocampalIndexError, + INDEX_EMBEDDING_DIM, ImportanceCluster, ImportanceConsolidationConfig, ImportanceEncodingConfig, @@ -374,40 +392,34 @@ pub use neuroscience::{ TemporalMarker, TimeOfDay, TopicalContext, - INDEX_EMBEDDING_DIM, - // Emotional Memory (Brown & Kulik 1977, Bower 1981, LaBar & Cabeza 2006) - EmotionCategory, - EmotionalEvaluation, - EmotionalMemory, - EmotionalMemoryStats, }; // Embeddings (when feature enabled) #[cfg(feature = "embeddings")] pub use embeddings::{ - cosine_similarity, euclidean_distance, Embedding, EmbeddingError, EmbeddingService, - EMBEDDING_DIMENSIONS, + EMBEDDING_DIMENSIONS, Embedding, EmbeddingError, EmbeddingService, cosine_similarity, + euclidean_distance, }; // Search (when feature enabled) #[cfg(feature = "vector-search")] pub use search::{ - linear_combination, - reciprocal_rank_fusion, HybridSearchConfig, // Hybrid search HybridSearcher, // Keyword search KeywordSearcher, - VectorIndex, - VectorIndexConfig, - VectorIndexStats, - VectorSearchError, + RerankedResult, // GOD TIER 2026: Reranking Reranker, RerankerConfig, RerankerError, - RerankedResult, + VectorIndex, + VectorIndexConfig, + VectorIndexStats, + VectorSearchError, + linear_combination, + reciprocal_rank_fusion, }; // ============================================================================ @@ -450,6 +462,8 @@ pub mod prelude { // Sleep consolidation ConsolidationScheduler, CrossProjectLearner, + EvaluationIntent, + GateDecision, ImportanceTracker, IntentDetector, LabileState, @@ -459,14 +473,12 @@ pub mod prelude { MemoryReplay, Modification, PredictedMemory, + // Prediction Error Gating + PredictionErrorGate, ReconsolidatedMemory, // Reconsolidation ReconsolidationManager, SpeculativeRetriever, - // Prediction Error Gating - PredictionErrorGate, - GateDecision, - EvaluationIntent, }; // Codebase memory diff --git a/crates/vestige-core/src/memory/mod.rs b/crates/vestige-core/src/memory/mod.rs index 0b5350e..e7c61d4 100644 --- a/crates/vestige-core/src/memory/mod.rs +++ b/crates/vestige-core/src/memory/mod.rs @@ -299,7 +299,6 @@ pub struct ConsolidationResult { pub w20_optimized: Option, } - // ============================================================================ // SEARCH RESULTS // ============================================================================ @@ -360,4 +359,3 @@ pub struct EmbeddingResult { /// Error messages for failures pub errors: Vec, } - diff --git a/crates/vestige-core/src/memory/node.rs b/crates/vestige-core/src/memory/node.rs index 90e672d..9785387 100644 --- a/crates/vestige-core/src/memory/node.rs +++ b/crates/vestige-core/src/memory/node.rs @@ -179,6 +179,15 @@ pub struct KnowledgeNode { /// Which model generated the embedding #[serde(skip_serializing_if = "Option::is_none")] pub embedding_model: Option, + + // ========== Active Forgetting (v2.0.5, Anderson 2025 + Davis Rac1) ========== + /// Top-down suppression count — compounds with each `suppress` call + /// (Suppression-Induced Forgetting, Anderson 2025). + #[serde(default)] + pub suppression_count: i32, + /// Timestamp of the most recent suppression (for 24h labile window). + #[serde(skip_serializing_if = "Option::is_none")] + pub suppressed_at: Option>, } impl Default for KnowledgeNode { @@ -213,6 +222,8 @@ impl Default for KnowledgeNode { temporal_level: None, has_embedding: None, embedding_model: None, + suppression_count: 0, + suppressed_at: None, } } } diff --git a/crates/vestige-core/src/neuroscience/active_forgetting.rs b/crates/vestige-core/src/neuroscience/active_forgetting.rs new file mode 100644 index 0000000..0a90769 --- /dev/null +++ b/crates/vestige-core/src/neuroscience/active_forgetting.rs @@ -0,0 +1,226 @@ +//! Active Forgetting — Top-Down Inhibitory Control of Memory (v2.0.5) +//! +//! Implements user-initiated memory suppression, distinct from passive FSRS +//! decay and from bottom-up retrieval-induced forgetting (Anderson 1994, +//! `memory_states.rs`). This module models the right-lateral-prefrontal-cortex +//! gated inhibitory pathway, where top-down cognitive control compounds with +//! each stopping attempt (Suppression-Induced Forgetting) and spreads via a +//! Rac1-GTPase-like cascade to co-activated synaptic neighbors. +//! +//! ## References +//! +//! - Anderson, M. C., Hanslmayr, S., & Quaegebeur, L. (2025). Brain mechanisms +//! underlying the inhibitory control of thought. *Nature Reviews Neuroscience*. +//! DOI: 10.1038/s41583-025-00929-y. Establishes rDLPFC as the domain-general +//! inhibitory controller; SIF scales with stopping attempts; incentive-resistant. +//! - Cervantes-Sandoval, I., Chakraborty, M., MacMullen, C., & Davis, R. L. +//! (2020). Rac1 Impairs Forgetting-Induced Cellular Plasticity in Mushroom +//! Body Output Neurons. *Front Cell Neurosci*. PMC7477079. Establishes Rac1 +//! GTPase as the active synaptic destabilization mechanism. +//! +//! ## Contrast with existing modules +//! +//! - `memory_states.rs` (Anderson 1994, RIF): BOTTOM-UP, passive consequence +//! of retrieval competition. When memory A wins a query, its competitors +//! automatically lose retrievability. +//! - `active_forgetting.rs` (Anderson 2025, SIF + Davis Rac1): TOP-DOWN, +//! user-initiated via the `suppress` MCP tool. Compounds with each call. +//! Spreads to neighbors. Reversible within a 24h labile window. + +use chrono::{DateTime, Duration, Utc}; +use serde::{Deserialize, Serialize}; + +/// Default SIF penalty coefficient per suppression increment. +pub const DEFAULT_SIF_K: f64 = 0.15; + +/// Maximum cumulative penalty from compounding suppression. +/// Matches Anderson's empirical SIF saturation. +pub const DEFAULT_MAX_PENALTY: f64 = 0.8; + +/// Cascade attenuation factor for Rac1 spreading to co-activated neighbors. +pub const DEFAULT_CASCADE_DECAY: f64 = 0.3; + +/// Labile window in hours during which a suppression may be reversed. +/// Parallels Nader's 5-minute reconsolidation window on a 24-hour axis. +pub const DEFAULT_LABILE_HOURS: i64 = 24; + +/// Maximum per-neighbor retrieval-strength decrement during cascade. +pub const DEFAULT_CASCADE_RETRIEVAL_DECREMENT_CAP: f64 = 0.15; + +/// Top-down inhibitory control over memory retrieval. +/// +/// Stateless — all persistent state lives on the `knowledge_nodes` table +/// (columns `suppression_count`, `suppressed_at`). This struct exposes pure +/// helper functions consumed by `Storage::suppress_memory`, +/// `Storage::reverse_suppression`, `Storage::apply_rac1_cascade`, and the +/// `search_unified` score adjustment stage. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ActiveForgettingSystem { + /// Penalty coefficient per suppression increment (SIF). + pub k: f64, + /// Maximum cumulative penalty cap. + pub max_penalty: f64, + /// Cascade attenuation factor for Rac1 spreading. + pub cascade_decay: f64, + /// Reversal window in hours. + pub labile_hours: i64, +} + +impl Default for ActiveForgettingSystem { + fn default() -> Self { + Self { + k: DEFAULT_SIF_K, + max_penalty: DEFAULT_MAX_PENALTY, + cascade_decay: DEFAULT_CASCADE_DECAY, + labile_hours: DEFAULT_LABILE_HOURS, + } + } +} + +impl ActiveForgettingSystem { + /// Create a new system with default parameters. + pub fn new() -> Self { + Self::default() + } + + /// Compute the retrieval-score penalty for a memory with the given + /// suppression count. Penalty grows linearly then saturates at + /// `max_penalty` (Anderson's empirical SIF ceiling). + /// + /// Applied in `search_unified` as `score *= (1.0 - penalty)`. + pub fn retrieval_penalty(&self, suppression_count: i32) -> f64 { + if suppression_count <= 0 { + return 0.0; + } + (self.k * suppression_count as f64).min(self.max_penalty) + } + + /// Return `true` if a suppression is within the labile window and + /// therefore reversible. Matches reconsolidation semantics on a 24h axis. + pub fn is_reversible(&self, suppressed_at: DateTime) -> bool { + Utc::now() - suppressed_at < Duration::hours(self.labile_hours) + } + + /// Stability multiplier to apply to a neighbor of a suppressed memory + /// during the Rac1 cascade. Stronger co-activation edges propagate more + /// decay. A 1.0 edge yields `(1 - cascade_decay)` = 0.7 by default + /// (30% stability loss per cascade hop), clamped never below 0.1. + pub fn cascade_stability_factor(&self, edge_strength: f64) -> f64 { + (1.0 - self.cascade_decay * edge_strength.clamp(0.0, 1.0)).max(0.1) + } + + /// Retrieval-strength decrement for a cascade neighbor, proportional to + /// co-activation edge strength and capped at + /// `DEFAULT_CASCADE_RETRIEVAL_DECREMENT_CAP`. + pub fn cascade_retrieval_decrement(&self, edge_strength: f64) -> f64 { + (0.05 * edge_strength.clamp(0.0, 1.0)).min(DEFAULT_CASCADE_RETRIEVAL_DECREMENT_CAP) + } + + /// Time remaining in the labile window, or `None` if expired. + pub fn remaining_labile_time(&self, suppressed_at: DateTime) -> Option { + let window = Duration::hours(self.labile_hours); + let elapsed = Utc::now() - suppressed_at; + if elapsed >= window { + None + } else { + Some(window - elapsed) + } + } + + /// Deadline timestamp after which reversal will fail. + pub fn reversible_until(&self, suppressed_at: DateTime) -> DateTime { + suppressed_at + Duration::hours(self.labile_hours) + } +} + +/// Aggregate statistics about active-forgetting state across all memories. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +pub struct SuppressionStats { + /// Total memories with suppression_count > 0. + pub total_suppressed: usize, + /// Memories suppressed within the last `labile_hours` (still reversible). + pub recently_reversible: usize, + /// Mean suppression_count across all suppressed memories. + pub avg_suppression_count: f64, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_sif_penalty_compounds() { + let sys = ActiveForgettingSystem::new(); + assert_eq!(sys.retrieval_penalty(0), 0.0); + assert!((sys.retrieval_penalty(1) - 0.15).abs() < 1e-9); + assert!((sys.retrieval_penalty(2) - 0.30).abs() < 1e-9); + assert!((sys.retrieval_penalty(5) - 0.75).abs() < 1e-9); + // Saturates at max_penalty + assert!((sys.retrieval_penalty(6) - 0.80).abs() < 1e-9); + assert!((sys.retrieval_penalty(100) - 0.80).abs() < 1e-9); + } + + #[test] + fn test_labile_window_reversible() { + let sys = ActiveForgettingSystem::new(); + let recent = Utc::now() - Duration::hours(23); + assert!(sys.is_reversible(recent)); + let expired = Utc::now() - Duration::hours(25); + assert!(!sys.is_reversible(expired)); + assert!(sys.is_reversible(Utc::now())); + } + + #[test] + fn test_cascade_attenuation() { + let sys = ActiveForgettingSystem::new(); + let strong = sys.cascade_stability_factor(0.9); + let weak = sys.cascade_stability_factor(0.1); + assert!(strong < weak, "strong edges should propagate more decay"); + // Zero edge → no decay + assert!((sys.cascade_stability_factor(0.0) - 1.0).abs() < 1e-9); + // Factor never zeroes out + assert!(sys.cascade_stability_factor(1.0) >= 0.1); + } + + #[test] + fn test_default_params_reasonable() { + let sys = ActiveForgettingSystem::new(); + assert!(sys.k > 0.0 && sys.k <= 0.25, "k should be in (0, 0.25]"); + assert!( + sys.max_penalty >= 0.5 && sys.max_penalty <= 0.95, + "max_penalty should be in [0.5, 0.95]" + ); + assert!(sys.labile_hours >= 12 && sys.labile_hours <= 72); + assert!(sys.cascade_decay > 0.0 && sys.cascade_decay < 1.0); + } + + #[test] + fn test_reversible_until_deadline() { + let sys = ActiveForgettingSystem::new(); + let now = Utc::now(); + let deadline = sys.reversible_until(now); + let expected = now + Duration::hours(24); + assert!((deadline - expected).num_milliseconds().abs() < 100); + } + + #[test] + fn test_remaining_labile_time_expired_returns_none() { + let sys = ActiveForgettingSystem::new(); + let past = Utc::now() - Duration::hours(30); + assert!(sys.remaining_labile_time(past).is_none()); + let recent = Utc::now() - Duration::hours(10); + let remaining = sys.remaining_labile_time(recent); + assert!(remaining.is_some()); + // Should have ~14 hours left (24h window - 10h elapsed) + let hours_left = remaining.unwrap().num_hours(); + assert!((13..=14).contains(&hours_left)); + } + + #[test] + fn test_cascade_retrieval_decrement_capped() { + let sys = ActiveForgettingSystem::new(); + assert!((sys.cascade_retrieval_decrement(0.0) - 0.0).abs() < 1e-9); + assert!(sys.cascade_retrieval_decrement(0.5) <= DEFAULT_CASCADE_RETRIEVAL_DECREMENT_CAP); + assert!(sys.cascade_retrieval_decrement(1.0) <= DEFAULT_CASCADE_RETRIEVAL_DECREMENT_CAP); + } +} diff --git a/crates/vestige-core/src/neuroscience/context_memory.rs b/crates/vestige-core/src/neuroscience/context_memory.rs index e220f9a..d89594c 100644 --- a/crates/vestige-core/src/neuroscience/context_memory.rs +++ b/crates/vestige-core/src/neuroscience/context_memory.rs @@ -911,33 +911,38 @@ impl ContextMatcher { // Same session is a very strong match if let (Some(e_id), Some(r_id)) = (&encoding.session_id, &retrieval.session_id) - && e_id == r_id { - return 1.0; - } + && e_id == r_id + { + return 1.0; + } // Project match (0.4 weight) if let (Some(e_proj), Some(r_proj)) = (&encoding.project, &retrieval.project) - && e_proj == r_proj { - score += 0.4; - } + && e_proj == r_proj + { + score += 0.4; + } // Activity type match (0.3 weight) if let (Some(e_act), Some(r_act)) = (&encoding.activity_type, &retrieval.activity_type) - && e_act == r_act { - score += 0.3; - } + && e_act == r_act + { + score += 0.3; + } // Git branch match (0.2 weight) if let (Some(e_br), Some(r_br)) = (&encoding.git_branch, &retrieval.git_branch) - && e_br == r_br { - score += 0.2; - } + && e_br == r_br + { + score += 0.2; + } // Active file match (0.1 weight) if let (Some(e_file), Some(r_file)) = (&encoding.active_file, &retrieval.active_file) - && e_file == r_file { - score += 0.1; - } + && e_file == r_file + { + score += 0.1; + } score } @@ -985,7 +990,11 @@ impl ContextMatcher { .collect(); // Sort by combined score (descending) - scored.sort_by(|a, b| b.combined_score.partial_cmp(&a.combined_score).unwrap_or(std::cmp::Ordering::Equal)); + scored.sort_by(|a, b| { + b.combined_score + .partial_cmp(&a.combined_score) + .unwrap_or(std::cmp::Ordering::Equal) + }); scored } @@ -1103,9 +1112,11 @@ mod tests { topical.add_topic("security"); topical.extract_keywords_from("implementing OAuth2 authentication flow"); - assert!(topical - .active_topics - .contains(&"authentication".to_string())); + assert!( + topical + .active_topics + .contains(&"authentication".to_string()) + ); assert!(topical.keywords.contains(&"oauth2".to_string())); let terms = topical.all_terms(); @@ -1118,10 +1129,11 @@ mod tests { ctx.add_topic("api-design"); ctx.set_project("vestige"); - assert!(ctx - .topical - .active_topics - .contains(&"api-design".to_string())); + assert!( + ctx.topical + .active_topics + .contains(&"api-design".to_string()) + ); assert_eq!(ctx.session.project, Some("vestige".to_string())); } @@ -1137,7 +1149,11 @@ mod tests { let ctx2 = ctx1.clone(); let similarity = matcher.match_contexts(&ctx1, &ctx2); - assert!(similarity > 0.8, "Same context should have high similarity, got {}", similarity); + assert!( + similarity > 0.8, + "Same context should have high similarity, got {}", + similarity + ); } #[test] diff --git a/crates/vestige-core/src/neuroscience/emotional_memory.rs b/crates/vestige-core/src/neuroscience/emotional_memory.rs index 9fcb7de..bc5a527 100644 --- a/crates/vestige-core/src/neuroscience/emotional_memory.rs +++ b/crates/vestige-core/src/neuroscience/emotional_memory.rs @@ -216,15 +216,25 @@ impl EmotionalMemory { // Check negation context (simple window-based) let negation_words: Vec<&str> = vec![ - "not", "no", "never", "don't", "doesn't", "didn't", "won't", - "can't", "couldn't", "shouldn't", "without", "hardly", + "not", + "no", + "never", + "don't", + "doesn't", + "didn't", + "won't", + "can't", + "couldn't", + "shouldn't", + "without", + "hardly", ]; for (i, word) in words.iter().enumerate() { if let Some(&(valence, arousal)) = self.lexicon.get(word.as_str()) { // Check for negation in 3-word window before - let negated = (i.saturating_sub(3)..i) - .any(|j| negation_words.contains(&words[j].as_str())); + let negated = + (i.saturating_sub(3)..i).any(|j| negation_words.contains(&words[j].as_str())); let effective_valence = if negated { -valence * 0.7 } else { valence }; @@ -269,9 +279,14 @@ impl EmotionalMemory { }; // Flashbulb detection: high novelty proxy (urgency/surprise markers) + high arousal - let novelty_proxy = urgency_boost + if category == EmotionCategory::Surprise { 0.4 } else { 0.0 }; - let is_flashbulb = novelty_proxy >= FLASHBULB_NOVELTY_THRESHOLD - && arousal >= FLASHBULB_AROUSAL_THRESHOLD; + let novelty_proxy = urgency_boost + + if category == EmotionCategory::Surprise { + 0.4 + } else { + 0.0 + }; + let is_flashbulb = + novelty_proxy >= FLASHBULB_NOVELTY_THRESHOLD && arousal >= FLASHBULB_AROUSAL_THRESHOLD; if is_flashbulb { self.flashbulbs_detected += 1; @@ -447,66 +462,114 @@ impl EmotionalMemory { // Positive / Low arousal for (word, v, a) in [ - ("good", 0.6, 0.3), ("nice", 0.5, 0.2), ("clean", 0.4, 0.2), - ("simple", 0.3, 0.1), ("smooth", 0.4, 0.2), ("stable", 0.4, 0.1), - ("helpful", 0.5, 0.3), ("elegant", 0.6, 0.3), ("solid", 0.4, 0.2), + ("good", 0.6, 0.3), + ("nice", 0.5, 0.2), + ("clean", 0.4, 0.2), + ("simple", 0.3, 0.1), + ("smooth", 0.4, 0.2), + ("stable", 0.4, 0.1), + ("helpful", 0.5, 0.3), + ("elegant", 0.6, 0.3), + ("solid", 0.4, 0.2), ] { lex.insert(word.to_string(), (v, a)); } // Positive / High arousal for (word, v, a) in [ - ("amazing", 0.9, 0.8), ("excellent", 0.8, 0.6), ("perfect", 0.9, 0.7), - ("awesome", 0.8, 0.7), ("great", 0.7, 0.5), ("fantastic", 0.9, 0.8), - ("brilliant", 0.8, 0.7), ("incredible", 0.9, 0.8), ("love", 0.8, 0.7), - ("success", 0.7, 0.6), ("solved", 0.7, 0.6), ("fixed", 0.6, 0.5), - ("working", 0.5, 0.4), ("breakthrough", 0.9, 0.9), ("discovered", 0.7, 0.7), + ("amazing", 0.9, 0.8), + ("excellent", 0.8, 0.6), + ("perfect", 0.9, 0.7), + ("awesome", 0.8, 0.7), + ("great", 0.7, 0.5), + ("fantastic", 0.9, 0.8), + ("brilliant", 0.8, 0.7), + ("incredible", 0.9, 0.8), + ("love", 0.8, 0.7), + ("success", 0.7, 0.6), + ("solved", 0.7, 0.6), + ("fixed", 0.6, 0.5), + ("working", 0.5, 0.4), + ("breakthrough", 0.9, 0.9), + ("discovered", 0.7, 0.7), ] { lex.insert(word.to_string(), (v, a)); } // Negative / Low arousal for (word, v, a) in [ - ("bad", -0.5, 0.3), ("wrong", -0.4, 0.3), ("slow", -0.3, 0.2), - ("confusing", -0.4, 0.3), ("unclear", -0.3, 0.2), ("messy", -0.4, 0.3), - ("annoying", -0.5, 0.4), ("boring", -0.3, 0.1), ("ugly", -0.5, 0.3), - ("deprecated", -0.3, 0.2), ("stale", -0.3, 0.1), + ("bad", -0.5, 0.3), + ("wrong", -0.4, 0.3), + ("slow", -0.3, 0.2), + ("confusing", -0.4, 0.3), + ("unclear", -0.3, 0.2), + ("messy", -0.4, 0.3), + ("annoying", -0.5, 0.4), + ("boring", -0.3, 0.1), + ("ugly", -0.5, 0.3), + ("deprecated", -0.3, 0.2), + ("stale", -0.3, 0.1), ] { lex.insert(word.to_string(), (v, a)); } // Negative / High arousal (bugs, errors, failures) for (word, v, a) in [ - ("error", -0.6, 0.7), ("bug", -0.6, 0.6), ("crash", -0.8, 0.9), - ("fail", -0.7, 0.7), ("failed", -0.7, 0.7), ("failure", -0.7, 0.7), - ("broken", -0.7, 0.7), ("panic", -0.9, 0.9), ("fatal", -0.9, 0.9), - ("critical", -0.5, 0.9), ("severe", -0.6, 0.8), ("urgent", -0.3, 0.9), - ("emergency", -0.5, 0.9), ("vulnerability", -0.7, 0.8), - ("exploit", -0.7, 0.8), ("leaked", -0.8, 0.9), ("compromised", -0.8, 0.9), - ("timeout", -0.5, 0.6), ("deadlock", -0.7, 0.8), ("overflow", -0.6, 0.7), - ("corruption", -0.8, 0.8), ("regression", -0.6, 0.7), - ("blocker", -0.6, 0.8), ("outage", -0.8, 0.9), ("incident", -0.5, 0.7), + ("error", -0.6, 0.7), + ("bug", -0.6, 0.6), + ("crash", -0.8, 0.9), + ("fail", -0.7, 0.7), + ("failed", -0.7, 0.7), + ("failure", -0.7, 0.7), + ("broken", -0.7, 0.7), + ("panic", -0.9, 0.9), + ("fatal", -0.9, 0.9), + ("critical", -0.5, 0.9), + ("severe", -0.6, 0.8), + ("urgent", -0.3, 0.9), + ("emergency", -0.5, 0.9), + ("vulnerability", -0.7, 0.8), + ("exploit", -0.7, 0.8), + ("leaked", -0.8, 0.9), + ("compromised", -0.8, 0.9), + ("timeout", -0.5, 0.6), + ("deadlock", -0.7, 0.8), + ("overflow", -0.6, 0.7), + ("corruption", -0.8, 0.8), + ("regression", -0.6, 0.7), + ("blocker", -0.6, 0.8), + ("outage", -0.8, 0.9), + ("incident", -0.5, 0.7), ] { lex.insert(word.to_string(), (v, a)); } // Surprise / Discovery for (word, v, a) in [ - ("unexpected", 0.0, 0.7), ("surprising", 0.1, 0.7), - ("strange", -0.1, 0.6), ("weird", -0.2, 0.5), - ("interesting", 0.4, 0.6), ("curious", 0.3, 0.5), - ("insight", 0.6, 0.7), ("realized", 0.4, 0.6), - ("found", 0.3, 0.5), ("noticed", 0.2, 0.4), + ("unexpected", 0.0, 0.7), + ("surprising", 0.1, 0.7), + ("strange", -0.1, 0.6), + ("weird", -0.2, 0.5), + ("interesting", 0.4, 0.6), + ("curious", 0.3, 0.5), + ("insight", 0.6, 0.7), + ("realized", 0.4, 0.6), + ("found", 0.3, 0.5), + ("noticed", 0.2, 0.4), ] { lex.insert(word.to_string(), (v, a)); } // Technical intensity markers for (word, v, a) in [ - ("production", -0.1, 0.7), ("deploy", 0.1, 0.6), - ("migration", -0.1, 0.5), ("refactor", 0.1, 0.4), - ("security", -0.1, 0.6), ("performance", 0.1, 0.4), - ("important", 0.2, 0.6), ("remember", 0.1, 0.5), + ("production", -0.1, 0.7), + ("deploy", 0.1, 0.6), + ("migration", -0.1, 0.5), + ("refactor", 0.1, 0.4), + ("security", -0.1, 0.6), + ("performance", 0.1, 0.4), + ("important", 0.2, 0.6), + ("remember", 0.1, 0.5), ] { lex.insert(word.to_string(), (v, a)); } @@ -572,16 +635,33 @@ mod tests { fn test_positive_content() { let mut em = EmotionalMemory::new(); let eval = em.evaluate_content("Amazing breakthrough! The fix is working perfectly"); - assert!(eval.valence > 0.3, "Expected positive valence, got {}", eval.valence); - assert!(eval.arousal > 0.4, "Expected high arousal, got {}", eval.arousal); + assert!( + eval.valence > 0.3, + "Expected positive valence, got {}", + eval.valence + ); + assert!( + eval.arousal > 0.4, + "Expected high arousal, got {}", + eval.arousal + ); } #[test] fn test_negative_content() { let mut em = EmotionalMemory::new(); - let eval = em.evaluate_content("Critical bug: production server crash with data corruption"); - assert!(eval.valence < -0.3, "Expected negative valence, got {}", eval.valence); - assert!(eval.arousal > 0.5, "Expected high arousal, got {}", eval.arousal); + let eval = + em.evaluate_content("Critical bug: production server crash with data corruption"); + assert!( + eval.valence < -0.3, + "Expected negative valence, got {}", + eval.valence + ); + assert!( + eval.arousal > 0.5, + "Expected high arousal, got {}", + eval.arousal + ); } #[test] @@ -592,7 +672,10 @@ mod tests { 0.8, // High novelty 0.9, // High arousal ); - assert!(eval.is_flashbulb, "Should detect flashbulb with high novelty + arousal"); + assert!( + eval.is_flashbulb, + "Should detect flashbulb with high novelty + arousal" + ); } #[test] @@ -611,7 +694,10 @@ mod tests { let mut em = EmotionalMemory::new(); let positive = em.evaluate_content("This is amazing"); let negated = em.evaluate_content("This is not amazing"); - assert!(negated.valence < positive.valence, "Negation should reduce valence"); + assert!( + negated.valence < positive.valence, + "Negation should reduce valence" + ); } #[test] @@ -632,15 +718,24 @@ mod tests { em.evaluate_content("Great amazing perfect success"); } let (mood_v, _) = em.current_mood(); - assert!(mood_v > 0.3, "Mood should be positive after positive content"); + assert!( + mood_v > 0.3, + "Mood should be positive after positive content" + ); // Positive memory should get boost let boost = em.mood_congruence_boost(0.7); - assert!(boost > 0.0, "Positive memory should get mood-congruent boost"); + assert!( + boost > 0.0, + "Positive memory should get mood-congruent boost" + ); // Negative memory should get less/no boost let neg_boost = em.mood_congruence_boost(-0.7); - assert!(neg_boost < boost, "Negative memory should get less boost in positive mood"); + assert!( + neg_boost < boost, + "Negative memory should get less boost in positive mood" + ); } #[test] @@ -674,7 +769,10 @@ mod tests { } let (v1, a1) = em.current_mood(); assert!(v1 < 0.0, "Mood should be negative after negative content"); - assert!(a1 > 0.3, "Arousal should be elevated after negative content"); + assert!( + a1 > 0.3, + "Arousal should be elevated after negative content" + ); } #[test] diff --git a/crates/vestige-core/src/neuroscience/hippocampal_index.rs b/crates/vestige-core/src/neuroscience/hippocampal_index.rs index a8fa0f9..5e1a367 100644 --- a/crates/vestige-core/src/neuroscience/hippocampal_index.rs +++ b/crates/vestige-core/src/neuroscience/hippocampal_index.rs @@ -1076,9 +1076,10 @@ impl ContentStore { // Check cache first let cache_key = self.cache_key(pointer); if let Ok(cache) = self.cache.read() - && let Some(data) = cache.get(&cache_key) { - return Ok(data.clone()); - } + && let Some(data) = cache.get(&cache_key) + { + return Ok(data.clone()); + } // Retrieve from storage let data = match &pointer.storage_location { @@ -1131,22 +1132,23 @@ impl ContentStore { } if let Ok(mut cache) = self.cache.write() - && let Ok(mut size) = self.current_cache_size.write() { - // Evict if necessary - while *size + data_size > self.max_cache_size && !cache.is_empty() { - // Simple eviction: remove first entry - if let Some(key_to_remove) = cache.keys().next().cloned() { - if let Some(removed) = cache.remove(&key_to_remove) { - *size = size.saturating_sub(removed.len()); - } - } else { - break; + && let Ok(mut size) = self.current_cache_size.write() + { + // Evict if necessary + while *size + data_size > self.max_cache_size && !cache.is_empty() { + // Simple eviction: remove first entry + if let Some(key_to_remove) = cache.keys().next().cloned() { + if let Some(removed) = cache.remove(&key_to_remove) { + *size = size.saturating_sub(removed.len()); } + } else { + break; } - - cache.insert(key.to_string(), data.to_vec()); - *size += data_size; } + + cache.insert(key.to_string(), data.to_vec()); + *size += data_size; + } } /// Retrieve from SQLite (placeholder - to be integrated with Storage) @@ -1393,15 +1395,16 @@ impl HippocampalIndex { // Calculate semantic score if let Some(ref query_embedding) = query.semantic_embedding - && !index.semantic_summary.is_empty() { - let query_compressed = self.compress_embedding(query_embedding); - match_result.semantic_score = - self.cosine_similarity(&query_compressed, &index.semantic_summary); + && !index.semantic_summary.is_empty() + { + let query_compressed = self.compress_embedding(query_embedding); + match_result.semantic_score = + self.cosine_similarity(&query_compressed, &index.semantic_summary); - if match_result.semantic_score < query.min_similarity { - continue; - } + if match_result.semantic_score < query.min_similarity { + continue; } + } // Calculate text score if let Some(ref text_query) = query.text_query { @@ -1442,21 +1445,24 @@ impl HippocampalIndex { fn passes_filters(&self, index: &MemoryIndex, query: &IndexQuery) -> bool { // Time range filter if let Some((start, end)) = query.time_range - && (index.temporal_marker.created_at < start || index.temporal_marker.created_at > end) { - return false; - } + && (index.temporal_marker.created_at < start || index.temporal_marker.created_at > end) + { + return false; + } // Importance flags filter if let Some(ref required) = query.required_flags - && !index.matches_importance(required.to_bits()) { - return false; - } + && !index.matches_importance(required.to_bits()) + { + return false; + } // Node type filter if let Some(ref types) = query.node_types - && !types.contains(&index.node_type) { - return false; - } + && !types.contains(&index.node_type) + { + return false; + } true } @@ -1574,9 +1580,10 @@ impl HippocampalIndex { for m in matches { // Record access if let Ok(mut indices) = self.indices.write() - && let Some(index) = indices.get_mut(&m.index.memory_id) { - index.record_access(); - } + && let Some(index) = indices.get_mut(&m.index.memory_id) + { + index.record_access(); + } match self.retrieve_content(&m.index) { Ok(memory) => memories.push(memory), @@ -1881,37 +1888,39 @@ impl HippocampalIndex { ) -> Result { // Check if already indexed if let Ok(indices) = self.indices.read() - && indices.contains_key(node_id) { - return Err(HippocampalIndexError::MigrationError( - "Node already indexed".to_string(), - )); - } + && indices.contains_key(node_id) + { + return Err(HippocampalIndexError::MigrationError( + "Node already indexed".to_string(), + )); + } // Create the index let barcode = self.index_memory(node_id, content, node_type, created_at, embedding)?; // Update importance flags based on existing data if let Ok(mut indices) = self.indices.write() - && let Some(index) = indices.get_mut(node_id) { - // Set high retention flag if applicable - if retention_strength > 0.7 { - index.importance_flags.set_high_retention(true); - } - - // Set emotional flag if applicable - if sentiment_magnitude > 0.5 { - index.importance_flags.set_emotional(true); - } - - // Add SQLite content pointer - index.content_pointers.clear(); - index.add_content_pointer(ContentPointer::sqlite( - "knowledge_nodes", - barcode.id as i64, - ContentType::Text, - )); + && let Some(index) = indices.get_mut(node_id) + { + // Set high retention flag if applicable + if retention_strength > 0.7 { + index.importance_flags.set_high_retention(true); } + // Set emotional flag if applicable + if sentiment_magnitude > 0.5 { + index.importance_flags.set_emotional(true); + } + + // Add SQLite content pointer + index.content_pointers.clear(); + index.add_content_pointer(ContentPointer::sqlite( + "knowledge_nodes", + barcode.id as i64, + ContentType::Text, + )); + } + Ok(barcode) } diff --git a/crates/vestige-core/src/neuroscience/importance_signals.rs b/crates/vestige-core/src/neuroscience/importance_signals.rs index cf26e63..f44f3fb 100644 --- a/crates/vestige-core/src/neuroscience/importance_signals.rs +++ b/crates/vestige-core/src/neuroscience/importance_signals.rs @@ -359,17 +359,18 @@ impl PredictionModel { let ngrams = self.extract_ngrams(content); if let Ok(mut patterns) = self.patterns.write() - && let Ok(mut total) = self.total_count.write() { - for ngram in ngrams { - *patterns.entry(ngram).or_insert(0) += 1; - *total += 1; - } - - // Prune if too large - if patterns.len() > MAX_PREDICTION_PATTERNS { - self.apply_decay(&mut patterns); - } + && let Ok(mut total) = self.total_count.write() + { + for ngram in ngrams { + *patterns.entry(ngram).or_insert(0) += 1; + *total += 1; } + + // Prune if too large + if patterns.len() > MAX_PREDICTION_PATTERNS { + self.apply_decay(&mut patterns); + } + } } fn compute_prediction_error(&self, content: &str) -> f64 { @@ -1186,7 +1187,11 @@ impl RewardSignal { // Limit pattern count if patterns.len() > 1000 { - patterns.sort_by(|a, b| b.strength.partial_cmp(&a.strength).unwrap_or(std::cmp::Ordering::Equal)); + patterns.sort_by(|a, b| { + b.strength + .partial_cmp(&a.strength) + .unwrap_or(std::cmp::Ordering::Equal) + }); patterns.truncate(500); } } @@ -1226,7 +1231,9 @@ impl RewardSignal { entries.sort_by(|a, b| { // Sort by score, then by recency - b.1.partial_cmp(&a.1).unwrap_or(std::cmp::Ordering::Equal).then_with(|| b.2.cmp(&a.2)) + b.1.partial_cmp(&a.1) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| b.2.cmp(&a.2)) }); // Keep top entries diff --git a/crates/vestige-core/src/neuroscience/memory_states.rs b/crates/vestige-core/src/neuroscience/memory_states.rs index 8f1bf33..0aca454 100644 --- a/crates/vestige-core/src/neuroscience/memory_states.rs +++ b/crates/vestige-core/src/neuroscience/memory_states.rs @@ -1267,13 +1267,14 @@ impl MemoryStateInfo { } MemoryState::Unavailable => { if let Some(until) = lifecycle.suppression_until - && until > now { - recommendations.push(format!( - "This memory is temporarily suppressed. \ + && until > now + { + recommendations.push(format!( + "This memory is temporarily suppressed. \ It will become accessible again after {}.", - until.format("%Y-%m-%d %H:%M UTC") - )); - } + until.format("%Y-%m-%d %H:%M UTC") + )); + } } MemoryState::Dormant => { if duration_since_access.num_days() > 20 { diff --git a/crates/vestige-core/src/neuroscience/mod.rs b/crates/vestige-core/src/neuroscience/mod.rs index 65a933c..21aab14 100644 --- a/crates/vestige-core/src/neuroscience/mod.rs +++ b/crates/vestige-core/src/neuroscience/mod.rs @@ -57,6 +57,7 @@ //! - Collins, A. M., & Loftus, E. F. (1975). A spreading-activation theory of semantic //! processing. Psychological Review. +pub mod active_forgetting; pub mod context_memory; pub mod emotional_memory; pub mod hippocampal_index; @@ -67,6 +68,12 @@ pub mod prospective_memory; pub mod spreading_activation; pub mod synaptic_tagging; +// Active forgetting — top-down inhibitory control (Anderson 2025 + Davis Rac1) +pub use active_forgetting::{ + ActiveForgettingSystem, DEFAULT_CASCADE_DECAY, DEFAULT_LABILE_HOURS, DEFAULT_MAX_PENALTY, + DEFAULT_SIF_K, SuppressionStats, +}; + // Re-exports for convenient access pub use synaptic_tagging::{ // Results @@ -94,15 +101,23 @@ pub use context_memory::{ // Memory states (accessibility continuum) pub use memory_states::{ + // Constants + ACCESSIBILITY_ACTIVE, + ACCESSIBILITY_DORMANT, + ACCESSIBILITY_SILENT, + ACCESSIBILITY_UNAVAILABLE, // Accessibility scoring AccessibilityCalculator, BatchUpdateResult, + COMPETITION_SIMILARITY_THRESHOLD, CompetitionCandidate, CompetitionConfig, CompetitionEvent, // Competition system (Retrieval-Induced Forgetting) CompetitionManager, CompetitionResult, + DEFAULT_ACTIVE_DECAY_HOURS, + DEFAULT_DORMANT_DECAY_DAYS, LifecycleSummary, MemoryLifecycle, // Core types @@ -116,14 +131,6 @@ pub use memory_states::{ StateTransitionReason, // State management StateUpdateService, - // Constants - ACCESSIBILITY_ACTIVE, - ACCESSIBILITY_DORMANT, - ACCESSIBILITY_SILENT, - ACCESSIBILITY_UNAVAILABLE, - COMPETITION_SIMILARITY_THRESHOLD, - DEFAULT_ACTIVE_DECAY_HOURS, - DEFAULT_DORMANT_DECAY_DAYS, }; // Multi-channel importance signaling (Neuromodulator-inspired) @@ -174,6 +181,8 @@ pub use hippocampal_index::{ HippocampalIndex, HippocampalIndexConfig, HippocampalIndexError, + // Constants + INDEX_EMBEDDING_DIM, ImportanceFlags, IndexLink, IndexMatch, @@ -187,40 +196,39 @@ pub use hippocampal_index::{ MigrationResult, StorageLocation, TemporalMarker, - // Constants - INDEX_EMBEDDING_DIM, }; // Predictive memory retrieval (Free Energy Principle - Friston, 2010) pub use predictive_retrieval::{ // Backward-compatible aliases ContextualPredictor, - Prediction, - PredictionConfidence, - PredictiveConfig, - PredictiveRetriever, - SequencePredictor, - TemporalPredictor, // Enhanced types (Friston's Active Inference) PredictedMemory, + Prediction, + PredictionConfidence, PredictionOutcome, PredictionReason, + PredictiveConfig, PredictiveMemory, PredictiveMemoryConfig, PredictiveMemoryError, + PredictiveRetriever, ProjectContext as PredictiveProjectContext, QueryPattern, + SequencePredictor, SessionContext as PredictiveSessionContext, TemporalPatterns, + TemporalPredictor, UserModel, }; // Prospective memory (Einstein & McDaniel, 1990) pub use prospective_memory::{ - // Core engine - ProspectiveMemory, - ProspectiveMemoryConfig, - ProspectiveMemoryError, + // Context monitoring + Context as ProspectiveContext, + ContextMonitor, + // Triggers and patterns + ContextPattern, // Intentions Intention, IntentionParser, @@ -229,13 +237,12 @@ pub use prospective_memory::{ IntentionStatus, IntentionTrigger, Priority, - // Triggers and patterns - ContextPattern, + // Core engine + ProspectiveMemory, + ProspectiveMemoryConfig, + ProspectiveMemoryError, RecurrencePattern, TriggerPattern, - // Context monitoring - Context as ProspectiveContext, - ContextMonitor, }; // Spreading activation (Associative Memory Network - Collins & Loftus, 1975) diff --git a/crates/vestige-core/src/neuroscience/predictive_retrieval.rs b/crates/vestige-core/src/neuroscience/predictive_retrieval.rs index 4bace7c..9c79c3e 100644 --- a/crates/vestige-core/src/neuroscience/predictive_retrieval.rs +++ b/crates/vestige-core/src/neuroscience/predictive_retrieval.rs @@ -915,7 +915,11 @@ impl PredictiveMemory { predictions.retain(|p| p.confidence >= self.config.min_confidence); // Sort by confidence - predictions.sort_by(|a, b| b.confidence.partial_cmp(&a.confidence).unwrap_or(std::cmp::Ordering::Equal)); + predictions.sort_by(|a, b| { + b.confidence + .partial_cmp(&a.confidence) + .unwrap_or(std::cmp::Ordering::Equal) + }); // Truncate to max predictions.truncate(self.config.max_predictions); diff --git a/crates/vestige-core/src/neuroscience/prospective_memory.rs b/crates/vestige-core/src/neuroscience/prospective_memory.rs index 868e1e5..133f17d 100644 --- a/crates/vestige-core/src/neuroscience/prospective_memory.rs +++ b/crates/vestige-core/src/neuroscience/prospective_memory.rs @@ -130,8 +130,7 @@ pub type Result = std::result::Result; // ============================================================================ /// Priority levels for intentions -#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -#[derive(Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Default)] pub enum Priority { /// Low priority - nice to remember Low = 1, @@ -144,7 +143,6 @@ pub enum Priority { Critical = 4, } - impl Priority { /// Get numeric value for comparison pub fn value(&self) -> u8 { @@ -178,8 +176,7 @@ impl Priority { } /// Status of an intention -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[derive(Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum IntentionStatus { /// Intention is active and being monitored #[default] @@ -196,7 +193,6 @@ pub enum IntentionStatus { Snoozed, } - /// Pattern for matching trigger conditions #[derive(Debug, Clone, Serialize, Deserialize)] pub enum TriggerPattern { @@ -695,15 +691,17 @@ impl Intention { // Check snoozed if let Some(snoozed_until) = self.snoozed_until - && Utc::now() < snoozed_until { - return false; - } + && Utc::now() < snoozed_until + { + return false; + } // Check minimum interval if let Some(last) = self.last_reminded_at - && (Utc::now() - last) < Duration::minutes(MIN_REMINDER_INTERVAL_MINUTES) { - return false; - } + && (Utc::now() - last) < Duration::minutes(MIN_REMINDER_INTERVAL_MINUTES) + { + return false; + } true } @@ -956,9 +954,17 @@ impl IntentionParser { let when_char_idx = text_lower[..when_byte_idx].chars().count(); let content_part: String = if text_lower.starts_with("remind me to ") { - original.chars().skip(13).take(when_char_idx.saturating_sub(13)).collect() + original + .chars() + .skip(13) + .take(when_char_idx.saturating_sub(13)) + .collect() } else if text_lower.starts_with("remind me ") { - original.chars().skip(10).take(when_char_idx.saturating_sub(10)).collect() + original + .chars() + .skip(10) + .take(when_char_idx.saturating_sub(10)) + .collect() } else { original.chars().take(when_char_idx).collect() }; @@ -1047,8 +1053,6 @@ impl IntentionParser { /// Extract content from text, removing trigger keywords fn extract_content(&self, _text_lower: &str, original: &str, keyword: &str) -> String { - - original .replace(keyword, "") .replace(&keyword.to_uppercase(), "") @@ -1267,9 +1271,10 @@ impl ProspectiveMemory { // Check if snoozed intention should wake if intention.status == IntentionStatus::Snoozed && let Some(until) = intention.snoozed_until - && Utc::now() >= until { - intention.wake(); - } + && Utc::now() >= until + { + intention.wake(); + } continue; } @@ -1277,10 +1282,11 @@ impl ProspectiveMemory { if intention .trigger .is_triggered(context, &context.recent_events) - && intention.should_remind() { - intention.mark_triggered(); - triggered.push(intention.clone()); - } + && intention.should_remind() + { + intention.mark_triggered(); + triggered.push(intention.clone()); + } // Check for deadline escalation if self.config.enable_escalation { diff --git a/crates/vestige-core/src/neuroscience/spreading_activation.rs b/crates/vestige-core/src/neuroscience/spreading_activation.rs index 55a1fad..2daf786 100644 --- a/crates/vestige-core/src/neuroscience/spreading_activation.rs +++ b/crates/vestige-core/src/neuroscience/spreading_activation.rs @@ -57,7 +57,6 @@ pub enum LinkType { UserDefined, } - // ============================================================================ // ASSOCIATION EDGE // ============================================================================ @@ -271,13 +270,7 @@ impl ActivationNetwork { } /// Add an edge between two nodes - pub fn add_edge( - &mut self, - source: String, - target: String, - link_type: LinkType, - strength: f64, - ) { + pub fn add_edge(&mut self, source: String, target: String, link_type: LinkType, strength: f64) { // Ensure both nodes exist self.add_node(source.clone()); self.add_node(target.clone()); @@ -288,9 +281,10 @@ impl ActivationNetwork { // Update node's edge list if let Some(node) = self.nodes.get_mut(&source) - && !node.edges.contains(&target) { - node.edges.push(target); - } + && !node.edges.contains(&target) + { + node.edges.push(target); + } } /// Activate a node and spread activation through the network @@ -314,9 +308,10 @@ impl ActivationNetwork { while let Some((current_id, current_activation, hops, path)) = queue.pop() { // Skip if we've visited this node with higher activation if let Some(&prev_activation) = visited.get(¤t_id) - && prev_activation >= current_activation { - continue; - } + && prev_activation >= current_activation + { + continue; + } visited.insert(current_id.clone(), current_activation); // Check hop limit @@ -499,7 +494,7 @@ mod tests { #[test] fn test_activation_threshold() { let mut network = ActivationNetwork::with_config(ActivationConfig { - decay_factor: 0.1, // Very high decay + decay_factor: 0.1, // Very high decay min_threshold: 0.5, // High threshold ..Default::default() }); diff --git a/crates/vestige-core/src/neuroscience/synaptic_tagging.rs b/crates/vestige-core/src/neuroscience/synaptic_tagging.rs index ea2e38c..c5e9ca1 100644 --- a/crates/vestige-core/src/neuroscience/synaptic_tagging.rs +++ b/crates/vestige-core/src/neuroscience/synaptic_tagging.rs @@ -122,7 +122,6 @@ pub enum DecayFunction { Logarithmic, } - impl DecayFunction { /// Calculate decayed strength /// diff --git a/crates/vestige-core/src/search/hyde.rs b/crates/vestige-core/src/search/hyde.rs index 1e4ebc7..1fea1fa 100644 --- a/crates/vestige-core/src/search/hyde.rs +++ b/crates/vestige-core/src/search/hyde.rs @@ -43,8 +43,10 @@ pub fn classify_intent(query: &str) -> QueryIntent { if lower.contains("how to") || lower.starts_with("how do") || lower.starts_with("steps") { return QueryIntent::HowTo; } - if lower.starts_with("what is") || lower.starts_with("what are") - || lower.starts_with("define") || lower.starts_with("explain") + if lower.starts_with("what is") + || lower.starts_with("what are") + || lower.starts_with("define") + || lower.starts_with("explain") { return QueryIntent::Definition; } @@ -54,8 +56,11 @@ pub fn classify_intent(query: &str) -> QueryIntent { if lower.starts_with("when") || lower.contains("date") || lower.contains("timeline") { return QueryIntent::Temporal; } - if query.contains('(') || query.contains('{') || query.contains("fn ") - || query.contains("class ") || query.contains("::") + if query.contains('(') + || query.contains('{') + || query.contains("fn ") + || query.contains("class ") + || query.contains("::") { return QueryIntent::Technical; } @@ -161,23 +166,38 @@ mod tests { #[test] fn test_classify_definition() { assert_eq!(classify_intent("What is FSRS?"), QueryIntent::Definition); - assert_eq!(classify_intent("explain spaced repetition"), QueryIntent::Definition); + assert_eq!( + classify_intent("explain spaced repetition"), + QueryIntent::Definition + ); } #[test] fn test_classify_howto() { - assert_eq!(classify_intent("how to configure embeddings"), QueryIntent::HowTo); - assert_eq!(classify_intent("How do I search memories?"), QueryIntent::HowTo); + assert_eq!( + classify_intent("how to configure embeddings"), + QueryIntent::HowTo + ); + assert_eq!( + classify_intent("How do I search memories?"), + QueryIntent::HowTo + ); } #[test] fn test_classify_reasoning() { - assert_eq!(classify_intent("why does retention decay?"), QueryIntent::Reasoning); + assert_eq!( + classify_intent("why does retention decay?"), + QueryIntent::Reasoning + ); } #[test] fn test_classify_temporal() { - assert_eq!(classify_intent("when did the last consolidation run"), QueryIntent::Temporal); + assert_eq!( + classify_intent("when did the last consolidation run"), + QueryIntent::Temporal + ); } #[test] @@ -188,7 +208,10 @@ mod tests { #[test] fn test_classify_lookup() { - assert_eq!(classify_intent("vestige memory system"), QueryIntent::Lookup); + assert_eq!( + classify_intent("vestige memory system"), + QueryIntent::Lookup + ); } #[test] @@ -200,10 +223,7 @@ mod tests { #[test] fn test_centroid_embedding() { - let embeddings = vec![ - vec![1.0, 0.0, 0.0], - vec![0.0, 1.0, 0.0], - ]; + let embeddings = vec![vec![1.0, 0.0, 0.0], vec![0.0, 1.0, 0.0]]; let centroid = centroid_embedding(&embeddings); assert_eq!(centroid.len(), 3); // Should be normalized diff --git a/crates/vestige-core/src/search/mod.rs b/crates/vestige-core/src/search/mod.rs index eb79f89..45b5a63 100644 --- a/crates/vestige-core/src/search/mod.rs +++ b/crates/vestige-core/src/search/mod.rs @@ -15,21 +15,21 @@ mod temporal; mod vector; pub use vector::{ - VectorIndex, VectorIndexConfig, VectorIndexStats, VectorSearchError, DEFAULT_CONNECTIVITY, - DEFAULT_DIMENSIONS, + DEFAULT_CONNECTIVITY, DEFAULT_DIMENSIONS, VectorIndex, VectorIndexConfig, VectorIndexStats, + VectorSearchError, }; -pub use keyword::{sanitize_fts5_query, KeywordSearcher}; +pub use keyword::{KeywordSearcher, sanitize_fts5_query}; -pub use hybrid::{linear_combination, reciprocal_rank_fusion, HybridSearchConfig, HybridSearcher}; +pub use hybrid::{HybridSearchConfig, HybridSearcher, linear_combination, reciprocal_rank_fusion}; pub use temporal::TemporalSearcher; // GOD TIER 2026: Reranking for +15-20% precision pub use reranker::{ - Reranker, RerankerConfig, RerankerError, RerankedResult, - DEFAULT_RERANK_COUNT, DEFAULT_RETRIEVAL_COUNT, + DEFAULT_RERANK_COUNT, DEFAULT_RETRIEVAL_COUNT, RerankedResult, Reranker, RerankerConfig, + RerankerError, }; // v2.0: HyDE-inspired query expansion for improved semantic search -pub use hyde::{classify_intent, expand_query, centroid_embedding, QueryIntent}; +pub use hyde::{QueryIntent, centroid_embedding, classify_intent, expand_query}; diff --git a/crates/vestige-core/src/search/vector.rs b/crates/vestige-core/src/search/vector.rs index d71b411..069dd9a 100644 --- a/crates/vestige-core/src/search/vector.rs +++ b/crates/vestige-core/src/search/vector.rs @@ -174,9 +174,9 @@ impl VectorIndex { /// Reserve capacity for a specified number of vectors /// This should be called before adding vectors to avoid segmentation faults pub fn reserve(&self, capacity: usize) -> Result<(), VectorSearchError> { - self.index - .reserve(capacity) - .map_err(|e| VectorSearchError::IndexCreation(format!("Failed to reserve capacity: {}", e))) + self.index.reserve(capacity).map_err(|e| { + VectorSearchError::IndexCreation(format!("Failed to reserve capacity: {}", e)) + }) } /// Add a vector with a string key diff --git a/crates/vestige-core/src/storage/migrations.rs b/crates/vestige-core/src/storage/migrations.rs index b5325b4..370257c 100644 --- a/crates/vestige-core/src/storage/migrations.rs +++ b/crates/vestige-core/src/storage/migrations.rs @@ -49,6 +49,11 @@ pub const MIGRATIONS: &[Migration] = &[ description: "v2.0.0 Cognitive Leap: emotional memory, flashbulb encoding, temporal hierarchy", up: MIGRATION_V9_UP, }, + Migration { + version: 10, + description: "v2.0.5 Intentional Amnesia: active forgetting — top-down suppression (Anderson 2025 + Davis Rac1)", + up: MIGRATION_V10_UP, + }, ]; /// A database migration @@ -315,7 +320,7 @@ const MIGRATION_V4_UP: &str = r#" -- TEMPORAL KNOWLEDGE GRAPH (Like Zep's Graphiti) -- ============================================================================ --- DEPRECATED (v2.1.0): knowledge_edges is unused. All graph edges use +-- DEPRECATED (v2.0.5): knowledge_edges is unused. All graph edges use -- memory_connections (migration V3). This table was designed for bi-temporal -- edge support but was never wired. Retained for schema compatibility with -- existing databases. Do NOT add queries against this table. @@ -608,6 +613,41 @@ ALTER TABLE dream_history ADD COLUMN creative_connections_found INTEGER DEFAULT UPDATE schema_version SET version = 9, applied_at = datetime('now'); "#; +/// V10: v2.0.5 Intentional Amnesia — Top-Down Active Forgetting +/// +/// Adds columns to `knowledge_nodes` for user-initiated suppression distinct +/// from passive FSRS decay and from bottom-up retrieval-induced forgetting +/// (which lives on `memory_states.suppression_until`). These columns are +/// incremented by the `suppress` MCP tool (tool #24) and consumed by the +/// search scoring stage + background Rac1 cascade worker. +/// +/// References: +/// - Anderson et al. (2025). Brain mechanisms underlying the inhibitory +/// control of thought. Nat Rev Neurosci. DOI 10.1038/s41583-025-00929-y +/// - Cervantes-Sandoval & Davis (2020). Rac1 Impairs Forgetting-Induced +/// Cellular Plasticity. Front Cell Neurosci. PMC7477079 +const MIGRATION_V10_UP: &str = r#" +-- Top-down suppression count (Suppression-Induced Forgetting, Anderson 2025). +-- Compounds with each `suppress` call, saturates via the k × count formula +-- in active_forgetting::retrieval_penalty(). +ALTER TABLE knowledge_nodes ADD COLUMN suppression_count INTEGER DEFAULT 0; + +-- Timestamp of the most recent suppression. Used for the 24h labile window +-- (reversal is allowed only while (now - suppressed_at) < labile_hours). +ALTER TABLE knowledge_nodes ADD COLUMN suppressed_at TEXT; + +-- Partial indices — only materialise rows actually involved in suppression. +CREATE INDEX IF NOT EXISTS idx_nodes_suppression_count + ON knowledge_nodes(suppression_count) + WHERE suppression_count > 0; + +CREATE INDEX IF NOT EXISTS idx_nodes_suppressed_at + ON knowledge_nodes(suppressed_at) + WHERE suppressed_at IS NOT NULL; + +UPDATE schema_version SET version = 10, applied_at = datetime('now'); +"#; + /// Get current schema version from database pub fn get_current_version(conn: &rusqlite::Connection) -> rusqlite::Result { conn.query_row( diff --git a/crates/vestige-core/src/storage/sqlite.rs b/crates/vestige-core/src/storage/sqlite.rs index 244e2ec..7de250a 100644 --- a/crates/vestige-core/src/storage/sqlite.rs +++ b/crates/vestige-core/src/storage/sqlite.rs @@ -6,7 +6,7 @@ use chrono::{DateTime, Duration, Utc}; use directories::ProjectDirs; #[cfg(feature = "embeddings")] use lru::LruCache; -use rusqlite::{params, Connection, OptionalExtension}; +use rusqlite::{Connection, OptionalExtension, params}; #[cfg(feature = "embeddings")] use std::num::NonZeroUsize; use std::path::PathBuf; @@ -14,22 +14,20 @@ use std::sync::Mutex; use uuid::Uuid; use crate::fsrs::{ - retrievability_with_decay, DEFAULT_DECAY, - FSRSScheduler, FSRSState, LearningState, Rating, + DEFAULT_DECAY, FSRSScheduler, FSRSState, LearningState, Rating, retrievability_with_decay, }; +use crate::fts::sanitize_fts5_query; use crate::memory::{ - ConsolidationResult, IngestInput, KnowledgeNode, MemoryStats, - RecallInput, SearchMode, + ConsolidationResult, IngestInput, KnowledgeNode, MemoryStats, RecallInput, SearchMode, }; #[cfg(all(feature = "embeddings", feature = "vector-search"))] use crate::memory::{EmbeddingResult, MatchType, SearchResult, SimilarityResult}; -use crate::fts::sanitize_fts5_query; #[cfg(feature = "embeddings")] -use crate::embeddings::{matryoshka_truncate, Embedding, EmbeddingService, EMBEDDING_DIMENSIONS}; +use crate::embeddings::{EMBEDDING_DIMENSIONS, Embedding, EmbeddingService, matryoshka_truncate}; #[cfg(feature = "vector-search")] -use crate::search::{linear_combination, VectorIndex}; +use crate::search::{VectorIndex, linear_combination}; #[cfg(all(feature = "embeddings", feature = "vector-search"))] use crate::search::hyde; @@ -208,11 +206,12 @@ impl Storage { /// Load existing embeddings into vector index #[cfg(all(feature = "embeddings", feature = "vector-search"))] fn load_embeddings_into_index(&self) -> Result<()> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader - .prepare("SELECT node_id, embedding FROM node_embeddings")?; + let mut stmt = reader.prepare("SELECT node_id, embedding FROM node_embeddings")?; let embeddings: Vec<(String, Vec)> = stmt .query_map([], |row| Ok((row.get(0)?, row.get(1)?)))? @@ -243,7 +242,11 @@ impl Storage { } } if load_failures > 0 { - tracing::error!(count = load_failures, "Vector index: {} embeddings failed to load", load_failures); + tracing::error!( + count = load_failures, + "Vector index: {} embeddings failed to load", + load_failures + ); } Ok(()) @@ -254,7 +257,9 @@ impl Storage { let now = Utc::now(); let id = Uuid::new_v4().to_string(); - let fsrs_state = self.scheduler.lock() + let fsrs_state = self + .scheduler + .lock() .map_err(|_| StorageError::Init("Scheduler lock poisoned".into()))? .new_card(); @@ -271,7 +276,9 @@ impl Storage { let valid_until_str = input.valid_until.map(|dt| dt.to_rfc3339()); { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO knowledge_nodes ( @@ -335,10 +342,7 @@ impl Storage { /// /// This solves the "bad vs good similar memory" problem. #[cfg(all(feature = "embeddings", feature = "vector-search"))] - pub fn smart_ingest( - &self, - input: IngestInput, - ) -> Result { + pub fn smart_ingest(&self, input: IngestInput) -> Result { use crate::advanced::prediction_error::{ CandidateMemory, GateDecision, PredictionErrorGate, UpdateType, }; @@ -395,7 +399,12 @@ impl Storage { let decision = gate.evaluate(&input.content, &new_embedding.vector, &candidates); match decision { - GateDecision::Create { prediction_error, related_memory_ids, reason, .. } => { + GateDecision::Create { + prediction_error, + related_memory_ids, + reason, + .. + } => { // Create new memory let node = self.ingest(input)?; Ok(SmartIngestResult { @@ -407,16 +416,25 @@ impl Storage { reason: if related_memory_ids.is_empty() { format!("Created new memory: {:?}", reason) } else { - format!("Created new memory: {:?}. Semantically similar (not linked): {:?}", reason, related_memory_ids) + format!( + "Created new memory: {:?}. Semantically similar (not linked): {:?}", + reason, related_memory_ids + ) }, }) } - GateDecision::Update { target_id, similarity, update_type, prediction_error } => { + GateDecision::Update { + target_id, + similarity, + update_type, + prediction_error, + } => { match update_type { UpdateType::Reinforce => { // Just strengthen the existing memory self.strengthen_on_access(&target_id)?; - let node = self.get_node(&target_id)? + let node = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; Ok(SmartIngestResult { decision: "reinforce".to_string(), @@ -424,12 +442,14 @@ impl Storage { superseded_id: None, similarity: Some(similarity), prediction_error: Some(prediction_error), - reason: "Content nearly identical - reinforced existing memory".to_string(), + reason: "Content nearly identical - reinforced existing memory" + .to_string(), }) } UpdateType::Merge | UpdateType::Append => { // Update the existing memory with merged content - let existing = self.get_node(&target_id)? + let existing = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; let merged_content = format!( @@ -442,7 +462,8 @@ impl Storage { self.update_node_content(&target_id, &merged_content)?; self.strengthen_on_access(&target_id)?; - let node = self.get_node(&target_id)? + let node = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; Ok(SmartIngestResult { @@ -457,7 +478,8 @@ impl Storage { UpdateType::Replace => { // Replace content entirely self.update_node_content(&target_id, &input.content)?; - let node = self.get_node(&target_id)? + let node = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; Ok(SmartIngestResult { @@ -471,17 +493,16 @@ impl Storage { } UpdateType::AddContext => { // Add as context without modifying main content - let existing = self.get_node(&target_id)? + let existing = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; - let merged_content = format!( - "{}\n\n---\nContext: {}", - existing.content, - input.content - ); + let merged_content = + format!("{}\n\n---\nContext: {}", existing.content, input.content); self.update_node_content(&target_id, &merged_content)?; - let node = self.get_node(&target_id)? + let node = self + .get_node(&target_id)? .ok_or_else(|| StorageError::NotFound(target_id.clone()))?; Ok(SmartIngestResult { @@ -495,7 +516,12 @@ impl Storage { } } } - GateDecision::Supersede { old_memory_id, similarity, supersede_reason, prediction_error } => { + GateDecision::Supersede { + old_memory_id, + similarity, + supersede_reason, + prediction_error, + } => { // Demote the old memory and create new self.demote_memory(&old_memory_id)?; @@ -511,7 +537,11 @@ impl Storage { reason: format!("New memory supersedes old: {:?}", supersede_reason), }) } - GateDecision::Merge { memory_ids, avg_similarity, strategy } => { + GateDecision::Merge { + memory_ids, + avg_similarity, + strategy, + } => { // For now, create new and link to existing let node = self.ingest(input)?; @@ -521,7 +551,11 @@ impl Storage { superseded_id: None, similarity: Some(avg_similarity), prediction_error: Some(1.0 - avg_similarity), - reason: format!("Created new memory linked to {} similar memories ({:?})", memory_ids.len(), strategy), + reason: format!( + "Created new memory linked to {} similar memories ({:?})", + memory_ids.len(), + strategy + ), }) } } @@ -530,28 +564,29 @@ impl Storage { /// Get the embedding vector for a node #[cfg(all(feature = "embeddings", feature = "vector-search"))] pub fn get_node_embedding(&self, node_id: &str) -> Result>> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT embedding FROM node_embeddings WHERE node_id = ?1" - )?; + let mut stmt = + reader.prepare("SELECT embedding FROM node_embeddings WHERE node_id = ?1")?; let embedding_bytes: Option> = stmt .query_row(params![node_id], |row| row.get(0)) .optional()?; - Ok(embedding_bytes.and_then(|bytes| { - crate::embeddings::Embedding::from_bytes(&bytes).map(|e| e.vector) - })) + Ok(embedding_bytes + .and_then(|bytes| crate::embeddings::Embedding::from_bytes(&bytes).map(|e| e.vector))) } /// Get all embedding vectors for duplicate detection #[cfg(all(feature = "embeddings", feature = "vector-search"))] pub fn get_all_embeddings(&self) -> Result)>> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader - .prepare("SELECT node_id, embedding FROM node_embeddings")?; + let mut stmt = reader.prepare("SELECT node_id, embedding FROM node_embeddings")?; let results: Vec<(String, Vec)> = stmt .query_map([], |row| { @@ -561,8 +596,7 @@ impl Storage { })? .filter_map(|r| r.ok()) .filter_map(|(id, bytes)| { - crate::embeddings::Embedding::from_bytes(&bytes) - .map(|e| (id, e.vector)) + crate::embeddings::Embedding::from_bytes(&bytes).map(|e| (id, e.vector)) }) .collect(); @@ -574,7 +608,9 @@ impl Storage { let now = Utc::now(); { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET content = ?1, updated_at = ?2 WHERE id = ?3", @@ -613,7 +649,9 @@ impl Storage { let now = Utc::now(); { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO node_embeddings (node_id, embedding, dimensions, model, created_at) @@ -646,14 +684,13 @@ impl Storage { /// Get a node by ID pub fn get_node(&self, id: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader - .prepare("SELECT * FROM knowledge_nodes WHERE id = ?1")?; + let mut stmt = reader.prepare("SELECT * FROM knowledge_nodes WHERE id = ?1")?; - let node = stmt - .query_row(params![id], Self::row_to_node) - .optional()?; + let node = stmt.query_row(params![id], Self::row_to_node).optional()?; Ok(node) } @@ -717,6 +754,15 @@ impl Storage { let has_embedding: Option = row.get("has_embedding").ok(); let embedding_model: Option = row.get("embedding_model").ok().flatten(); + // v2.0.5 Active Forgetting columns (Migration V10) + let suppression_count: i32 = row.get("suppression_count").unwrap_or(0); + let suppressed_at_str: Option = row.get("suppressed_at").ok().flatten(); + let suppressed_at = suppressed_at_str.and_then(|s| { + DateTime::parse_from_rfc3339(&s) + .map(|dt| dt.with_timezone(&Utc)) + .ok() + }); + Ok(KnowledgeNode { id: row.get("id")?, content: row.get("content")?, @@ -746,7 +792,13 @@ impl Storage { times_useful: row.get("times_useful").ok(), emotional_valence: row.get("emotional_valence").ok(), flashbulb: row.get::<_, Option>("flashbulb").ok().flatten(), - temporal_level: row.get::<_, Option>("temporal_level").ok().flatten(), + temporal_level: row + .get::<_, Option>("temporal_level") + .ok() + .flatten(), + // v2.0.5 Active Forgetting + suppression_count, + suppressed_at, }) } @@ -787,7 +839,9 @@ impl Storage { ) -> Result> { let sanitized_query = sanitize_fts5_query(query); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT n.* FROM knowledge_nodes n @@ -831,7 +885,9 @@ impl Storage { scheduled_days: 0, }; - let scheduler = self.scheduler.lock() + let scheduler = self + .scheduler + .lock() .map_err(|_| StorageError::Init("Scheduler lock poisoned".into()))?; let elapsed_days = scheduler.days_since_review(¤t_state.last_review); @@ -841,8 +897,7 @@ impl Storage { None }; - let result = scheduler - .review(¤t_state, rating, elapsed_days, sentiment_boost); + let result = scheduler.review(¤t_state, rating, elapsed_days, sentiment_boost); drop(scheduler); let now = Utc::now(); @@ -859,7 +914,9 @@ impl Storage { (new_retrieval_strength * 0.7) + ((new_storage_strength / 10.0).min(1.0) * 0.3); { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET @@ -907,7 +964,9 @@ impl Storage { // Primary boost on the accessed node { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET @@ -942,7 +1001,9 @@ impl Storage { drop(index); if let Ok(neighbors) = neighbors_result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; for (neighbor_id, similarity) in neighbors { if neighbor_id == id || similarity < 0.7 { @@ -981,7 +1042,9 @@ impl Storage { /// /// Increments `times_useful` and recomputes `utility_score = times_useful / times_retrieved`. pub fn mark_memory_useful(&self, id: &str) -> Result<()> { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET @@ -999,7 +1062,9 @@ impl Storage { /// Log a memory access event for ACT-R activation computation fn log_access(&self, node_id: &str, access_type: &str) -> Result<()> { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO memory_access_log (node_id, access_type, accessed_at) @@ -1017,7 +1082,9 @@ impl Storage { // Strong boost: +0.2 retrieval, +0.1 retention { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET @@ -1047,7 +1114,9 @@ impl Storage { // Strong penalty: -0.3 retrieval, -0.15 retention, halve stability { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET @@ -1066,11 +1135,218 @@ impl Storage { .ok_or_else(|| StorageError::NotFound(id.to_string())) } + // ======================================================================== + // Active Forgetting (v2.0.5 — Anderson 2025 + Davis Rac1) + // ======================================================================== + + /// Top-down memory suppression (Suppression-Induced Forgetting). + /// + /// Distinct from `delete` (which removes the row) and from + /// `demote_memory` (which is a single thumb-down hit). Each call + /// compounds: `suppression_count` is incremented, `suppressed_at` is + /// bumped to now, and FSRS state is dealt a strong blow: + /// + /// - `retrieval_strength -= 0.35` (stronger than demote's -0.30) + /// - `retention_strength -= 0.20` + /// - `stability *= 0.4` + /// + /// Reversible within a 24-hour labile window via + /// [`Self::reverse_suppression`]. + /// + /// Reference: Anderson et al. (2025). Brain mechanisms underlying the + /// inhibitory control of thought. *Nature Reviews Neuroscience*. + /// DOI: 10.1038/s41583-025-00929-y + pub fn suppress_memory(&self, id: &str) -> Result { + let now = Utc::now(); + { + let writer = self + .writer + .lock() + .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; + writer.execute( + "UPDATE knowledge_nodes SET + last_accessed = ?1, + suppression_count = COALESCE(suppression_count, 0) + 1, + suppressed_at = ?1, + retrieval_strength = MAX(0.05, retrieval_strength - 0.35), + retention_strength = MAX(0.05, retention_strength - 0.20), + stability = stability * 0.4 + WHERE id = ?2", + params![now.to_rfc3339(), id], + )?; + } + + let _ = self.log_access(id, "suppress"); + + self.get_node(id)? + .ok_or_else(|| StorageError::NotFound(id.to_string())) + } + + /// Reverse a previous suppression if within the 24-hour labile window. + /// + /// Returns `Err(StorageError::NotFound)` if the memory has never been + /// suppressed, or `Err(StorageError::Init)` with a "labile window expired" + /// message if more than `labile_hours` have passed. Matches Nader + /// reconsolidation semantics on a 24h axis. + pub fn reverse_suppression(&self, id: &str, labile_hours: i64) -> Result { + let node = self + .get_node(id)? + .ok_or_else(|| StorageError::NotFound(id.to_string()))?; + + let suppressed_at = node.suppressed_at.ok_or_else(|| { + StorageError::Init(format!( + "memory {} has no active suppression to reverse", + id + )) + })?; + + let elapsed = Utc::now() - suppressed_at; + if elapsed >= chrono::Duration::hours(labile_hours) { + return Err(StorageError::Init(format!( + "labile window expired ({}h since suppression; limit {}h)", + elapsed.num_hours(), + labile_hours + ))); + } + + { + let writer = self + .writer + .lock() + .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; + writer.execute( + "UPDATE knowledge_nodes SET + suppression_count = MAX(0, COALESCE(suppression_count, 0) - 1), + suppressed_at = CASE + WHEN COALESCE(suppression_count, 0) - 1 <= 0 THEN NULL + ELSE suppressed_at + END, + retrieval_strength = MIN(1.0, retrieval_strength + 0.15), + retention_strength = MIN(1.0, retention_strength + 0.10), + stability = stability * 1.25 + WHERE id = ?1", + params![id], + )?; + } + + let _ = self.log_access(id, "reverse_suppress"); + + self.get_node(id)? + .ok_or_else(|| StorageError::NotFound(id.to_string())) + } + + /// Count memories currently in a suppressed state (suppression_count > 0). + pub fn count_suppressed(&self) -> Result { + let reader = self + .reader + .lock() + .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; + let count: i64 = reader.query_row( + "SELECT COUNT(*) FROM knowledge_nodes WHERE COALESCE(suppression_count, 0) > 0", + [], + |row| row.get(0), + )?; + Ok(count.max(0) as usize) + } + + /// Fetch memories suppressed within the last `window_hours` (still within + /// the labile window). Used by the Rac1 cascade sweep. + pub fn get_recently_suppressed(&self, window_hours: i64) -> Result> { + let cutoff = (Utc::now() - chrono::Duration::hours(window_hours)).to_rfc3339(); + let reader = self + .reader + .lock() + .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; + let mut stmt = reader.prepare( + "SELECT * FROM knowledge_nodes + WHERE suppressed_at IS NOT NULL AND suppressed_at >= ?1", + )?; + let rows = stmt.query_map(params![cutoff], Self::row_to_node)?; + let mut result = Vec::new(); + for row in rows { + result.push(row?); + } + Ok(result) + } + + /// Apply one-hop Rac1 cascade from a single suppressed seed memory: + /// walk `memory_connections` edges and attenuate neighbor FSRS state + /// proportional to edge strength. + /// + /// Returns the number of neighbors affected. + /// + /// Reference: Cervantes-Sandoval & Davis (2020). Rac1 Impairs Forgetting- + /// Induced Cellular Plasticity in Mushroom Body Output Neurons. + /// *Front Cell Neurosci*. PMC7477079 + pub fn apply_rac1_cascade(&self, seed_id: &str) -> Result { + use crate::neuroscience::active_forgetting::ActiveForgettingSystem; + let sys = ActiveForgettingSystem::new(); + + let edges = self.get_connections_for_memory(seed_id)?; + if edges.is_empty() { + return Ok(0); + } + + let writer = self + .writer + .lock() + .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; + + let mut affected = 0usize; + for edge in edges.iter().take(100) { + let neighbor_id = if edge.source_id == seed_id { + &edge.target_id + } else { + &edge.source_id + }; + + // Never cascade back into the suppressed seed + if neighbor_id == seed_id { + continue; + } + + let stability_factor = sys.cascade_stability_factor(edge.strength); + let retrieval_decrement = sys.cascade_retrieval_decrement(edge.strength); + + let rows = writer.execute( + "UPDATE knowledge_nodes SET + stability = MAX(0.1, stability * ?1), + retrieval_strength = MAX(0.05, retrieval_strength - ?2) + WHERE id = ?3 AND COALESCE(suppression_count, 0) = 0", + params![stability_factor, retrieval_decrement, neighbor_id], + )?; + affected += rows; + } + + Ok(affected) + } + + /// Sweep all recently-suppressed memories and apply Rac1 cascade to each. + /// Intended to run from the background consolidation loop every tick. + /// + /// Returns `(seeds_processed, neighbors_affected)`. + pub fn run_rac1_cascade_sweep(&self) -> Result<(usize, usize)> { + // 72h keeps the cascade window slightly longer than the 24h labile + // reversibility window — so suppressions that lock in continue to + // propagate for 48h after they become irreversible. + let seeds = self.get_recently_suppressed(72)?; + let mut total_affected = 0usize; + for seed in &seeds { + match self.apply_rac1_cascade(&seed.id) { + Ok(n) => total_affected += n, + Err(e) => tracing::warn!("Rac1 cascade failed for {}: {}", seed.id, e), + } + } + Ok((seeds.len(), total_affected)) + } + /// Get memories due for review pub fn get_review_queue(&self, limit: i32) -> Result> { let now = Utc::now().to_rfc3339(); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM knowledge_nodes @@ -1110,7 +1386,9 @@ impl Storage { scheduled_days: 0, }; - let scheduler = self.scheduler.lock() + let scheduler = self + .scheduler + .lock() .map_err(|_| StorageError::Init("Scheduler lock poisoned".into()))?; let elapsed_days = scheduler.days_since_review(¤t_state.last_review); @@ -1121,12 +1399,13 @@ impl Storage { pub fn get_stats(&self) -> Result { let now = Utc::now().to_rfc3339(); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let total: i64 = - reader - .query_row("SELECT COUNT(*) FROM knowledge_nodes", [], |row| row.get(0))?; + reader.query_row("SELECT COUNT(*) FROM knowledge_nodes", [], |row| row.get(0))?; let due: i64 = reader.query_row( "SELECT COUNT(*) FROM knowledge_nodes WHERE next_review <= ?1", @@ -1199,17 +1478,19 @@ impl Storage { /// Delete a node pub fn delete_node(&self, id: &str) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; - let rows = writer - .execute("DELETE FROM knowledge_nodes WHERE id = ?1", params![id])?; + let rows = writer.execute("DELETE FROM knowledge_nodes WHERE id = ?1", params![id])?; // Clean up vector index to prevent stale search results #[cfg(all(feature = "embeddings", feature = "vector-search"))] if rows > 0 - && let Ok(mut index) = self.vector_index.lock() { - let _ = index.remove(id); - } + && let Ok(mut index) = self.vector_index.lock() + { + let _ = index.remove(id); + } Ok(rows > 0) } @@ -1218,7 +1499,9 @@ impl Storage { pub fn search(&self, query: &str, limit: i32) -> Result> { let sanitized_query = sanitize_fts5_query(query); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT n.* FROM knowledge_nodes n @@ -1239,7 +1522,9 @@ impl Storage { /// Get all nodes (paginated) pub fn get_all_nodes(&self, limit: i32, offset: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM knowledge_nodes @@ -1266,7 +1551,9 @@ impl Storage { tag_filter: Option<&str>, limit: i32, ) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; match tag_filter { Some(tag) => { @@ -1337,7 +1624,9 @@ impl Storage { fn get_query_embedding(&self, query: &str) -> Result> { // Check cache first { - let mut cache = self.query_cache.lock() + let mut cache = self + .query_cache + .lock() .map_err(|_| StorageError::Init("Query cache lock poisoned".to_string()))?; if let Some(cached) = cache.get(query) { return Ok(cached.clone()); @@ -1345,12 +1634,16 @@ impl Storage { } // Not in cache, compute embedding - let embedding = self.embedding_service.embed(query) + let embedding = self + .embedding_service + .embed(query) .map_err(|e| StorageError::Init(format!("Failed to embed query: {}", e)))?; // Store in cache { - let mut cache = self.query_cache.lock() + let mut cache = self + .query_cache + .lock() .map_err(|_| StorageError::Init("Query cache lock poisoned".to_string()))?; cache.put(query.to_string(), embedding.vector.clone()); } @@ -1440,7 +1733,12 @@ impl Storage { }; let combined = if !semantic_results.is_empty() { - linear_combination(&keyword_results, &semantic_results, keyword_weight, semantic_weight) + linear_combination( + &keyword_results, + &semantic_results, + keyword_weight, + semantic_weight, + ) } else { keyword_results.clone() }; @@ -1505,12 +1803,16 @@ impl Storage { // ACT-R activation as importance signal (pre-computed during consolidation) let activation: f64 = self - .reader.lock() - .map(|r| r.query_row( - "SELECT COALESCE(activation, 0.0) FROM knowledge_nodes WHERE id = ?1", - params![result.node.id], - |row| row.get(0), - ).unwrap_or(0.0)) + .reader + .lock() + .map(|r| { + r.query_row( + "SELECT COALESCE(activation, 0.0) FROM knowledge_nodes WHERE id = ?1", + params![result.node.id], + |row| row.get(0), + ) + .unwrap_or(0.0) + }) .unwrap_or(0.0); // Normalize ACT-R activation [-2, 5] → [0, 1] let importance = ((activation + 2.0) / 7.0).clamp(0.0, 1.0); @@ -1548,9 +1850,8 @@ impl Storage { if let Some(includes) = include_types { if !includes.is_empty() { - let placeholders: Vec = (0..includes.len()) - .map(|i| format!("?{}", i + 3)) - .collect(); + let placeholders: Vec = + (0..includes.len()).map(|i| format!("?{}", i + 3)).collect(); type_clause = format!(" AND n.node_type IN ({})", placeholders.join(",")); type_values = includes.iter().map(|s| s.as_str()).collect(); } else { @@ -1558,9 +1859,8 @@ impl Storage { } } else if let Some(excludes) = exclude_types { if !excludes.is_empty() { - let placeholders: Vec = (0..excludes.len()) - .map(|i| format!("?{}", i + 3)) - .collect(); + let placeholders: Vec = + (0..excludes.len()).map(|i| format!("?{}", i + 3)).collect(); type_clause = format!(" AND n.node_type NOT IN ({})", placeholders.join(",")); type_values = excludes.iter().map(|s| s.as_str()).collect(); } else { @@ -1579,7 +1879,9 @@ impl Storage { type_clause ); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare(&sql)?; @@ -1671,7 +1973,9 @@ impl Storage { let mut result = EmbeddingResult::default(); let nodes: Vec<(String, String)> = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; if let Some(ids) = node_ids { let placeholders = ids.iter().map(|_| "?").collect::>().join(","); @@ -1696,8 +2000,7 @@ impl Storage { } result_nodes } else if force { - let mut stmt = reader - .prepare("SELECT id, content FROM knowledge_nodes")?; + let mut stmt = reader.prepare("SELECT id, content FROM knowledge_nodes")?; let rows = stmt.query_map([], |row| { Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)) })?; @@ -1717,7 +2020,8 @@ impl Storage { for (id, content) in nodes { if !force { let has_emb: i32 = self - .reader.lock() + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))? .query_row( "SELECT COALESCE(has_embedding, 0) FROM knowledge_nodes WHERE id = ?1", @@ -1752,7 +2056,9 @@ impl Storage { ) -> Result> { let timestamp = point_in_time.to_rfc3339(); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM knowledge_nodes @@ -1821,7 +2127,9 @@ impl Storage { ), }; - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare(query)?; let params_refs: Vec<&dyn rusqlite::ToSql> = params.iter().map(|p| p.as_ref()).collect(); @@ -1852,7 +2160,9 @@ impl Storage { loop { // Read batch using reader let batch: Vec<(String, String, f64, f64, f64, f64)> = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; reader .prepare( @@ -1884,7 +2194,9 @@ impl Storage { // Write batch using writer transaction { - let mut writer = self.writer.lock() + let mut writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let tx = writer.transaction()?; @@ -1900,12 +2212,12 @@ impl Storage { let effective_stability = stability * (1.0 + sentiment_mag * 0.5); // Real FSRS-6 retrievability with personalized w20 - let new_retrieval = retrievability_with_decay( - effective_stability, days_since, w20, - ); + let new_retrieval = + retrievability_with_decay(effective_stability, days_since, w20); // Use SleepConsolidation for retention calculation - let new_retention = sleep.calculate_retention(*storage_strength, new_retrieval); + let new_retention = + sleep.calculate_retention(*storage_strength, new_retrieval); tx.execute( "UPDATE knowledge_nodes SET retrieval_strength = ?1, retention_strength = ?2 WHERE id = ?3", @@ -1926,7 +2238,9 @@ impl Storage { /// Read personalized w20 from fsrs_config table fn get_fsrs_w20(&self) -> Result { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; reader .query_row( @@ -1960,20 +2274,24 @@ impl Storage { let mut promoted = 0i64; { let candidates: Vec<(String, f64, f64)> = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; reader .prepare( "SELECT id, sentiment_magnitude, storage_strength FROM knowledge_nodes - WHERE storage_strength < 10.0" + WHERE storage_strength < 10.0", )? .query_map([], |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?)))? .filter_map(|r| r.ok()) .collect() }; - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; for (id, sentiment_mag, storage_strength) in &candidates { if sleep.should_promote(*sentiment_mag, *storage_strength) { @@ -2088,24 +2406,25 @@ impl Storage { { let service = crate::neuroscience::memory_states::StateUpdateService::new(); let all_nodes = self.get_all_nodes(500, 0).unwrap_or_default(); - let mut lifecycles: Vec = all_nodes - .iter() - .map(|n| { - let mut lc = crate::neuroscience::memory_states::MemoryLifecycle::new(); - lc.last_access = n.last_accessed; - lc.access_count = n.reps as u32; - lc.state = if n.retention_strength > 0.7 { - crate::neuroscience::memory_states::MemoryState::Active - } else if n.retention_strength > 0.3 { - crate::neuroscience::memory_states::MemoryState::Dormant - } else if n.retention_strength > 0.1 { - crate::neuroscience::memory_states::MemoryState::Silent - } else { - crate::neuroscience::memory_states::MemoryState::Unavailable - }; - lc - }) - .collect(); + let mut lifecycles: Vec = + all_nodes + .iter() + .map(|n| { + let mut lc = crate::neuroscience::memory_states::MemoryLifecycle::new(); + lc.last_access = n.last_accessed; + lc.access_count = n.reps as u32; + lc.state = if n.retention_strength > 0.7 { + crate::neuroscience::memory_states::MemoryState::Active + } else if n.retention_strength > 0.3 { + crate::neuroscience::memory_states::MemoryState::Dormant + } else if n.retention_strength > 0.1 { + crate::neuroscience::memory_states::MemoryState::Silent + } else { + crate::neuroscience::memory_states::MemoryState::Unavailable + }; + lc + }) + .collect(); let batch_result = service.batch_update(&mut lifecycles); _state_transitions = batch_result.total_transitions as i64; } @@ -2141,11 +2460,12 @@ impl Storage { // 16. FTS5 index optimization — merge segments for faster keyword search // 17. Run PRAGMA optimize to refresh query planner statistics { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; - let _ = writer.execute_batch( - "INSERT INTO knowledge_fts(knowledge_fts) VALUES('optimize');" - ); + let _ = writer + .execute_batch("INSERT INTO knowledge_fts(knowledge_fts) VALUES('optimize');"); let _ = writer.execute_batch("PRAGMA optimize;"); } @@ -2191,7 +2511,9 @@ impl Storage { // Record consolidation history { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let _ = writer.execute( "INSERT INTO consolidation_history (completed_at, duration_ms, memories_replayed, duplicates_merged, activations_computed, w20_optimized) @@ -2249,8 +2571,10 @@ impl Storage { if consumed.contains(&all_embeddings[j].0) { continue; } - let sim = - crate::embeddings::cosine_similarity(&all_embeddings[i].1, &all_embeddings[j].1); + let sim = crate::embeddings::cosine_similarity( + &all_embeddings[i].1, + &all_embeddings[j].1, + ); if sim >= SIMILARITY_THRESHOLD { cluster.push((j, sim)); } @@ -2262,7 +2586,9 @@ impl Storage { // Find the strongest node (highest retention_strength) let anchor_id = &all_embeddings[i].0; - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let anchor_retention: f64 = reader .query_row( @@ -2358,7 +2684,9 @@ impl Storage { let now = Utc::now(); let node_ids: Vec = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; reader .prepare("SELECT DISTINCT node_id FROM memory_access_log")? @@ -2372,7 +2700,9 @@ impl Storage { } let mut count = 0i64; - let mut writer = self.writer.lock() + let mut writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let tx = writer.transaction()?; @@ -2418,7 +2748,9 @@ impl Storage { /// Prune old access log entries (keep last 90 days) fn prune_access_log(&self) -> Result { let cutoff = (Utc::now() - Duration::days(90)).to_rfc3339(); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let deleted = writer.execute( "DELETE FROM memory_access_log WHERE accessed_at < ?1", @@ -2432,15 +2764,15 @@ impl Storage { fn optimize_w20_if_ready(&self) -> Result> { use crate::fsrs::{FSRSOptimizer, ReviewLog}; - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let access_count: i64 = reader - .query_row( - "SELECT COUNT(*) FROM memory_access_log", - [], - |row| row.get(0), - ) + .query_row("SELECT COUNT(*) FROM memory_access_log", [], |row| { + row.get(0) + }) .unwrap_or(0); if access_count < 100 { @@ -2508,7 +2840,9 @@ impl Storage { // Save to config { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO fsrs_config (key, value, updated_at) @@ -2517,7 +2851,10 @@ impl Storage { )?; } - tracing::info!(w20 = optimized_w20, "Personalized w20 optimized from access history"); + tracing::info!( + w20 = optimized_w20, + "Personalized w20 optimized from access history" + ); Ok(Some(optimized_w20)) } @@ -2526,13 +2863,16 @@ impl Storage { #[cfg(all(feature = "embeddings", feature = "vector-search"))] fn generate_missing_embeddings(&self) -> Result { if !self.embedding_service.is_ready() - && let Err(e) = self.embedding_service.init() { - tracing::warn!("Could not initialize embedding model: {}", e); - return Ok(0); - } + && let Err(e) = self.embedding_service.init() + { + tracing::warn!("Could not initialize embedding model: {}", e); + return Ok(0); + } let nodes: Vec<(String, String)> = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; reader .prepare( @@ -2569,7 +2909,7 @@ pub struct IntentionRecord { pub id: String, pub content: String, pub trigger_type: String, - pub trigger_data: String, // JSON + pub trigger_data: String, // JSON pub priority: i32, pub status: String, pub created_at: DateTime, @@ -2633,7 +2973,7 @@ pub struct ConnectionRecord { #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct MemoryStateRecord { pub memory_id: String, - pub state: String, // 'active', 'dormant', 'silent', 'unavailable' + pub state: String, // 'active', 'dormant', 'silent', 'unavailable' pub last_access: DateTime, pub access_count: i32, pub state_entered_at: DateTime, @@ -2694,9 +3034,12 @@ impl Storage { /// Save an intention to the database pub fn save_intention(&self, intention: &IntentionRecord) -> Result<()> { let tags_json = serde_json::to_string(&intention.tags).unwrap_or_else(|_| "[]".to_string()); - let related_json = serde_json::to_string(&intention.related_memories).unwrap_or_else(|_| "[]".to_string()); + let related_json = + serde_json::to_string(&intention.related_memories).unwrap_or_else(|_| "[]".to_string()); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO intentions ( @@ -2729,11 +3072,11 @@ impl Storage { /// Get an intention by ID pub fn get_intention(&self, id: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM intentions WHERE id = ?1" - )?; + let mut stmt = reader.prepare("SELECT * FROM intentions WHERE id = ?1")?; stmt.query_row(params![id], Self::row_to_intention) .optional() @@ -2742,7 +3085,9 @@ impl Storage { /// Get all active intentions pub fn get_active_intentions(&self) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM intentions WHERE status = 'active' ORDER BY priority DESC, created_at ASC" @@ -2758,10 +3103,12 @@ impl Storage { /// Get intentions by status pub fn get_intentions_by_status(&self, status: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( - "SELECT * FROM intentions WHERE status = ?1 ORDER BY priority DESC, created_at ASC" + "SELECT * FROM intentions WHERE status = ?1 ORDER BY priority DESC, created_at ASC", )?; let rows = stmt.query_map(params![status], Self::row_to_intention)?; @@ -2775,9 +3122,15 @@ impl Storage { /// Update intention status pub fn update_intention_status(&self, id: &str, status: &str) -> Result { let now = Utc::now(); - let fulfilled_at = if status == "fulfilled" { Some(now.to_rfc3339()) } else { None }; + let fulfilled_at = if status == "fulfilled" { + Some(now.to_rfc3339()) + } else { + None + }; - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE intentions SET status = ?1, fulfilled_at = ?2 WHERE id = ?3", @@ -2788,7 +3141,9 @@ impl Storage { /// Delete an intention pub fn delete_intention(&self, id: &str) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute("DELETE FROM intentions WHERE id = ?1", params![id])?; Ok(rows > 0) @@ -2797,7 +3152,9 @@ impl Storage { /// Get overdue intentions pub fn get_overdue_intentions(&self) -> Result> { let now = Utc::now().to_rfc3339(); - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM intentions WHERE status = 'active' AND deadline IS NOT NULL AND deadline < ?1 ORDER BY deadline ASC" @@ -2813,7 +3170,9 @@ impl Storage { /// Snooze an intention pub fn snooze_intention(&self, id: &str, until: DateTime) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE intentions SET status = 'snoozed', snoozed_until = ?1 WHERE id = ?2", @@ -2829,7 +3188,11 @@ impl Storage { let related: Vec = serde_json::from_str(&related_json).unwrap_or_default(); let parse_opt_dt = |s: Option| -> Option> { - s.and_then(|v| DateTime::parse_from_rfc3339(&v).ok().map(|dt| dt.with_timezone(&Utc))) + s.and_then(|v| { + DateTime::parse_from_rfc3339(&v) + .ok() + .map(|dt| dt.with_timezone(&Utc)) + }) }; Ok(IntentionRecord { @@ -2861,10 +3224,13 @@ impl Storage { /// Save an insight to the database pub fn save_insight(&self, insight: &InsightRecord) -> Result<()> { - let source_json = serde_json::to_string(&insight.source_memories).unwrap_or_else(|_| "[]".to_string()); + let source_json = + serde_json::to_string(&insight.source_memories).unwrap_or_else(|_| "[]".to_string()); let tags_json = serde_json::to_string(&insight.tags).unwrap_or_else(|_| "[]".to_string()); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO insights ( @@ -2889,11 +3255,12 @@ impl Storage { /// Get insights with optional limit pub fn get_insights(&self, limit: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM insights ORDER BY generated_at DESC LIMIT ?1" - )?; + let mut stmt = + reader.prepare("SELECT * FROM insights ORDER BY generated_at DESC LIMIT ?1")?; let rows = stmt.query_map(params![limit], Self::row_to_insight)?; let mut result = Vec::new(); @@ -2905,11 +3272,12 @@ impl Storage { /// Get insights without feedback (pending review) pub fn get_pending_insights(&self) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM insights WHERE feedback IS NULL ORDER BY novelty_score DESC" - )?; + let mut stmt = reader + .prepare("SELECT * FROM insights WHERE feedback IS NULL ORDER BY novelty_score DESC")?; let rows = stmt.query_map([], Self::row_to_insight)?; let mut result = Vec::new(); @@ -2921,7 +3289,9 @@ impl Storage { /// Mark insight feedback pub fn mark_insight_feedback(&self, id: &str, feedback: &str) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE insights SET feedback = ?1 WHERE id = ?2", @@ -2932,7 +3302,9 @@ impl Storage { /// Clear all insights pub fn clear_insights(&self) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let count: i32 = writer.query_row("SELECT COUNT(*) FROM insights", [], |row| row.get(0))?; writer.execute("DELETE FROM insights", [])?; @@ -2967,7 +3339,9 @@ impl Storage { /// Save a memory connection pub fn save_connection(&self, connection: &ConnectionRecord) -> Result<()> { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO memory_connections ( @@ -2988,7 +3362,9 @@ impl Storage { /// Get connections for a memory pub fn get_connections_for_memory(&self, memory_id: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM memory_connections WHERE source_id = ?1 OR target_id = ?1 ORDER BY strength DESC" @@ -3004,11 +3380,11 @@ impl Storage { /// Get all connections (for building activation network) pub fn get_all_connections(&self) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM memory_connections ORDER BY strength DESC" - )?; + let mut stmt = reader.prepare("SELECT * FROM memory_connections ORDER BY strength DESC")?; let rows = stmt.query_map([], Self::row_to_connection)?; let mut result = Vec::new(); @@ -3019,9 +3395,16 @@ impl Storage { } /// Strengthen a connection - pub fn strengthen_connection(&self, source_id: &str, target_id: &str, boost: f64) -> Result { + pub fn strengthen_connection( + &self, + source_id: &str, + target_id: &str, + boost: f64, + ) -> Result { let now = Utc::now().to_rfc3339(); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE memory_connections SET @@ -3036,7 +3419,9 @@ impl Storage { /// Apply decay to all connections pub fn apply_connection_decay(&self, decay_factor: f64) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE memory_connections SET strength = strength * ?1", @@ -3047,7 +3432,9 @@ impl Storage { /// Prune weak connections below threshold pub fn prune_weak_connections(&self, min_strength: f64) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "DELETE FROM memory_connections WHERE strength < ?1", @@ -3078,9 +3465,12 @@ impl Storage { /// Save or update memory state pub fn save_memory_state(&self, state: &MemoryStateRecord) -> Result<()> { - let suppressed_json = serde_json::to_string(&state.suppressed_by).unwrap_or_else(|_| "[]".to_string()); + let suppressed_json = + serde_json::to_string(&state.suppressed_by).unwrap_or_else(|_| "[]".to_string()); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT OR REPLACE INTO memory_states ( @@ -3102,11 +3492,11 @@ impl Storage { /// Get memory state pub fn get_memory_state(&self, memory_id: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM memory_states WHERE memory_id = ?1" - )?; + let mut stmt = reader.prepare("SELECT * FROM memory_states WHERE memory_id = ?1")?; stmt.query_row(params![memory_id], Self::row_to_memory_state) .optional() @@ -3115,11 +3505,11 @@ impl Storage { /// Get memories by state pub fn get_memories_by_state(&self, state: &str) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT memory_id FROM memory_states WHERE state = ?1" - )?; + let mut stmt = reader.prepare("SELECT memory_id FROM memory_states WHERE state = ?1")?; let rows = stmt.query_map(params![state], |row| row.get::<_, String>(0))?; let mut result = Vec::new(); @@ -3130,13 +3520,20 @@ impl Storage { } /// Update memory state - pub fn update_memory_state(&self, memory_id: &str, new_state: &str, reason: &str) -> Result { + pub fn update_memory_state( + &self, + memory_id: &str, + new_state: &str, + reason: &str, + ) -> Result { let now = Utc::now(); // Get old state for transition record if let Some(old_record) = self.get_memory_state(memory_id)? { // Record state transition - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO state_transitions (memory_id, from_state, to_state, reason_type, timestamp) @@ -3145,7 +3542,9 @@ impl Storage { )?; } - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let rows = writer.execute( "UPDATE memory_states SET state = ?1, state_entered_at = ?2 WHERE memory_id = ?3", @@ -3158,7 +3557,9 @@ impl Storage { pub fn record_memory_access(&self, memory_id: &str) -> Result<()> { let now = Utc::now(); - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; // Check if state exists (writer can read too) @@ -3193,7 +3594,11 @@ impl Storage { let suppressed_by: Vec = serde_json::from_str(&suppressed_json).unwrap_or_default(); let parse_opt_dt = |s: Option| -> Option> { - s.and_then(|v| DateTime::parse_from_rfc3339(&v).ok().map(|dt| dt.with_timezone(&Utc))) + s.and_then(|v| { + DateTime::parse_from_rfc3339(&v) + .ok() + .map(|dt| dt.with_timezone(&Utc)) + }) }; Ok(MemoryStateRecord { @@ -3203,9 +3608,11 @@ impl Storage { .map(|dt| dt.with_timezone(&Utc)) .unwrap_or_else(|_| Utc::now()), access_count: row.get("access_count").unwrap_or(1), - state_entered_at: DateTime::parse_from_rfc3339(&row.get::<_, String>("state_entered_at")?) - .map(|dt| dt.with_timezone(&Utc)) - .unwrap_or_else(|_| Utc::now()), + state_entered_at: DateTime::parse_from_rfc3339( + &row.get::<_, String>("state_entered_at")?, + ) + .map(|dt| dt.with_timezone(&Utc)) + .unwrap_or_else(|_| Utc::now()), suppression_until: parse_opt_dt(row.get("suppression_until").ok().flatten()), suppressed_by, }) @@ -3217,7 +3624,9 @@ impl Storage { /// Save consolidation history record pub fn save_consolidation_history(&self, record: &ConsolidationHistoryRecord) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO consolidation_history ( @@ -3239,26 +3648,34 @@ impl Storage { /// Get last consolidation timestamp pub fn get_last_consolidation(&self) -> Result>> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let result: Option = reader.query_row( - "SELECT MAX(completed_at) FROM consolidation_history", - [], - |row| row.get(0), - ).ok().flatten(); + let result: Option = reader + .query_row( + "SELECT MAX(completed_at) FROM consolidation_history", + [], + |row| row.get(0), + ) + .ok() + .flatten(); Ok(result.and_then(|s| { - DateTime::parse_from_rfc3339(&s).ok().map(|dt| dt.with_timezone(&Utc)) + DateTime::parse_from_rfc3339(&s) + .ok() + .map(|dt| dt.with_timezone(&Utc)) })) } /// Get consolidation history pub fn get_consolidation_history(&self, limit: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM consolidation_history ORDER BY completed_at DESC LIMIT ?1" - )?; + let mut stmt = reader + .prepare("SELECT * FROM consolidation_history ORDER BY completed_at DESC LIMIT ?1")?; let rows = stmt.query_map(params![limit], |row| { Ok(ConsolidationHistoryRecord { @@ -3288,7 +3705,9 @@ impl Storage { /// Save a dream history record pub fn save_dream_history(&self, record: &DreamHistoryRecord) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO dream_history ( @@ -3319,58 +3738,69 @@ impl Storage { /// Get last dream timestamp pub fn get_last_dream(&self) -> Result>> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let result: Option = reader.query_row( - "SELECT MAX(dreamed_at) FROM dream_history", - [], - |row| row.get(0), - ).ok().flatten(); + let result: Option = reader + .query_row("SELECT MAX(dreamed_at) FROM dream_history", [], |row| { + row.get(0) + }) + .ok() + .flatten(); Ok(result.and_then(|s| { - DateTime::parse_from_rfc3339(&s).ok().map(|dt| dt.with_timezone(&Utc)) + DateTime::parse_from_rfc3339(&s) + .ok() + .map(|dt| dt.with_timezone(&Utc)) })) } /// Get dream history (most recent first) pub fn get_dream_history(&self, limit: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT dreamed_at, duration_ms, memories_replayed, connections_found, insights_generated, memories_strengthened, memories_compressed, phase_nrem1_ms, phase_nrem3_ms, phase_rem_ms, phase_integration_ms, summaries_generated, emotional_memories_processed, creative_connections_found - FROM dream_history ORDER BY dreamed_at DESC LIMIT ?1" + FROM dream_history ORDER BY dreamed_at DESC LIMIT ?1", )?; - let records = stmt.query_map(params![limit], |row| { - let dreamed_at_str: String = row.get(0)?; - let dreamed_at = DateTime::parse_from_rfc3339(&dreamed_at_str) - .map(|dt| dt.with_timezone(&Utc)) - .unwrap_or_else(|_| Utc::now()); - Ok(DreamHistoryRecord { - dreamed_at, - duration_ms: row.get(1)?, - memories_replayed: row.get(2)?, - connections_found: row.get(3)?, - insights_generated: row.get(4)?, - memories_strengthened: row.get(5)?, - memories_compressed: row.get(6)?, - phase_nrem1_ms: row.get(7)?, - phase_nrem3_ms: row.get(8)?, - phase_rem_ms: row.get(9)?, - phase_integration_ms: row.get(10)?, - summaries_generated: row.get(11)?, - emotional_memories_processed: row.get(12)?, - creative_connections_found: row.get(13)?, - }) - })?.collect::, _>>()?; + let records = stmt + .query_map(params![limit], |row| { + let dreamed_at_str: String = row.get(0)?; + let dreamed_at = DateTime::parse_from_rfc3339(&dreamed_at_str) + .map(|dt| dt.with_timezone(&Utc)) + .unwrap_or_else(|_| Utc::now()); + Ok(DreamHistoryRecord { + dreamed_at, + duration_ms: row.get(1)?, + memories_replayed: row.get(2)?, + connections_found: row.get(3)?, + insights_generated: row.get(4)?, + memories_strengthened: row.get(5)?, + memories_compressed: row.get(6)?, + phase_nrem1_ms: row.get(7)?, + phase_nrem3_ms: row.get(8)?, + phase_rem_ms: row.get(9)?, + phase_integration_ms: row.get(10)?, + summaries_generated: row.get(11)?, + emotional_memories_processed: row.get(12)?, + creative_connections_found: row.get(13)?, + }) + })? + .collect::, _>>()?; Ok(records) } /// Count memories created since a given timestamp pub fn count_memories_since(&self, since: DateTime) -> Result { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let count: i64 = reader.query_row( "SELECT COUNT(*) FROM knowledge_nodes WHERE created_at >= ?1", @@ -3397,13 +3827,17 @@ impl Storage { let name = entry.file_name(); let name_str = name.to_string_lossy(); // Parse vestige-YYYYMMDD-HHMMSS.db - if let Some(ts_part) = name_str.strip_prefix("vestige-").and_then(|s| s.strip_suffix(".db")) - && let Ok(naive) = chrono::NaiveDateTime::parse_from_str(ts_part, "%Y%m%d-%H%M%S") { - let dt = naive.and_utc(); - if latest.as_ref().is_none_or(|l| dt > *l) { - latest = Some(dt); - } + if let Some(ts_part) = name_str + .strip_prefix("vestige-") + .and_then(|s| s.strip_suffix(".db")) + && let Ok(naive) = + chrono::NaiveDateTime::parse_from_str(ts_part, "%Y%m%d-%H%M%S") + { + let dt = naive.and_utc(); + if latest.as_ref().is_none_or(|l| dt > *l) { + latest = Some(dt); } + } } } @@ -3415,11 +3849,17 @@ impl Storage { // ======================================================================== /// Get state transitions for a memory - pub fn get_state_transitions(&self, memory_id: &str, limit: i32) -> Result> { - let reader = self.reader.lock() + pub fn get_state_transitions( + &self, + memory_id: &str, + limit: i32, + ) -> Result> { + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( - "SELECT * FROM state_transitions WHERE memory_id = ?1 ORDER BY timestamp DESC LIMIT ?2" + "SELECT * FROM state_transitions WHERE memory_id = ?1 ORDER BY timestamp DESC LIMIT ?2", )?; let rows = stmt.query_map(params![memory_id, limit], |row| { @@ -3445,14 +3885,18 @@ impl Storage { /// Create a consistent backup using VACUUM INTO pub fn backup_to(&self, path: &std::path::Path) -> Result<()> { - let path_str = path.to_str().ok_or_else(|| { - StorageError::Init("Invalid backup path encoding".to_string()) - })?; + let path_str = path + .to_str() + .ok_or_else(|| StorageError::Init("Invalid backup path encoding".to_string()))?; // Validate path: reject control characters (except tab) for defense-in-depth if path_str.bytes().any(|b| b < 0x20 && b != b'\t') { - return Err(StorageError::Init("Backup path contains invalid characters".to_string())); + return Err(StorageError::Init( + "Backup path contains invalid characters".to_string(), + )); } - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; // VACUUM INTO doesn't support parameterized queries; escape single quotes reader.execute_batch(&format!("VACUUM INTO '{}'", path_str.replace('\'', "''")))?; @@ -3465,7 +3909,9 @@ impl Storage { /// Get average retention across all memories pub fn get_avg_retention(&self) -> Result { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let avg: f64 = reader.query_row( "SELECT COALESCE(AVG(retention_strength), 0.0) FROM knowledge_nodes", @@ -3477,7 +3923,9 @@ impl Storage { /// Get retention distribution in buckets (0-20%, 20-40%, 40-60%, 60-80%, 80-100%) pub fn get_retention_distribution(&self) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT @@ -3491,7 +3939,7 @@ impl Storage { COUNT(*) as count FROM knowledge_nodes GROUP BY bucket - ORDER BY bucket" + ORDER BY bucket", )?; let rows = stmt.query_map([], |row| { @@ -3507,12 +3955,16 @@ impl Storage { /// Get retention trend (improving/declining/stable) from retention snapshots pub fn get_retention_trend(&self) -> Result { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let snapshots: Vec = reader.prepare( - "SELECT avg_retention FROM retention_snapshots ORDER BY snapshot_at DESC LIMIT 5" - )?.query_map([], |row| row.get(0))? + let snapshots: Vec = reader + .prepare( + "SELECT avg_retention FROM retention_snapshots ORDER BY snapshot_at DESC LIMIT 5", + )? + .query_map([], |row| row.get(0))? .filter_map(|r| r.ok()) .collect(); @@ -3535,8 +3987,16 @@ impl Storage { } /// Save a retention snapshot (called during consolidation) - pub fn save_retention_snapshot(&self, avg_retention: f64, total: i64, below_target: i64, gc_triggered: bool) -> Result<()> { - let writer = self.writer.lock() + pub fn save_retention_snapshot( + &self, + avg_retention: f64, + total: i64, + below_target: i64, + gc_triggered: bool, + ) -> Result<()> { + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "INSERT INTO retention_snapshots (snapshot_at, avg_retention, total_memories, memories_below_target, gc_triggered) @@ -3548,7 +4008,9 @@ impl Storage { /// Count memories below a given retention threshold pub fn count_memories_below_retention(&self, threshold: f64) -> Result { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let count: i64 = reader.query_row( "SELECT COUNT(*) FROM knowledge_nodes WHERE retention_strength < ?1", @@ -3565,7 +4027,9 @@ impl Storage { // Collect IDs first for vector index cleanup #[cfg(all(feature = "embeddings", feature = "vector-search"))] let doomed_ids: Vec = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT id FROM knowledge_nodes WHERE retention_strength < ?1 AND created_at < ?2", @@ -3575,7 +4039,9 @@ impl Storage { .collect() }; - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let deleted = writer.execute( "DELETE FROM knowledge_nodes WHERE retention_strength < ?1 AND created_at < ?2", @@ -3586,11 +4052,12 @@ impl Storage { // Clean up vector index #[cfg(all(feature = "embeddings", feature = "vector-search"))] if deleted > 0 - && let Ok(mut index) = self.vector_index.lock() { - for id in &doomed_ids { - let _ = index.remove(id); - } + && let Ok(mut index) = self.vector_index.lock() + { + for id in &doomed_ids { + let _ = index.remove(id); } + } Ok(deleted) } @@ -3602,14 +4069,16 @@ impl Storage { // Find memories with 3+ accesses in last 24h let candidates: Vec = { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT node_id, COUNT(*) as access_count FROM memory_access_log WHERE accessed_at >= ?1 GROUP BY node_id - HAVING access_count >= 3" + HAVING access_count >= 3", )?; stmt.query_map(params![twenty_four_hours_ago], |row| row.get(0))? .filter_map(|r| r.ok()) @@ -3620,7 +4089,9 @@ impl Storage { return Ok(0); } - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let mut promoted = 0i64; for id in &candidates { @@ -3642,7 +4113,9 @@ impl Storage { /// Set waking tag on a memory (marks it for preferential dream replay) pub fn set_waking_tag(&self, memory_id: &str) -> Result<()> { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; writer.execute( "UPDATE knowledge_nodes SET waking_tag = TRUE, waking_tag_at = ?1 WHERE id = ?2", @@ -3653,7 +4126,9 @@ impl Storage { /// Clear waking tags (called after dream processes them) pub fn clear_waking_tags(&self) -> Result { - let writer = self.writer.lock() + let writer = self + .writer + .lock() .map_err(|_| StorageError::Init("Writer lock poisoned".into()))?; let cleared = writer.execute( "UPDATE knowledge_nodes SET waking_tag = FALSE, waking_tag_at = NULL WHERE waking_tag = TRUE", @@ -3664,7 +4139,9 @@ impl Storage { /// Get waking-tagged memories for preferential dream replay pub fn get_waking_tagged_memories(&self, limit: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT * FROM knowledge_nodes WHERE waking_tag = TRUE ORDER BY waking_tag_at DESC LIMIT ?1" @@ -3679,21 +4156,30 @@ impl Storage { /// Get the memory with the most connections (best center node for graph visualization) pub fn get_most_connected_memory(&self) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; let mut stmt = reader.prepare( "SELECT id, COUNT(*) as cnt FROM ( SELECT source_id as id FROM memory_connections UNION ALL SELECT target_id as id FROM memory_connections - ) GROUP BY id ORDER BY cnt DESC LIMIT 1" + ) GROUP BY id ORDER BY cnt DESC LIMIT 1", )?; - let result = stmt.query_row([], |row| row.get::<_, String>(0)).optional()?; + let result = stmt + .query_row([], |row| row.get::<_, String>(0)) + .optional()?; Ok(result) } /// Get memories with their connection data for graph visualization - pub fn get_memory_subgraph(&self, center_id: &str, depth: u32, max_nodes: usize) -> Result<(Vec, Vec)> { + pub fn get_memory_subgraph( + &self, + center_id: &str, + depth: u32, + max_nodes: usize, + ) -> Result<(Vec, Vec)> { let mut visited_ids: std::collections::HashSet = std::collections::HashSet::new(); let mut frontier = vec![center_id.to_string()]; visited_ids.insert(center_id.to_string()); @@ -3704,7 +4190,11 @@ impl Storage { for id in &frontier { let connections = self.get_connections_for_memory(id)?; for conn in &connections { - let other_id = if conn.source_id == *id { &conn.target_id } else { &conn.source_id }; + let other_id = if conn.source_id == *id { + &conn.target_id + } else { + &conn.source_id + }; if visited_ids.insert(other_id.clone()) { next_frontier.push(other_id.clone()); if visited_ids.len() >= max_nodes { @@ -3742,11 +4232,12 @@ impl Storage { /// Get recent state transitions across all memories (system-wide changelog) pub fn get_recent_state_transitions(&self, limit: i32) -> Result> { - let reader = self.reader.lock() + let reader = self + .reader + .lock() .map_err(|_| StorageError::Init("Reader lock poisoned".into()))?; - let mut stmt = reader.prepare( - "SELECT * FROM state_transitions ORDER BY timestamp DESC LIMIT ?1" - )?; + let mut stmt = + reader.prepare("SELECT * FROM state_transitions ORDER BY timestamp DESC LIMIT ?1")?; let rows = stmt.query_map(params![limit], |row| { Ok(StateTransitionRecord { @@ -3908,11 +4399,13 @@ mod tests { let before = Utc::now() - Duration::seconds(10); for i in 0..5 { - storage.ingest(IngestInput { - content: format!("Count test memory {}", i), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: format!("Count test memory {}", i), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); } let count = storage.count_memories_since(before).unwrap(); @@ -3934,33 +4427,41 @@ mod tests { let storage = create_test_storage(); // Ingest nodes of different types all containing the word "quantum" - storage.ingest(IngestInput { - content: "Quantum mechanics is fundamental to physics".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); - storage.ingest(IngestInput { - content: "Quantum computing uses qubits for calculation".to_string(), - node_type: "concept".to_string(), - ..Default::default() - }).unwrap(); - storage.ingest(IngestInput { - content: "Quantum entanglement was demonstrated in the lab".to_string(), - node_type: "event".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: "Quantum mechanics is fundamental to physics".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); + storage + .ingest(IngestInput { + content: "Quantum computing uses qubits for calculation".to_string(), + node_type: "concept".to_string(), + ..Default::default() + }) + .unwrap(); + storage + .ingest(IngestInput { + content: "Quantum entanglement was demonstrated in the lab".to_string(), + node_type: "event".to_string(), + ..Default::default() + }) + .unwrap(); // Search with include_types = ["fact"] — should only return the fact let include = vec!["fact".to_string()]; - let results = storage.hybrid_search_filtered( - "quantum", 10, 0.3, 0.7, - Some(&include), None, - ).unwrap(); + let results = storage + .hybrid_search_filtered("quantum", 10, 0.3, 0.7, Some(&include), None) + .unwrap(); assert!(!results.is_empty(), "should return at least one result"); for r in &results { - assert_eq!(r.node.node_type, "fact", - "include_types=[fact] should only return facts, got: {}", r.node.node_type); + assert_eq!( + r.node.node_type, "fact", + "include_types=[fact] should only return facts, got: {}", + r.node.node_type + ); } } @@ -3968,28 +4469,33 @@ mod tests { fn test_keyword_search_with_exclude_types() { let storage = create_test_storage(); - storage.ingest(IngestInput { - content: "Photosynthesis converts sunlight to energy".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); - storage.ingest(IngestInput { - content: "Photosynthesis is a complex biochemical process".to_string(), - node_type: "reflection".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: "Photosynthesis converts sunlight to energy".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); + storage + .ingest(IngestInput { + content: "Photosynthesis is a complex biochemical process".to_string(), + node_type: "reflection".to_string(), + ..Default::default() + }) + .unwrap(); // Search with exclude_types = ["reflection"] — should skip the reflection let exclude = vec!["reflection".to_string()]; - let results = storage.hybrid_search_filtered( - "photosynthesis", 10, 0.3, 0.7, - None, Some(&exclude), - ).unwrap(); + let results = storage + .hybrid_search_filtered("photosynthesis", 10, 0.3, 0.7, None, Some(&exclude)) + .unwrap(); assert!(!results.is_empty(), "should return at least one result"); for r in &results { - assert_ne!(r.node.node_type, "reflection", - "exclude_types=[reflection] should not return reflections"); + assert_ne!( + r.node.node_type, "reflection", + "exclude_types=[reflection] should not return reflections" + ); } } @@ -3997,24 +4503,27 @@ mod tests { fn test_include_types_takes_precedence_over_exclude() { let storage = create_test_storage(); - storage.ingest(IngestInput { - content: "Gravity holds planets in orbit around stars".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); - storage.ingest(IngestInput { - content: "Gravity waves were first detected by LIGO".to_string(), - node_type: "event".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: "Gravity holds planets in orbit around stars".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); + storage + .ingest(IngestInput { + content: "Gravity waves were first detected by LIGO".to_string(), + node_type: "event".to_string(), + ..Default::default() + }) + .unwrap(); // When both are provided, include_types wins let include = vec!["fact".to_string()]; let exclude = vec!["fact".to_string()]; - let results = storage.hybrid_search_filtered( - "gravity", 10, 0.3, 0.7, - Some(&include), Some(&exclude), - ).unwrap(); + let results = storage + .hybrid_search_filtered("gravity", 10, 0.3, 0.7, Some(&include), Some(&exclude)) + .unwrap(); // include_types takes precedence — facts should be returned assert!(!results.is_empty()); @@ -4027,21 +4536,24 @@ mod tests { fn test_type_filter_with_no_matches_returns_empty() { let storage = create_test_storage(); - storage.ingest(IngestInput { - content: "DNA carries genetic information in cells".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: "DNA carries genetic information in cells".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); // Search for a type that doesn't exist among matches let include = vec!["person".to_string()]; - let results = storage.hybrid_search_filtered( - "DNA", 10, 0.3, 0.7, - Some(&include), None, - ).unwrap(); + let results = storage + .hybrid_search_filtered("DNA", 10, 0.3, 0.7, Some(&include), None) + .unwrap(); - assert!(results.is_empty(), - "filtering for a non-matching type should return empty results"); + assert!( + results.is_empty(), + "filtering for a non-matching type should return empty results" + ); } #[test] @@ -4049,11 +4561,13 @@ mod tests { // Ensure the original hybrid_search (no type filters) still works let storage = create_test_storage(); - storage.ingest(IngestInput { - content: "Neurons transmit electrical signals in the brain".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap(); + storage + .ingest(IngestInput { + content: "Neurons transmit electrical signals in the brain".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap(); let results = storage.hybrid_search("neurons", 10, 0.3, 0.7).unwrap(); assert!(!results.is_empty()); diff --git a/crates/vestige-mcp/Cargo.toml b/crates/vestige-mcp/Cargo.toml index f93ef2c..a8851f8 100644 --- a/crates/vestige-mcp/Cargo.toml +++ b/crates/vestige-mcp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "vestige-mcp" -version = "2.0.4" +version = "2.0.5" edition = "2024" description = "Cognitive memory MCP server for Claude - FSRS-6, spreading activation, synaptic tagging, 3D dashboard, and 130 years of memory research" authors = ["samvallad33"] diff --git a/crates/vestige-mcp/src/bin/cli.rs b/crates/vestige-mcp/src/bin/cli.rs index ecb278e..eeffe54 100644 --- a/crates/vestige-mcp/src/bin/cli.rs +++ b/crates/vestige-mcp/src/bin/cli.rs @@ -18,7 +18,9 @@ use vestige_core::{IngestInput, Storage}; #[command(author = "samvallad33")] #[command(version = env!("CARGO_PKG_VERSION"))] #[command(about = "CLI for the Vestige cognitive memory system")] -#[command(long_about = "Vestige is a cognitive memory system based on 130 years of memory research.\n\nIt implements FSRS-6, spreading activation, synaptic tagging, and more.")] +#[command( + long_about = "Vestige is a cognitive memory system based on 130 years of memory research.\n\nIt implements FSRS-6, spreading activation, synaptic tagging, and more." +)] struct Cli { #[command(subcommand)] command: Commands, @@ -171,21 +173,49 @@ fn run_stats(show_tagging: bool, show_states: bool) -> anyhow::Result<()> { // Basic stats println!("{}: {}", "Total Memories".white().bold(), stats.total_nodes); - println!("{}: {}", "Due for Review".white().bold(), stats.nodes_due_for_review); - println!("{}: {:.1}%", "Average Retention".white().bold(), stats.average_retention * 100.0); - println!("{}: {:.2}", "Average Storage Strength".white().bold(), stats.average_storage_strength); - println!("{}: {:.2}", "Average Retrieval Strength".white().bold(), stats.average_retrieval_strength); - println!("{}: {}", "With Embeddings".white().bold(), stats.nodes_with_embeddings); + println!( + "{}: {}", + "Due for Review".white().bold(), + stats.nodes_due_for_review + ); + println!( + "{}: {:.1}%", + "Average Retention".white().bold(), + stats.average_retention * 100.0 + ); + println!( + "{}: {:.2}", + "Average Storage Strength".white().bold(), + stats.average_storage_strength + ); + println!( + "{}: {:.2}", + "Average Retrieval Strength".white().bold(), + stats.average_retrieval_strength + ); + println!( + "{}: {}", + "With Embeddings".white().bold(), + stats.nodes_with_embeddings + ); if let Some(model) = &stats.embedding_model { println!("{}: {}", "Embedding Model".white().bold(), model); } if let Some(oldest) = stats.oldest_memory { - println!("{}: {}", "Oldest Memory".white().bold(), oldest.format("%Y-%m-%d %H:%M:%S")); + println!( + "{}: {}", + "Oldest Memory".white().bold(), + oldest.format("%Y-%m-%d %H:%M:%S") + ); } if let Some(newest) = stats.newest_memory { - println!("{}: {}", "Newest Memory".white().bold(), newest.format("%Y-%m-%d %H:%M:%S")); + println!( + "{}: {}", + "Newest Memory".white().bold(), + newest.format("%Y-%m-%d %H:%M:%S") + ); } // Embedding coverage @@ -194,7 +224,11 @@ fn run_stats(show_tagging: bool, show_states: bool) -> anyhow::Result<()> { } else { 0.0 }; - println!("{}: {:.1}%", "Embedding Coverage".white().bold(), embedding_coverage); + println!( + "{}: {:.1}%", + "Embedding Coverage".white().bold(), + embedding_coverage + ); // Tagging distribution (retention levels) if show_tagging { @@ -205,9 +239,18 @@ fn run_stats(show_tagging: bool, show_states: bool) -> anyhow::Result<()> { let total = memories.len(); if total > 0 { - let high = memories.iter().filter(|m| m.retention_strength >= 0.7).count(); - let medium = memories.iter().filter(|m| m.retention_strength >= 0.4 && m.retention_strength < 0.7).count(); - let low = memories.iter().filter(|m| m.retention_strength < 0.4).count(); + let high = memories + .iter() + .filter(|m| m.retention_strength >= 0.7) + .count(); + let medium = memories + .iter() + .filter(|m| m.retention_strength >= 0.4 && m.retention_strength < 0.7) + .count(); + let low = memories + .iter() + .filter(|m| m.retention_strength < 0.4) + .count(); print_distribution_bar("High (>=70%)", high, total, "green"); print_distribution_bar("Medium (40-70%)", medium, total, "yellow"); @@ -220,7 +263,10 @@ fn run_stats(show_tagging: bool, show_states: bool) -> anyhow::Result<()> { // State distribution if show_states { println!(); - println!("{}", "=== Cognitive State Distribution ===".magenta().bold()); + println!( + "{}", + "=== Cognitive State Distribution ===".magenta().bold() + ); let memories = storage.get_all_nodes(500, 0)?; let total = memories.len(); @@ -248,7 +294,9 @@ fn run_stats(show_tagging: bool, show_states: bool) -> anyhow::Result<()> { } /// Compute cognitive state distribution for memories -fn compute_state_distribution(memories: &[vestige_core::KnowledgeNode]) -> (usize, usize, usize, usize) { +fn compute_state_distribution( + memories: &[vestige_core::KnowledgeNode], +) -> (usize, usize, usize, usize) { let mut active = 0; let mut dormant = 0; let mut silent = 0; @@ -297,10 +345,7 @@ fn print_distribution_bar(label: &str, count: usize, total: usize, color: &str) println!( " {:15} [{:30}] {:>4} ({:>5.1}%)", - label, - colored_bar, - count, - percentage + label, colored_bar, count, percentage ); } @@ -332,8 +377,16 @@ fn run_health() -> anyhow::Result<()> { println!("{}: {}", "Status".white().bold(), colored_status); println!("{}: {}", "Total Memories".white(), stats.total_nodes); - println!("{}: {}", "Due for Review".white(), stats.nodes_due_for_review); - println!("{}: {:.1}%", "Average Retention".white(), stats.average_retention * 100.0); + println!( + "{}: {}", + "Due for Review".white(), + stats.nodes_due_for_review + ); + println!( + "{}: {:.1}%", + "Average Retention".white(), + stats.average_retention * 100.0 + ); // Embedding coverage let embedding_coverage = if stats.total_nodes > 0 { @@ -341,15 +394,27 @@ fn run_health() -> anyhow::Result<()> { } else { 0.0 }; - println!("{}: {:.1}%", "Embedding Coverage".white(), embedding_coverage); - println!("{}: {}", "Embedding Service".white(), - if storage.is_embedding_ready() { "Ready".green() } else { "Not Ready".red() }); + println!( + "{}: {:.1}%", + "Embedding Coverage".white(), + embedding_coverage + ); + println!( + "{}: {}", + "Embedding Service".white(), + if storage.is_embedding_ready() { + "Ready".green() + } else { + "Not Ready".red() + } + ); // Warnings let mut warnings = Vec::new(); if stats.average_retention < 0.5 && stats.total_nodes > 0 { - warnings.push("Low average retention - consider running consolidation or reviewing memories"); + warnings + .push("Low average retention - consider running consolidation or reviewing memories"); } if stats.nodes_due_for_review > 10 { @@ -376,7 +441,8 @@ fn run_health() -> anyhow::Result<()> { let mut recommendations = Vec::new(); if status == "CRITICAL" { - recommendations.push("CRITICAL: Many memories have very low retention. Review important memories."); + recommendations + .push("CRITICAL: Many memories have very low retention. Review important memories."); } if stats.nodes_due_for_review > 5 { @@ -384,7 +450,8 @@ fn run_health() -> anyhow::Result<()> { } if stats.nodes_with_embeddings < stats.total_nodes { - recommendations.push("Run 'vestige consolidate' to generate embeddings for better semantic search."); + recommendations + .push("Run 'vestige consolidate' to generate embeddings for better semantic search."); } if stats.total_nodes > 100 && stats.average_retention < 0.7 { @@ -398,8 +465,16 @@ fn run_health() -> anyhow::Result<()> { println!(); println!("{}", "Recommendations:".cyan().bold()); for rec in &recommendations { - let icon = if rec.starts_with("CRITICAL") { "!".red().bold() } else { ">".cyan() }; - let text = if rec.starts_with("CRITICAL") { rec.red().to_string() } else { rec.to_string() }; + let icon = if rec.starts_with("CRITICAL") { + "!".red().bold() + } else { + ">".cyan() + }; + let text = if rec.starts_with("CRITICAL") { + rec.red().to_string() + } else { + rec.to_string() + }; println!(" {} {}", icon, text); } @@ -416,11 +491,27 @@ fn run_consolidate() -> anyhow::Result<()> { let storage = Storage::new(None)?; let result = storage.run_consolidation()?; - println!("{}: {}", "Nodes Processed".white().bold(), result.nodes_processed); - println!("{}: {}", "Nodes Promoted".white().bold(), result.nodes_promoted); + println!( + "{}: {}", + "Nodes Processed".white().bold(), + result.nodes_processed + ); + println!( + "{}: {}", + "Nodes Promoted".white().bold(), + result.nodes_promoted + ); println!("{}: {}", "Nodes Pruned".white().bold(), result.nodes_pruned); - println!("{}: {}", "Decay Applied".white().bold(), result.decay_applied); - println!("{}: {}", "Embeddings Generated".white().bold(), result.embeddings_generated); + println!( + "{}: {}", + "Decay Applied".white().bold(), + result.decay_applied + ); + println!( + "{}: {}", + "Embeddings Generated".white().bold(), + result.embeddings_generated + ); println!("{}: {}ms", "Duration".white().bold(), result.duration_ms); println!(); @@ -523,7 +614,11 @@ fn run_restore(backup_path: PathBuf) -> anyhow::Result<()> { let stats = storage.get_stats()?; println!(); println!("{}: {}", "Total Nodes".white(), stats.total_nodes); - println!("{}: {}", "With Embeddings".white(), stats.nodes_with_embeddings); + println!( + "{}: {}", + "With Embeddings".white(), + stats.nodes_with_embeddings + ); Ok(()) } @@ -581,9 +676,10 @@ fn run_backup(output: PathBuf) -> anyhow::Result<()> { // Create parent directories if needed if let Some(parent) = output.parent() - && !parent.exists() { - std::fs::create_dir_all(parent)?; - } + && !parent.exists() + { + std::fs::create_dir_all(parent)?; + } // Copy the database file println!("Copying database..."); @@ -630,8 +726,9 @@ fn run_export( // Parse since date if provided let since_date = match &since { Some(date_str) => { - let naive = NaiveDate::parse_from_str(date_str, "%Y-%m-%d") - .map_err(|e| anyhow::anyhow!("Invalid date '{}': {}. Use YYYY-MM-DD format.", date_str, e))?; + let naive = NaiveDate::parse_from_str(date_str, "%Y-%m-%d").map_err(|e| { + anyhow::anyhow!("Invalid date '{}': {}. Use YYYY-MM-DD format.", date_str, e) + })?; Some( naive .and_hms_opt(0, 0, 0) @@ -645,7 +742,12 @@ fn run_export( // Parse tags filter let tag_filter: Vec = tags .as_deref() - .map(|t| t.split(',').map(|s| s.trim().to_string()).filter(|s| !s.is_empty()).collect()) + .map(|t| { + t.split(',') + .map(|s| s.trim().to_string()) + .filter(|s| !s.is_empty()) + .collect() + }) .unwrap_or_default(); let storage = Storage::new(None)?; @@ -657,9 +759,10 @@ fn run_export( .filter(|node| { // Date filter if let Some(ref since_dt) = since_date - && node.created_at < *since_dt { - return false; - } + && node.created_at < *since_dt + { + return false; + } // Tag filter: node must contain ALL specified tags if !tag_filter.is_empty() { for tag in &tag_filter { @@ -689,9 +792,10 @@ fn run_export( // Create parent directories if needed if let Some(parent) = output.parent() - && !parent.exists() { - std::fs::create_dir_all(parent)?; - } + && !parent.exists() + { + std::fs::create_dir_all(parent)?; + } let file = std::fs::File::create(&output)?; let mut writer = BufWriter::new(file); @@ -770,7 +874,11 @@ fn run_gc( }) .collect(); - println!("{}: {}", "Min retention threshold".white().bold(), min_retention); + println!( + "{}: {}", + "Min retention threshold".white().bold(), + min_retention + ); if let Some(max_days) = max_age_days { println!("{}: {} days", "Max age".white().bold(), max_days); } @@ -783,7 +891,10 @@ fn run_gc( if candidates.is_empty() { println!(); - println!("{}", "No memories match the garbage collection criteria.".green()); + println!( + "{}", + "No memories match the garbage collection criteria.".green() + ); return Ok(()); } @@ -853,7 +964,12 @@ fn run_gc( Ok(true) => deleted += 1, Ok(false) => errors += 1, // node was already gone Err(e) => { - eprintln!(" {} Failed to delete {}: {}", "ERR".red(), &node.id[..8], e); + eprintln!( + " {} Failed to delete {}: {}", + "ERR".red(), + &node.id[..8], + e + ); errors += 1; } } @@ -960,7 +1076,10 @@ fn run_ingest( fn run_dashboard(port: u16, open_browser: bool) -> anyhow::Result<()> { println!("{}", "=== Vestige Dashboard ===".cyan().bold()); println!(); - println!("Starting dashboard at {}...", format!("http://127.0.0.1:{}", port).cyan()); + println!( + "Starting dashboard at {}...", + format!("http://127.0.0.1:{}", port).cyan() + ); let storage = Storage::new(None)?; @@ -1025,8 +1144,19 @@ fn run_serve(port: u16, with_dashboard: bool, dashboard_port: u16) -> anyhow::Re let dc = Arc::clone(&cognitive); let dtx = event_tx.clone(); tokio::spawn(async move { - match vestige_mcp::dashboard::start_background_with_event_tx(ds, Some(dc), dtx, dashboard_port).await { - Ok(_) => println!(" {} Dashboard: http://127.0.0.1:{}", ">".cyan(), dashboard_port), + match vestige_mcp::dashboard::start_background_with_event_tx( + ds, + Some(dc), + dtx, + dashboard_port, + ) + .await + { + Ok(_) => println!( + " {} Dashboard: http://127.0.0.1:{}", + ">".cyan(), + dashboard_port + ), Err(e) => eprintln!(" {} Dashboard failed: {}", "!".yellow(), e), } }); @@ -1037,7 +1167,12 @@ fn run_serve(port: u16, with_dashboard: bool, dashboard_port: u16) -> anyhow::Re .map_err(|e| anyhow::anyhow!("Failed to create auth token: {}", e))?; let bind = std::env::var("VESTIGE_HTTP_BIND").unwrap_or_else(|_| "127.0.0.1".to_string()); - println!(" {} HTTP transport: http://{}:{}/mcp", ">".cyan(), bind, port); + println!( + " {} HTTP transport: http://{}:{}/mcp", + ">".cyan(), + bind, + port + ); println!(" {} Auth token: {}...", ">".cyan(), &token[..8]); println!(); println!("{}", "Press Ctrl+C to stop.".dimmed()); diff --git a/crates/vestige-mcp/src/bin/restore.rs b/crates/vestige-mcp/src/bin/restore.rs index afb7f85..6e24800 100644 --- a/crates/vestige-mcp/src/bin/restore.rs +++ b/crates/vestige-mcp/src/bin/restore.rs @@ -65,7 +65,12 @@ fn main() -> anyhow::Result<()> { match storage.ingest(input) { Ok(_node) => { success_count += 1; - println!("[{}/{}] OK: {}", i + 1, total, truncate(&memory.content, 60)); + println!( + "[{}/{}] OK: {}", + i + 1, + total, + truncate(&memory.content, 60) + ); } Err(e) => { println!("[{}/{}] FAIL: {}", i + 1, total, e); @@ -73,7 +78,10 @@ fn main() -> anyhow::Result<()> { } } - println!("\nRestore complete: {}/{} memories restored", success_count, total); + println!( + "\nRestore complete: {}/{} memories restored", + success_count, total + ); // Show stats let stats = storage.get_stats()?; diff --git a/crates/vestige-mcp/src/cognitive.rs b/crates/vestige-mcp/src/cognitive.rs index 6f9c174..86aadcf 100644 --- a/crates/vestige-mcp/src/cognitive.rs +++ b/crates/vestige-mcp/src/cognitive.rs @@ -4,24 +4,43 @@ //! Each module is initialized once at startup and shared via Arc> //! across all tool invocations. +use vestige_core::neuroscience::predictive_retrieval::PredictiveMemory; +use vestige_core::neuroscience::prospective_memory::{IntentionParser, ProspectiveMemory}; +use vestige_core::search::TemporalSearcher; use vestige_core::{ + AccessibilityCalculator, // Neuroscience modules - ActivationNetwork, SynapticTaggingSystem, HippocampalIndex, ContextMatcher, - AccessibilityCalculator, CompetitionManager, StateUpdateService, - ImportanceSignals, NoveltySignal, ArousalSignal, RewardSignal, AttentionSignal, - EmotionalMemory, LinkType, + ActivationNetwork, + ActivityTracker, + AdaptiveEmbedder, + ArousalSignal, + AttentionSignal, + CompetitionManager, + ConsolidationScheduler, + ContextMatcher, + CrossProjectLearner, + EmotionalMemory, + HippocampalIndex, + ImportanceSignals, // Advanced modules - ImportanceTracker, ReconsolidationManager, IntentDetector, ActivityTracker, - MemoryDreamer, MemoryChainBuilder, MemoryCompressor, CrossProjectLearner, - AdaptiveEmbedder, SpeculativeRetriever, ConsolidationScheduler, + ImportanceTracker, + IntentDetector, + LinkType, + MemoryChainBuilder, + MemoryCompressor, + MemoryDreamer, + NoveltySignal, + ReconsolidationManager, // Search modules - Reranker, RerankerConfig, + Reranker, + RerankerConfig, + RewardSignal, + SpeculativeRetriever, + StateUpdateService, // Storage Storage, + SynapticTaggingSystem, }; -use vestige_core::search::TemporalSearcher; -use vestige_core::neuroscience::predictive_retrieval::PredictiveMemory; -use vestige_core::neuroscience::prospective_memory::{ProspectiveMemory, IntentionParser}; /// Stateful cognitive engine holding all neuroscience modules. /// @@ -151,9 +170,9 @@ impl CognitiveEngine { #[cfg(test)] mod tests { use super::*; - use vestige_core::{ConnectionRecord, IngestInput}; use chrono::Utc; use tempfile::TempDir; + use vestige_core::{ConnectionRecord, IngestInput}; fn create_test_storage() -> (Storage, TempDir) { let dir = TempDir::new().unwrap(); @@ -162,16 +181,18 @@ mod tests { } fn ingest_memory(storage: &Storage, content: &str) -> String { - let result = storage.ingest(IngestInput { - content: content.to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + let result = storage + .ingest(IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); result.id } @@ -195,15 +216,17 @@ mod tests { // Save a connection between them let now = Utc::now(); - storage.save_connection(&ConnectionRecord { - source_id: id1.clone(), - target_id: id2.clone(), - strength: 0.85, - link_type: "semantic".to_string(), - created_at: now, - last_activated: now, - activation_count: 1, - }).unwrap(); + storage + .save_connection(&ConnectionRecord { + source_id: id1.clone(), + target_id: id2.clone(), + strength: 0.85, + link_type: "semantic".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); // Hydrate engine let mut engine = CognitiveEngine::new(); @@ -211,7 +234,11 @@ mod tests { // Verify activation network has the connection let assocs = engine.activation_network.get_associations(&id1); - assert!(!assocs.is_empty(), "Hydrated engine should have associations for {}", id1); + assert!( + !assocs.is_empty(), + "Hydrated engine should have associations for {}", + id1 + ); assert!( assocs.iter().any(|a| a.memory_id == id2), "Should find connection to {}", @@ -228,29 +255,37 @@ mod tests { let id3 = ingest_memory(&storage, "Event C was caused by A"); let now = Utc::now(); - storage.save_connection(&ConnectionRecord { - source_id: id1.clone(), - target_id: id2.clone(), - strength: 0.7, - link_type: "temporal".to_string(), - created_at: now, - last_activated: now, - activation_count: 1, - }).unwrap(); - storage.save_connection(&ConnectionRecord { - source_id: id1.clone(), - target_id: id3.clone(), - strength: 0.9, - link_type: "causal".to_string(), - created_at: now, - last_activated: now, - activation_count: 1, - }).unwrap(); + storage + .save_connection(&ConnectionRecord { + source_id: id1.clone(), + target_id: id2.clone(), + strength: 0.7, + link_type: "temporal".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); + storage + .save_connection(&ConnectionRecord { + source_id: id1.clone(), + target_id: id3.clone(), + strength: 0.9, + link_type: "causal".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); let mut engine = CognitiveEngine::new(); engine.hydrate(&storage); let assocs = engine.activation_network.get_associations(&id1); - assert!(assocs.len() >= 2, "Should have at least 2 associations, got {}", assocs.len()); + assert!( + assocs.len() >= 2, + "Should have at least 2 associations, got {}", + assocs.len() + ); } } diff --git a/crates/vestige-mcp/src/dashboard/events.rs b/crates/vestige-mcp/src/dashboard/events.rs index 15b624c..be875b0 100644 --- a/crates/vestige-mcp/src/dashboard/events.rs +++ b/crates/vestige-mcp/src/dashboard/events.rs @@ -38,6 +38,24 @@ pub enum VestigeEvent { new_retention: f64, timestamp: DateTime, }, + // v2.0.5: Active forgetting — top-down suppression (Anderson 2025 + Davis Rac1) + MemorySuppressed { + id: String, + suppression_count: i32, + estimated_cascade: usize, + reversible_until: DateTime, + timestamp: DateTime, + }, + MemoryUnsuppressed { + id: String, + remaining_count: i32, + timestamp: DateTime, + }, + Rac1CascadeSwept { + seeds: usize, + neighbors_affected: usize, + timestamp: DateTime, + }, // -- Search -- SearchPerformed { @@ -119,6 +137,9 @@ pub enum VestigeEvent { uptime_secs: u64, memory_count: usize, avg_retention: f64, + /// v2.0.5: memories with suppression_count > 0 (actively forgetting) + #[serde(default)] + suppressed_count: usize, timestamp: DateTime, }, } diff --git a/crates/vestige-mcp/src/dashboard/handlers.rs b/crates/vestige-mcp/src/dashboard/handlers.rs index af65cc6..b999cae 100644 --- a/crates/vestige-mcp/src/dashboard/handlers.rs +++ b/crates/vestige-mcp/src/dashboard/handlers.rs @@ -38,7 +38,8 @@ pub async fn list_memories( if let Some(query) = params.q.as_ref().filter(|q| !q.trim().is_empty()) { // Use hybrid search - let results = state.storage + let results = state + .storage .hybrid_search(query, limit, 0.3, 0.7) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -76,7 +77,8 @@ pub async fn list_memories( } // No search query — list all memories - let mut nodes = state.storage + let mut nodes = state + .storage .get_all_nodes(limit, offset) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -121,7 +123,8 @@ pub async fn get_memory( State(state): State, Path(id): Path, ) -> Result, StatusCode> { - let node = state.storage + let node = state + .storage .get_node(&id) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)? .ok_or(StatusCode::NOT_FOUND)?; @@ -152,7 +155,8 @@ pub async fn delete_memory( State(state): State, Path(id): Path, ) -> Result, StatusCode> { - let deleted = state.storage + let deleted = state + .storage .delete_node(&id) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -172,7 +176,8 @@ pub async fn promote_memory( State(state): State, Path(id): Path, ) -> Result, StatusCode> { - let node = state.storage + let node = state + .storage .promote_memory(&id) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -194,7 +199,8 @@ pub async fn demote_memory( State(state): State, Path(id): Path, ) -> Result, StatusCode> { - let node = state.storage + let node = state + .storage .demote_memory(&id) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -212,10 +218,9 @@ pub async fn demote_memory( } /// Get system stats -pub async fn get_stats( - State(state): State, -) -> Result, StatusCode> { - let stats = state.storage +pub async fn get_stats(State(state): State) -> Result, StatusCode> { + let stats = state + .storage .get_stats() .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -254,12 +259,14 @@ pub async fn get_timeline( let limit = params.limit.unwrap_or(200).clamp(1, 500); let start = Utc::now() - Duration::days(days); - let nodes = state.storage + let nodes = state + .storage .query_time_range(Some(start), Some(Utc::now()), limit) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; // Group by day - let mut by_day: std::collections::BTreeMap> = std::collections::BTreeMap::new(); + let mut by_day: std::collections::BTreeMap> = + std::collections::BTreeMap::new(); for node in &nodes { let date = node.created_at.format("%Y-%m-%d").to_string(); let content_preview: String = { @@ -299,10 +306,9 @@ pub async fn get_timeline( } /// Health check -pub async fn health_check( - State(state): State, -) -> Result, StatusCode> { - let stats = state.storage +pub async fn health_check(State(state): State) -> Result, StatusCode> { + let stats = state + .storage .get_stats() .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -353,32 +359,38 @@ pub async fn get_graph( let center_id = if let Some(ref id) = params.center_id { id.clone() } else if let Some(ref query) = params.query { - let results = state.storage + let results = state + .storage .search(query, 1) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - results.first() + results + .first() .map(|n| n.id.clone()) .ok_or(StatusCode::NOT_FOUND)? } else { // Default: most connected memory (for a rich initial graph) - let most_connected = state.storage + let most_connected = state + .storage .get_most_connected_memory() .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; if let Some(id) = most_connected { id } else { // Fallback: most recent memory - let recent = state.storage + let recent = state + .storage .get_all_nodes(1, 0) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; - recent.first() + recent + .first() .map(|n| n.id.clone()) .ok_or(StatusCode::NOT_FOUND)? } }; // Get subgraph - let (nodes, edges) = state.storage + let (nodes, edges) = state + .storage .get_memory_subgraph(¢er_id, depth, max_nodes) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)?; @@ -387,7 +399,8 @@ pub async fn get_graph( } // Build nodes JSON with timestamps for recency calculation - let nodes_json: Vec = nodes.iter() + let nodes_json: Vec = nodes + .iter() .map(|n| { let label = if n.content.chars().count() > 80 { format!("{}...", n.content.chars().take(77).collect::()) @@ -407,7 +420,8 @@ pub async fn get_graph( }) .collect(); - let edges_json: Vec = edges.iter() + let edges_json: Vec = edges + .iter() .map(|e| { serde_json::json!({ "source": e.source_id, @@ -498,10 +512,11 @@ pub async fn search_memories( // ============================================================================ /// Trigger a dream cycle via CognitiveEngine -pub async fn trigger_dream( - State(state): State, -) -> Result, StatusCode> { - let cognitive = state.cognitive.as_ref().ok_or(StatusCode::SERVICE_UNAVAILABLE)?; +pub async fn trigger_dream(State(state): State) -> Result, StatusCode> { + let cognitive = state + .cognitive + .as_ref() + .ok_or(StatusCode::SERVICE_UNAVAILABLE)?; let start = std::time::Instant::now(); let memory_count: usize = 50; @@ -715,9 +730,7 @@ pub async fn explore_connections( } /// Predict which memories will be needed -pub async fn predict_memories( - State(state): State, -) -> Result, StatusCode> { +pub async fn predict_memories(State(state): State) -> Result, StatusCode> { // Get recent memories as predictions based on activity let recent = state .storage @@ -756,7 +769,9 @@ pub async fn score_importance( if let Some(ref cognitive) = state.cognitive { let context = vestige_core::ImportanceContext::current(); let cog = cognitive.lock().await; - let score = cog.importance_signals.compute_importance(&req.content, &context); + let score = cog + .importance_signals + .compute_importance(&req.content, &context); drop(cog); let composite = score.composite; @@ -789,7 +804,11 @@ pub async fn score_importance( // Fallback: basic heuristic scoring let word_count = req.content.split_whitespace().count(); let has_code = req.content.contains("```") || req.content.contains("fn "); - let composite = if has_code { 0.7 } else { (word_count as f64 / 100.0).min(0.8) }; + let composite = if has_code { + 0.7 + } else { + (word_count as f64 / 100.0).min(0.8) + }; Ok(Json(serde_json::json!({ "composite": composite, @@ -907,17 +926,35 @@ pub async fn list_intentions( let intentions = if status_filter == "all" { // Get all statuses - let mut all = state.storage.get_active_intentions() - .unwrap_or_default(); - all.extend(state.storage.get_intentions_by_status("fulfilled").unwrap_or_default()); - all.extend(state.storage.get_intentions_by_status("cancelled").unwrap_or_default()); - all.extend(state.storage.get_intentions_by_status("snoozed").unwrap_or_default()); + let mut all = state.storage.get_active_intentions().unwrap_or_default(); + all.extend( + state + .storage + .get_intentions_by_status("fulfilled") + .unwrap_or_default(), + ); + all.extend( + state + .storage + .get_intentions_by_status("cancelled") + .unwrap_or_default(), + ); + all.extend( + state + .storage + .get_intentions_by_status("snoozed") + .unwrap_or_default(), + ); all } else if status_filter == "active" { - state.storage.get_active_intentions() + state + .storage + .get_active_intentions() .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)? } else { - state.storage.get_intentions_by_status(&status_filter) + state + .storage + .get_intentions_by_status(&status_filter) .map_err(|_| StatusCode::INTERNAL_SERVER_ERROR)? }; diff --git a/crates/vestige-mcp/src/dashboard/mod.rs b/crates/vestige-mcp/src/dashboard/mod.rs index d236041..4a235a6 100644 --- a/crates/vestige-mcp/src/dashboard/mod.rs +++ b/crates/vestige-mcp/src/dashboard/mod.rs @@ -11,8 +11,8 @@ pub mod state; pub mod static_files; pub mod websocket; -use axum::routing::{delete, get, post}; use axum::Router; +use axum::routing::{delete, get, post}; use std::net::SocketAddr; use std::sync::Arc; use tokio::sync::Mutex; @@ -47,7 +47,6 @@ pub fn build_router_with_event_tx( } fn build_router_inner(state: AppState, port: u16) -> (Router, AppState) { - #[allow(unused_mut)] let mut origins = vec![ format!("http://127.0.0.1:{}", port) @@ -61,8 +60,16 @@ fn build_router_inner(state: AppState, port: u16) -> (Router, AppState) { // SvelteKit dev server — only in debug builds #[cfg(debug_assertions)] { - origins.push("http://localhost:5173".parse::().expect("valid origin")); - origins.push("http://127.0.0.1:5173".parse::().expect("valid origin")); + origins.push( + "http://localhost:5173" + .parse::() + .expect("valid origin"), + ); + origins.push( + "http://127.0.0.1:5173" + .parse::() + .expect("valid origin"), + ); } let cors = CorsLayer::new() @@ -116,7 +123,10 @@ fn build_router_inner(state: AppState, port: u16) -> (Router, AppState) { let router = Router::new() // SvelteKit Dashboard v2.0 (embedded static build) .route("/dashboard", get(static_files::serve_dashboard_spa)) - .route("/dashboard/{*path}", get(static_files::serve_dashboard_asset)) + .route( + "/dashboard/{*path}", + get(static_files::serve_dashboard_asset), + ) // Legacy embedded HTML (keep for backward compat) .route("/", get(handlers::serve_dashboard)) .route("/graph", get(handlers::serve_graph)) @@ -143,7 +153,10 @@ fn build_router_inner(state: AppState, port: u16) -> (Router, AppState) { .route("/api/predict", post(handlers::predict_memories)) .route("/api/importance", post(handlers::score_importance)) .route("/api/consolidate", post(handlers::trigger_consolidation)) - .route("/api/retention-distribution", get(handlers::retention_distribution)) + .route( + "/api/retention-distribution", + get(handlers::retention_distribution), + ) // Intentions (v2.0) .route("/api/intentions", get(handlers::list_intentions)) .layer( diff --git a/crates/vestige-mcp/src/dashboard/state.rs b/crates/vestige-mcp/src/dashboard/state.rs index c1ae661..5a41266 100644 --- a/crates/vestige-mcp/src/dashboard/state.rs +++ b/crates/vestige-mcp/src/dashboard/state.rs @@ -2,11 +2,11 @@ use std::sync::Arc; use std::time::Instant; -use tokio::sync::{broadcast, Mutex}; +use tokio::sync::{Mutex, broadcast}; use vestige_core::Storage; -use crate::cognitive::CognitiveEngine; use super::events::VestigeEvent; +use crate::cognitive::CognitiveEngine; /// Broadcast channel capacity — how many events can buffer before old ones drop. const EVENT_CHANNEL_CAPACITY: usize = 1024; @@ -22,10 +22,7 @@ pub struct AppState { impl AppState { /// Create a new AppState with event broadcasting. - pub fn new( - storage: Arc, - cognitive: Option>>, - ) -> Self { + pub fn new(storage: Arc, cognitive: Option>>) -> Self { let (event_tx, _) = broadcast::channel(EVENT_CHANNEL_CAPACITY); Self { storage, diff --git a/crates/vestige-mcp/src/dashboard/static_files.rs b/crates/vestige-mcp/src/dashboard/static_files.rs index 1bc9ba3..c780965 100644 --- a/crates/vestige-mcp/src/dashboard/static_files.rs +++ b/crates/vestige-mcp/src/dashboard/static_files.rs @@ -4,9 +4,9 @@ //! using `include_dir!`. This serves it at `/dashboard/` prefix. use axum::extract::Path; -use axum::http::{header, StatusCode}; +use axum::http::{StatusCode, header}; use axum::response::{Html, IntoResponse, Response}; -use include_dir::{include_dir, Dir}; +use include_dir::{Dir, include_dir}; /// Embed the entire SvelteKit build output into the binary. /// Build with: cd apps/dashboard && pnpm build @@ -16,11 +16,11 @@ static DASHBOARD_DIR: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/../../apps/das /// Serve the SvelteKit dashboard index pub async fn serve_dashboard_spa() -> impl IntoResponse { match DASHBOARD_DIR.get_file("index.html") { - Some(file) => Html( - String::from_utf8_lossy(file.contents()).to_string(), + Some(file) => Html(String::from_utf8_lossy(file.contents()).to_string()).into_response(), + None => ( + StatusCode::NOT_FOUND, + "Dashboard not built. Run: cd apps/dashboard && pnpm build", ) - .into_response(), - None => (StatusCode::NOT_FOUND, "Dashboard not built. Run: cd apps/dashboard && pnpm build") .into_response(), } } diff --git a/crates/vestige-mcp/src/dashboard/websocket.rs b/crates/vestige-mcp/src/dashboard/websocket.rs index 88d428c..97471ef 100644 --- a/crates/vestige-mcp/src/dashboard/websocket.rs +++ b/crates/vestige-mcp/src/dashboard/websocket.rs @@ -3,8 +3,8 @@ //! Clients connect to `/ws` and receive all VestigeEvents as JSON. //! Also sends heartbeats every 5 seconds with system stats. -use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade}; use axum::extract::State; +use axum::extract::ws::{Message, WebSocket, WebSocketUpgrade}; use axum::http::{HeaderMap, StatusCode}; use axum::response::IntoResponse; use chrono::Utc; @@ -26,10 +26,11 @@ pub async fn ws_handler( // Non-browser clients (curl, wscat) won't have Origin — allowed since localhost-only. match headers.get("origin").and_then(|v| v.to_str().ok()) { Some(origin) => { - let allowed = origin.starts_with("http://127.0.0.1:") - || origin.starts_with("http://localhost:"); + let allowed = + origin.starts_with("http://127.0.0.1:") || origin.starts_with("http://localhost:"); #[cfg(debug_assertions)] - let allowed = allowed || origin == "http://localhost:5173" || origin == "http://127.0.0.1:5173"; + let allowed = + allowed || origin == "http://localhost:5173" || origin == "http://127.0.0.1:5173"; if !allowed { warn!("Rejected WebSocket connection from origin: {}", origin); return StatusCode::FORBIDDEN.into_response(); @@ -85,10 +86,14 @@ async fn handle_socket(socket: WebSocket, state: AppState) { .map(|s| (s.total_nodes as usize, s.average_retention)) .unwrap_or((0, 0.0)); + // v2.0.5: live count of memories being actively forgotten + let suppressed_count = heartbeat_state.storage.count_suppressed().unwrap_or(0); + let event = VestigeEvent::Heartbeat { uptime_secs: uptime, memory_count, avg_retention, + suppressed_count, timestamp: Utc::now(), }; diff --git a/crates/vestige-mcp/src/main.rs b/crates/vestige-mcp/src/main.rs index 7a38c33..4ac6237 100644 --- a/crates/vestige-mcp/src/main.rs +++ b/crates/vestige-mcp/src/main.rs @@ -35,7 +35,7 @@ use std::io; use std::path::PathBuf; use std::sync::Arc; use tokio::sync::Mutex; -use tracing::{error, info, warn, Level}; +use tracing::{Level, error, info, warn}; use tracing_subscriber::EnvFilter; // Use vestige-core for the cognitive science engine @@ -82,8 +82,12 @@ fn parse_args() -> Config { println!(" --http-port HTTP transport port (default: 3928)"); println!(); println!("ENVIRONMENT:"); - println!(" RUST_LOG Log level filter (e.g., debug, info, warn, error)"); - println!(" VESTIGE_AUTH_TOKEN Override the bearer token for HTTP transport"); + println!( + " RUST_LOG Log level filter (e.g., debug, info, warn, error)" + ); + println!( + " VESTIGE_AUTH_TOKEN Override the bearer token for HTTP transport" + ); println!(" VESTIGE_HTTP_PORT HTTP transport port (default: 3928)"); println!(" VESTIGE_DASHBOARD_ENABLED Enable dashboard (default: disabled)"); println!(" VESTIGE_DASHBOARD_PORT Dashboard port (default: 3927)"); @@ -153,7 +157,11 @@ fn parse_args() -> Config { i += 1; } - Config { data_dir, http_port, dashboard_enabled } + Config { + data_dir, + http_port, + dashboard_enabled, + } } #[tokio::main] @@ -163,16 +171,16 @@ async fn main() { // Initialize logging to stderr (stdout is for JSON-RPC) tracing_subscriber::fmt() - .with_env_filter( - EnvFilter::from_default_env() - .add_directive(Level::INFO.into()) - ) + .with_env_filter(EnvFilter::from_default_env().add_directive(Level::INFO.into())) .with_writer(io::stderr) .with_target(false) .with_ansi(false) .init(); - info!("Vestige MCP Server v{} starting...", env!("CARGO_PKG_VERSION")); + info!( + "Vestige MCP Server v{} starting...", + env!("CARGO_PKG_VERSION") + ); // Initialize storage with optional custom data directory let storage = match Storage::new(config.data_dir) { @@ -185,7 +193,9 @@ async fn main() { if let Err(e) = s.init_embeddings() { error!("Failed to initialize embedding service: {}", e); error!("Smart ingest will fall back to regular ingest without deduplication"); - error!("Hint: Check FASTEMBED_CACHE_PATH or ensure ~/.cache/vestige/fastembed is writable"); + error!( + "Hint: Check FASTEMBED_CACHE_PATH or ensure ~/.cache/vestige/fastembed is writable" + ); } else { info!("Embedding service initialized successfully"); } @@ -233,7 +243,10 @@ async fn main() { true } Err(e) => { - warn!("Could not read consolidation history: {} — running anyway", e); + warn!( + "Could not read consolidation history: {} — running anyway", + e + ); true } }; @@ -255,6 +268,23 @@ async fn main() { warn!("Periodic auto-consolidation failed: {}", e); } } + + // v2.0.5: Rac1 cascade sweep — walk recently-suppressed + // memories and fade their co-activated neighbors + // (Cervantes-Sandoval & Davis 2020, PMC7477079). + match storage_clone.run_rac1_cascade_sweep() { + Ok((seeds, affected)) if seeds > 0 || affected > 0 => { + info!( + suppressed_seeds = seeds, + neighbors_affected = affected, + "Rac1 cascade sweep complete" + ); + } + Ok(_) => {} + Err(e) => { + warn!("Rac1 cascade sweep failed: {}", e); + } + } } // Sleep until next check @@ -273,7 +303,8 @@ async fn main() { info!("CognitiveEngine initialized and hydrated"); // Create shared event broadcast channel for dashboard <-> MCP tool events - let (event_tx, _) = tokio::sync::broadcast::channel::(1024); + let (event_tx, _) = + tokio::sync::broadcast::channel::(1024); // Spawn dashboard HTTP server alongside MCP server (now with CognitiveEngine access) if config.dashboard_enabled { @@ -290,7 +321,9 @@ async fn main() { Some(dashboard_cognitive), dashboard_event_tx, dashboard_port, - ).await { + ) + .await + { Ok(_state) => { info!("Dashboard started with WebSocket + CognitiveEngine + shared event bus"); } @@ -312,7 +345,8 @@ async fn main() { match protocol::auth::get_or_create_auth_token() { Ok(token) => { - let bind = std::env::var("VESTIGE_HTTP_BIND").unwrap_or_else(|_| "127.0.0.1".to_string()); + let bind = + std::env::var("VESTIGE_HTTP_BIND").unwrap_or_else(|_| "127.0.0.1".to_string()); eprintln!("Vestige HTTP transport: http://{}:{}/mcp", bind, http_port); eprintln!("Auth token: {}...", &token[..token.len().min(8)]); tokio::spawn(async move { @@ -330,7 +364,10 @@ async fn main() { }); } Err(e) => { - warn!("Could not create auth token, HTTP transport disabled: {}", e); + warn!( + "Could not create auth token, HTTP transport disabled: {}", + e + ); } } } diff --git a/crates/vestige-mcp/src/protocol/http.rs b/crates/vestige-mcp/src/protocol/http.rs index d5369a2..e90c313 100644 --- a/crates/vestige-mcp/src/protocol/http.rs +++ b/crates/vestige-mcp/src/protocol/http.rs @@ -17,17 +17,17 @@ use axum::response::IntoResponse; use axum::routing::{delete, post}; use axum::{Json, Router}; use subtle::ConstantTimeEq; -use tokio::sync::{broadcast, Mutex, RwLock}; +use tokio::sync::{Mutex, RwLock, broadcast}; use tower::ServiceBuilder; use tower::limit::ConcurrencyLimitLayer; use tower_http::cors::CorsLayer; use tracing::{info, warn}; use crate::cognitive::CognitiveEngine; +use crate::dashboard::events::VestigeEvent; use crate::protocol::types::JsonRpcRequest; use crate::server::McpServer; use vestige_core::Storage; -use crate::dashboard::events::VestigeEvent; /// Maximum concurrent sessions. const MAX_SESSIONS: usize = 100; @@ -95,7 +95,11 @@ pub async fn start_http_transport( }); let removed = before - map.len(); if removed > 0 { - info!("Session reaper: removed {} idle sessions ({} active)", removed, map.len()); + info!( + "Session reaper: removed {} idle sessions ({} active)", + removed, + map.len() + ); } } }); @@ -119,8 +123,15 @@ pub async fn start_http_transport( .filter_map(|s| s.parse().ok()) .collect::>(), ) - .allow_methods([axum::http::Method::POST, axum::http::Method::DELETE, axum::http::Method::OPTIONS]) - .allow_headers([axum::http::header::CONTENT_TYPE, axum::http::header::AUTHORIZATION]) + .allow_methods([ + axum::http::Method::POST, + axum::http::Method::DELETE, + axum::http::Method::OPTIONS, + ]) + .allow_headers([ + axum::http::header::CONTENT_TYPE, + axum::http::header::AUTHORIZATION, + ]), ), ) .with_state(state); @@ -156,9 +167,10 @@ fn validate_auth(headers: &HeaderMap, expected: &str) -> Result<(), (StatusCode, .and_then(|v| v.to_str().ok()) .ok_or((StatusCode::UNAUTHORIZED, "Missing Authorization header"))?; - let token = header - .strip_prefix("Bearer ") - .ok_or((StatusCode::UNAUTHORIZED, "Invalid Authorization scheme (expected Bearer)"))?; + let token = header.strip_prefix("Bearer ").ok_or(( + StatusCode::UNAUTHORIZED, + "Invalid Authorization scheme (expected Bearer)", + ))?; // Constant-time comparison: prevents timing side-channel attacks. // We first check lengths match (length itself is not secret since UUIDs @@ -209,11 +221,7 @@ async fn post_mcp( // Take write lock immediately to avoid TOCTOU race on MAX_SESSIONS check. let mut sessions = state.sessions.write().await; if sessions.len() >= MAX_SESSIONS { - return ( - StatusCode::SERVICE_UNAVAILABLE, - "Too many active sessions", - ) - .into_response(); + return (StatusCode::SERVICE_UNAVAILABLE, "Too many active sessions").into_response(); } let server = McpServer::new_with_events( @@ -242,13 +250,23 @@ async fn post_mcp( match response { Some(resp) => { let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); + resp_headers.insert( + "mcp-session-id", + session_id + .parse() + .unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid")), + ); (StatusCode::OK, resp_headers, Json(resp)).into_response() } None => { // Notifications return 202 let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); + resp_headers.insert( + "mcp-session-id", + session_id + .parse() + .unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid")), + ); (StatusCode::ACCEPTED, resp_headers).into_response() } } @@ -273,11 +291,7 @@ async fn post_mcp( let session = match session { Some(s) => s, None => { - return ( - StatusCode::NOT_FOUND, - "Session not found or expired", - ) - .into_response(); + return (StatusCode::NOT_FOUND, "Session not found or expired").into_response(); } }; @@ -288,7 +302,12 @@ async fn post_mcp( }; let mut resp_headers = HeaderMap::new(); - resp_headers.insert("mcp-session-id", session_id.parse().unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid"))); + resp_headers.insert( + "mcp-session-id", + session_id + .parse() + .unwrap_or_else(|_| axum::http::HeaderValue::from_static("invalid")), + ); match response { Some(resp) => (StatusCode::OK, resp_headers, Json(resp)).into_response(), @@ -308,7 +327,13 @@ async fn delete_mcp( let session_id = match session_id_from_headers(&headers) { Some(id) => id, - None => return (StatusCode::BAD_REQUEST, "Missing or invalid Mcp-Session-Id header").into_response(), + None => { + return ( + StatusCode::BAD_REQUEST, + "Missing or invalid Mcp-Session-Id header", + ) + .into_response(); + } }; let mut sessions = state.sessions.write().await; diff --git a/crates/vestige-mcp/src/protocol/types.rs b/crates/vestige-mcp/src/protocol/types.rs index a29355f..57f5a10 100644 --- a/crates/vestige-mcp/src/protocol/types.rs +++ b/crates/vestige-mcp/src/protocol/types.rs @@ -25,7 +25,6 @@ pub struct JsonRpcRequest { pub params: Option, } - /// JSON-RPC Response #[derive(Debug, Clone, Serialize, Deserialize)] pub struct JsonRpcResponse { @@ -129,7 +128,10 @@ impl JsonRpcError { #[allow(dead_code)] // Reserved for future resource handling pub fn resource_not_found(uri: &str) -> Self { - Self::new(ErrorCode::ResourceNotFound, &format!("Resource not found: {}", uri)) + Self::new( + ErrorCode::ResourceNotFound, + &format!("Resource not found: {}", uri), + ) } } diff --git a/crates/vestige-mcp/src/resources/memory.rs b/crates/vestige-mcp/src/resources/memory.rs index 1c52dd7..6148932 100644 --- a/crates/vestige-mcp/src/resources/memory.rs +++ b/crates/vestige-mcp/src/resources/memory.rs @@ -35,15 +35,10 @@ pub async fn read(storage: &Arc, uri: &str) -> Result { fn parse_query_param(query: Option<&str>, key: &str, default: i32) -> i32 { query .and_then(|q| { - q.split('&') - .find_map(|pair| { - let (k, v) = pair.split_once('=')?; - if k == key { - v.parse().ok() - } else { - None - } - }) + q.split('&').find_map(|pair| { + let (k, v) = pair.split_once('=')?; + if k == key { v.parse().ok() } else { None } + }) }) .unwrap_or(default) .clamp(1, 100) @@ -228,7 +223,10 @@ async fn read_intentions(storage: &Arc) -> Result { }) .collect(); - let overdue_count = items.iter().filter(|i| i["isOverdue"].as_bool().unwrap_or(false)).count(); + let overdue_count = items + .iter() + .filter(|i| i["isOverdue"].as_bool().unwrap_or(false)) + .count(); let result = serde_json::json!({ "total": intentions.len(), @@ -241,7 +239,9 @@ async fn read_intentions(storage: &Arc) -> Result { } async fn read_triggered_intentions(storage: &Arc) -> Result { - let overdue = storage.get_overdue_intentions().map_err(|e| e.to_string())?; + let overdue = storage + .get_overdue_intentions() + .map_err(|e| e.to_string())?; let now = chrono::Utc::now(); let items: Vec = overdue @@ -289,7 +289,10 @@ async fn read_insights(storage: &Arc) -> Result { let insights = storage.get_insights(50).map_err(|e| e.to_string())?; let pending: Vec<_> = insights.iter().filter(|i| i.feedback.is_none()).collect(); - let accepted: Vec<_> = insights.iter().filter(|i| i.feedback.as_deref() == Some("accepted")).collect(); + let accepted: Vec<_> = insights + .iter() + .filter(|i| i.feedback.as_deref() == Some("accepted")) + .collect(); let items: Vec = insights .iter() @@ -319,8 +322,12 @@ async fn read_insights(storage: &Arc) -> Result { } async fn read_consolidation_log(storage: &Arc) -> Result { - let history = storage.get_consolidation_history(20).map_err(|e| e.to_string())?; - let last_run = storage.get_last_consolidation().map_err(|e| e.to_string())?; + let history = storage + .get_consolidation_history(20) + .map_err(|e| e.to_string())?; + let last_run = storage + .get_last_consolidation() + .map_err(|e| e.to_string())?; let items: Vec = history .iter() diff --git a/crates/vestige-mcp/src/server.rs b/crates/vestige-mcp/src/server.rs index b2c30ce..4f3f1e3 100644 --- a/crates/vestige-mcp/src/server.rs +++ b/crates/vestige-mcp/src/server.rs @@ -3,19 +3,19 @@ //! Handles the main MCP server logic, routing requests to appropriate //! tool and resource handlers. -use std::collections::HashMap; -use std::sync::atomic::{AtomicU64, Ordering}; -use std::sync::Arc; use chrono::Utc; -use tokio::sync::{broadcast, Mutex}; +use std::collections::HashMap; +use std::sync::Arc; +use std::sync::atomic::{AtomicU64, Ordering}; +use tokio::sync::{Mutex, broadcast}; use tracing::{debug, info, warn}; use crate::cognitive::CognitiveEngine; use crate::dashboard::events::VestigeEvent; use crate::protocol::messages::{ - CallToolRequest, CallToolResult, InitializeRequest, InitializeResult, - ListResourcesResult, ListToolsResult, ReadResourceRequest, ReadResourceResult, - ResourceDescription, ServerCapabilities, ServerInfo, ToolDescription, + CallToolRequest, CallToolResult, InitializeRequest, InitializeResult, ListResourcesResult, + ListToolsResult, ReadResourceRequest, ReadResourceResult, ResourceDescription, + ServerCapabilities, ServerInfo, ToolDescription, }; use crate::protocol::types::{JsonRpcError, JsonRpcRequest, JsonRpcResponse, MCP_VERSION}; use crate::resources; @@ -72,8 +72,14 @@ impl McpServer { debug!("Handling request: {}", request.method); // Check initialization for non-initialize requests - if !self.initialized && request.method != "initialize" && request.method != "notifications/initialized" { - warn!("Rejecting request '{}': server not initialized", request.method); + if !self.initialized + && request.method != "initialize" + && request.method != "notifications/initialized" + { + warn!( + "Rejecting request '{}': server not initialized", + request.method + ); return Some(JsonRpcResponse::error( request.id, JsonRpcError::server_not_initialized(), @@ -109,21 +115,28 @@ impl McpServer { params: Option, ) -> Result { let request: InitializeRequest = match params { - Some(p) => serde_json::from_value(p).map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, + Some(p) => serde_json::from_value(p) + .map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, None => InitializeRequest::default(), }; // Version negotiation: use client's version if older than server's // Claude Desktop rejects servers with newer protocol versions let negotiated_version = if request.protocol_version.as_str() < MCP_VERSION { - info!("Client requested older protocol version {}, using it", request.protocol_version); + info!( + "Client requested older protocol version {}, using it", + request.protocol_version + ); request.protocol_version.clone() } else { MCP_VERSION.to_string() }; self.initialized = true; - info!("MCP session initialized with protocol version {}", negotiated_version); + info!( + "MCP session initialized with protocol version {}", + negotiated_version + ); let result = InitializeResult { protocol_version: negotiated_version, @@ -306,6 +319,15 @@ impl McpServer { description: Some("Alias for deep_reference. Connect the dots across memories with cognitive reasoning.".to_string()), input_schema: tools::cross_reference::schema(), }, + // ================================================================ + // ACTIVE FORGETTING (v2.0.5) — top-down suppression + // Anderson et al. 2025 Nat Rev Neurosci + Davis Rac1 + // ================================================================ + ToolDescription { + name: "suppress".to_string(), + description: Some("Actively suppress a memory via top-down inhibitory control (Anderson 2025 SIF + Davis Rac1). Distinct from delete: the memory persists but is inhibited from retrieval and actively decays. Each call compounds. A background Rac1 worker cascades decay to co-activated neighbors. Reversible within 24 hours via reverse=true.".to_string()), + input_schema: tools::suppress::schema(), + }, ]; let result = ListToolsResult { tools }; @@ -318,7 +340,8 @@ impl McpServer { params: Option, ) -> Result { let request: CallToolRequest = match params { - Some(p) => serde_json::from_value(p).map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, + Some(p) => serde_json::from_value(p) + .map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, None => return Err(JsonRpcError::invalid_params("Missing tool call parameters")), }; @@ -329,43 +352,68 @@ impl McpServer { } // Save args for event emission (tool dispatch consumes request.arguments) - let saved_args = if self.event_tx.is_some() { request.arguments.clone() } else { None }; + let saved_args = if self.event_tx.is_some() { + request.arguments.clone() + } else { + None + }; let result = match request.name.as_str() { // ================================================================ // UNIFIED TOOLS (v1.1+) - Preferred API // ================================================================ - "search" => tools::search_unified::execute(&self.storage, &self.cognitive, request.arguments).await, - "memory" => tools::memory_unified::execute(&self.storage, &self.cognitive, request.arguments).await, - "codebase" => tools::codebase_unified::execute(&self.storage, &self.cognitive, request.arguments).await, - "intention" => tools::intention_unified::execute(&self.storage, &self.cognitive, request.arguments).await, + "search" => { + tools::search_unified::execute(&self.storage, &self.cognitive, request.arguments) + .await + } + "memory" => { + tools::memory_unified::execute(&self.storage, &self.cognitive, request.arguments) + .await + } + "codebase" => { + tools::codebase_unified::execute(&self.storage, &self.cognitive, request.arguments) + .await + } + "intention" => { + tools::intention_unified::execute(&self.storage, &self.cognitive, request.arguments) + .await + } // ================================================================ // Core memory (v1.7: smart_ingest absorbs ingest + checkpoint) // ================================================================ - "smart_ingest" => tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments).await, + "smart_ingest" => { + tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments) + .await + } // ================================================================ // DEPRECATED (v1.7): ingest → smart_ingest // ================================================================ "ingest" => { warn!("Tool 'ingest' is deprecated in v1.7. Use 'smart_ingest' instead."); - tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments).await + tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments) + .await } // ================================================================ // DEPRECATED (v1.7): session_checkpoint → smart_ingest (batch mode) // ================================================================ "session_checkpoint" => { - warn!("Tool 'session_checkpoint' is deprecated in v1.7. Use 'smart_ingest' with 'items' parameter instead."); - tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments).await + warn!( + "Tool 'session_checkpoint' is deprecated in v1.7. Use 'smart_ingest' with 'items' parameter instead." + ); + tools::smart_ingest::execute(&self.storage, &self.cognitive, request.arguments) + .await } // ================================================================ // DEPRECATED (v1.7): promote_memory → memory(action='promote') // ================================================================ "promote_memory" => { - warn!("Tool 'promote_memory' is deprecated in v1.7. Use 'memory' with action='promote' instead."); + warn!( + "Tool 'promote_memory' is deprecated in v1.7. Use 'memory' with action='promote' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -379,7 +427,9 @@ impl McpServer { tools::memory_unified::execute(&self.storage, &self.cognitive, unified_args).await } "demote_memory" => { - warn!("Tool 'demote_memory' is deprecated in v1.7. Use 'memory' with action='demote' instead."); + warn!( + "Tool 'demote_memory' is deprecated in v1.7. Use 'memory' with action='demote' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -398,17 +448,34 @@ impl McpServer { // ================================================================ "health_check" => { warn!("Tool 'health_check' is deprecated in v1.7. Use 'system_status' instead."); - tools::maintenance::execute_system_status(&self.storage, &self.cognitive, request.arguments).await + tools::maintenance::execute_system_status( + &self.storage, + &self.cognitive, + request.arguments, + ) + .await } "stats" => { warn!("Tool 'stats' is deprecated in v1.7. Use 'system_status' instead."); - tools::maintenance::execute_system_status(&self.storage, &self.cognitive, request.arguments).await + tools::maintenance::execute_system_status( + &self.storage, + &self.cognitive, + request.arguments, + ) + .await } // ================================================================ // SYSTEM STATUS (v1.7: replaces health_check + stats) // ================================================================ - "system_status" => tools::maintenance::execute_system_status(&self.storage, &self.cognitive, request.arguments).await, + "system_status" => { + tools::maintenance::execute_system_status( + &self.storage, + &self.cognitive, + request.arguments, + ) + .await + } "mark_reviewed" => tools::review::execute(&self.storage, request.arguments).await, @@ -416,15 +483,21 @@ impl McpServer { // DEPRECATED: Search tools - redirect to unified 'search' // ================================================================ "recall" | "semantic_search" | "hybrid_search" => { - warn!("Tool '{}' is deprecated. Use 'search' instead.", request.name); - tools::search_unified::execute(&self.storage, &self.cognitive, request.arguments).await + warn!( + "Tool '{}' is deprecated. Use 'search' instead.", + request.name + ); + tools::search_unified::execute(&self.storage, &self.cognitive, request.arguments) + .await } // ================================================================ // DEPRECATED: Memory tools - redirect to unified 'memory' // ================================================================ "get_knowledge" => { - warn!("Tool 'get_knowledge' is deprecated. Use 'memory' with action='get' instead."); + warn!( + "Tool 'get_knowledge' is deprecated. Use 'memory' with action='get' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let id = args.get("id").cloned().unwrap_or(serde_json::Value::Null); @@ -438,7 +511,9 @@ impl McpServer { tools::memory_unified::execute(&self.storage, &self.cognitive, unified_args).await } "delete_knowledge" => { - warn!("Tool 'delete_knowledge' is deprecated. Use 'memory' with action='delete' instead."); + warn!( + "Tool 'delete_knowledge' is deprecated. Use 'memory' with action='delete' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let id = args.get("id").cloned().unwrap_or(serde_json::Value::Null); @@ -452,10 +527,15 @@ impl McpServer { tools::memory_unified::execute(&self.storage, &self.cognitive, unified_args).await } "get_memory_state" => { - warn!("Tool 'get_memory_state' is deprecated. Use 'memory' with action='state' instead."); + warn!( + "Tool 'get_memory_state' is deprecated. Use 'memory' with action='state' instead." + ); let unified_args = match request.arguments { Some(ref args) => { - let id = args.get("memory_id").cloned().unwrap_or(serde_json::Value::Null); + let id = args + .get("memory_id") + .cloned() + .unwrap_or(serde_json::Value::Null); Some(serde_json::json!({ "action": "state", "id": id @@ -470,7 +550,9 @@ impl McpServer { // DEPRECATED: Codebase tools - redirect to unified 'codebase' // ================================================================ "remember_pattern" => { - warn!("Tool 'remember_pattern' is deprecated. Use 'codebase' with action='remember_pattern' instead."); + warn!( + "Tool 'remember_pattern' is deprecated. Use 'codebase' with action='remember_pattern' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -484,12 +566,17 @@ impl McpServer { tools::codebase_unified::execute(&self.storage, &self.cognitive, unified_args).await } "remember_decision" => { - warn!("Tool 'remember_decision' is deprecated. Use 'codebase' with action='remember_decision' instead."); + warn!( + "Tool 'remember_decision' is deprecated. Use 'codebase' with action='remember_decision' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); if let Some(obj) = new_args.as_object_mut() { - obj.insert("action".to_string(), serde_json::json!("remember_decision")); + obj.insert( + "action".to_string(), + serde_json::json!("remember_decision"), + ); } Some(new_args) } @@ -498,7 +585,9 @@ impl McpServer { tools::codebase_unified::execute(&self.storage, &self.cognitive, unified_args).await } "get_codebase_context" => { - warn!("Tool 'get_codebase_context' is deprecated. Use 'codebase' with action='get_context' instead."); + warn!( + "Tool 'get_codebase_context' is deprecated. Use 'codebase' with action='get_context' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -516,7 +605,9 @@ impl McpServer { // DEPRECATED: Intention tools - redirect to unified 'intention' // ================================================================ "set_intention" => { - warn!("Tool 'set_intention' is deprecated. Use 'intention' with action='set' instead."); + warn!( + "Tool 'set_intention' is deprecated. Use 'intention' with action='set' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -527,10 +618,13 @@ impl McpServer { } None => Some(serde_json::json!({"action": "set"})), }; - tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args).await + tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args) + .await } "check_intentions" => { - warn!("Tool 'check_intentions' is deprecated. Use 'intention' with action='check' instead."); + warn!( + "Tool 'check_intentions' is deprecated. Use 'intention' with action='check' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -541,13 +635,19 @@ impl McpServer { } None => Some(serde_json::json!({"action": "check"})), }; - tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args).await + tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args) + .await } "complete_intention" => { - warn!("Tool 'complete_intention' is deprecated. Use 'intention' with action='update', status='complete' instead."); + warn!( + "Tool 'complete_intention' is deprecated. Use 'intention' with action='update', status='complete' instead." + ); let unified_args = match request.arguments { Some(ref args) => { - let id = args.get("intentionId").cloned().unwrap_or(serde_json::Value::Null); + let id = args + .get("intentionId") + .cloned() + .unwrap_or(serde_json::Value::Null); Some(serde_json::json!({ "action": "update", "id": id, @@ -556,14 +656,23 @@ impl McpServer { } None => None, }; - tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args).await + tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args) + .await } "snooze_intention" => { - warn!("Tool 'snooze_intention' is deprecated. Use 'intention' with action='update', status='snooze' instead."); + warn!( + "Tool 'snooze_intention' is deprecated. Use 'intention' with action='update', status='snooze' instead." + ); let unified_args = match request.arguments { Some(ref args) => { - let id = args.get("intentionId").cloned().unwrap_or(serde_json::Value::Null); - let minutes = args.get("minutes").cloned().unwrap_or(serde_json::json!(30)); + let id = args + .get("intentionId") + .cloned() + .unwrap_or(serde_json::Value::Null); + let minutes = args + .get("minutes") + .cloned() + .unwrap_or(serde_json::json!(30)); Some(serde_json::json!({ "action": "update", "id": id, @@ -573,10 +682,13 @@ impl McpServer { } None => None, }; - tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args).await + tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args) + .await } "list_intentions" => { - warn!("Tool 'list_intentions' is deprecated. Use 'intention' with action='list' instead."); + warn!( + "Tool 'list_intentions' is deprecated. Use 'intention' with action='list' instead." + ); let unified_args = match request.arguments { Some(ref args) => { let mut new_args = args.clone(); @@ -590,15 +702,20 @@ impl McpServer { } None => Some(serde_json::json!({"action": "list"})), }; - tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args).await + tools::intention_unified::execute(&self.storage, &self.cognitive, unified_args) + .await } // ================================================================ // Neuroscience tools (internal, not in tools/list) // ================================================================ - "list_by_state" => tools::memory_states::execute_list(&self.storage, request.arguments).await, + "list_by_state" => { + tools::memory_states::execute_list(&self.storage, request.arguments).await + } "state_stats" => tools::memory_states::execute_stats(&self.storage).await, - "trigger_importance" => tools::tagging::execute_trigger(&self.storage, request.arguments).await, + "trigger_importance" => { + tools::tagging::execute_trigger(&self.storage, request.arguments).await + } "find_tagged" => tools::tagging::execute_find(&self.storage, request.arguments).await, "tagging_stats" => tools::tagging::execute_stats(&self.storage).await, "match_context" => tools::context::execute(&self.storage, request.arguments).await, @@ -606,7 +723,9 @@ impl McpServer { // ================================================================ // Feedback (internal, still used by request_feedback) // ================================================================ - "request_feedback" => tools::feedback::execute_request_feedback(&self.storage, request.arguments).await, + "request_feedback" => { + tools::feedback::execute_request_feedback(&self.storage, request.arguments).await + } // ================================================================ // TEMPORAL TOOLS (v1.2+) @@ -630,7 +749,9 @@ impl McpServer { // ================================================================ // AUTO-SAVE & DEDUP TOOLS (v1.3+) // ================================================================ - "importance_score" => tools::importance::execute(&self.storage, &self.cognitive, request.arguments).await, + "importance_score" => { + tools::importance::execute(&self.storage, &self.cognitive, request.arguments).await + } "find_duplicates" => tools::dedup::execute(&self.storage, request.arguments).await, // ================================================================ @@ -638,26 +759,45 @@ impl McpServer { // ================================================================ "dream" => { self.emit(VestigeEvent::DreamStarted { - memory_count: self.storage.get_stats().map(|s| s.total_nodes as usize).unwrap_or(0), + memory_count: self + .storage + .get_stats() + .map(|s| s.total_nodes as usize) + .unwrap_or(0), timestamp: chrono::Utc::now(), }); tools::dream::execute(&self.storage, &self.cognitive, request.arguments).await } - "explore_connections" => tools::explore::execute(&self.storage, &self.cognitive, request.arguments).await, - "predict" => tools::predict::execute(&self.storage, &self.cognitive, request.arguments).await, + "explore_connections" => { + tools::explore::execute(&self.storage, &self.cognitive, request.arguments).await + } + "predict" => { + tools::predict::execute(&self.storage, &self.cognitive, request.arguments).await + } "restore" => tools::restore::execute(&self.storage, request.arguments).await, // ================================================================ // CONTEXT PACKETS (v1.8+) // ================================================================ - "session_context" => tools::session_context::execute(&self.storage, &self.cognitive, request.arguments).await, + "session_context" => { + tools::session_context::execute(&self.storage, &self.cognitive, request.arguments) + .await + } // ================================================================ // AUTONOMIC TOOLS (v1.9+) // ================================================================ "memory_health" => tools::health::execute(&self.storage, request.arguments).await, "memory_graph" => tools::graph::execute(&self.storage, request.arguments).await, - "deep_reference" | "cross_reference" => tools::cross_reference::execute(&self.storage, &self.cognitive, request.arguments).await, + "deep_reference" | "cross_reference" => { + tools::cross_reference::execute(&self.storage, &self.cognitive, request.arguments) + .await + } + + // ================================================================ + // ACTIVE FORGETTING (v2.0.5) — top-down suppression + // ================================================================ + "suppress" => tools::suppress::execute(&self.storage, request.arguments).await, name => { return Err(JsonRpcError::method_not_found_with_message(&format!( @@ -680,11 +820,13 @@ impl McpServer { let call_result = CallToolResult { content: vec![crate::protocol::messages::ToolResultContent { content_type: "text".to_string(), - text: serde_json::to_string_pretty(&content).unwrap_or_else(|_| content.to_string()), + text: serde_json::to_string_pretty(&content) + .unwrap_or_else(|_| content.to_string()), }], is_error: Some(false), }; - serde_json::to_value(call_result).map_err(|e| JsonRpcError::internal_error(&e.to_string())) + serde_json::to_value(call_result) + .map_err(|e| JsonRpcError::internal_error(&e.to_string())) } Err(e) => { let call_result = CallToolResult { @@ -694,13 +836,16 @@ impl McpServer { }], is_error: Some(true), }; - serde_json::to_value(call_result).map_err(|e| JsonRpcError::internal_error(&e.to_string())) + serde_json::to_value(call_result) + .map_err(|e| JsonRpcError::internal_error(&e.to_string())) } }; // Inline consolidation trigger: uses ConsolidationScheduler instead of fixed count let count = self.tool_call_count.fetch_add(1, Ordering::Relaxed) + 1; - let should_consolidate = self.cognitive.try_lock() + let should_consolidate = self + .cognitive + .try_lock() .ok() .map(|cog| cog.consolidation_scheduler.should_consolidate()) .unwrap_or(count.is_multiple_of(100)); // Fallback to count-based if lock unavailable @@ -799,7 +944,9 @@ impl McpServer { ResourceDescription { uri: "memory://intentions".to_string(), name: "Active Intentions".to_string(), - description: Some("Future intentions (prospective memory) waiting to be triggered".to_string()), + description: Some( + "Future intentions (prospective memory) waiting to be triggered".to_string(), + ), mime_type: Some("application/json".to_string()), }, ResourceDescription { @@ -820,7 +967,8 @@ impl McpServer { params: Option, ) -> Result { let request: ReadResourceRequest = match params { - Some(p) => serde_json::from_value(p).map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, + Some(p) => serde_json::from_value(p) + .map_err(|e| JsonRpcError::invalid_params(&e.to_string()))?, None => return Err(JsonRpcError::invalid_params("Missing resource URI")), }; @@ -847,7 +995,8 @@ impl McpServer { blob: None, }], }; - serde_json::to_value(result).map_err(|e| JsonRpcError::internal_error(&e.to_string())) + serde_json::to_value(result) + .map_err(|e| JsonRpcError::internal_error(&e.to_string())) } Err(e) => Err(JsonRpcError::internal_error(&e)), } @@ -870,25 +1019,49 @@ impl McpServer { "smart_ingest" | "ingest" | "session_checkpoint" => { // Single mode: result has "decision" (create/update/supersede/reinforce/merge/replace/add_context) if let Some(decision) = result.get("decision").and_then(|a| a.as_str()) { - let id = result.get("nodeId").or(result.get("id")) - .and_then(|v| v.as_str()).unwrap_or("").to_string(); - let preview = result.get("contentPreview").or(result.get("content")) - .and_then(|v| v.as_str()).unwrap_or("").to_string(); + let id = result + .get("nodeId") + .or(result.get("id")) + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); + let preview = result + .get("contentPreview") + .or(result.get("content")) + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); match decision { "create" => { - let node_type = result.get("nodeType") - .and_then(|v| v.as_str()).unwrap_or("fact").to_string(); - let tags = result.get("tags") + let node_type = result + .get("nodeType") + .and_then(|v| v.as_str()) + .unwrap_or("fact") + .to_string(); + let tags = result + .get("tags") .and_then(|v| v.as_array()) - .map(|arr| arr.iter().filter_map(|t| t.as_str().map(String::from)).collect()) + .map(|arr| { + arr.iter() + .filter_map(|t| t.as_str().map(String::from)) + .collect() + }) .unwrap_or_default(); self.emit(VestigeEvent::MemoryCreated { - id, content_preview: preview, node_type, tags, timestamp: now, + id, + content_preview: preview, + node_type, + tags, + timestamp: now, }); } - "update" | "supersede" | "reinforce" | "merge" | "replace" | "add_context" => { + "update" | "supersede" | "reinforce" | "merge" | "replace" + | "add_context" => { self.emit(VestigeEvent::MemoryUpdated { - id, content_preview: preview, field: decision.to_string(), timestamp: now, + id, + content_preview: preview, + field: decision.to_string(), + timestamp: now, }); } _ => {} @@ -898,19 +1071,31 @@ impl McpServer { if let Some(results) = result.get("results").and_then(|r| r.as_array()) { for item in results { let decision = item.get("decision").and_then(|a| a.as_str()).unwrap_or(""); - let id = item.get("nodeId").or(item.get("id")) - .and_then(|v| v.as_str()).unwrap_or("").to_string(); - let preview = item.get("contentPreview") - .and_then(|v| v.as_str()).unwrap_or("").to_string(); + let id = item + .get("nodeId") + .or(item.get("id")) + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); + let preview = item + .get("contentPreview") + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); if decision == "create" { self.emit(VestigeEvent::MemoryCreated { - id, content_preview: preview, - node_type: "fact".to_string(), tags: vec![], timestamp: now, + id, + content_preview: preview, + node_type: "fact".to_string(), + tags: vec![], + timestamp: now, }); } else if !decision.is_empty() { self.emit(VestigeEvent::MemoryUpdated { - id, content_preview: preview, - field: decision.to_string(), timestamp: now, + id, + content_preview: preview, + field: decision.to_string(), + timestamp: now, }); } } @@ -918,35 +1103,53 @@ impl McpServer { } // -- memory: get/delete/promote/demote -- - "memory" | "promote_memory" | "demote_memory" | "delete_knowledge" | "get_memory_state" => { - let action = args.as_ref() + "memory" | "promote_memory" | "demote_memory" | "delete_knowledge" + | "get_memory_state" => { + let action = args + .as_ref() .and_then(|a| a.get("action")) .and_then(|a| a.as_str()) - .unwrap_or(if tool_name == "promote_memory" { "promote" } - else if tool_name == "demote_memory" { "demote" } - else if tool_name == "delete_knowledge" { "delete" } - else { "" }); - let id = args.as_ref() + .unwrap_or(if tool_name == "promote_memory" { + "promote" + } else if tool_name == "demote_memory" { + "demote" + } else if tool_name == "delete_knowledge" { + "delete" + } else { + "" + }); + let id = args + .as_ref() .and_then(|a| a.get("id")) - .and_then(|v| v.as_str()).unwrap_or("").to_string(); + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); match action { "delete" => { self.emit(VestigeEvent::MemoryDeleted { id, timestamp: now }); } "promote" => { - let retention = result.get("newRetention") + let retention = result + .get("newRetention") .or(result.get("retrievalStrength")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); self.emit(VestigeEvent::MemoryPromoted { - id, new_retention: retention, timestamp: now, + id, + new_retention: retention, + timestamp: now, }); } "demote" => { - let retention = result.get("newRetention") + let retention = result + .get("newRetention") .or(result.get("retrievalStrength")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); self.emit(VestigeEvent::MemoryDemoted { - id, new_retention: retention, timestamp: now, + id, + new_retention: retention, + timestamp: now, }); } _ => {} @@ -955,86 +1158,144 @@ impl McpServer { // -- search -- "search" | "recall" | "semantic_search" | "hybrid_search" => { - let query = args.as_ref() + let query = args + .as_ref() .and_then(|a| a.get("query")) - .and_then(|v| v.as_str()).unwrap_or("").to_string(); + .and_then(|v| v.as_str()) + .unwrap_or("") + .to_string(); let results = result.get("results").and_then(|r| r.as_array()); let result_count = results.map(|r| r.len()).unwrap_or(0); let result_ids: Vec = results - .map(|r| r.iter() - .filter_map(|item| item.get("id").and_then(|v| v.as_str()).map(String::from)) - .collect()) + .map(|r| { + r.iter() + .filter_map(|item| { + item.get("id").and_then(|v| v.as_str()).map(String::from) + }) + .collect() + }) .unwrap_or_default(); - let duration_ms = result.get("durationMs") + let duration_ms = result + .get("durationMs") .or(result.get("duration_ms")) - .and_then(|v| v.as_u64()).unwrap_or(0); + .and_then(|v| v.as_u64()) + .unwrap_or(0); self.emit(VestigeEvent::SearchPerformed { - query, result_count, result_ids, duration_ms, timestamp: now, + query, + result_count, + result_ids, + duration_ms, + timestamp: now, }); } // -- dream -- "dream" => { - let replayed = result.get("memoriesReplayed") + let replayed = result + .get("memoriesReplayed") .or(result.get("memories_replayed")) - .and_then(|v| v.as_u64()).unwrap_or(0) as usize; - let connections = result.get("connectionsFound") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let connections = result + .get("connectionsFound") .or(result.get("connections_found")) - .and_then(|v| v.as_u64()).unwrap_or(0) as usize; - let insights = result.get("insightsGenerated") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let insights = result + .get("insightsGenerated") .or(result.get("insights")) - .and_then(|v| v.as_array()).map(|a| a.len()).unwrap_or(0); - let duration_ms = result.get("durationMs") + .and_then(|v| v.as_array()) + .map(|a| a.len()) + .unwrap_or(0); + let duration_ms = result + .get("durationMs") .or(result.get("duration_ms")) - .and_then(|v| v.as_u64()).unwrap_or(0); + .and_then(|v| v.as_u64()) + .unwrap_or(0); self.emit(VestigeEvent::DreamCompleted { - memories_replayed: replayed, connections_found: connections, - insights_generated: insights, duration_ms, timestamp: now, + memories_replayed: replayed, + connections_found: connections, + insights_generated: insights, + duration_ms, + timestamp: now, }); } // -- consolidate -- "consolidate" => { - let processed = result.get("nodesProcessed") + let processed = result + .get("nodesProcessed") .or(result.get("nodes_processed")) - .and_then(|v| v.as_u64()).unwrap_or(0) as usize; - let decay = result.get("decayApplied") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let decay = result + .get("decayApplied") .or(result.get("decay_applied")) - .and_then(|v| v.as_u64()).unwrap_or(0) as usize; - let embeddings = result.get("embeddingsGenerated") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let embeddings = result + .get("embeddingsGenerated") .or(result.get("embeddings_generated")) - .and_then(|v| v.as_u64()).unwrap_or(0) as usize; - let duration_ms = result.get("durationMs") + .and_then(|v| v.as_u64()) + .unwrap_or(0) as usize; + let duration_ms = result + .get("durationMs") .or(result.get("duration_ms")) - .and_then(|v| v.as_u64()).unwrap_or(0); + .and_then(|v| v.as_u64()) + .unwrap_or(0); self.emit(VestigeEvent::ConsolidationCompleted { - nodes_processed: processed, decay_applied: decay, - embeddings_generated: embeddings, duration_ms, timestamp: now, + nodes_processed: processed, + decay_applied: decay, + embeddings_generated: embeddings, + duration_ms, + timestamp: now, }); } // -- importance_score -- "importance_score" => { - let preview = args.as_ref() + let preview = args + .as_ref() .and_then(|a| a.get("content")) .and_then(|v| v.as_str()) - .map(|s| if s.len() > 100 { format!("{}...", &s[..s.floor_char_boundary(100)]) } else { s.to_string() }) + .map(|s| { + if s.len() > 100 { + format!("{}...", &s[..s.floor_char_boundary(100)]) + } else { + s.to_string() + } + }) .unwrap_or_default(); - let composite = result.get("compositeScore") + let composite = result + .get("compositeScore") .or(result.get("composite_score")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); let channels = result.get("channels").or(result.get("breakdown")); - let novelty = channels.and_then(|c| c.get("novelty")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); - let arousal = channels.and_then(|c| c.get("arousal")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); - let reward = channels.and_then(|c| c.get("reward")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); - let attention = channels.and_then(|c| c.get("attention")) - .and_then(|v| v.as_f64()).unwrap_or(0.0); + let novelty = channels + .and_then(|c| c.get("novelty")) + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); + let arousal = channels + .and_then(|c| c.get("arousal")) + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); + let reward = channels + .and_then(|c| c.get("reward")) + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); + let attention = channels + .and_then(|c| c.get("attention")) + .and_then(|v| v.as_f64()) + .unwrap_or(0.0); self.emit(VestigeEvent::ImportanceScored { - content_preview: preview, composite_score: composite, - novelty, arousal, reward, attention, timestamp: now, + content_preview: preview, + composite_score: composite, + novelty, + arousal, + reward, + attention, + timestamp: now, }); } @@ -1087,14 +1348,17 @@ mod tests { let (mut server, _dir) = test_server().await; assert!(!server.initialized); - let request = make_request("initialize", Some(serde_json::json!({ - "protocolVersion": "2024-11-05", - "capabilities": {}, - "clientInfo": { - "name": "test-client", - "version": "1.0.0" - } - }))); + let request = make_request( + "initialize", + Some(serde_json::json!({ + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "test-client", + "version": "1.0.0" + } + })), + ); let response = server.handle_request(request).await; assert!(response.is_some()); @@ -1201,13 +1465,10 @@ mod tests { let result = response.result.unwrap(); let tools = result["tools"].as_array().unwrap(); - // v2.0.4: 23 tools (4 unified + 1 core + 2 temporal + 5 maintenance + 2 auto-save + 3 cognitive + 1 restore + 1 session_context + 2 autonomic + 1 deep_reference + 1 cross_reference alias) - assert_eq!(tools.len(), 23, "Expected exactly 23 tools in v2.0.4+"); + // v2.0.5: 24 tools (4 unified + 1 core + 2 temporal + 5 maintenance + 2 auto-save + 3 cognitive + 1 restore + 1 session_context + 2 autonomic + 1 deep_reference + 1 cross_reference alias + 1 suppress) + assert_eq!(tools.len(), 24, "Expected exactly 24 tools in v2.0.5+"); - let tool_names: Vec<&str> = tools - .iter() - .map(|t| t["name"].as_str().unwrap()) - .collect(); + let tool_names: Vec<&str> = tools.iter().map(|t| t["name"].as_str().unwrap()).collect(); // Unified tools assert!(tool_names.contains(&"search")); @@ -1217,12 +1478,24 @@ mod tests { // Core memory (smart_ingest absorbs ingest + checkpoint in v1.7) assert!(tool_names.contains(&"smart_ingest")); - assert!(!tool_names.contains(&"ingest"), "ingest should be removed in v1.7"); - assert!(!tool_names.contains(&"session_checkpoint"), "session_checkpoint should be removed in v1.7"); + assert!( + !tool_names.contains(&"ingest"), + "ingest should be removed in v1.7" + ); + assert!( + !tool_names.contains(&"session_checkpoint"), + "session_checkpoint should be removed in v1.7" + ); // Feedback merged into memory tool (v1.7) - assert!(!tool_names.contains(&"promote_memory"), "promote_memory should be removed in v1.7"); - assert!(!tool_names.contains(&"demote_memory"), "demote_memory should be removed in v1.7"); + assert!( + !tool_names.contains(&"promote_memory"), + "promote_memory should be removed in v1.7" + ); + assert!( + !tool_names.contains(&"demote_memory"), + "demote_memory should be removed in v1.7" + ); // Temporal tools (v1.2) assert!(tool_names.contains(&"memory_timeline")); @@ -1230,8 +1503,14 @@ mod tests { // Maintenance tools (v1.7: system_status replaces health_check + stats) assert!(tool_names.contains(&"system_status")); - assert!(!tool_names.contains(&"health_check"), "health_check should be removed in v1.7"); - assert!(!tool_names.contains(&"stats"), "stats should be removed in v1.7"); + assert!( + !tool_names.contains(&"health_check"), + "health_check should be removed in v1.7" + ); + assert!( + !tool_names.contains(&"stats"), + "stats should be removed in v1.7" + ); assert!(tool_names.contains(&"consolidate")); assert!(tool_names.contains(&"backup")); assert!(tool_names.contains(&"export")); @@ -1257,6 +1536,9 @@ mod tests { // Deep reference + cross_reference alias (v2.0.4) assert!(tool_names.contains(&"deep_reference")); assert!(tool_names.contains(&"cross_reference")); + + // Active forgetting (v2.0.5) — Anderson 2025 + Davis Rac1 + assert!(tool_names.contains(&"suppress")); } #[tokio::test] @@ -1274,8 +1556,14 @@ mod tests { for tool in tools { assert!(tool["name"].is_string(), "Tool should have a name"); - assert!(tool["description"].is_string(), "Tool should have a description"); - assert!(tool["inputSchema"].is_object(), "Tool should have an input schema"); + assert!( + tool["description"].is_string(), + "Tool should have a description" + ); + assert!( + tool["inputSchema"].is_object(), + "Tool should have an input schema" + ); } } @@ -1328,7 +1616,10 @@ mod tests { for resource in resources { assert!(resource["uri"].is_string(), "Resource should have a URI"); assert!(resource["name"].is_string(), "Resource should have a name"); - assert!(resource["description"].is_string(), "Resource should have a description"); + assert!( + resource["description"].is_string(), + "Resource should have a description" + ); } } @@ -1360,10 +1651,13 @@ mod tests { let init_request = make_request("initialize", None); server.handle_request(init_request).await; - let request = make_request("tools/call", Some(serde_json::json!({ - "name": "nonexistent_tool", - "arguments": {} - }))); + let request = make_request( + "tools/call", + Some(serde_json::json!({ + "name": "nonexistent_tool", + "arguments": {} + })), + ); let response = server.handle_request(request).await.unwrap(); assert!(response.error.is_some()); @@ -1414,9 +1708,12 @@ mod tests { let init_request = make_request("initialize", None); server.handle_request(init_request).await; - let request = make_request("tools/call", Some(serde_json::json!({ - "invalid": "params" - }))); + let request = make_request( + "tools/call", + Some(serde_json::json!({ + "invalid": "params" + })), + ); let response = server.handle_request(request).await.unwrap(); assert!(response.error.is_some()); diff --git a/crates/vestige-mcp/src/tools/changelog.rs b/crates/vestige-mcp/src/tools/changelog.rs index f615acb..e2c4928 100644 --- a/crates/vestige-mcp/src/tools/changelog.rs +++ b/crates/vestige-mcp/src/tools/changelog.rs @@ -54,10 +54,7 @@ struct ChangelogArgs { } /// Execute memory_changelog tool -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: ChangelogArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => ChangelogArgs { @@ -80,11 +77,7 @@ pub async fn execute( } /// Per-memory changelog: state transition audit trail -fn execute_per_memory( - storage: &Storage, - memory_id: &str, - limit: i32, -) -> Result { +fn execute_per_memory(storage: &Storage, memory_id: &str, limit: i32) -> Result { // Validate UUID format Uuid::parse_str(memory_id) .map_err(|_| format!("Invalid memory_id '{}'. Must be a valid UUID.", memory_id))?; @@ -126,10 +119,7 @@ fn execute_per_memory( } /// System-wide changelog: consolidations + recent state transitions -fn execute_system_wide( - storage: &Storage, - limit: i32, -) -> Result { +fn execute_system_wide(storage: &Storage, limit: i32) -> Result { // Get consolidation history let consolidations = storage .get_consolidation_history(limit) @@ -141,9 +131,7 @@ fn execute_system_wide( .map_err(|e| e.to_string())?; // Get dream history (Bug #9 fix — dreams were invisible to audit trail) - let dreams = storage - .get_dream_history(limit) - .unwrap_or_default(); + let dreams = storage.get_dream_history(limit).unwrap_or_default(); // Build unified event list let mut events: Vec<(DateTime, Value)> = Vec::new(); @@ -296,8 +284,7 @@ mod tests { #[tokio::test] async fn test_changelog_per_memory_nonexistent() { let (storage, _dir) = test_storage().await; - let args = - serde_json::json!({ "memory_id": "00000000-0000-0000-0000-000000000000" }); + let args = serde_json::json!({ "memory_id": "00000000-0000-0000-0000-000000000000" }); let result = execute(&storage, Some(args)).await; assert!(result.is_err()); assert!(result.unwrap_err().contains("not found")); diff --git a/crates/vestige-mcp/src/tools/checkpoint.rs b/crates/vestige-mcp/src/tools/checkpoint.rs index b31becc..69cab08 100644 --- a/crates/vestige-mcp/src/tools/checkpoint.rs +++ b/crates/vestige-mcp/src/tools/checkpoint.rs @@ -7,7 +7,6 @@ use serde::Deserialize; use serde_json::Value; use std::sync::Arc; - use vestige_core::{IngestInput, Storage}; /// Input schema for session_checkpoint tool @@ -63,10 +62,7 @@ struct CheckpointItem { source: Option, } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: CheckpointArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), diff --git a/crates/vestige-mcp/src/tools/codebase.rs b/crates/vestige-mcp/src/tools/codebase.rs index 22fe3d4..3d51a4b 100644 --- a/crates/vestige-mcp/src/tools/codebase.rs +++ b/crates/vestige-mcp/src/tools/codebase.rs @@ -7,7 +7,6 @@ use serde::Deserialize; use serde_json::Value; use std::sync::Arc; - use vestige_core::{IngestInput, Storage}; /// Input schema for remember_pattern tool @@ -114,10 +113,7 @@ struct ContextArgs { limit: Option, } -pub async fn execute_pattern( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_pattern(storage: &Arc, args: Option) -> Result { let args: PatternArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -206,7 +202,11 @@ pub async fn execute_decision( } // Build tags - let mut tags = vec!["decision".to_string(), "architecture".to_string(), "codebase".to_string()]; + let mut tags = vec![ + "decision".to_string(), + "architecture".to_string(), + "codebase".to_string(), + ]; if let Some(ref codebase) = args.codebase { tags.push(format!("codebase:{}", codebase)); } @@ -231,10 +231,7 @@ pub async fn execute_decision( })) } -pub async fn execute_context( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_context(storage: &Arc, args: Option) -> Result { let args: ContextArgs = args .map(serde_json::from_value) .transpose() diff --git a/crates/vestige-mcp/src/tools/codebase_unified.rs b/crates/vestige-mcp/src/tools/codebase_unified.rs index 61c7536..726ab4b 100644 --- a/crates/vestige-mcp/src/tools/codebase_unified.rs +++ b/crates/vestige-mcp/src/tools/codebase_unified.rs @@ -161,7 +161,8 @@ async fn execute_remember_pattern( // ==================================================================== if let Ok(cog) = cognitive.try_lock() { let codebase_name = args.codebase.as_deref().unwrap_or("default"); - cog.cross_project.record_project_memory(&node_id, codebase_name, None); + cog.cross_project + .record_project_memory(&node_id, codebase_name, None); // Also index in hippocampal index for fast retrieval let _ = cog.hippocampal_index.index_memory( @@ -256,7 +257,8 @@ async fn execute_remember_decision( // ==================================================================== if let Ok(cog) = cognitive.try_lock() { let codebase_name = args.codebase.as_deref().unwrap_or("default"); - cog.cross_project.record_project_memory(&node_id, codebase_name, None); + cog.cross_project + .record_project_memory(&node_id, codebase_name, None); // Index in hippocampal index let _ = cog.hippocampal_index.index_memory( @@ -285,10 +287,7 @@ async fn execute_get_context( let limit = args.limit.unwrap_or(10).clamp(1, 50); // Build tag filter for codebase - let tag_filter = args - .codebase - .as_ref() - .map(|cb| format!("codebase:{}", cb)); + let tag_filter = args.codebase.as_ref().map(|cb| format!("codebase:{}", cb)); // Query patterns by node_type and tag let patterns = storage @@ -377,18 +376,24 @@ mod tests { // Check action enum values let action_enum = &schema["properties"]["action"]["enum"]; - assert!(action_enum - .as_array() - .unwrap() - .contains(&serde_json::json!("remember_pattern"))); - assert!(action_enum - .as_array() - .unwrap() - .contains(&serde_json::json!("remember_decision"))); - assert!(action_enum - .as_array() - .unwrap() - .contains(&serde_json::json!("get_context"))); + assert!( + action_enum + .as_array() + .unwrap() + .contains(&serde_json::json!("remember_pattern")) + ); + assert!( + action_enum + .as_array() + .unwrap() + .contains(&serde_json::json!("remember_decision")) + ); + assert!( + action_enum + .as_array() + .unwrap() + .contains(&serde_json::json!("get_context")) + ); } // === INTEGRATION TESTS === diff --git a/crates/vestige-mcp/src/tools/context.rs b/crates/vestige-mcp/src/tools/context.rs index 211c2c5..20b3fd1 100644 --- a/crates/vestige-mcp/src/tools/context.rs +++ b/crates/vestige-mcp/src/tools/context.rs @@ -7,7 +7,6 @@ use chrono::Utc; use serde_json::Value; use std::sync::Arc; - use vestige_core::{RecallInput, SearchMode, Storage}; /// Input schema for match_context tool @@ -50,19 +49,18 @@ pub fn schema() -> Value { }) } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args = args.ok_or("Missing arguments")?; - let query = args["query"] - .as_str() - .ok_or("query is required")?; + let query = args["query"].as_str().ok_or("query is required")?; let topics: Vec = args["topics"] .as_array() - .map(|arr| arr.iter().filter_map(|v| v.as_str().map(String::from)).collect()) + .map(|arr| { + arr.iter() + .filter_map(|v| v.as_str().map(String::from)) + .collect() + }) .unwrap_or_default(); let project = args["project"].as_str().map(String::from); @@ -83,11 +81,11 @@ pub async fn execute( search_mode: SearchMode::Hybrid, valid_at: None, }; - let candidates = storage.recall(recall_input) - .map_err(|e| e.to_string())?; + let candidates = storage.recall(recall_input).map_err(|e| e.to_string())?; // Score by context match (simplified implementation) - let mut scored_results: Vec<_> = candidates.into_iter() + let mut scored_results: Vec<_> = candidates + .into_iter() .map(|mem| { // Calculate context score based on: // 1. Temporal proximity (how recent) @@ -98,8 +96,14 @@ pub async fn execute( let tag_overlap = if topics.is_empty() { 0.5 // Neutral if no topics specified } else { - let matching = mem.tags.iter() - .filter(|t| topics.iter().any(|topic| topic.to_lowercase().contains(&t.to_lowercase()))) + let matching = mem + .tags + .iter() + .filter(|t| { + topics + .iter() + .any(|topic| topic.to_lowercase().contains(&t.to_lowercase())) + }) .count(); matching as f64 / topics.len().max(1) as f64 }; @@ -136,7 +140,8 @@ pub async fn execute( scored_results.sort_by(|a, b| b.2.partial_cmp(&a.2).unwrap_or(std::cmp::Ordering::Equal)); scored_results.truncate(limit as usize); - let results: Vec = scored_results.into_iter() + let results: Vec = scored_results + .into_iter() .map(|(mem, ctx_score, combined)| { serde_json::json!({ "id": mem.id, diff --git a/crates/vestige-mcp/src/tools/cross_reference.rs b/crates/vestige-mcp/src/tools/cross_reference.rs index 257122b..fdfd0cc 100644 --- a/crates/vestige-mcp/src/tools/cross_reference.rs +++ b/crates/vestige-mcp/src/tools/cross_reference.rs @@ -72,20 +72,64 @@ fn compute_trust(retention: f64, stability: f64, reps: i32, lapses: i32) -> f64 #[derive(Debug, Clone, PartialEq)] enum QueryIntent { - FactCheck, // "Is X true?" → find support/contradiction evidence - Timeline, // "When did X happen?" → temporal ordering + pattern detection - RootCause, // "Why did X happen?" → causal chain backward - Comparison, // "How does X differ from Y?" → diff two memory clusters - Synthesis, // Default: "What do I know about X?" → cluster + best per cluster + FactCheck, // "Is X true?" → find support/contradiction evidence + Timeline, // "When did X happen?" → temporal ordering + pattern detection + RootCause, // "Why did X happen?" → causal chain backward + Comparison, // "How does X differ from Y?" → diff two memory clusters + Synthesis, // Default: "What do I know about X?" → cluster + best per cluster } fn classify_intent(query: &str) -> QueryIntent { let q = query.to_lowercase(); let patterns: &[(QueryIntent, &[&str])] = &[ - (QueryIntent::RootCause, &["why did", "root cause", "what caused", "because of", "reason for", "why is", "why was"]), - (QueryIntent::Timeline, &["when did", "timeline", "history of", "over time", "how has", "evolution of", "sequence of"]), - (QueryIntent::Comparison, &["differ", "compare", "versus", " vs ", "difference between", "changed from"]), - (QueryIntent::FactCheck, &["is it true", "did i", "was there", "verify", "confirm", "is this correct", "should i use", "should we"]), + ( + QueryIntent::RootCause, + &[ + "why did", + "root cause", + "what caused", + "because of", + "reason for", + "why is", + "why was", + ], + ), + ( + QueryIntent::Timeline, + &[ + "when did", + "timeline", + "history of", + "over time", + "how has", + "evolution of", + "sequence of", + ], + ), + ( + QueryIntent::Comparison, + &[ + "differ", + "compare", + "versus", + " vs ", + "difference between", + "changed from", + ], + ), + ( + QueryIntent::FactCheck, + &[ + "is it true", + "did i", + "was there", + "verify", + "confirm", + "is this correct", + "should i use", + "should we", + ], + ), ]; for (intent, keywords) in patterns { if keywords.iter().any(|kw| q.contains(kw)) { @@ -118,9 +162,15 @@ struct RelationAssessment { /// Assess the relationship between two memories using embedding similarity, /// correction signals, temporal ordering, and trust comparison. /// No LLM needed — pure algorithmic assessment. -fn assess_relation(a_content: &str, b_content: &str, a_trust: f64, b_trust: f64, - a_date: chrono::DateTime, b_date: chrono::DateTime, - topic_sim: f32) -> RelationAssessment { +fn assess_relation( + a_content: &str, + b_content: &str, + a_trust: f64, + b_trust: f64, + a_date: chrono::DateTime, + b_date: chrono::DateTime, + topic_sim: f32, +) -> RelationAssessment { // Irrelevant: different topics if topic_sim < 0.15 { return RelationAssessment { @@ -136,12 +186,21 @@ fn assess_relation(a_content: &str, b_content: &str, a_trust: f64, b_trust: f64, // Supersession: same topic + newer + higher trust if topic_sim > 0.4 && time_delta_days > 0 && trust_diff > 0.05 && !has_correction { - let (newer, older) = if b_date > a_date { ("B", "A") } else { ("A", "B") }; + let (newer, older) = if b_date > a_date { + ("B", "A") + } else { + ("A", "B") + }; return RelationAssessment { relation: Relation::Supersedes, confidence: topic_sim as f64 * (0.5 + trust_diff.min(0.5)), - reasoning: format!("{} supersedes {} (newer by {}d, trust +{:.0}%)", - newer, older, time_delta_days, trust_diff * 100.0), + reasoning: format!( + "{} supersedes {} (newer by {}d, trust +{:.0}%)", + newer, + older, + time_delta_days, + trust_diff * 100.0 + ), }; } @@ -150,7 +209,10 @@ fn assess_relation(a_content: &str, b_content: &str, a_trust: f64, b_trust: f64, return RelationAssessment { relation: Relation::Contradicts, confidence: topic_sim as f64 * 0.8, - reasoning: format!("Contradiction detected (similarity {:.2}, correction signals present)", topic_sim), + reasoning: format!( + "Contradiction detected (similarity {:.2}, correction signals present)", + topic_sim + ), }; } @@ -159,7 +221,10 @@ fn assess_relation(a_content: &str, b_content: &str, a_trust: f64, b_trust: f64, return RelationAssessment { relation: Relation::Supports, confidence: topic_sim as f64, - reasoning: format!("Topically aligned (similarity {:.2}), consistent stance", topic_sim), + reasoning: format!( + "Topically aligned (similarity {:.2}), consistent stance", + topic_sim + ), }; } @@ -188,29 +253,19 @@ fn generate_reasoning_chain( // Intent-specific opening match intent { QueryIntent::FactCheck => { - chain.push_str(&format!( - "FACT CHECK: \"{}\"\n\n", query - )); + chain.push_str(&format!("FACT CHECK: \"{}\"\n\n", query)); } QueryIntent::Timeline => { - chain.push_str(&format!( - "TIMELINE: \"{}\"\n\n", query - )); + chain.push_str(&format!("TIMELINE: \"{}\"\n\n", query)); } QueryIntent::RootCause => { - chain.push_str(&format!( - "ROOT CAUSE ANALYSIS: \"{}\"\n\n", query - )); + chain.push_str(&format!("ROOT CAUSE ANALYSIS: \"{}\"\n\n", query)); } QueryIntent::Comparison => { - chain.push_str(&format!( - "COMPARISON: \"{}\"\n\n", query - )); + chain.push_str(&format!("COMPARISON: \"{}\"\n\n", query)); } QueryIntent::Synthesis => { - chain.push_str(&format!( - "SYNTHESIS: \"{}\"\n\n", query - )); + chain.push_str(&format!("SYNTHESIS: \"{}\"\n\n", query)); } } @@ -223,7 +278,8 @@ fn generate_reasoning_chain( )); // Superseded memories — with reasoning arrows - let superseded: Vec<_> = relations.iter() + let superseded: Vec<_> = relations + .iter() .filter(|(_, _, r)| matches!(r.relation, Relation::Supersedes)) .collect(); for (preview, trust, rel) in &superseded { @@ -236,11 +292,13 @@ fn generate_reasoning_chain( } // Supporting evidence - let supporting: Vec<_> = relations.iter() + let supporting: Vec<_> = relations + .iter() .filter(|(_, _, r)| matches!(r.relation, Relation::Supports)) .collect(); if !supporting.is_empty() { - chain.push_str(&format!("SUPPORTED BY {} MEMOR{}:\n", + chain.push_str(&format!( + "SUPPORTED BY {} MEMOR{}:\n", supporting.len(), if supporting.len() == 1 { "Y" } else { "IES" }, )); @@ -254,11 +312,15 @@ fn generate_reasoning_chain( } // Contradicting evidence - let contradicting: Vec<_> = relations.iter() + let contradicting: Vec<_> = relations + .iter() .filter(|(_, _, r)| matches!(r.relation, Relation::Contradicts)) .collect(); if !contradicting.is_empty() { - chain.push_str(&format!("CONTRADICTING EVIDENCE ({}):\n", contradicting.len())); + chain.push_str(&format!( + "CONTRADICTING EVIDENCE ({}):\n", + contradicting.len() + )); for (preview, trust, rel) in contradicting.iter().take(3) { chain.push_str(&format!( " ! (trust {:.0}%): \"{}\"\n -> {}\n", @@ -284,36 +346,61 @@ fn generate_reasoning_chain( // ============================================================================ const NEGATION_PAIRS: &[(&str, &str)] = &[ - ("don't", "do"), ("never", "always"), ("avoid", "use"), - ("wrong", "right"), ("incorrect", "correct"), - ("deprecated", "recommended"), ("outdated", "current"), - ("removed", "added"), ("disabled", "enabled"), - ("not ", ""), ("no longer", ""), + ("don't", "do"), + ("never", "always"), + ("avoid", "use"), + ("wrong", "right"), + ("incorrect", "correct"), + ("deprecated", "recommended"), + ("outdated", "current"), + ("removed", "added"), + ("disabled", "enabled"), + ("not ", ""), + ("no longer", ""), ]; const CORRECTION_SIGNALS: &[&str] = &[ - "actually", "correction", "update:", "updated:", "fixed", - "was wrong", "changed to", "now uses", "replaced by", - "superseded", "no longer", "instead of", "switched to", "migrated to", + "actually", + "correction", + "update:", + "updated:", + "fixed", + "was wrong", + "changed to", + "now uses", + "replaced by", + "superseded", + "no longer", + "instead of", + "switched to", + "migrated to", ]; fn appears_contradictory(a: &str, b: &str) -> bool { let a_lower = a.to_lowercase(); let b_lower = b.to_lowercase(); - let a_words: std::collections::HashSet<&str> = a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); - let b_words: std::collections::HashSet<&str> = b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let a_words: std::collections::HashSet<&str> = + a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let b_words: std::collections::HashSet<&str> = + b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); let shared_words = a_words.intersection(&b_words).count(); - if shared_words < 2 { return false; } + if shared_words < 2 { + return false; + } for (neg, _) in NEGATION_PAIRS { if (a_lower.contains(neg) && !b_lower.contains(neg)) || (b_lower.contains(neg) && !a_lower.contains(neg)) - { return true; } + { + return true; + } } for signal in CORRECTION_SIGNALS { - if a_lower.contains(signal) || b_lower.contains(signal) { return true; } + if a_lower.contains(signal) || b_lower.contains(signal) { + return true; + } } false } @@ -321,12 +408,20 @@ fn appears_contradictory(a: &str, b: &str) -> bool { fn topic_overlap(a: &str, b: &str) -> f32 { let a_lower = a.to_lowercase(); let b_lower = b.to_lowercase(); - let a_words: std::collections::HashSet<&str> = a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); - let b_words: std::collections::HashSet<&str> = b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); - if a_words.is_empty() || b_words.is_empty() { return 0.0; } + let a_words: std::collections::HashSet<&str> = + a_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + let b_words: std::collections::HashSet<&str> = + b_lower.split_whitespace().filter(|w| w.len() > 3).collect(); + if a_words.is_empty() || b_words.is_empty() { + return 0.0; + } let intersection = a_words.intersection(&b_words).count(); let union = a_words.union(&b_words).count(); - if union == 0 { 0.0 } else { intersection as f32 / union as f32 } + if union == 0 { + 0.0 + } else { + intersection as f32 / union as f32 + } } // ============================================================================ @@ -389,7 +484,10 @@ pub async fn execute( let mut ranked = results; if let Ok(mut cog) = cognitive.try_lock() { - let candidates: Vec<_> = ranked.iter().map(|r| (r.clone(), r.node.content.clone())).collect(); + let candidates: Vec<_> = ranked + .iter() + .map(|r| (r.clone(), r.node.content.clone())) + .collect(); if let Ok(reranked) = cog.reranker.rerank(&args.query, candidates, Some(depth)) { ranked = reranked.into_iter().map(|rr| rr.item).collect(); } @@ -399,7 +497,8 @@ pub async fn execute( // STAGE 2: Spreading Activation Expansion // ==================================================================== let mut activation_expanded = 0usize; - let existing_ids: std::collections::HashSet = ranked.iter().map(|r| r.node.id.clone()).collect(); + let existing_ids: std::collections::HashSet = + ranked.iter().map(|r| r.node.id.clone()).collect(); if let Ok(mut cog) = cognitive.try_lock() { let mut expanded_ids = Vec::new(); @@ -431,24 +530,27 @@ pub async fn execute( // STAGE 3: FSRS-6 Trust Scoring // ==================================================================== - let scored: Vec = ranked.iter().map(|r| { - let trust = compute_trust( - r.node.retention_strength, - r.node.stability, - r.node.reps, - r.node.lapses, - ); - ScoredMemory { - id: r.node.id.clone(), - content: r.node.content.clone(), - tags: r.node.tags.clone(), - trust, - updated_at: r.node.updated_at, - created_at: r.node.created_at, - retention: r.node.retention_strength, - combined_score: r.combined_score, - } - }).collect(); + let scored: Vec = ranked + .iter() + .map(|r| { + let trust = compute_trust( + r.node.retention_strength, + r.node.stability, + r.node.reps, + r.node.lapses, + ); + ScoredMemory { + id: r.node.id.clone(), + content: r.node.content.clone(), + tags: r.node.tags.clone(), + trust, + updated_at: r.node.updated_at, + created_at: r.node.created_at, + retention: r.node.retention_strength, + combined_score: r.combined_score, + } + }) + .collect(); // ==================================================================== // STAGE 4: Temporal Supersession @@ -488,14 +590,20 @@ pub async fn execute( let a = &scored[i]; let b = &scored[j]; let overlap = topic_overlap(&a.content, &b.content); - if overlap < 0.15 { continue; } + if overlap < 0.15 { + continue; + } let is_contradiction = appears_contradictory(&a.content, &b.content); - if !is_contradiction { continue; } + if !is_contradiction { + continue; + } // Only flag as real contradiction if BOTH have decent trust let min_trust = a.trust.min(b.trust); - if min_trust < 0.3 { continue; } // Low-trust memory isn't worth flagging + if min_trust < 0.3 { + continue; + } // Low-trust memory isn't worth flagging let (stronger, weaker) = if a.trust >= b.trust { (a, b) } else { (b, a) }; contradictions.push(serde_json::json!({ @@ -521,9 +629,12 @@ pub async fn execute( // ==================================================================== let mut related_insights: Vec = Vec::new(); if let Ok(insights) = storage.get_insights(20) { - let memory_ids: std::collections::HashSet<&str> = scored.iter().map(|s| s.id.as_str()).collect(); + let memory_ids: std::collections::HashSet<&str> = + scored.iter().map(|s| s.id.as_str()).collect(); for insight in insights { - let overlaps = insight.source_memories.iter() + let overlaps = insight + .source_memories + .iter() .any(|src_id| memory_ids.contains(src_id.as_str())); if overlaps { related_insights.push(serde_json::json!({ @@ -540,27 +651,35 @@ pub async fn execute( // STAGE 7: Relation Assessment (per-pair, using trust + temporal + similarity) // ==================================================================== let mut pair_relations: Vec<(String, f64, RelationAssessment)> = Vec::new(); - if let Some(primary) = scored.iter() + if let Some(primary) = scored + .iter() .filter(|s| !superseded_ids.contains(&s.id)) - .max_by(|a, b| a.trust.partial_cmp(&b.trust).unwrap_or(std::cmp::Ordering::Equal)) + .max_by(|a, b| { + a.trust + .partial_cmp(&b.trust) + .unwrap_or(std::cmp::Ordering::Equal) + }) { for other in scored.iter().filter(|s| s.id != primary.id).take(15) { // Use combined_score as a proxy for semantic similarity (already reranked) // Fall back to topic_overlap for keyword-level comparison let sim = topic_overlap(&primary.content, &other.content); - let effective_sim = if other.combined_score > 0.2 { sim.max(0.3) } else { sim }; + let effective_sim = if other.combined_score > 0.2 { + sim.max(0.3) + } else { + sim + }; let rel = assess_relation( - &primary.content, &other.content, - primary.trust, other.trust, - primary.updated_at, other.updated_at, + &primary.content, + &other.content, + primary.trust, + other.trust, + primary.updated_at, + other.updated_at, effective_sim, ); if !matches!(rel.relation, Relation::Irrelevant) { - pair_relations.push(( - other.content.chars().take(100).collect(), - other.trust, - rel, - )); + pair_relations.push((other.content.chars().take(100).collect(), other.trust, rel)); } } } @@ -595,25 +714,32 @@ pub async fn execute( .partial_cmp(&composite(a)) .unwrap_or(std::cmp::Ordering::Equal) }); - let evidence: Vec = non_superseded.iter() + let evidence: Vec = non_superseded + .iter() .take(10) .enumerate() - .map(|(i, s)| serde_json::json!({ - "id": s.id, - "preview": s.content.chars().take(200).collect::(), - "trust": (s.trust * 100.0).round() / 100.0, - "date": s.updated_at.to_rfc3339(), - "role": if i == 0 { "primary" } else { "supporting" }, - })) + .map(|(i, s)| { + serde_json::json!({ + "id": s.id, + "preview": s.content.chars().take(200).collect::(), + "trust": (s.trust * 100.0).round() / 100.0, + "date": s.updated_at.to_rfc3339(), + "role": if i == 0 { "primary" } else { "supporting" }, + }) + }) .collect(); // Build evolution timeline - let mut evolution: Vec = by_date.iter().rev() - .map(|s| serde_json::json!({ - "date": s.updated_at.format("%b %d, %Y").to_string(), - "preview": s.content.chars().take(100).collect::(), - "trust": (s.trust * 100.0).round() / 100.0, - })) + let mut evolution: Vec = by_date + .iter() + .rev() + .map(|s| { + serde_json::json!({ + "date": s.updated_at.format("%b %d, %Y").to_string(), + "preview": s.content.chars().take(100).collect::(), + "trust": (s.trust * 100.0).round() / 100.0, + }) + }) .collect(); evolution.truncate(15); // cap timeline length @@ -639,12 +765,15 @@ pub async fn execute( if contradictions.is_empty() { format!( "High confidence ({:.0}%). Recommended memory (trust {:.0}%, {}) is the most reliable source.", - confidence * 100.0, rec.trust * 100.0, rec.updated_at.format("%b %d, %Y") + confidence * 100.0, + rec.trust * 100.0, + rec.updated_at.format("%b %d, %Y") ) } else { format!( "WARNING: {} contradiction(s) detected. Recommended memory has trust {:.0}% but conflicts exist. Review contradictions below.", - contradictions.len(), rec.trust * 100.0 + contradictions.len(), + rec.trust * 100.0 ) } } else { @@ -683,11 +812,21 @@ pub async fn execute( }); } - if !evidence.is_empty() { response["evidence"] = serde_json::json!(evidence); } - if !contradictions.is_empty() { response["contradictions"] = serde_json::json!(contradictions); } - if !superseded.is_empty() { response["superseded"] = serde_json::json!(superseded); } - if !evolution.is_empty() { response["evolution"] = serde_json::json!(evolution); } - if !related_insights.is_empty() { response["related_insights"] = serde_json::json!(related_insights); } + if !evidence.is_empty() { + response["evidence"] = serde_json::json!(evidence); + } + if !contradictions.is_empty() { + response["contradictions"] = serde_json::json!(contradictions); + } + if !superseded.is_empty() { + response["superseded"] = serde_json::json!(superseded); + } + if !evolution.is_empty() { + response["evolution"] = serde_json::json!(evolution); + } + if !related_insights.is_empty() { + response["related_insights"] = serde_json::json!(related_insights); + } Ok(response) } @@ -849,7 +988,11 @@ mod tests { fn test_trust_score_medium() { // Medium everything let trust = compute_trust(0.6, 15.0, 5, 2); - assert!(trust > 0.4 && trust < 0.7, "Expected 0.4-0.7, got {}", trust); + assert!( + trust > 0.4 && trust < 0.7, + "Expected 0.4-0.7, got {}", + trust + ); } #[test] @@ -861,7 +1004,10 @@ mod tests { #[test] fn test_contradiction_requires_shared_words() { - assert!(!appears_contradictory("not sure about weather", "Rust is fast")); + assert!(!appears_contradictory( + "not sure about weather", + "Rust is fast" + )); } #[test] @@ -874,7 +1020,10 @@ mod tests { #[test] fn test_topic_overlap_similar() { - let overlap = topic_overlap("Vestige uses USearch for vector search", "Vestige vector search powered by USearch HNSW"); + let overlap = topic_overlap( + "Vestige uses USearch for vector search", + "Vestige vector search powered by USearch HNSW", + ); assert!(overlap > 0.3); } @@ -895,32 +1044,62 @@ mod tests { #[test] fn test_intent_fact_check() { - assert_eq!(classify_intent("Is it true that Vestige uses USearch?"), QueryIntent::FactCheck); - assert_eq!(classify_intent("Did I switch to port 3002?"), QueryIntent::FactCheck); - assert_eq!(classify_intent("Should I use prefix caching?"), QueryIntent::FactCheck); + assert_eq!( + classify_intent("Is it true that Vestige uses USearch?"), + QueryIntent::FactCheck + ); + assert_eq!( + classify_intent("Did I switch to port 3002?"), + QueryIntent::FactCheck + ); + assert_eq!( + classify_intent("Should I use prefix caching?"), + QueryIntent::FactCheck + ); } #[test] fn test_intent_timeline() { - assert_eq!(classify_intent("When did the port change happen?"), QueryIntent::Timeline); - assert_eq!(classify_intent("How has the AIMO3 score evolved over time?"), QueryIntent::Timeline); + assert_eq!( + classify_intent("When did the port change happen?"), + QueryIntent::Timeline + ); + assert_eq!( + classify_intent("How has the AIMO3 score evolved over time?"), + QueryIntent::Timeline + ); } #[test] fn test_intent_root_cause() { - assert_eq!(classify_intent("Why did the build fail?"), QueryIntent::RootCause); - assert_eq!(classify_intent("What caused the score regression?"), QueryIntent::RootCause); + assert_eq!( + classify_intent("Why did the build fail?"), + QueryIntent::RootCause + ); + assert_eq!( + classify_intent("What caused the score regression?"), + QueryIntent::RootCause + ); } #[test] fn test_intent_comparison() { - assert_eq!(classify_intent("How does USearch differ from FAISS?"), QueryIntent::Comparison); - assert_eq!(classify_intent("Compare FSRS versus SM-2"), QueryIntent::Comparison); + assert_eq!( + classify_intent("How does USearch differ from FAISS?"), + QueryIntent::Comparison + ); + assert_eq!( + classify_intent("Compare FSRS versus SM-2"), + QueryIntent::Comparison + ); } #[test] fn test_intent_synthesis_default() { - assert_eq!(classify_intent("Tell me about Sam's projects"), QueryIntent::Synthesis); + assert_eq!( + classify_intent("Tell me about Sam's projects"), + QueryIntent::Synthesis + ); assert_eq!(classify_intent("What is Vestige?"), QueryIntent::Synthesis); } @@ -928,8 +1107,15 @@ mod tests { #[test] fn test_relation_irrelevant() { - let rel = assess_relation("Rust is fast", "The weather is nice", 0.8, 0.8, - Utc::now(), Utc::now(), 0.05); + let rel = assess_relation( + "Rust is fast", + "The weather is nice", + 0.8, + 0.8, + Utc::now(), + Utc::now(), + 0.05, + ); assert!(matches!(rel.relation, Relation::Irrelevant)); } @@ -938,7 +1124,12 @@ mod tests { let rel = assess_relation( "Vestige uses USearch for vector search", "USearch provides fast HNSW indexing for Vestige", - 0.8, 0.7, Utc::now(), Utc::now(), 0.6); + 0.8, + 0.7, + Utc::now(), + Utc::now(), + 0.6, + ); assert!(matches!(rel.relation, Relation::Supports)); } @@ -947,7 +1138,12 @@ mod tests { let rel = assess_relation( "Don't use FAISS for vector search in production anymore", "Use FAISS for vector search in production always", - 0.8, 0.5, Utc::now(), Utc::now(), 0.7); + 0.8, + 0.5, + Utc::now(), + Utc::now(), + 0.7, + ); assert!(matches!(rel.relation, Relation::Contradicts)); } } diff --git a/crates/vestige-mcp/src/tools/dedup.rs b/crates/vestige-mcp/src/tools/dedup.rs index 7985bd5..8456629 100644 --- a/crates/vestige-mcp/src/tools/dedup.rs +++ b/crates/vestige-mcp/src/tools/dedup.rs @@ -9,7 +9,6 @@ use serde_json::Value; use std::collections::HashMap; use std::sync::Arc; - use vestige_core::Storage; #[cfg(all(feature = "embeddings", feature = "vector-search"))] use vestige_core::cosine_similarity; @@ -89,10 +88,7 @@ impl UnionFind { } } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: DedupArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => DedupArgs { @@ -108,7 +104,6 @@ pub async fn execute( #[cfg(all(feature = "embeddings", feature = "vector-search"))] { - // Load all embeddings let all_embeddings = storage .get_all_embeddings() @@ -191,10 +186,8 @@ pub async fn execute( } // Only keep clusters with >1 member, sorted by size descending - let mut clusters: Vec> = cluster_map - .into_values() - .filter(|c| c.len() > 1) - .collect(); + let mut clusters: Vec> = + cluster_map.into_values().filter(|c| c.len() > 1).collect(); clusters.sort_by_key(|b| std::cmp::Reverse(b.len())); clusters.truncate(limit); diff --git a/crates/vestige-mcp/src/tools/dream.rs b/crates/vestige-mcp/src/tools/dream.rs index ac9c479..357315f 100644 --- a/crates/vestige-mcp/src/tools/dream.rs +++ b/crates/vestige-mcp/src/tools/dream.rs @@ -4,8 +4,8 @@ use std::sync::Arc; use tokio::sync::Mutex; -use chrono::Utc; use crate::cognitive::CognitiveEngine; +use chrono::Utc; use vestige_core::{DreamHistoryRecord, InsightRecord, LinkType, Storage}; pub fn schema() -> serde_json::Value { @@ -34,21 +34,24 @@ pub async fn execute( .min(500) as usize; // Cap at 500 to prevent O(N^2) hang // v1.9.0: Waking SWR tagging — preferential replay of tagged memories (70/30 split) - let tagged_nodes = storage.get_waking_tagged_memories(memory_count as i32) + let tagged_nodes = storage + .get_waking_tagged_memories(memory_count as i32) .unwrap_or_default(); let tagged_count = tagged_nodes.len(); // Calculate how many tagged vs random to include let tagged_target = (memory_count * 7 / 10).min(tagged_count); // 70% tagged - let _random_target = memory_count.saturating_sub(tagged_target); // 30% random (used for logging) + let _random_target = memory_count.saturating_sub(tagged_target); // 30% random (used for logging) // Build the dream memory set: tagged memories first, then fill with random - let tagged_ids: std::collections::HashSet = tagged_nodes.iter() + let tagged_ids: std::collections::HashSet = tagged_nodes + .iter() .take(tagged_target) .map(|n| n.id.clone()) .collect(); - let random_nodes = storage.get_all_nodes(memory_count as i32, 0) + let random_nodes = storage + .get_all_nodes(memory_count as i32, 0) .map_err(|e| format!("Failed to load memories: {}", e))?; let mut all_nodes: Vec<_> = tagged_nodes.into_iter().take(tagged_target).collect(); @@ -59,8 +62,10 @@ pub async fn execute( } // If still under capacity (e.g., all memories are tagged), fill from remaining tagged if all_nodes.len() < memory_count { - let used_ids: std::collections::HashSet = all_nodes.iter().map(|n| n.id.clone()).collect(); - let remaining_tagged = storage.get_waking_tagged_memories(memory_count as i32) + let used_ids: std::collections::HashSet = + all_nodes.iter().map(|n| n.id.clone()).collect(); + let remaining_tagged = storage + .get_waking_tagged_memories(memory_count as i32) .unwrap_or_default(); for node in remaining_tagged { if !used_ids.contains(&node.id) && all_nodes.len() < memory_count { @@ -77,16 +82,17 @@ pub async fn execute( })); } - let dream_memories: Vec = all_nodes.iter().map(|n| { - vestige_core::DreamMemory { + let dream_memories: Vec = all_nodes + .iter() + .map(|n| vestige_core::DreamMemory { id: n.id.clone(), content: n.content.clone(), embedding: storage.get_node_embedding(&n.id).ok().flatten(), tags: n.tags.clone(), created_at: n.created_at, access_count: n.reps as u32, - } - }).collect(); + }) + .collect(); let cog = cognitive.lock().await; // Capture start time before the dream so we can identify newly discovered @@ -259,17 +265,18 @@ mod tests { async fn ingest_n_memories(storage: &Arc, n: usize) { for i in 0..n { - storage.ingest(vestige_core::IngestInput { - content: format!("Dream test memory number {}", i), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["dream-test".to_string()], - valid_from: None, - valid_until: None, - }) - .unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: format!("Dream test memory number {}", i), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["dream-test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); } } @@ -368,7 +375,10 @@ mod tests { // After dream: dream history should exist { let last = storage.get_last_dream().unwrap(); - assert!(last.is_some(), "Dream should have been persisted to database"); + assert!( + last.is_some(), + "Dream should have been persisted to database" + ); } } @@ -379,20 +389,28 @@ mod tests { // Create enough diverse memories to trigger connection discovery for i in 0..15 { - storage.ingest(vestige_core::IngestInput { - content: format!( - "Memory {} about topic {}: detailed content for connection discovery", - i, - if i % 3 == 0 { "rust" } else if i % 3 == 1 { "cargo" } else { "testing" } - ), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["dream-roundtrip".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: format!( + "Memory {} about topic {}: detailed content for connection discovery", + i, + if i % 3 == 0 { + "rust" + } else if i % 3 == 1 { + "cargo" + } else { + "testing" + } + ), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["dream-roundtrip".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); } let cognitive = test_cognitive(); @@ -403,7 +421,10 @@ mod tests { if persisted > 0 { // Verify connections are queryable from storage let all_conns = storage.get_all_connections().unwrap(); - assert!(!all_conns.is_empty(), "Persisted connections should be queryable"); + assert!( + !all_conns.is_empty(), + "Persisted connections should be queryable" + ); // Verify connection IDs reference valid memories let all_nodes = storage.get_all_nodes(100, 0).unwrap(); @@ -425,7 +446,9 @@ mod tests { // Verify live cognitive engine was hydrated let cog = cognitive.lock().await; let first_conn = &all_conns[0]; - let assocs = cog.activation_network.get_associations(&first_conn.source_id); + let assocs = cog + .activation_network + .get_associations(&first_conn.source_id); assert!( !assocs.is_empty(), "Live cognitive engine should have been hydrated with dream connections" @@ -441,16 +464,18 @@ mod tests { // Ingest memories and collect their IDs let mut ids = Vec::new(); for i in 0..5 { - let result = storage.ingest(vestige_core::IngestInput { - content: format!("Save connection test memory {}", i), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["save-conn-test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + let result = storage + .ingest(vestige_core::IngestInput { + content: format!("Save connection test memory {}", i), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["save-conn-test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); ids.push(result.id); } @@ -459,7 +484,7 @@ mod tests { let mut saved = 0u32; let mut errors = Vec::new(); for i in 0..ids.len() { - for j in (i+1)..ids.len() { + for j in (i + 1)..ids.len() { let record = vestige_core::ConnectionRecord { source_id: ids[i].clone(), target_id: ids[j].clone(), @@ -471,10 +496,7 @@ mod tests { }; match storage.save_connection(&record) { Ok(_) => saved += 1, - Err(e) => errors.push(format!( - "{} -> {}: {}", - ids[i], ids[j], e - )), + Err(e) => errors.push(format!("{} -> {}: {}", ids[i], ids[j], e)), } } } @@ -510,34 +532,62 @@ mod tests { // Ingest memories with known high-similarity content (shared tags + similar text) let topics = [ - ("Rust borrow checker prevents data races at compile time", vec!["rust", "safety"]), - ("Rust ownership model ensures memory safety without GC", vec!["rust", "safety"]), - ("Cargo is the Rust package manager and build system", vec!["rust", "cargo"]), - ("Cargo.toml defines dependencies for Rust projects", vec!["rust", "cargo"]), - ("Unit tests in Rust use #[test] attribute", vec!["rust", "testing"]), - ("Integration tests in Rust live in the tests/ directory", vec!["rust", "testing"]), - ("Clippy is a Rust linter that catches common mistakes", vec!["rust", "tooling"]), - ("Rustfmt formats Rust code according to style guidelines", vec!["rust", "tooling"]), + ( + "Rust borrow checker prevents data races at compile time", + vec!["rust", "safety"], + ), + ( + "Rust ownership model ensures memory safety without GC", + vec!["rust", "safety"], + ), + ( + "Cargo is the Rust package manager and build system", + vec!["rust", "cargo"], + ), + ( + "Cargo.toml defines dependencies for Rust projects", + vec!["rust", "cargo"], + ), + ( + "Unit tests in Rust use #[test] attribute", + vec!["rust", "testing"], + ), + ( + "Integration tests in Rust live in the tests/ directory", + vec!["rust", "testing"], + ), + ( + "Clippy is a Rust linter that catches common mistakes", + vec!["rust", "tooling"], + ), + ( + "Rustfmt formats Rust code according to style guidelines", + vec!["rust", "tooling"], + ), ]; for (content, tags) in &topics { - storage.ingest(vestige_core::IngestInput { - content: content.to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: tags.iter().map(|t| t.to_string()).collect(), - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: tags.iter().map(|t| t.to_string()).collect(), + valid_from: None, + valid_until: None, + }) + .unwrap(); } let cognitive = test_cognitive(); let result = execute(&storage, &cognitive, None).await.unwrap(); assert_eq!(result["status"], "dreamed"); - let found = result["stats"]["new_connections_found"].as_u64().unwrap_or(0); + let found = result["stats"]["new_connections_found"] + .as_u64() + .unwrap_or(0); let persisted = result["connectionsPersisted"].as_u64().unwrap_or(0); // Dream should discover connections between these related memories @@ -572,23 +622,52 @@ mod tests { // Create diverse tagged memories to encourage insight generation let topics = [ - ("Rust borrow checker prevents data races", vec!["rust", "safety"]), - ("Rust ownership model ensures memory safety", vec!["rust", "safety"]), - ("Cargo manages Rust project dependencies", vec!["rust", "cargo"]), - ("Cargo.toml defines project configuration", vec!["rust", "cargo"]), - ("Unit tests use the #[test] attribute", vec!["rust", "testing"]), - ("Integration tests live in the tests directory", vec!["rust", "testing"]), - ("Clippy catches common Rust mistakes", vec!["rust", "tooling"]), - ("Rustfmt automatically formats code", vec!["rust", "tooling"]), + ( + "Rust borrow checker prevents data races", + vec!["rust", "safety"], + ), + ( + "Rust ownership model ensures memory safety", + vec!["rust", "safety"], + ), + ( + "Cargo manages Rust project dependencies", + vec!["rust", "cargo"], + ), + ( + "Cargo.toml defines project configuration", + vec!["rust", "cargo"], + ), + ( + "Unit tests use the #[test] attribute", + vec!["rust", "testing"], + ), + ( + "Integration tests live in the tests directory", + vec!["rust", "testing"], + ), + ( + "Clippy catches common Rust mistakes", + vec!["rust", "tooling"], + ), + ( + "Rustfmt automatically formats code", + vec!["rust", "tooling"], + ), ]; for (content, tags) in &topics { - storage.ingest(vestige_core::IngestInput { - content: content.to_string(), - node_type: "fact".to_string(), - source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, - tags: tags.iter().map(|t| t.to_string()).collect(), - valid_from: None, valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: tags.iter().map(|t| t.to_string()).collect(), + valid_from: None, + valid_until: None, + }) + .unwrap(); } let result = execute(&storage, &test_cognitive(), None).await.unwrap(); @@ -599,19 +678,30 @@ mod tests { // If insights were generated, they should be persisted if !response_insights.is_empty() { - assert!(persisted_count > 0, "Generated insights should be persisted to database"); + assert!( + persisted_count > 0, + "Generated insights should be persisted to database" + ); let stored = storage.get_insights(100).unwrap(); assert_eq!( - stored.len(), persisted_count as usize, - "All {} persisted insights should be retrievable", persisted_count + stored.len(), + persisted_count as usize, + "All {} persisted insights should be retrievable", + persisted_count ); // Verify insight fields for insight in &stored { assert!(!insight.id.is_empty(), "Insight ID should not be empty"); - assert!(!insight.insight.is_empty(), "Insight text should not be empty"); + assert!( + !insight.insight.is_empty(), + "Insight text should not be empty" + ); assert!(insight.confidence >= 0.0 && insight.confidence <= 1.0); assert!(insight.novelty_score >= 0.0); - assert!(insight.feedback.is_none(), "Fresh insight should have no feedback"); + assert!( + insight.feedback.is_none(), + "Fresh insight should have no feedback" + ); assert_eq!(insight.applied_count, 0); } } diff --git a/crates/vestige-mcp/src/tools/explore.rs b/crates/vestige-mcp/src/tools/explore.rs index 50fdd24..441afd3 100644 --- a/crates/vestige-mcp/src/tools/explore.rs +++ b/crates/vestige-mcp/src/tools/explore.rs @@ -5,8 +5,8 @@ use std::sync::Arc; use tokio::sync::Mutex; use crate::cognitive::CognitiveEngine; -use vestige_core::advanced::{Connection, ConnectionType, MemoryChainBuilder, MemoryNode}; use vestige_core::Storage; +use vestige_core::advanced::{Connection, ConnectionType, MemoryChainBuilder, MemoryNode}; pub fn schema() -> serde_json::Value { serde_json::json!({ @@ -41,8 +41,14 @@ pub async fn execute( args: Option, ) -> Result { let args = args.ok_or("Missing arguments")?; - let action = args.get("action").and_then(|v| v.as_str()).ok_or("Missing 'action'")?; - let from = args.get("from").and_then(|v| v.as_str()).ok_or("Missing 'from'")?; + let action = args + .get("action") + .and_then(|v| v.as_str()) + .ok_or("Missing 'action'")?; + let from = args + .get("from") + .and_then(|v| v.as_str()) + .ok_or("Missing 'from'")?; let to = args.get("to").and_then(|v| v.as_str()); let limit = args.get("limit").and_then(|v| v.as_u64()).unwrap_or(10) as usize; @@ -64,36 +70,34 @@ pub async fn execute( }; match chain_opt { - Some(chain) => { - Ok(serde_json::json!({ - "action": "chain", - "from": from_owned, - "to": to_owned, - "steps": chain.steps.iter().map(|s| serde_json::json!({ - "memory_id": s.memory_id, - "memory_preview": s.memory_preview, - "connection_type": format!("{:?}", s.connection_type), - "connection_strength": s.connection_strength, - "reasoning": s.reasoning, - })).collect::>(), - "confidence": chain.confidence, - "total_hops": chain.total_hops, - })) - } - None => { - Ok(serde_json::json!({ - "action": "chain", - "from": from_owned, - "to": to_owned, - "steps": [], - "message": "No chain found between these memories" - })) - } + Some(chain) => Ok(serde_json::json!({ + "action": "chain", + "from": from_owned, + "to": to_owned, + "steps": chain.steps.iter().map(|s| serde_json::json!({ + "memory_id": s.memory_id, + "memory_preview": s.memory_preview, + "connection_type": format!("{:?}", s.connection_type), + "connection_strength": s.connection_strength, + "reasoning": s.reasoning, + })).collect::>(), + "confidence": chain.confidence, + "total_hops": chain.total_hops, + })), + None => Ok(serde_json::json!({ + "action": "chain", + "from": from_owned, + "to": to_owned, + "steps": [], + "message": "No chain found between these memories" + })), } } "associations" => { let activation_assocs = cog.activation_network.get_associations(from); - let hippocampal_assocs = cog.hippocampal_index.get_associations(from, 2) + let hippocampal_assocs = cog + .hippocampal_index + .get_associations(from, 2) .unwrap_or_default(); let from_owned = from.to_string(); drop(cog); // release lock consistently (matches chain/bridges pattern) @@ -120,20 +124,22 @@ pub async fn execute( all_associations.truncate(limit); // Fallback: if in-memory modules are empty, query storage directly - if all_associations.is_empty() && let Ok(connections) = storage.get_connections_for_memory(&from_owned) { - for conn in connections.iter().take(limit) { - let other_id = if conn.source_id == from_owned { - &conn.target_id - } else { - &conn.source_id - }; - all_associations.push(serde_json::json!({ - "memory_id": other_id, - "strength": conn.strength, - "link_type": conn.link_type, - "source": "persistent_graph", - })); - } + if all_associations.is_empty() + && let Ok(connections) = storage.get_connections_for_memory(&from_owned) + { + for conn in connections.iter().take(limit) { + let other_id = if conn.source_id == from_owned { + &conn.target_id + } else { + &conn.source_id + }; + all_associations.push(serde_json::json!({ + "memory_id": other_id, + "strength": conn.strength, + "link_type": conn.link_type, + "source": "persistent_graph", + })); + } } Ok(serde_json::json!({ @@ -167,12 +173,19 @@ pub async fn execute( "count": limited.len(), })) } - _ => Err(format!("Unknown action: '{}'. Expected: chain, associations, bridges", action)), + _ => Err(format!( + "Unknown action: '{}'. Expected: chain, associations, bridges", + action + )), } } /// Build a temporary MemoryChainBuilder from persisted connections for fallback queries. -fn build_temp_chain_builder(storage: &Arc, from_id: &str, to_id: &str) -> MemoryChainBuilder { +fn build_temp_chain_builder( + storage: &Arc, + from_id: &str, + to_id: &str, +) -> MemoryChainBuilder { let mut builder = MemoryChainBuilder::new(); // Load connections involving either endpoint @@ -191,7 +204,9 @@ fn build_temp_chain_builder(storage: &Arc, from_id: &str, to_id: &str) let mut seen_ids = std::collections::HashSet::new(); for conn in &all_conns { for id in [&conn.source_id, &conn.target_id] { - if seen_ids.insert(id.clone()) && let Ok(Some(node)) = storage.get_node(id) { + if seen_ids.insert(id.clone()) + && let Ok(Some(node)) = storage.get_node(id) + { builder.add_memory(MemoryNode { id: node.id.clone(), content_preview: node.content.chars().take(100).collect(), @@ -389,39 +404,47 @@ mod tests { let (storage, _dir) = test_storage().await; // Create two memories and a direct connection in storage - let id1 = storage.ingest(vestige_core::IngestInput { - content: "Memory about Rust".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap().id; + let id1 = storage + .ingest(vestige_core::IngestInput { + content: "Memory about Rust".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap() + .id; - let id2 = storage.ingest(vestige_core::IngestInput { - content: "Memory about Cargo".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap().id; + let id2 = storage + .ingest(vestige_core::IngestInput { + content: "Memory about Cargo".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap() + .id; // Save connection directly to storage (bypassing cognitive engine) let now = chrono::Utc::now(); - storage.save_connection(&vestige_core::ConnectionRecord { - source_id: id1.clone(), - target_id: id2.clone(), - strength: 0.9, - link_type: "semantic".to_string(), - created_at: now, - last_activated: now, - activation_count: 1, - }).unwrap(); + storage + .save_connection(&vestige_core::ConnectionRecord { + source_id: id1.clone(), + target_id: id2.clone(), + strength: 0.9, + link_type: "semantic".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); // Execute with empty cognitive engine — should fall back to storage let cognitive = test_cognitive(); @@ -447,22 +470,36 @@ mod tests { // Create 3 memories: A -> B -> C let make = |content: &str| vestige_core::IngestInput { - content: content.to_string(), node_type: "fact".to_string(), - source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], valid_from: None, valid_until: None, + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, }; let id_a = storage.ingest(make("Memory A about databases")).unwrap().id; let id_b = storage.ingest(make("Memory B about indexes")).unwrap().id; - let id_c = storage.ingest(make("Memory C about performance")).unwrap().id; + let id_c = storage + .ingest(make("Memory C about performance")) + .unwrap() + .id; // Save connections A->B and B->C to storage let now = chrono::Utc::now(); for (src, tgt) in [(&id_a, &id_b), (&id_b, &id_c)] { - storage.save_connection(&vestige_core::ConnectionRecord { - source_id: src.clone(), target_id: tgt.clone(), - strength: 0.9, link_type: "semantic".to_string(), - created_at: now, last_activated: now, activation_count: 1, - }).unwrap(); + storage + .save_connection(&vestige_core::ConnectionRecord { + source_id: src.clone(), + target_id: tgt.clone(), + strength: 0.9, + link_type: "semantic".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); } // Execute chain with empty cognitive engine — should fall back to storage @@ -472,7 +509,10 @@ mod tests { let value = result.unwrap(); assert_eq!(value["action"], "chain"); let steps = value["steps"].as_array().unwrap(); - assert!(!steps.is_empty(), "Chain should find path A->B->C via storage fallback"); + assert!( + !steps.is_empty(), + "Chain should find path A->B->C via storage fallback" + ); } #[tokio::test] @@ -481,9 +521,14 @@ mod tests { // Create 3 memories: A -> B -> C (B is the bridge) let make = |content: &str| vestige_core::IngestInput { - content: content.to_string(), node_type: "fact".to_string(), - source: None, sentiment_score: 0.0, sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], valid_from: None, valid_until: None, + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, }; let id_a = storage.ingest(make("Bridge test memory A")).unwrap().id; let id_b = storage.ingest(make("Bridge test memory B")).unwrap().id; @@ -491,11 +536,17 @@ mod tests { let now = chrono::Utc::now(); for (src, tgt) in [(&id_a, &id_b), (&id_b, &id_c)] { - storage.save_connection(&vestige_core::ConnectionRecord { - source_id: src.clone(), target_id: tgt.clone(), - strength: 0.9, link_type: "semantic".to_string(), - created_at: now, last_activated: now, activation_count: 1, - }).unwrap(); + storage + .save_connection(&vestige_core::ConnectionRecord { + source_id: src.clone(), + target_id: tgt.clone(), + strength: 0.9, + link_type: "semantic".to_string(), + created_at: now, + last_activated: now, + activation_count: 1, + }) + .unwrap(); } // Execute bridges with empty cognitive engine @@ -505,6 +556,9 @@ mod tests { let value = result.unwrap(); assert_eq!(value["action"], "bridges"); let bridges = value["bridges"].as_array().unwrap(); - assert!(!bridges.is_empty(), "Should find B as bridge between A and C via storage fallback"); + assert!( + !bridges.is_empty(), + "Should find B as bridge between A and C via storage fallback" + ); } } diff --git a/crates/vestige-mcp/src/tools/feedback.rs b/crates/vestige-mcp/src/tools/feedback.rs index e21cc97..438e594 100644 --- a/crates/vestige-mcp/src/tools/feedback.rs +++ b/crates/vestige-mcp/src/tools/feedback.rs @@ -73,19 +73,23 @@ pub async fn execute_promote( // Validate UUID uuid::Uuid::parse_str(&args.id).map_err(|_| "Invalid node ID format".to_string())?; - // Get node before for comparison - let before = storage.get_node(&args.id).map_err(|e| e.to_string())? + let before = storage + .get_node(&args.id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", args.id))?; - let node = storage.promote_memory(&args.id).map_err(|e| e.to_string())?; + let node = storage + .promote_memory(&args.id) + .map_err(|e| e.to_string())?; // ==================================================================== // COGNITIVE FEEDBACK PIPELINE (promote) // ==================================================================== if let Ok(mut cog) = cognitive.try_lock() { // 5A. Reward signal — record positive outcome - cog.reward_signal.record_outcome(&args.id, OutcomeType::Helpful); + cog.reward_signal + .record_outcome(&args.id, OutcomeType::Helpful); // 5B. Importance tracking — mark as helpful retrieval cog.importance_tracker.on_retrieved(&args.id, true); @@ -143,9 +147,10 @@ pub async fn execute_demote( // Validate UUID uuid::Uuid::parse_str(&args.id).map_err(|_| "Invalid node ID format".to_string())?; - // Get node before for comparison - let before = storage.get_node(&args.id).map_err(|e| e.to_string())? + let before = storage + .get_node(&args.id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", args.id))?; let node = storage.demote_memory(&args.id).map_err(|e| e.to_string())?; @@ -155,7 +160,8 @@ pub async fn execute_demote( // ==================================================================== if let Ok(mut cog) = cognitive.try_lock() { // 5A. Reward signal — record negative outcome - cog.reward_signal.record_outcome(&args.id, OutcomeType::NotHelpful); + cog.reward_signal + .record_outcome(&args.id, OutcomeType::NotHelpful); // 5B. Importance tracking — mark as unhelpful retrieval cog.importance_tracker.on_retrieved(&args.id, false); @@ -237,8 +243,9 @@ pub async fn execute_request_feedback( // Validate UUID uuid::Uuid::parse_str(&args.id).map_err(|_| "Invalid node ID format".to_string())?; - - let node = storage.get_node(&args.id).map_err(|e| e.to_string())? + let node = storage + .get_node(&args.id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", args.id))?; // Truncate content for display @@ -319,10 +326,12 @@ mod tests { assert_eq!(schema["type"], "object"); assert!(schema["properties"]["id"].is_object()); assert!(schema["properties"]["reason"].is_object()); - assert!(schema["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("id"))); + assert!( + schema["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("id")) + ); } #[test] @@ -330,10 +339,12 @@ mod tests { let schema = demote_schema(); assert_eq!(schema["type"], "object"); assert!(schema["properties"]["id"].is_object()); - assert!(schema["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("id"))); + assert!( + schema["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("id")) + ); } #[test] @@ -342,10 +353,12 @@ mod tests { assert_eq!(schema["type"], "object"); assert!(schema["properties"]["id"].is_object()); assert!(schema["properties"]["context"].is_object()); - assert!(schema["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("id"))); + assert!( + schema["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("id")) + ); } // === PROMOTE TESTS === @@ -370,8 +383,7 @@ mod tests { #[tokio::test] async fn test_promote_nonexistent_node_fails() { let (storage, _dir) = test_storage().await; - let args = - serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); + let args = serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); let result = execute_promote(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Node not found")); @@ -454,8 +466,7 @@ mod tests { #[tokio::test] async fn test_demote_nonexistent_node_fails() { let (storage, _dir) = test_storage().await; - let args = - serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); + let args = serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); let result = execute_demote(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Node not found")); @@ -510,8 +521,7 @@ mod tests { #[tokio::test] async fn test_request_feedback_nonexistent_node_fails() { let (storage, _dir) = test_storage().await; - let args = - serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); + let args = serde_json::json!({ "id": "00000000-0000-0000-0000-000000000000" }); let result = execute_request_feedback(&storage, Some(args)).await; assert!(result.is_err()); } diff --git a/crates/vestige-mcp/src/tools/graph.rs b/crates/vestige-mcp/src/tools/graph.rs index 183c725..13ca746 100644 --- a/crates/vestige-mcp/src/tools/graph.rs +++ b/crates/vestige-mcp/src/tools/graph.rs @@ -125,52 +125,72 @@ pub async fn execute( storage: &Arc, args: Option, ) -> Result { - let depth = args.as_ref() + let depth = args + .as_ref() .and_then(|a| a.get("depth")) .and_then(|v| v.as_u64()) .unwrap_or(2) .min(3) as u32; - let max_nodes = args.as_ref() + let max_nodes = args + .as_ref() .and_then(|a| a.get("max_nodes")) .and_then(|v| v.as_u64()) .unwrap_or(50) .min(200) as usize; // Determine center node - let center_id = if let Some(id) = args.as_ref().and_then(|a| a.get("center_id")).and_then(|v| v.as_str()) { + let center_id = if let Some(id) = args + .as_ref() + .and_then(|a| a.get("center_id")) + .and_then(|v| v.as_str()) + { id.to_string() - } else if let Some(query) = args.as_ref().and_then(|a| a.get("query")).and_then(|v| v.as_str()) { + } else if let Some(query) = args + .as_ref() + .and_then(|a| a.get("query")) + .and_then(|v| v.as_str()) + { // Search for center node - let results = storage.search(query, 1) + let results = storage + .search(query, 1) .map_err(|e| format!("Search failed: {}", e))?; - results.first() + results + .first() .map(|n| n.id.clone()) .ok_or_else(|| "No memories found matching query".to_string())? } else { // Default: use the most recent memory - let recent = storage.get_all_nodes(1, 0) + let recent = storage + .get_all_nodes(1, 0) .map_err(|e| format!("Failed to get recent node: {}", e))?; - recent.first() + recent + .first() .map(|n| n.id.clone()) .ok_or_else(|| "No memories in database".to_string())? }; // Get subgraph - let (nodes, edges) = storage.get_memory_subgraph(¢er_id, depth, max_nodes) + let (nodes, edges) = storage + .get_memory_subgraph(¢er_id, depth, max_nodes) .map_err(|e| format!("Failed to get subgraph: {}", e))?; if nodes.is_empty() || !nodes.iter().any(|n| n.id == center_id) { - return Err(format!("Memory '{}' not found or has no accessible data", center_id)); + return Err(format!( + "Memory '{}' not found or has no accessible data", + center_id + )); } // Build index map for FR layout - let id_to_idx: std::collections::HashMap<&str, usize> = nodes.iter() + let id_to_idx: std::collections::HashMap<&str, usize> = nodes + .iter() .enumerate() .map(|(i, n)| (n.id.as_str(), i)) .collect(); - let layout_edges: Vec<(usize, usize, f64)> = edges.iter() + let layout_edges: Vec<(usize, usize, f64)> = edges + .iter() .filter_map(|e| { let u = id_to_idx.get(e.source_id.as_str())?; let v = id_to_idx.get(e.target_id.as_str())?; @@ -182,7 +202,8 @@ pub async fn execute( let positions = fruchterman_reingold(nodes.len(), &layout_edges, 800.0, 600.0, 50); // Build response - let nodes_json: Vec = nodes.iter() + let nodes_json: Vec = nodes + .iter() .enumerate() .map(|(i, n)| { let (x, y) = positions.get(i).copied().unwrap_or((400.0, 300.0)); @@ -199,11 +220,15 @@ pub async fn execute( "x": (x * 100.0).round() / 100.0, "y": (y * 100.0).round() / 100.0, "isCenter": n.id == center_id, + // v2.0.5 Active Forgetting — dashboard uses these to dim suppressed nodes + "suppression_count": n.suppression_count, + "suppressed_at": n.suppressed_at.map(|t| t.to_rfc3339()), }) }) .collect(); - let edges_json: Vec = edges.iter() + let edges_json: Vec = edges + .iter() .map(|e| { serde_json::json!({ "source": e.source_id, @@ -293,16 +318,18 @@ mod tests { #[tokio::test] async fn test_graph_with_center_id() { let (storage, _dir) = test_storage().await; - let node = storage.ingest(vestige_core::IngestInput { - content: "Graph test memory".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + let node = storage + .ingest(vestige_core::IngestInput { + content: "Graph test memory".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); let args = serde_json::json!({ "center_id": node.id }); let result = execute(&storage, Some(args)).await; @@ -318,16 +345,18 @@ mod tests { #[tokio::test] async fn test_graph_with_query() { let (storage, _dir) = test_storage().await; - storage.ingest(vestige_core::IngestInput { - content: "Quantum computing fundamentals".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["science".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: "Quantum computing fundamentals".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["science".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); let args = serde_json::json!({ "query": "quantum" }); let result = execute(&storage, Some(args)).await; @@ -339,16 +368,18 @@ mod tests { #[tokio::test] async fn test_graph_node_has_position() { let (storage, _dir) = test_storage().await; - let node = storage.ingest(vestige_core::IngestInput { - content: "Position test memory".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec![], - valid_from: None, - valid_until: None, - }).unwrap(); + let node = storage + .ingest(vestige_core::IngestInput { + content: "Position test memory".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec![], + valid_from: None, + valid_until: None, + }) + .unwrap(); let args = serde_json::json!({ "center_id": node.id }); let result = execute(&storage, Some(args)).await.unwrap(); diff --git a/crates/vestige-mcp/src/tools/health.rs b/crates/vestige-mcp/src/tools/health.rs index 773438a..362f298 100644 --- a/crates/vestige-mcp/src/tools/health.rs +++ b/crates/vestige-mcp/src/tools/health.rs @@ -16,23 +16,28 @@ pub async fn execute( _args: Option, ) -> Result { // Average retention - let avg_retention = storage.get_avg_retention() + let avg_retention = storage + .get_avg_retention() .map_err(|e| format!("Failed to get avg retention: {}", e))?; // Retention distribution - let distribution = storage.get_retention_distribution() + let distribution = storage + .get_retention_distribution() .map_err(|e| format!("Failed to get retention distribution: {}", e))?; - let distribution_json: serde_json::Value = distribution.iter().map(|(bucket, count)| { - serde_json::json!({ "bucket": bucket, "count": count }) - }).collect(); + let distribution_json: serde_json::Value = distribution + .iter() + .map(|(bucket, count)| serde_json::json!({ "bucket": bucket, "count": count })) + .collect(); // Retention trend - let trend = storage.get_retention_trend() + let trend = storage + .get_retention_trend() .unwrap_or_else(|_| "unknown".to_string()); // Total memories and those below key thresholds - let stats = storage.get_stats() + let stats = storage + .get_stats() .map_err(|e| format!("Failed to get stats: {}", e))?; let below_30 = storage.count_memories_below_retention(0.3).unwrap_or(0); @@ -104,16 +109,18 @@ mod tests { let (storage, _dir) = test_storage().await; // Ingest some test memories for i in 0..5 { - storage.ingest(vestige_core::IngestInput { - content: format!("Health test memory {}", i), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["test".to_string()], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: format!("Health test memory {}", i), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); } let result = execute(&storage, None).await; @@ -127,24 +134,24 @@ mod tests { #[tokio::test] async fn test_health_distribution_buckets() { let (storage, _dir) = test_storage().await; - storage.ingest(vestige_core::IngestInput { - content: "Test memory for distribution".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec![], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: "Test memory for distribution".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec![], + valid_from: None, + valid_until: None, + }) + .unwrap(); let result = execute(&storage, None).await.unwrap(); let dist = result["distribution"].as_array().unwrap(); // Should have at least one bucket with data assert!(!dist.is_empty()); - let total: i64 = dist.iter() - .map(|b| b["count"].as_i64().unwrap_or(0)) - .sum(); + let total: i64 = dist.iter().map(|b| b["count"].as_i64().unwrap_or(0)).sum(); assert_eq!(total, 1); } } diff --git a/crates/vestige-mcp/src/tools/importance.rs b/crates/vestige-mcp/src/tools/importance.rs index 10f5bfb..c9048aa 100644 --- a/crates/vestige-mcp/src/tools/importance.rs +++ b/crates/vestige-mcp/src/tools/importance.rs @@ -70,7 +70,9 @@ pub async fn execute( // Use CognitiveEngine's persistent signals (novelty/reward/attention accumulate) let cog = cognitive.lock().await; - let score = cog.importance_signals.compute_importance(&args.content, &context); + let score = cog + .importance_signals + .compute_importance(&args.content, &context); // Also detect emotional markers for richer output let emotional_markers = cog.arousal_signal.detect_emotional_markers(&args.content); @@ -129,10 +131,12 @@ mod tests { let schema = schema(); assert_eq!(schema["type"], "object"); assert!(schema["properties"]["content"].is_object()); - assert!(schema["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("content"))); + assert!( + schema["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("content")) + ); } #[tokio::test] @@ -140,7 +144,12 @@ mod tests { let storage = Arc::new( Storage::new(Some(std::path::PathBuf::from("/tmp/test_importance.db"))).unwrap(), ); - let result = execute(&storage, &test_cognitive(), Some(serde_json::json!({ "content": "" }))).await; + let result = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ "content": "" })), + ) + .await; assert!(result.is_err()); } diff --git a/crates/vestige-mcp/src/tools/ingest.rs b/crates/vestige-mcp/src/tools/ingest.rs index 402e24f..d724445 100644 --- a/crates/vestige-mcp/src/tools/ingest.rs +++ b/crates/vestige-mcp/src/tools/ingest.rs @@ -84,7 +84,9 @@ pub async fn execute( if let Ok(cog) = cognitive.try_lock() { // Full 4-channel importance scoring let context = ImportanceContext::current(); - let importance = cog.importance_signals.compute_importance(&args.content, &context); + let importance = cog + .importance_signals + .compute_importance(&args.content, &context); importance_composite = importance.composite; // Standalone novelty check (dopaminergic signal) @@ -136,7 +138,13 @@ pub async fn execute( let node_type = result.node.node_type.clone(); let has_embedding = result.node.has_embedding.unwrap_or(false); - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); Ok(serde_json::json!({ "success": true, @@ -157,7 +165,13 @@ pub async fn execute( let node_type = node.node_type.clone(); let has_embedding = node.has_embedding.unwrap_or(false); - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); Ok(serde_json::json!({ "success": true, @@ -181,7 +195,13 @@ pub async fn execute( let node_type = node.node_type.clone(); let has_embedding = node.has_embedding.unwrap_or(false); - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); Ok(serde_json::json!({ "success": true, @@ -217,16 +237,13 @@ fn run_post_ingest( cog.importance_signals.learn_content(content); // Record in hippocampal index - let _ = cog.hippocampal_index.index_memory( - node_id, - content, - node_type, - Utc::now(), - None, - ); + let _ = cog + .hippocampal_index + .index_memory(node_id, content, node_type, Utc::now(), None); // Cross-project pattern recording - cog.cross_project.record_project_memory(node_id, "default", None); + cog.cross_project + .record_project_memory(node_id, "default", None); } } @@ -421,7 +438,12 @@ mod tests { let schema_value = schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["content"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("content"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("content")) + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/intention_unified.rs b/crates/vestige-mcp/src/tools/intention_unified.rs index b2d3369..5eae9dc 100644 --- a/crates/vestige-mcp/src/tools/intention_unified.rs +++ b/crates/vestige-mcp/src/tools/intention_unified.rs @@ -265,25 +265,34 @@ async fn execute_set( nlp_parsed = true; // Extract trigger info from parsed intention let (t_type, t_data) = match &parsed.trigger { - ProspectiveTrigger::TimeBased { .. } => { - ("time".to_string(), serde_json::json!({"type": "time"}).to_string()) - } + ProspectiveTrigger::TimeBased { .. } => ( + "time".to_string(), + serde_json::json!({"type": "time"}).to_string(), + ), ProspectiveTrigger::DurationBased { after, .. } => { let mins = after.num_minutes(); - ("time".to_string(), serde_json::json!({"type": "time", "in_minutes": mins}).to_string()) - } - ProspectiveTrigger::EventBased { condition, .. } => { - ("event".to_string(), serde_json::json!({"type": "event", "condition": condition}).to_string()) - } - ProspectiveTrigger::ContextBased { context_match } => { - ("context".to_string(), serde_json::json!({"type": "context", "topic": format!("{:?}", context_match)}).to_string()) - } - ProspectiveTrigger::Recurring { .. } => { - ("recurring".to_string(), serde_json::json!({"type": "recurring"}).to_string()) - } - _ => { - ("event".to_string(), serde_json::json!({"type": "event"}).to_string()) + ( + "time".to_string(), + serde_json::json!({"type": "time", "in_minutes": mins}).to_string(), + ) } + ProspectiveTrigger::EventBased { condition, .. } => ( + "event".to_string(), + serde_json::json!({"type": "event", "condition": condition}).to_string(), + ), + ProspectiveTrigger::ContextBased { context_match } => ( + "context".to_string(), + serde_json::json!({"type": "context", "topic": format!("{:?}", context_match)}) + .to_string(), + ), + ProspectiveTrigger::Recurring { .. } => ( + "recurring".to_string(), + serde_json::json!({"type": "recurring"}).to_string(), + ), + _ => ( + "event".to_string(), + serde_json::json!({"type": "event"}).to_string(), + ), }; nlp_trigger_type = Some(t_type); nlp_trigger_data = Some(t_data); @@ -426,7 +435,6 @@ async fn execute_check( let _ = cog.prospective_memory.update_context(prospective_ctx); } - // Get active intentions let intentions = storage.get_active_intentions().map_err(|e| e.to_string())?; @@ -521,10 +529,7 @@ async fn execute_update( storage: &Arc, args: &UnifiedIntentionArgs, ) -> Result { - let intention_id = args - .id - .as_ref() - .ok_or("Missing 'id' for update action")?; + let intention_id = args.id.as_ref().ok_or("Missing 'id' for update action")?; let status = args .status @@ -690,7 +695,9 @@ mod tests { "action": "set", "description": description }); - let result = execute(storage, &test_cognitive(), Some(args)).await.unwrap(); + let result = execute(storage, &test_cognitive(), Some(args)) + .await + .unwrap(); result["intentionId"].as_str().unwrap().to_string() } @@ -742,10 +749,12 @@ mod tests { assert_eq!(value["success"], true); assert_eq!(value["action"], "set"); assert!(value["intentionId"].is_string()); - assert!(value["message"] - .as_str() - .unwrap() - .contains("Intention created")); + assert!( + value["message"] + .as_str() + .unwrap() + .contains("Intention created") + ); } #[tokio::test] @@ -953,7 +962,9 @@ mod tests { "codebase": "payments" } }); - execute(&storage, &test_cognitive(), Some(set_args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(set_args)) + .await + .unwrap(); // Check with matching context let check_args = serde_json::json!({ @@ -984,7 +995,9 @@ mod tests { "at": past_time } }); - execute(&storage, &test_cognitive(), Some(set_args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(set_args)) + .await + .unwrap(); let check_args = serde_json::json!({ "action": "check" }); let result = execute(&storage, &test_cognitive(), Some(check_args)).await; @@ -1183,7 +1196,9 @@ mod tests { "id": intention_id, "status": "complete" }); - execute(&storage, &test_cognitive(), Some(complete_args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(complete_args)) + .await + .unwrap(); // Create another active one create_test_intention(&storage, "Active task").await; @@ -1193,7 +1208,9 @@ mod tests { "action": "list", "filter_status": "fulfilled" }); - let result = execute(&storage, &test_cognitive(), Some(list_args)).await.unwrap(); + let result = execute(&storage, &test_cognitive(), Some(list_args)) + .await + .unwrap(); assert_eq!(result["total"], 1); assert_eq!(result["status"], "fulfilled"); } @@ -1229,14 +1246,18 @@ mod tests { "id": intention_id, "status": "complete" }); - execute(&storage, &test_cognitive(), Some(complete_args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(complete_args)) + .await + .unwrap(); // List all let list_args = serde_json::json!({ "action": "list", "filter_status": "all" }); - let result = execute(&storage, &test_cognitive(), Some(list_args)).await.unwrap(); + let result = execute(&storage, &test_cognitive(), Some(list_args)) + .await + .unwrap(); assert_eq!(result["total"], 2); } @@ -1253,7 +1274,9 @@ mod tests { // 2. Verify it appears in list let list_args = serde_json::json!({ "action": "list" }); - let list_result = execute(&storage, &test_cognitive(), Some(list_args)).await.unwrap(); + let list_result = execute(&storage, &test_cognitive(), Some(list_args)) + .await + .unwrap(); assert_eq!(list_result["total"], 1); // 3. Snooze it @@ -1277,7 +1300,9 @@ mod tests { // 5. Verify it's no longer active let final_list_args = serde_json::json!({ "action": "list" }); - let final_list = execute(&storage, &test_cognitive(), Some(final_list_args)).await.unwrap(); + let final_list = execute(&storage, &test_cognitive(), Some(final_list_args)) + .await + .unwrap(); assert_eq!(final_list["total"], 0); // 6. Verify it's in fulfilled list @@ -1285,7 +1310,9 @@ mod tests { "action": "list", "filter_status": "fulfilled" }); - let fulfilled_list = execute(&storage, &test_cognitive(), Some(fulfilled_args)).await.unwrap(); + let fulfilled_list = execute(&storage, &test_cognitive(), Some(fulfilled_args)) + .await + .unwrap(); assert_eq!(fulfilled_list["total"], 1); } @@ -1299,25 +1326,33 @@ mod tests { "description": "Low priority task", "priority": "low" }); - execute(&storage, &test_cognitive(), Some(args_low)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(args_low)) + .await + .unwrap(); let args_critical = serde_json::json!({ "action": "set", "description": "Critical task", "priority": "critical" }); - execute(&storage, &test_cognitive(), Some(args_critical)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(args_critical)) + .await + .unwrap(); let args_normal = serde_json::json!({ "action": "set", "description": "Normal task", "priority": "normal" }); - execute(&storage, &test_cognitive(), Some(args_normal)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(args_normal)) + .await + .unwrap(); // List and verify ordering (critical should be first due to priority DESC ordering) let list_args = serde_json::json!({ "action": "list" }); - let list_result = execute(&storage, &test_cognitive(), Some(list_args)).await.unwrap(); + let list_result = execute(&storage, &test_cognitive(), Some(list_args)) + .await + .unwrap(); let intentions = list_result["intentions"].as_array().unwrap(); assert!(intentions.len() >= 3); @@ -1335,10 +1370,12 @@ mod tests { let schema_value = schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["action"].is_object()); - assert!(schema_value["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("action"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("action")) + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/intentions.rs b/crates/vestige-mcp/src/tools/intentions.rs index 8060125..169ac43 100644 --- a/crates/vestige-mcp/src/tools/intentions.rs +++ b/crates/vestige-mcp/src/tools/intentions.rs @@ -6,7 +6,7 @@ use serde::Deserialize; use serde_json::Value; use std::sync::Arc; -use chrono::{DateTime, Utc, Duration}; +use chrono::{DateTime, Duration, Utc}; use uuid::Uuid; use vestige_core::{IntentionRecord, Storage}; @@ -221,10 +221,7 @@ struct ListArgs { } /// Execute set_intention tool -pub async fn execute_set( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_set(storage: &Arc, args: Option) -> Result { let args: SetIntentionArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -239,7 +236,10 @@ pub async fn execute_set( // Determine trigger type and data let (trigger_type, trigger_data) = if let Some(trigger) = &args.trigger { - let t_type = trigger.trigger_type.clone().unwrap_or_else(|| "time".to_string()); + let t_type = trigger + .trigger_type + .clone() + .unwrap_or_else(|| "time".to_string()); let data = serde_json::to_string(trigger).unwrap_or_else(|_| "{}".to_string()); (t_type, data) } else { @@ -256,13 +256,17 @@ pub async fn execute_set( // Parse deadline let deadline = args.deadline.and_then(|s| { - DateTime::parse_from_rfc3339(&s).ok().map(|dt| dt.with_timezone(&Utc)) + DateTime::parse_from_rfc3339(&s) + .ok() + .map(|dt| dt.with_timezone(&Utc)) }); // Calculate trigger time if specified let trigger_at = if let Some(trigger) = &args.trigger { if let Some(at) = &trigger.at { - DateTime::parse_from_rfc3339(at).ok().map(|dt| dt.with_timezone(&Utc)) + DateTime::parse_from_rfc3339(at) + .ok() + .map(|dt| dt.with_timezone(&Utc)) } else { trigger.in_minutes.map(|mins| now + Duration::minutes(mins)) } @@ -303,13 +307,13 @@ pub async fn execute_set( } /// Execute check_intentions tool -pub async fn execute_check( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_check(storage: &Arc, args: Option) -> Result { let args: CheckIntentionsArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, - None => CheckIntentionsArgs { context: None, include_snoozed: None }, + None => CheckIntentionsArgs { + context: None, + include_snoozed: None, + }, }; let now = Utc::now(); @@ -344,14 +348,20 @@ pub async fn execute_check( Some("context") => { if let Some(ctx) = &args.context { // Check codebase match - if let (Some(trigger_codebase), Some(current_codebase)) = (&t.codebase, &ctx.codebase) { - current_codebase.to_lowercase().contains(&trigger_codebase.to_lowercase()) + if let (Some(trigger_codebase), Some(current_codebase)) = + (&t.codebase, &ctx.codebase) + { + current_codebase + .to_lowercase() + .contains(&trigger_codebase.to_lowercase()) // Check file pattern match } else if let (Some(pattern), Some(file)) = (&t.file_pattern, &ctx.file) { file.contains(pattern) // Check topic match } else if let (Some(topic), Some(topics)) = (&t.topic, &ctx.topics) { - topics.iter().any(|t| t.to_lowercase().contains(&topic.to_lowercase())) + topics + .iter() + .any(|t| t.to_lowercase().contains(&topic.to_lowercase())) } else { false } @@ -406,7 +416,8 @@ pub async fn execute_complete( None => return Err("Missing intention_id".to_string()), }; - let updated = storage.update_intention_status(&args.intention_id, "fulfilled") + let updated = storage + .update_intention_status(&args.intention_id, "fulfilled") .map_err(|e| e.to_string())?; if updated { @@ -421,10 +432,7 @@ pub async fn execute_complete( } /// Execute snooze_intention tool -pub async fn execute_snooze( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_snooze(storage: &Arc, args: Option) -> Result { let args: SnoozeArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing intention_id".to_string()), @@ -433,7 +441,8 @@ pub async fn execute_snooze( let minutes = args.minutes.unwrap_or(30); let snooze_until = Utc::now() + Duration::minutes(minutes); - let updated = storage.snooze_intention(&args.intention_id, snooze_until) + let updated = storage + .snooze_intention(&args.intention_id, snooze_until) .map_err(|e| e.to_string())?; if updated { @@ -449,13 +458,13 @@ pub async fn execute_snooze( } /// Execute list_intentions tool -pub async fn execute_list( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_list(storage: &Arc, args: Option) -> Result { let args: ListArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, - None => ListArgs { status: None, limit: None }, + None => ListArgs { + status: None, + limit: None, + }, }; let status = args.status.as_deref().unwrap_or("active"); @@ -463,15 +472,29 @@ pub async fn execute_list( let intentions = if status == "all" { // Get all by combining different statuses let mut all = storage.get_active_intentions().map_err(|e| e.to_string())?; - all.extend(storage.get_intentions_by_status("fulfilled").map_err(|e| e.to_string())?); - all.extend(storage.get_intentions_by_status("cancelled").map_err(|e| e.to_string())?); - all.extend(storage.get_intentions_by_status("snoozed").map_err(|e| e.to_string())?); + all.extend( + storage + .get_intentions_by_status("fulfilled") + .map_err(|e| e.to_string())?, + ); + all.extend( + storage + .get_intentions_by_status("cancelled") + .map_err(|e| e.to_string())?, + ); + all.extend( + storage + .get_intentions_by_status("snoozed") + .map_err(|e| e.to_string())?, + ); all } else if status == "active" { // Use get_active_intentions for proper priority ordering storage.get_active_intentions().map_err(|e| e.to_string())? } else { - storage.get_intentions_by_status(status).map_err(|e| e.to_string())? + storage + .get_intentions_by_status(status) + .map_err(|e| e.to_string())? }; let limit = args.limit.unwrap_or(20) as usize; @@ -574,7 +597,12 @@ mod tests { let value = result.unwrap(); assert_eq!(value["success"], true); assert!(value["intentionId"].is_string()); - assert!(value["message"].as_str().unwrap().contains("Intention created")); + assert!( + value["message"] + .as_str() + .unwrap() + .contains("Intention created") + ); } #[tokio::test] @@ -1017,14 +1045,24 @@ mod tests { let schema_value = set_schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["description"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("description"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("description")) + ); } #[test] fn test_complete_schema_has_required_fields() { let schema_value = complete_schema(); assert!(schema_value["properties"]["intentionId"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("intentionId"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("intentionId")) + ); } #[test] @@ -1032,7 +1070,12 @@ mod tests { let schema_value = snooze_schema(); assert!(schema_value["properties"]["intentionId"].is_object()); assert!(schema_value["properties"]["minutes"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("intentionId"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("intentionId")) + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/knowledge.rs b/crates/vestige-mcp/src/tools/knowledge.rs index 1171d76..f26646d 100644 --- a/crates/vestige-mcp/src/tools/knowledge.rs +++ b/crates/vestige-mcp/src/tools/knowledge.rs @@ -42,10 +42,7 @@ struct KnowledgeArgs { id: String, } -pub async fn execute_get( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_get(storage: &Arc, args: Option) -> Result { let args: KnowledgeArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -90,10 +87,7 @@ pub async fn execute_get( } } -pub async fn execute_delete( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_delete(storage: &Arc, args: Option) -> Result { let args: KnowledgeArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), diff --git a/crates/vestige-mcp/src/tools/maintenance.rs b/crates/vestige-mcp/src/tools/maintenance.rs index 9764dce..fcd89d1 100644 --- a/crates/vestige-mcp/src/tools/maintenance.rs +++ b/crates/vestige-mcp/src/tools/maintenance.rs @@ -159,7 +159,8 @@ pub async fn execute_system_status( let mut recommendations = Vec::new(); if status == "critical" { - recommendations.push("CRITICAL: Many memories have very low retention. Review important memories."); + recommendations + .push("CRITICAL: Many memories have very low retention. Review important memories."); } if stats.nodes_due_for_review > 5 { recommendations.push("Review due memories to strengthen retention."); @@ -253,7 +254,6 @@ pub async fn execute_system_status( }; let last_backup = Storage::get_last_backup_timestamp(); - Ok(serde_json::json!({ "tool": "system_status", // Health @@ -336,7 +336,8 @@ pub async fn execute_health_check( let mut recommendations = Vec::new(); if status == "critical" { - recommendations.push("CRITICAL: Many memories have very low retention. Review important memories."); + recommendations + .push("CRITICAL: Many memories have very low retention. Review important memories."); } if stats.nodes_due_for_review > 5 { recommendations.push("Review due memories to strengthen retention."); @@ -505,7 +506,9 @@ pub async fn execute_stats( }) .collect(); if !memories_for_compression.is_empty() { - let groups = cog.compressor.find_compressible_groups(&memories_for_compression); + let groups = cog + .compressor + .find_compressible_groups(&memories_for_compression); Some(serde_json::json!({ "groupCount": groups.len(), "totalCompressible": groups.iter().map(|g| g.len()).sum::(), @@ -566,14 +569,13 @@ pub async fn execute_stats( } /// Backup tool -pub async fn execute_backup( - storage: &Arc, - _args: Option, -) -> Result { +pub async fn execute_backup(storage: &Arc, _args: Option) -> Result { // Determine backup path let vestige_dir = directories::ProjectDirs::from("com", "vestige", "core") .ok_or("Could not determine data directory")?; - let backup_dir = vestige_dir.data_dir().parent() + let backup_dir = vestige_dir + .data_dir() + .parent() .unwrap_or(vestige_dir.data_dir()) .join("backups"); @@ -585,7 +587,8 @@ pub async fn execute_backup( // Use VACUUM INTO for a consistent backup (handles WAL properly) { - storage.backup_to(&backup_path) + storage + .backup_to(&backup_path) .map_err(|e| format!("Failed to create backup: {}", e))?; } @@ -611,10 +614,7 @@ struct ExportArgs { } /// Export tool -pub async fn execute_export( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_export(storage: &Arc, args: Option) -> Result { let args: ExportArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => ExportArgs { @@ -627,7 +627,10 @@ pub async fn execute_export( let format = args.format.unwrap_or_else(|| "json".to_string()); if format != "json" && format != "jsonl" { - return Err(format!("Invalid format '{}'. Must be 'json' or 'jsonl'.", format)); + return Err(format!( + "Invalid format '{}'. Must be 'json' or 'jsonl'.", + format + )); } // Parse since date @@ -648,7 +651,9 @@ pub async fn execute_export( let max_nodes = 100_000; let mut offset = 0; loop { - let batch = storage.get_all_nodes(page_size, offset).map_err(|e| e.to_string())?; + let batch = storage + .get_all_nodes(page_size, offset) + .map_err(|e| e.to_string())?; let batch_len = batch.len(); all_nodes.extend(batch); if batch_len < page_size as usize || all_nodes.len() >= max_nodes { @@ -661,7 +666,10 @@ pub async fn execute_export( let filtered: Vec<&vestige_core::KnowledgeNode> = all_nodes .iter() .filter(|node| { - if since_date.as_ref().is_some_and(|since_dt| node.created_at < *since_dt) { + if since_date + .as_ref() + .is_some_and(|since_dt| node.created_at < *since_dt) + { return false; } if !tag_filter.is_empty() { @@ -678,7 +686,9 @@ pub async fn execute_export( // Determine export path — always constrained to vestige exports directory let vestige_dir = directories::ProjectDirs::from("com", "vestige", "core") .ok_or("Could not determine data directory")?; - let export_dir = vestige_dir.data_dir().parent() + let export_dir = vestige_dir + .data_dir() + .parent() .unwrap_or(vestige_dir.data_dir()) .join("exports"); std::fs::create_dir_all(&export_dir) @@ -725,7 +735,9 @@ pub async fn execute_export( } writer.flush().map_err(|e| e.to_string())?; - let file_size = std::fs::metadata(&export_path).map(|m| m.len()).unwrap_or(0); + let file_size = std::fs::metadata(&export_path) + .map(|m| m.len()) + .unwrap_or(0); Ok(serde_json::json!({ "tool": "export", @@ -746,10 +758,7 @@ struct GcArgs { } /// Garbage collection tool -pub async fn execute_gc( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_gc(storage: &Arc, args: Option) -> Result { let args: GcArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => GcArgs { @@ -771,7 +780,9 @@ pub async fn execute_gc( let max_nodes = 100_000; let mut offset = 0; loop { - let batch = storage.get_all_nodes(page_size, offset).map_err(|e| e.to_string())?; + let batch = storage + .get_all_nodes(page_size, offset) + .map_err(|e| e.to_string())?; let batch_len = batch.len(); all_nodes.extend(batch); if batch_len < page_size as usize || all_nodes.len() >= max_nodes { @@ -903,16 +914,18 @@ mod tests { async fn test_system_status_with_memories() { let (storage, _dir) = test_storage().await; { - storage.ingest(vestige_core::IngestInput { - content: "Test memory for status".to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec![], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: "Test memory for status".to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec![], + valid_from: None, + valid_until: None, + }) + .unwrap(); } let result = execute_system_status(&storage, &test_cognitive(), None).await; assert!(result.is_ok()); @@ -942,7 +955,10 @@ mod tests { assert!(triggers.is_object(), "automationTriggers should be present"); assert!(triggers["lastDreamTimestamp"].is_null(), "No dreams yet"); assert_eq!(triggers["savesSinceLastDream"], 0, "Empty DB = 0 saves"); - assert!(triggers["lastConsolidationTimestamp"].is_null(), "No consolidation yet"); + assert!( + triggers["lastConsolidationTimestamp"].is_null(), + "No consolidation yet" + ); // lastBackupTimestamp depends on filesystem state, just check it exists assert!(triggers.get("lastBackupTimestamp").is_some()); } @@ -952,16 +968,18 @@ mod tests { let (storage, _dir) = test_storage().await; { for i in 0..3 { - storage.ingest(vestige_core::IngestInput { - content: format!("Automation trigger test memory {}", i), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec![], - valid_from: None, - valid_until: None, - }).unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: format!("Automation trigger test memory {}", i), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec![], + valid_from: None, + valid_until: None, + }) + .unwrap(); } } let result = execute_system_status(&storage, &test_cognitive(), None).await; diff --git a/crates/vestige-mcp/src/tools/memory_states.rs b/crates/vestige-mcp/src/tools/memory_states.rs index 92d3c76..dae2583 100644 --- a/crates/vestige-mcp/src/tools/memory_states.rs +++ b/crates/vestige-mcp/src/tools/memory_states.rs @@ -75,19 +75,14 @@ pub fn stats_schema() -> Value { } /// Get the cognitive state of a specific memory -pub async fn execute_get( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_get(storage: &Arc, args: Option) -> Result { let args = args.ok_or("Missing arguments")?; - let memory_id = args["memory_id"] - .as_str() - .ok_or("memory_id is required")?; - + let memory_id = args["memory_id"].as_str().ok_or("memory_id is required")?; // Get the memory - let memory = storage.get_node(memory_id) + let memory = storage + .get_node(memory_id) .map_err(|e| format!("Error: {}", e))? .ok_or("Memory not found")?; @@ -128,19 +123,14 @@ pub async fn execute_get( } /// List memories by state -pub async fn execute_list( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_list(storage: &Arc, args: Option) -> Result { let args = args.unwrap_or(serde_json::json!({})); let state_filter = args["state"].as_str(); let limit = args["limit"].as_i64().unwrap_or(20) as usize; - // Get all memories - let memories = storage.get_all_nodes(500, 0) - .map_err(|e| e.to_string())?; + let memories = storage.get_all_nodes(500, 0).map_err(|e| e.to_string())?; // Categorize by state let mut active = Vec::new(); @@ -199,19 +189,15 @@ pub async fn execute_list( "dormant": { "count": dormant.len(), "memories": dormant.into_iter().take(limit).collect::>() }, "silent": { "count": silent.len(), "memories": silent.into_iter().take(limit).collect::>() }, "unavailable": { "count": unavailable.len(), "memories": unavailable.into_iter().take(limit).collect::>() } - }) + }), }; Ok(result) } /// Get memory state statistics -pub async fn execute_stats( - storage: &Arc, -) -> Result { - - let memories = storage.get_all_nodes(1000, 0) - .map_err(|e| e.to_string())?; +pub async fn execute_stats(storage: &Arc) -> Result { + let memories = storage.get_all_nodes(1000, 0).map_err(|e| e.to_string())?; let total = memories.len(); let mut active_count = 0; @@ -237,7 +223,11 @@ pub async fn execute_stats( } } - let avg_accessibility = if total > 0 { total_accessibility / total as f64 } else { 0.0 }; + let avg_accessibility = if total > 0 { + total_accessibility / total as f64 + } else { + 0.0 + }; Ok(serde_json::json!({ "totalMemories": total, diff --git a/crates/vestige-mcp/src/tools/memory_unified.rs b/crates/vestige-mcp/src/tools/memory_unified.rs index e138b97..2d73b6b 100644 --- a/crates/vestige-mcp/src/tools/memory_unified.rs +++ b/crates/vestige-mcp/src/tools/memory_unified.rs @@ -219,7 +219,6 @@ async fn execute_delete(storage: &Arc, id: &str) -> Result, id: &str) -> Result { - // Get the memory let memory = storage .get_node(id) @@ -270,8 +269,9 @@ async fn execute_promote( id: &str, reason: Option, ) -> Result { - - let before = storage.get_node(id).map_err(|e| e.to_string())? + let before = storage + .get_node(id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", id))?; let node = storage.promote_memory(id).map_err(|e| e.to_string())?; @@ -325,15 +325,17 @@ async fn execute_demote( id: &str, reason: Option, ) -> Result { - - let before = storage.get_node(id).map_err(|e| e.to_string())? + let before = storage + .get_node(id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", id))?; let node = storage.demote_memory(id).map_err(|e| e.to_string())?; // Cognitive feedback pipeline if let Ok(mut cog) = cognitive.try_lock() { - cog.reward_signal.record_outcome(id, OutcomeType::NotHelpful); + cog.reward_signal + .record_outcome(id, OutcomeType::NotHelpful); cog.importance_tracker.on_retrieved(id, false); if cog.reconsolidation.is_labile(id) { cog.reconsolidation.apply_modification( @@ -429,22 +431,34 @@ mod tests { // Test Active state let accessibility = compute_accessibility(0.9, 0.8, 0.7); assert!(accessibility >= ACCESSIBILITY_ACTIVE); - assert!(matches!(state_from_accessibility(accessibility), MemoryState::Active)); + assert!(matches!( + state_from_accessibility(accessibility), + MemoryState::Active + )); // Test Dormant state let accessibility = compute_accessibility(0.5, 0.5, 0.5); - assert!(accessibility >= ACCESSIBILITY_DORMANT && accessibility < ACCESSIBILITY_ACTIVE); - assert!(matches!(state_from_accessibility(accessibility), MemoryState::Dormant)); + assert!((ACCESSIBILITY_DORMANT..ACCESSIBILITY_ACTIVE).contains(&accessibility)); + assert!(matches!( + state_from_accessibility(accessibility), + MemoryState::Dormant + )); // Test Silent state let accessibility = compute_accessibility(0.2, 0.2, 0.2); - assert!(accessibility >= ACCESSIBILITY_SILENT && accessibility < ACCESSIBILITY_DORMANT); - assert!(matches!(state_from_accessibility(accessibility), MemoryState::Silent)); + assert!((ACCESSIBILITY_SILENT..ACCESSIBILITY_DORMANT).contains(&accessibility)); + assert!(matches!( + state_from_accessibility(accessibility), + MemoryState::Silent + )); // Test Unavailable state let accessibility = compute_accessibility(0.05, 0.05, 0.05); assert!(accessibility < ACCESSIBILITY_SILENT); - assert!(matches!(state_from_accessibility(accessibility), MemoryState::Unavailable)); + assert!(matches!( + state_from_accessibility(accessibility), + MemoryState::Unavailable + )); } #[test] @@ -538,7 +552,8 @@ mod tests { #[tokio::test] async fn test_get_nonexistent_memory() { let (storage, _dir) = test_storage().await; - let args = serde_json::json!({ "action": "get", "id": "00000000-0000-0000-0000-000000000000" }); + let args = + serde_json::json!({ "action": "get", "id": "00000000-0000-0000-0000-000000000000" }); let result = execute(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_ok()); let value = result.unwrap(); @@ -562,13 +577,17 @@ mod tests { async fn test_delete_nonexistent_memory() { let (storage, _dir) = test_storage().await; // Ingest+delete a throwaway memory to warm writer after WAL migration - let warmup_id = storage.ingest(vestige_core::IngestInput { - content: "warmup".to_string(), - node_type: "fact".to_string(), - ..Default::default() - }).unwrap().id; + let warmup_id = storage + .ingest(vestige_core::IngestInput { + content: "warmup".to_string(), + node_type: "fact".to_string(), + ..Default::default() + }) + .unwrap() + .id; let _ = storage.delete_node(&warmup_id); - let args = serde_json::json!({ "action": "delete", "id": "00000000-0000-0000-0000-000000000000" }); + let args = + serde_json::json!({ "action": "delete", "id": "00000000-0000-0000-0000-000000000000" }); let result = execute(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_ok()); let value = result.unwrap(); @@ -581,7 +600,9 @@ mod tests { let (storage, _dir) = test_storage().await; let id = ingest_memory(&storage).await; let del_args = serde_json::json!({ "action": "delete", "id": id }); - execute(&storage, &test_cognitive(), Some(del_args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(del_args)) + .await + .unwrap(); let get_args = serde_json::json!({ "action": "get", "id": id }); let result = execute(&storage, &test_cognitive(), Some(get_args)).await; let value = result.unwrap(); @@ -612,7 +633,8 @@ mod tests { #[tokio::test] async fn test_state_nonexistent_memory_fails() { let (storage, _dir) = test_storage().await; - let args = serde_json::json!({ "action": "state", "id": "00000000-0000-0000-0000-000000000000" }); + let args = + serde_json::json!({ "action": "state", "id": "00000000-0000-0000-0000-000000000000" }); let result = execute(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_err()); assert!(result.unwrap_err().contains("not found")); @@ -629,7 +651,10 @@ mod tests { fn test_accessibility_boundary_zero() { let a = compute_accessibility(0.0, 0.0, 0.0); assert_eq!(a, 0.0); - assert!(matches!(state_from_accessibility(a), MemoryState::Unavailable)); + assert!(matches!( + state_from_accessibility(a), + MemoryState::Unavailable + )); } // ======================================================================== @@ -708,7 +733,8 @@ mod tests { #[tokio::test] async fn test_demote_nonexistent_node_fails() { let (storage, _dir) = test_storage().await; - let args = serde_json::json!({ "action": "demote", "id": "00000000-0000-0000-0000-000000000000" }); + let args = + serde_json::json!({ "action": "demote", "id": "00000000-0000-0000-0000-000000000000" }); let result = execute(&storage, &test_cognitive(), Some(args)).await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Node not found")); @@ -761,9 +787,24 @@ mod tests { assert_eq!(value["success"], true); assert_eq!(value["action"], "edit"); assert_eq!(value["nodeId"], id); - assert!(value["oldContentPreview"].as_str().unwrap().contains("Memory unified test content")); - assert!(value["newContentPreview"].as_str().unwrap().contains("Updated memory content")); - assert!(value["note"].as_str().unwrap().contains("FSRS state preserved")); + assert!( + value["oldContentPreview"] + .as_str() + .unwrap() + .contains("Memory unified test content") + ); + assert!( + value["newContentPreview"] + .as_str() + .unwrap() + .contains("Updated memory content") + ); + assert!( + value["note"] + .as_str() + .unwrap() + .contains("FSRS state preserved") + ); } #[tokio::test] @@ -780,7 +821,9 @@ mod tests { "id": id, "content": "Completely new content after edit" }); - execute(&storage, &test_cognitive(), Some(args)).await.unwrap(); + execute(&storage, &test_cognitive(), Some(args)) + .await + .unwrap(); // Verify FSRS state preserved let after = storage.get_node(&id).unwrap().unwrap(); diff --git a/crates/vestige-mcp/src/tools/mod.rs b/crates/vestige-mcp/src/tools/mod.rs index c621cf7..6d2d674 100644 --- a/crates/vestige-mcp/src/tools/mod.rs +++ b/crates/vestige-mcp/src/tools/mod.rs @@ -34,12 +34,15 @@ pub mod restore; pub mod session_context; // v1.9: Autonomic tools -pub mod health; pub mod graph; +pub mod health; // v2.1: Cross-reference (connect the dots) pub mod cross_reference; +// v2.0.5: Active Forgetting — Anderson 2025 + Davis Rac1 +pub mod suppress; + // Deprecated/internal tools — not advertised in the public MCP tools/list, // but some functions are actively dispatched for backwards compatibility // and internal cognitive operations. #[allow(dead_code)] suppresses warnings diff --git a/crates/vestige-mcp/src/tools/predict.rs b/crates/vestige-mcp/src/tools/predict.rs index 4ebf741..020f54a 100644 --- a/crates/vestige-mcp/src/tools/predict.rs +++ b/crates/vestige-mcp/src/tools/predict.rs @@ -57,23 +57,30 @@ pub async fn execute( project_context: context .and_then(|c| c.get("codebase")) .and_then(|v| v.as_str()) - .map(|name| vestige_core::neuroscience::predictive_retrieval::ProjectContext { - name: name.to_string(), - path: String::new(), - technologies: Vec::new(), - primary_language: None, - }), + .map( + |name| vestige_core::neuroscience::predictive_retrieval::ProjectContext { + name: name.to_string(), + path: String::new(), + technologies: Vec::new(), + primary_language: None, + }, + ), }; // Get predictions from predictive memory - let predictions = cog.predictive_memory.predict_needed_memories(&session_ctx) + let predictions = cog + .predictive_memory + .predict_needed_memories(&session_ctx) .unwrap_or_default(); - let suggestions = cog.predictive_memory.get_proactive_suggestions(0.3) + let suggestions = cog + .predictive_memory + .get_proactive_suggestions(0.3) .unwrap_or_default(); - let top_interests = cog.predictive_memory.get_top_interests(10) + let top_interests = cog + .predictive_memory + .get_top_interests(10) .unwrap_or_default(); - let accuracy = cog.predictive_memory.prediction_accuracy() - .unwrap_or(0.0); + let accuracy = cog.predictive_memory.prediction_accuracy().unwrap_or(0.0); // Build speculative context let speculative_context = vestige_core::PredictionContext { @@ -91,7 +98,9 @@ pub async fn execute( .map(PathBuf::from), timestamp: Some(chrono::Utc::now()), }; - let speculative = cog.speculative_retriever.predict_needed(&speculative_context); + let speculative = cog + .speculative_retriever + .predict_needed(&speculative_context); Ok(serde_json::json!({ "predictions": predictions.iter().map(|p| serde_json::json!({ diff --git a/crates/vestige-mcp/src/tools/recall.rs b/crates/vestige-mcp/src/tools/recall.rs index 23c4ac7..28ff8c4 100644 --- a/crates/vestige-mcp/src/tools/recall.rs +++ b/crates/vestige-mcp/src/tools/recall.rs @@ -44,10 +44,7 @@ struct RecallArgs { min_retention: Option, } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: RecallArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -101,8 +98,8 @@ pub async fn execute( #[cfg(test)] mod tests { use super::*; - use vestige_core::IngestInput; use tempfile::TempDir; + use vestige_core::IngestInput; /// Create a test storage instance with a temporary database async fn test_storage() -> (Arc, TempDir) { @@ -266,7 +263,8 @@ mod tests { #[tokio::test] async fn test_recall_returns_matching_content() { let (storage, _dir) = test_storage().await; - let node_id = ingest_test_content(&storage, "Python is a dynamic programming language.").await; + let node_id = + ingest_test_content(&storage, "Python is a dynamic programming language.").await; let args = serde_json::json!({ "query": "python" }); let result = execute(&storage, Some(args)).await; @@ -370,7 +368,12 @@ mod tests { let schema_value = schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["query"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("query"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("query")) + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/restore.rs b/crates/vestige-mcp/src/tools/restore.rs index 90ed1df..4d77252 100644 --- a/crates/vestige-mcp/src/tools/restore.rs +++ b/crates/vestige-mcp/src/tools/restore.rs @@ -8,7 +8,6 @@ use serde::Deserialize; use serde_json::Value; use std::sync::Arc; - use vestige_core::{IngestInput, Storage}; /// Input schema for restore tool @@ -51,10 +50,7 @@ struct MemoryBackup { source: Option, } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: RestoreArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -71,25 +67,26 @@ pub async fn execute( // Try parsing as wrapped format first (MCP response wrapper), // then fall back to direct RecallResult - let memories: Vec = - if let Ok(wrapper) = serde_json::from_str::>(&backup_content) { - if let Some(first) = wrapper.first() { - let recall: RecallResult = serde_json::from_str(&first.text) - .map_err(|e| format!("Failed to parse backup contents: {}", e))?; - recall.results - } else { - return Err("Empty backup file".to_string()); - } - } else if let Ok(recall) = serde_json::from_str::(&backup_content) { + let memories: Vec = if let Ok(wrapper) = + serde_json::from_str::>(&backup_content) + { + if let Some(first) = wrapper.first() { + let recall: RecallResult = serde_json::from_str(&first.text) + .map_err(|e| format!("Failed to parse backup contents: {}", e))?; recall.results - } else if let Ok(nodes) = serde_json::from_str::>(&backup_content) { - nodes } else { - return Err( - "Unrecognized backup format. Expected MCP wrapper, RecallResult, or array of memories." - .to_string(), - ); - }; + return Err("Empty backup file".to_string()); + } + } else if let Ok(recall) = serde_json::from_str::(&backup_content) { + recall.results + } else if let Ok(nodes) = serde_json::from_str::>(&backup_content) { + nodes + } else { + return Err( + "Unrecognized backup format. Expected MCP wrapper, RecallResult, or array of memories." + .to_string(), + ); + }; let total = memories.len(); if total == 0 { @@ -108,7 +105,10 @@ pub async fn execute( for memory in &memories { let input = IngestInput { content: memory.content.clone(), - node_type: memory.node_type.clone().unwrap_or_else(|| "fact".to_string()), + node_type: memory + .node_type + .clone() + .unwrap_or_else(|| "fact".to_string()), source: memory.source.clone(), sentiment_score: 0.0, sentiment_magnitude: 0.0, @@ -157,10 +157,12 @@ mod tests { let s = schema(); assert_eq!(s["type"], "object"); assert!(s["properties"]["path"].is_object()); - assert!(s["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("path"))); + assert!( + s["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("path")) + ); } #[tokio::test] diff --git a/crates/vestige-mcp/src/tools/review.rs b/crates/vestige-mcp/src/tools/review.rs index 3f13835..f5a0025 100644 --- a/crates/vestige-mcp/src/tools/review.rs +++ b/crates/vestige-mcp/src/tools/review.rs @@ -6,7 +6,6 @@ use serde::Deserialize; use serde_json::Value; use std::sync::Arc; - use vestige_core::{Rating, Storage}; /// Input schema for mark_reviewed tool @@ -37,10 +36,7 @@ struct ReviewArgs { rating: Option, } -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: ReviewArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -54,15 +50,18 @@ pub async fn execute( return Err("Rating must be between 1 and 4".to_string()); } - let rating = Rating::from_i32(rating_value) - .ok_or_else(|| "Invalid rating value".to_string())?; - + let rating = + Rating::from_i32(rating_value).ok_or_else(|| "Invalid rating value".to_string())?; // Get node before review for comparison - let before = storage.get_node(&args.id).map_err(|e| e.to_string())? + let before = storage + .get_node(&args.id) + .map_err(|e| e.to_string())? .ok_or_else(|| format!("Node not found: {}", args.id))?; - let node = storage.mark_reviewed(&args.id, rating).map_err(|e| e.to_string())?; + let node = storage + .mark_reviewed(&args.id, rating) + .map_err(|e| e.to_string())?; let rating_name = match rating { Rating::Again => "Again", @@ -97,8 +96,8 @@ pub async fn execute( #[cfg(test)] mod tests { use super::*; - use vestige_core::IngestInput; use tempfile::TempDir; + use vestige_core::IngestInput; /// Create a test storage instance with a temporary database async fn test_storage() -> (Arc, TempDir) { @@ -438,7 +437,12 @@ mod tests { let schema_value = schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["id"].is_object()); - assert!(schema_value["required"].as_array().unwrap().contains(&serde_json::json!("id"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("id")) + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/search.rs b/crates/vestige-mcp/src/tools/search.rs index 9235b64..7653cec 100644 --- a/crates/vestige-mcp/src/tools/search.rs +++ b/crates/vestige-mcp/src/tools/search.rs @@ -101,7 +101,6 @@ pub async fn execute_semantic( return Err("Query cannot be empty".to_string()); } - // Check if embeddings are ready if !storage.is_embedding_ready() { return Ok(serde_json::json!({ @@ -140,10 +139,7 @@ pub async fn execute_semantic( })) } -pub async fn execute_hybrid( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_hybrid(storage: &Arc, args: Option) -> Result { let args: HybridSearchArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => return Err("Missing arguments".to_string()), @@ -153,7 +149,6 @@ pub async fn execute_hybrid( return Err("Query cannot be empty".to_string()); } - let results = storage .hybrid_search( &args.query, diff --git a/crates/vestige-mcp/src/tools/search_unified.rs b/crates/vestige-mcp/src/tools/search_unified.rs index 8cadbe2..bfe419e 100644 --- a/crates/vestige-mcp/src/tools/search_unified.rs +++ b/crates/vestige-mcp/src/tools/search_unified.rs @@ -191,15 +191,16 @@ pub async fn execute( .hybrid_search_filtered( &args.query, keyword_first_limit, - 1.0, // keyword_weight = 1.0 (keyword-only) - 0.0, // semantic_weight = 0.0 + 1.0, // keyword_weight = 1.0 (keyword-only) + 0.0, // semantic_weight = 0.0 args.include_types.as_deref(), args.exclude_types.as_deref(), ) .map_err(|e| e.to_string())?; // Collect keyword-priority results (keyword_score >= threshold) - let mut keyword_priority_ids: std::collections::HashSet = std::collections::HashSet::new(); + let mut keyword_priority_ids: std::collections::HashSet = + std::collections::HashSet::new(); let mut keyword_priority_results: Vec = Vec::new(); for r in keyword_first_results { if r.keyword_score.unwrap_or(0.0) >= keyword_priority_threshold @@ -214,7 +215,7 @@ pub async fn execute( // STAGE 1: Hybrid search with Nx over-fetch for reranking pool // ==================================================================== let overfetch_multiplier = match retrieval_mode { - "precise" => 1, // No overfetch — return exactly what's asked + "precise" => 1, // No overfetch — return exactly what's asked "exhaustive" => 5, // Deep overfetch for maximum recall _ => 3, // Balanced default }; @@ -251,7 +252,10 @@ pub async fn execute( // Dedup: merge Stage 0 keyword-priority results into Stage 1 results // ==================================================================== for kp in &keyword_priority_results { - if let Some(existing) = filtered_results.iter_mut().find(|r| r.node.id == kp.node.id) { + if let Some(existing) = filtered_results + .iter_mut() + .find(|r| r.node.id == kp.node.id) + { // Preserve keyword_score from Stage 0 (keyword-only search is authoritative) if kp.keyword_score.unwrap_or(0.0) > existing.keyword_score.unwrap_or(0.0) { existing.keyword_score = kp.keyword_score; @@ -305,7 +309,10 @@ pub async fn execute( let reranked_results: Vec = if rerank_candidates.is_empty() { Vec::new() } else if let Ok(mut cog) = cognitive.try_lock() { - if let Ok(reranked) = cog.reranker.rerank(&args.query, rerank_candidates, Some(limit_usize)) { + if let Ok(reranked) = + cog.reranker + .rerank(&args.query, rerank_candidates, Some(limit_usize)) + { reranked.into_iter().map(|rr| rr.item).collect() } else { // Reranker failed — fall back to original order for non-bypass candidates @@ -343,8 +350,8 @@ pub async fn execute( ); // Blend: 85% relevance + 15% temporal signal let temporal_factor = recency * validity; - result.combined_score = - result.combined_score * 0.85 + (result.combined_score * temporal_factor as f32) * 0.15; + result.combined_score = result.combined_score * 0.85 + + (result.combined_score * temporal_factor as f32) * 0.15; } } @@ -368,9 +375,21 @@ pub async fn execute( MemoryState::Unavailable }; - let adjusted = cog + let mut adjusted = cog .accessibility_calc .calculate(&lifecycle, result.combined_score as f64); + + // v2.0.5: Active forgetting penalty (Anderson 2025 SIF). + // Each prior suppress call compounds a retrieval-score penalty, + // saturating at 80%. Applied AFTER accessibility so the penalty + // stacks on top of any passive FSRS decay. + if result.node.suppression_count > 0 { + let sys = + vestige_core::neuroscience::active_forgetting::ActiveForgettingSystem::new(); + let penalty = sys.retrieval_penalty(result.node.suppression_count); + adjusted *= 1.0 - penalty; + } + result.combined_score = adjusted as f32; } } @@ -381,14 +400,16 @@ pub async fn execute( if let Some(ref topics) = args.context_topics && !topics.is_empty() { - let retrieval_ctx = EncodingContext::new() - .with_topical(TopicalContext::with_topics(topics.clone())); + let retrieval_ctx = + EncodingContext::new().with_topical(TopicalContext::with_topics(topics.clone())); if let Ok(cog) = cognitive.try_lock() { for result in &mut filtered_results { // Build encoding context from memory's tags let encoding_ctx = EncodingContext::new() .with_topical(TopicalContext::with_topics(result.node.tags.clone())); - let context_score = cog.context_matcher.match_contexts(&encoding_ctx, &retrieval_ctx); + let context_score = cog + .context_matcher + .match_contexts(&encoding_ctx, &retrieval_ctx); // Blend: context match boosts relevance up to +30% result.combined_score *= 1.0 + (context_score as f32 * 0.3); } @@ -403,7 +424,9 @@ pub async fn execute( } else { EncodingContext::new() }; - let reinstatement = cog.context_matcher.reinstate_context(&first.node.id, ¤t_ctx); + let reinstatement = cog + .context_matcher + .reinstate_context(&first.node.id, ¤t_ctx); Some(serde_json::json!({ "memoryId": reinstatement.memory_id, "temporalHint": reinstatement.temporal_hint, @@ -438,7 +461,10 @@ pub async fn execute( if let Some(result) = cog.competition_mgr.run_competition(&candidates, 0.7) { // Apply suppression: losers get penalized for suppressed_id in &result.suppressed_ids { - if let Some(r) = filtered_results.iter_mut().find(|r| &r.node.id == suppressed_id) { + if let Some(r) = filtered_results + .iter_mut() + .find(|r| &r.node.id == suppressed_id) + { r.combined_score *= 0.85; // 15% suppression penalty suppressed_count += 1; } @@ -503,7 +529,10 @@ pub async fn execute( // ==================================================================== // Auto-strengthen on access (Testing Effect) // ==================================================================== - let ids: Vec<&str> = filtered_results.iter().map(|r| r.node.id.as_str()).collect(); + let ids: Vec<&str> = filtered_results + .iter() + .map(|r| r.node.id.as_str()) + .collect(); let _ = storage.strengthen_batch_on_access(&ids); // Drop storage lock before acquiring cognitive for side effects @@ -525,9 +554,9 @@ pub async fn execute( cog.speculative_retriever.record_access( &result.node.id, - None, // file_context - Some(args.query.as_str()), // query_context - None, // was_helpful (unknown yet) + None, // file_context + Some(args.query.as_str()), // query_context + None, // was_helpful (unknown yet) ); // 7C. Mark labile for reconsolidation window (5 min) @@ -580,7 +609,11 @@ pub async fn execute( } // Check learning mode via attention signal - let learning_mode = cognitive.try_lock().ok().map(|cog| cog.attention_signal.is_learning_mode()).unwrap_or(false); + let learning_mode = cognitive + .try_lock() + .ok() + .map(|cog| cog.attention_signal.is_learning_mode()) + .unwrap_or(false); let mut response = serde_json::json!({ "query": args.query, @@ -593,7 +626,9 @@ pub async fn execute( // Helpful hint when no results found if formatted.is_empty() { - response["hint"] = serde_json::json!("No memories found. Use smart_ingest to add memories, or try a broader query."); + response["hint"] = serde_json::json!( + "No memories found. Use smart_ingest to add memories, or try a broader query." + ); } // Include associations if any were found @@ -1038,10 +1073,12 @@ mod tests { let schema_value = schema(); assert_eq!(schema_value["type"], "object"); assert!(schema_value["properties"]["query"].is_object()); - assert!(schema_value["required"] - .as_array() - .unwrap() - .contains(&serde_json::json!("query"))); + assert!( + schema_value["required"] + .as_array() + .unwrap() + .contains(&serde_json::json!("query")) + ); } #[test] @@ -1172,8 +1209,14 @@ mod tests { // Summary should have content AND timestamps (v2.1: dates always visible) assert!(first["content"].is_string()); assert!(first["id"].is_string()); - assert!(first["createdAt"].is_string(), "summary must include createdAt"); - assert!(first["updatedAt"].is_string(), "summary must include updatedAt"); + assert!( + first["createdAt"].is_string(), + "summary must include createdAt" + ); + assert!( + first["updatedAt"].is_string(), + "summary must include updatedAt" + ); } } @@ -1199,7 +1242,10 @@ mod tests { for i in 0..10 { ingest_test_content( &storage, - &format!("Budget test content number {} with some extra text to increase size.", i), + &format!( + "Budget test content number {} with some extra text to increase size.", + i + ), ) .await; } diff --git a/crates/vestige-mcp/src/tools/session_context.rs b/crates/vestige-mcp/src/tools/session_context.rs index f93d681..e7414eb 100644 --- a/crates/vestige-mcp/src/tools/session_context.rs +++ b/crates/vestige-mcp/src/tools/session_context.rs @@ -110,7 +110,9 @@ pub async fn execute( let include_status = args.include_status.unwrap_or(true); let include_intentions = args.include_intentions.unwrap_or(true); let include_predictions = args.include_predictions.unwrap_or(true); - let queries = args.queries.unwrap_or_else(|| vec!["user preferences".to_string()]); + let queries = args + .queries + .unwrap_or_else(|| vec!["user preferences".to_string()]); let mut context_parts: Vec = Vec::new(); let mut expandable_ids: Vec = Vec::new(); @@ -275,34 +277,33 @@ pub async fn execute( if include_predictions { let cog = cognitive.lock().await; - let session_ctx = vestige_core::neuroscience::predictive_retrieval::SessionContext { - started_at: Utc::now(), - current_focus: args - .context - .as_ref() - .and_then(|c| c.topics.as_ref()) - .and_then(|t| t.first()) - .cloned(), - active_files: args - .context - .as_ref() - .and_then(|c| c.file.as_ref()) - .map(|f| vec![f.clone()]) - .unwrap_or_default(), - accessed_memories: Vec::new(), - recent_queries: Vec::new(), - detected_intent: None, - project_context: args - .context - .as_ref() - .and_then(|c| c.codebase.as_ref()) - .map(|name| vestige_core::neuroscience::predictive_retrieval::ProjectContext { - name: name.to_string(), - path: String::new(), - technologies: Vec::new(), - primary_language: None, - }), - }; + let session_ctx = + vestige_core::neuroscience::predictive_retrieval::SessionContext { + started_at: Utc::now(), + current_focus: args + .context + .as_ref() + .and_then(|c| c.topics.as_ref()) + .and_then(|t| t.first()) + .cloned(), + active_files: args + .context + .as_ref() + .and_then(|c| c.file.as_ref()) + .map(|f| vec![f.clone()]) + .unwrap_or_default(), + accessed_memories: Vec::new(), + recent_queries: Vec::new(), + detected_intent: None, + project_context: args.context.as_ref().and_then(|c| c.codebase.as_ref()).map( + |name| vestige_core::neuroscience::predictive_retrieval::ProjectContext { + name: name.to_string(), + path: String::new(), + technologies: Vec::new(), + primary_language: None, + }, + ), + }; let predictions = cog .predictive_memory @@ -335,41 +336,45 @@ pub async fn execute( // 5. Codebase patterns/decisions (if codebase specified) // ==================================================================== if let Some(ref ctx) = args.context - && let Some(ref codebase) = ctx.codebase { - let codebase_tag = format!("codebase:{}", codebase); - let mut cb_lines: Vec = Vec::new(); + && let Some(ref codebase) = ctx.codebase + { + let codebase_tag = format!("codebase:{}", codebase); + let mut cb_lines: Vec = Vec::new(); - // Get patterns - if let Ok(patterns) = storage.get_nodes_by_type_and_tag("pattern", Some(&codebase_tag), 3) { - for p in &patterns { - let line = format!("- [pattern] {}", first_sentence(&p.content)); - let line_len = line.len() + 1; - if char_count + line_len <= budget_chars { - cb_lines.push(line); - char_count += line_len; - } + // Get patterns + if let Ok(patterns) = storage.get_nodes_by_type_and_tag("pattern", Some(&codebase_tag), 3) { + for p in &patterns { + let line = format!("- [pattern] {}", first_sentence(&p.content)); + let line_len = line.len() + 1; + if char_count + line_len <= budget_chars { + cb_lines.push(line); + char_count += line_len; } } - - // Get decisions - if let Ok(decisions) = - storage.get_nodes_by_type_and_tag("decision", Some(&codebase_tag), 3) - { - for d in &decisions { - let line = format!("- [decision] {}", first_sentence(&d.content)); - let line_len = line.len() + 1; - if char_count + line_len <= budget_chars { - cb_lines.push(line); - char_count += line_len; - } - } - } - - if !cb_lines.is_empty() { - context_parts.push(format!("**Codebase ({}):**\n{}", codebase, cb_lines.join("\n"))); - } } + // Get decisions + if let Ok(decisions) = storage.get_nodes_by_type_and_tag("decision", Some(&codebase_tag), 3) + { + for d in &decisions { + let line = format!("- [decision] {}", first_sentence(&d.content)); + let line_len = line.len() + 1; + if char_count + line_len <= budget_chars { + cb_lines.push(line); + char_count += line_len; + } + } + } + + if !cb_lines.is_empty() { + context_parts.push(format!( + "**Codebase ({}):**\n{}", + codebase, + cb_lines.join("\n") + )); + } + } + // ==================================================================== // 6. Assemble final response // ==================================================================== @@ -405,9 +410,10 @@ fn check_intention_triggered( match trigger.trigger_type.as_deref() { Some("time") => { if let Some(ref at) = trigger.at - && let Ok(trigger_time) = DateTime::parse_from_rfc3339(at) { - return trigger_time.with_timezone(&Utc) <= now; - } + && let Ok(trigger_time) = DateTime::parse_from_rfc3339(at) + { + return trigger_time.with_timezone(&Utc) <= now; + } if let Some(mins) = trigger.in_minutes { let trigger_time = intention.created_at + Duration::minutes(mins); return trigger_time <= now; @@ -420,22 +426,23 @@ fn check_intention_triggered( && current_cb .to_lowercase() .contains(&trigger_cb.to_lowercase()) - { - return true; - } + { + return true; + } // Check file pattern match if let (Some(pattern), Some(file)) = (&trigger.file_pattern, &ctx.file) - && file.contains(pattern.as_str()) { - return true; - } + && file.contains(pattern.as_str()) + { + return true; + } // Check topic match if let (Some(topic), Some(topics)) = (&trigger.topic, &ctx.topics) && topics .iter() .any(|t| t.to_lowercase().contains(&topic.to_lowercase())) - { - return true; - } + { + return true; + } false } _ => false, @@ -537,7 +544,12 @@ mod tests { #[tokio::test] async fn test_with_queries() { let (storage, _dir) = test_storage().await; - ingest_test_content(&storage, "Sam prefers Rust and TypeScript for all projects.", vec![]).await; + ingest_test_content( + &storage, + "Sam prefers Rust and TypeScript for all projects.", + vec![], + ) + .await; let args = serde_json::json!({ "queries": ["Sam preferences", "project context"] @@ -574,12 +586,16 @@ mod tests { assert!(result.is_ok()); let value = result.unwrap(); - let ctx = value["context"].as_str().unwrap(); + assert!(value["context"].is_string()); // Context should be within budget (200 tokens * 4 = 800 chars + header overhead) // The actual char count of context should be reasonable let tokens_used = value["tokensUsed"].as_u64().unwrap(); // Allow some overhead for the header - assert!(tokens_used <= 300, "tokens_used {} should be near budget 200", tokens_used); + assert!( + tokens_used <= 300, + "tokens_used {} should be near budget 200", + tokens_used + ); } #[tokio::test] @@ -649,7 +665,8 @@ mod tests { let (storage, _dir) = test_storage().await; // Ingest a pattern with codebase tag let input = IngestInput { - content: "Code pattern: Use Arc> for shared state in async contexts.".to_string(), + content: "Code pattern: Use Arc> for shared state in async contexts." + .to_string(), node_type: "pattern".to_string(), source: None, sentiment_score: 0.0, @@ -681,7 +698,10 @@ mod tests { #[test] fn test_first_sentence_period() { - assert_eq!(first_sentence("Hello world. More text here."), "Hello world."); + assert_eq!( + first_sentence("Hello world. More text here."), + "Hello world." + ); } #[test] diff --git a/crates/vestige-mcp/src/tools/smart_ingest.rs b/crates/vestige-mcp/src/tools/smart_ingest.rs index 900c99f..72dc3a6 100644 --- a/crates/vestige-mcp/src/tools/smart_ingest.rs +++ b/crates/vestige-mcp/src/tools/smart_ingest.rs @@ -22,7 +22,7 @@ use tokio::sync::Mutex; use crate::cognitive::CognitiveEngine; use vestige_core::{ - ContentType, ImportanceContext, ImportanceEventType, ImportanceEvent, IngestInput, Storage, + ContentType, ImportanceContext, ImportanceEvent, ImportanceEventType, IngestInput, Storage, }; /// Input schema for smart_ingest tool @@ -136,7 +136,9 @@ pub async fn execute( } // Single mode: content is required - let content = args.content.ok_or("Missing 'content' field. Provide 'content' for single mode or 'items' for batch mode.")?; + let content = args.content.ok_or( + "Missing 'content' field. Provide 'content' for single mode or 'items' for batch mode.", + )?; // Validate content if content.trim().is_empty() { @@ -156,7 +158,9 @@ pub async fn execute( if let Ok(cog) = cognitive.try_lock() { // 4A. Full 4-channel importance scoring let context = ImportanceContext::current(); - let importance = cog.importance_signals.compute_importance(&content, &context); + let importance = cog + .importance_signals + .compute_importance(&content, &context); importance_composite = importance.composite; // 4B. Intent detection → auto-tag @@ -201,7 +205,13 @@ pub async fn execute( let has_embedding = node.has_embedding.unwrap_or(false); // Post-ingest cognitive side effects - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); return Ok(serde_json::json!({ "success": true, @@ -225,7 +235,13 @@ pub async fn execute( let has_embedding = result.node.has_embedding.unwrap_or(false); // Post-ingest cognitive side effects - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); Ok(serde_json::json!({ "success": true, @@ -258,7 +274,13 @@ pub async fn execute( let node_content = node.content.clone(); let node_type = node.node_type.clone(); - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); Ok(serde_json::json!({ "success": true, @@ -331,7 +353,9 @@ async fn execute_batch( if let Ok(cog) = cognitive.try_lock() { let context = ImportanceContext::current(); - let importance = cog.importance_signals.compute_importance(&item.content, &context); + let importance = cog + .importance_signals + .compute_importance(&item.content, &context); importance_composite = importance.composite; let intent_result = cog.intent_detector.detect_intent(); @@ -373,7 +397,13 @@ async fn execute_batch( let node_type = node.node_type.clone(); created += 1; - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); results.push(serde_json::json!({ "index": i, @@ -411,7 +441,13 @@ async fn execute_batch( } // Post-ingest cognitive side effects - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); results.push(serde_json::json!({ "index": i, @@ -443,7 +479,13 @@ async fn execute_batch( let node_type = node.node_type.clone(); created += 1; - run_post_ingest(cognitive, &node_id, &node_content, &node_type, importance_composite); + run_post_ingest( + cognitive, + &node_id, + &node_content, + &node_type, + importance_composite, + ); results.push(serde_json::json!({ "index": i, @@ -514,7 +556,8 @@ fn run_post_ingest( ); // 4G. Cross-project pattern recording - cog.cross_project.record_project_memory(node_id, "default", None); + cog.cross_project + .record_project_memory(node_id, "default", None); } } @@ -576,8 +619,13 @@ mod tests { let value = result.unwrap(); assert_eq!(value["success"], true); assert_eq!(value["decision"], "create"); - assert!(value["reason"].as_str().unwrap().contains("Forced") || - value["reason"].as_str().unwrap().contains("Embeddings not available")); + assert!( + value["reason"].as_str().unwrap().contains("Forced") + || value["reason"] + .as_str() + .unwrap() + .contains("Embeddings not available") + ); } #[test] @@ -729,7 +777,12 @@ mod tests { #[tokio::test] async fn test_batch_empty_items_fails() { let (storage, _dir) = test_storage().await; - let result = execute(&storage, &test_cognitive(), Some(serde_json::json!({ "items": [] }))).await; + let result = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ "items": [] })), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("empty")); } @@ -738,14 +791,16 @@ mod tests { async fn test_batch_ingest() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": "First batch item", "tags": ["test"] }, { "content": "Second batch item", "tags": ["test"] } ] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["mode"], "batch"); @@ -756,7 +811,8 @@ mod tests { async fn test_batch_skips_empty_content() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": "Valid item" }, @@ -764,7 +820,8 @@ mod tests { { "content": "Another valid item" } ] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["summary"]["skipped"], 1); @@ -784,7 +841,12 @@ mod tests { let items: Vec = (0..21) .map(|i| serde_json::json!({ "content": format!("Item {}", i) })) .collect(); - let result = execute(&storage, &test_cognitive(), Some(serde_json::json!({ "items": items }))).await; + let result = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ "items": items })), + ) + .await; assert!(result.is_err()); assert!(result.unwrap_err().contains("Maximum 20 items")); } @@ -795,7 +857,12 @@ mod tests { let items: Vec = (0..20) .map(|i| serde_json::json!({ "content": format!("Item {}", i) })) .collect(); - let result = execute(&storage, &test_cognitive(), Some(serde_json::json!({ "items": items }))).await; + let result = execute( + &storage, + &test_cognitive(), + Some(serde_json::json!({ "items": items })), + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["summary"]["total"], 20); @@ -805,14 +872,16 @@ mod tests { async fn test_batch_skips_whitespace_only_content() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": " \t\n " }, { "content": "Valid content" } ] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["summary"]["skipped"], 1); @@ -823,11 +892,13 @@ mod tests { async fn test_batch_single_item_succeeds() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [{ "content": "Single item" }] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["summary"]["total"], 1); @@ -838,7 +909,8 @@ mod tests { async fn test_batch_items_with_all_fields() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [{ "content": "Full fields item", @@ -847,7 +919,8 @@ mod tests { "source": "test-suite" }] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["summary"]["created"], 1); @@ -857,7 +930,8 @@ mod tests { async fn test_batch_results_array_matches_items() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": "First" }, @@ -865,7 +939,8 @@ mod tests { { "content": "Third" } ] })), - ).await; + ) + .await; let value = result.unwrap(); let results = value["results"].as_array().unwrap(); assert_eq!(results.len(), 3); @@ -879,14 +954,16 @@ mod tests { async fn test_batch_success_true_when_only_skipped() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": "" }, { "content": " " } ] })), - ).await; + ) + .await; let value = result.unwrap(); assert_eq!(value["success"], true); // skipped ≠ errors assert_eq!(value["summary"]["errors"], 0); @@ -897,11 +974,13 @@ mod tests { async fn test_batch_has_importance_scores() { let (storage, _dir) = test_storage().await; let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [{ "content": "Important batch memory content" }] })), - ).await; + ) + .await; let value = result.unwrap(); let results = value["results"].as_array().unwrap(); assert!(results[0]["importanceScore"].is_number()); @@ -912,7 +991,8 @@ mod tests { let (storage, _dir) = test_storage().await; // Three items with very similar content + global forceCreate let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "forceCreate": true, "items": [ @@ -921,7 +1001,8 @@ mod tests { { "content": "Physics question about quantum mechanics and wave behavior" } ] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); assert_eq!(value["mode"], "batch"); @@ -941,7 +1022,8 @@ mod tests { let (storage, _dir) = test_storage().await; // Mix of forced and non-forced items let result = execute( - &storage, &test_cognitive(), + &storage, + &test_cognitive(), Some(serde_json::json!({ "items": [ { "content": "Forced item one", "forceCreate": true }, @@ -949,7 +1031,8 @@ mod tests { { "content": "Forced item three", "forceCreate": true } ] })), - ).await; + ) + .await; assert!(result.is_ok()); let value = result.unwrap(); let results = value["results"].as_array().unwrap(); diff --git a/crates/vestige-mcp/src/tools/stats.rs b/crates/vestige-mcp/src/tools/stats.rs index aaf37fd..f9f31aa 100644 --- a/crates/vestige-mcp/src/tools/stats.rs +++ b/crates/vestige-mcp/src/tools/stats.rs @@ -57,15 +57,23 @@ pub async fn execute_health(storage: &Arc) -> Result { let mut warnings = Vec::new(); if stats.average_retention < 0.5 && stats.total_nodes > 0 { - warnings.push("Low average retention - consider running consolidation or reviewing memories".to_string()); + warnings.push( + "Low average retention - consider running consolidation or reviewing memories" + .to_string(), + ); } if stats.nodes_due_for_review > 10 { - warnings.push(format!("{} memories are due for review", stats.nodes_due_for_review)); + warnings.push(format!( + "{} memories are due for review", + stats.nodes_due_for_review + )); } if stats.total_nodes > 0 && stats.nodes_with_embeddings == 0 { - warnings.push("No embeddings generated - semantic search unavailable. Run consolidation.".to_string()); + warnings.push( + "No embeddings generated - semantic search unavailable. Run consolidation.".to_string(), + ); } let embedding_coverage = if stats.total_nodes > 0 { @@ -75,7 +83,10 @@ pub async fn execute_health(storage: &Arc) -> Result { }; if embedding_coverage < 50.0 && stats.total_nodes > 10 { - warnings.push(format!("Only {:.1}% of memories have embeddings", embedding_coverage)); + warnings.push(format!( + "Only {:.1}% of memories have embeddings", + embedding_coverage + )); } Ok(serde_json::json!({ @@ -90,10 +101,7 @@ pub async fn execute_health(storage: &Arc) -> Result { })) } -fn get_recommendations( - stats: &MemoryStats, - status: &str, -) -> Vec { +fn get_recommendations(stats: &MemoryStats, status: &str) -> Vec { let mut recommendations = Vec::new(); if status == "critical" { @@ -105,11 +113,15 @@ fn get_recommendations( } if stats.nodes_with_embeddings < stats.total_nodes { - recommendations.push("Run 'run_consolidation' to generate embeddings for better semantic search.".to_string()); + recommendations.push( + "Run 'run_consolidation' to generate embeddings for better semantic search." + .to_string(), + ); } if stats.total_nodes > 100 && stats.average_retention < 0.7 { - recommendations.push("Consider running periodic consolidation to maintain memory health.".to_string()); + recommendations + .push("Consider running periodic consolidation to maintain memory health.".to_string()); } if recommendations.is_empty() { diff --git a/crates/vestige-mcp/src/tools/suppress.rs b/crates/vestige-mcp/src/tools/suppress.rs new file mode 100644 index 0000000..f06debc --- /dev/null +++ b/crates/vestige-mcp/src/tools/suppress.rs @@ -0,0 +1,313 @@ +//! `suppress` MCP Tool (v2.0.5) — Top-Down Active Forgetting +//! +//! Actively suppress a memory via top-down inhibitory control. Distinct from +//! `memory.delete` (which removes the row) and `memory.demote` (which is a +//! one-shot thumb-down). Each call compounds: suppression_count increments, +//! FSRS state is dealt a strong blow, and a background Rac1 cascade worker +//! (in the existing consolidation loop) will fade co-activated neighbors. +//! +//! Reversible within a 24-hour labile window via `reverse: true`. +//! +//! References: +//! - Anderson et al. (2025). Brain mechanisms underlying the inhibitory +//! control of thought. Nat Rev Neurosci. DOI 10.1038/s41583-025-00929-y +//! - Cervantes-Sandoval & Davis (2020). Rac1 Impairs Forgetting-Induced +//! Cellular Plasticity. Front Cell Neurosci. PMC7477079 + +use serde::{Deserialize, Serialize}; +use serde_json::{Value, json}; +use std::sync::Arc; + +use vestige_core::Storage; +use vestige_core::neuroscience::active_forgetting::{ActiveForgettingSystem, DEFAULT_LABILE_HOURS}; + +/// Input schema for the `suppress` tool. +pub fn schema() -> Value { + json!({ + "type": "object", + "description": "Actively suppress a memory via top-down inhibitory control (Anderson 2025 SIF + Davis Rac1). Distinct from delete: the memory persists but is inhibited from retrieval and actively decays. Each call compounds suppression strength. A background Rac1 worker cascades accelerated decay to co-activated neighbors over the next 72 hours. Reversible within 24 hours via reverse=true.", + "properties": { + "id": { + "type": "string", + "description": "Memory UUID to suppress (or reverse-suppress)" + }, + "reason": { + "type": "string", + "description": "Optional free-form note explaining why this memory is being suppressed. Logged for audit." + }, + "reverse": { + "type": "boolean", + "default": false, + "description": "If true, reverse a previous suppression. Only works within the 24-hour labile window." + } + }, + "required": ["id"] + }) +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +struct SuppressArgs { + id: String, + #[serde(default)] + reason: Option, + #[serde(default)] + reverse: bool, +} + +pub async fn execute(storage: &Arc, args: Option) -> Result { + let args: SuppressArgs = match args { + Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, + None => return Err("Missing arguments".to_string()), + }; + + if args.id.trim().is_empty() { + return Err("'id' must not be empty".to_string()); + } + // Basic UUID sanity check — don't reject if missing, but warn + if uuid::Uuid::parse_str(&args.id).is_err() { + return Err(format!("Invalid memory ID format: {}", args.id)); + } + + let sys = ActiveForgettingSystem::new(); + + if args.reverse { + // Reverse path — only allowed within labile window. + match storage.reverse_suppression(&args.id, sys.labile_hours) { + Ok(node) => { + let still_suppressed = node.suppression_count > 0; + Ok(json!({ + "success": true, + "action": "reverse", + "id": args.id, + "suppressionCount": node.suppression_count, + "stillSuppressed": still_suppressed, + "retentionStrength": node.retention_strength, + "retrievalStrength": node.retrieval_strength, + "stability": node.stability, + "message": if still_suppressed { + format!( + "Reversal applied. {} suppression(s) remain on this memory.", + node.suppression_count + ) + } else { + "Suppression fully reversed. Memory is no longer inhibited.".to_string() + }, + })) + } + Err(e) => Err(format!("Reverse failed: {}", e)), + } + } else { + // Forward path — suppress + log reason + tell the user what will happen. + let before_count = storage + .get_node(&args.id) + .map_err(|e| format!("Failed to load memory: {}", e))? + .map(|n| n.suppression_count) + .unwrap_or(0); + + let node = storage + .suppress_memory(&args.id) + .map_err(|e| format!("Suppress failed: {}", e))?; + + // Count how many neighbors will be cascaded over the coming 72h. + // We don't run the cascade synchronously — it happens in the + // background consolidation loop via `run_rac1_cascade_sweep`. But we + // can give the user an estimate. + let edges = storage + .get_connections_for_memory(&args.id) + .unwrap_or_default(); + let estimated_cascade = edges.len().min(100); + + let reversible_until = node + .suppressed_at + .map(|t| sys.reversible_until(t)) + .unwrap_or_else(chrono::Utc::now); + let retrieval_penalty = sys.retrieval_penalty(node.suppression_count); + + tracing::info!( + id = %args.id, + count = node.suppression_count, + reason = args.reason.as_deref().unwrap_or(""), + "Memory suppressed" + ); + + Ok(json!({ + "success": true, + "action": "suppress", + "id": args.id, + "suppressionCount": node.suppression_count, + "priorCount": before_count, + "retrievalPenalty": retrieval_penalty, + "retentionStrength": node.retention_strength, + "retrievalStrength": node.retrieval_strength, + "stability": node.stability, + "estimatedCascadeNeighbors": estimated_cascade, + "reversibleUntil": reversible_until.to_rfc3339(), + "labileWindowHours": DEFAULT_LABILE_HOURS, + "reason": args.reason, + "message": format!( + "Actively forgetting. Suppression #{} applied. ~{} co-activated neighbors will fade over the next 72h via Rac1 cascade. Reversible for {}h.", + node.suppression_count, estimated_cascade, DEFAULT_LABILE_HOURS + ), + "citation": "Anderson et al. 2025, Nat Rev Neurosci, DOI: 10.1038/s41583-025-00929-y" + })) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + use vestige_core::IngestInput; + + fn test_storage() -> (Arc, TempDir) { + let dir = TempDir::new().unwrap(); + let storage = Storage::new(Some(dir.path().join("test.db"))).unwrap(); + (Arc::new(storage), dir) + } + + fn ingest(storage: &Storage, content: &str) -> String { + storage + .ingest(IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap() + .id + } + + #[test] + fn test_schema_is_valid() { + let s = schema(); + assert_eq!(s["type"], "object"); + assert!(s["properties"]["id"].is_object()); + assert!(s["properties"]["reverse"].is_object()); + assert_eq!(s["required"][0], "id"); + } + + #[tokio::test] + async fn test_suppress_missing_args() { + let (storage, _dir) = test_storage(); + let result = execute(&storage, None).await; + assert!(result.is_err()); + assert!(result.unwrap_err().contains("Missing arguments")); + } + + #[tokio::test] + async fn test_suppress_invalid_uuid() { + let (storage, _dir) = test_storage(); + let args = json!({"id": "not-a-uuid"}); + let result = execute(&storage, Some(args)).await; + assert!(result.is_err()); + assert!(result.unwrap_err().contains("Invalid memory ID")); + } + + #[tokio::test] + async fn test_suppress_increments_count() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Jake is my roommate"); + + // First call + let r1 = execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + assert_eq!(r1["suppressionCount"], 1); + assert_eq!(r1["priorCount"], 0); + + // Second call — compounds + let r2 = execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + assert_eq!(r2["suppressionCount"], 2); + assert_eq!(r2["priorCount"], 1); + } + + #[tokio::test] + async fn test_suppress_applies_fsrs_penalty() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Jake"); + + let before = storage.get_node(&id).unwrap().unwrap(); + let result = execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + + // Stability should be heavily reduced + let after_stability = result["stability"].as_f64().unwrap(); + assert!(after_stability < before.stability); + // Retention should be reduced + let after_retention = result["retentionStrength"].as_f64().unwrap(); + assert!(after_retention < before.retention_strength); + } + + #[tokio::test] + async fn test_suppress_is_not_delete() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Jake"); + + execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + + // Memory must still be retrievable via get_node + let node = storage.get_node(&id).unwrap(); + assert!(node.is_some(), "Suppressed memory must still exist"); + assert_eq!(node.unwrap().suppression_count, 1); + } + + #[tokio::test] + async fn test_reverse_within_window_decrements() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Jake"); + + execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + + // Now reverse — count should drop from 2 to 1 + let r = execute(&storage, Some(json!({"id": id.clone(), "reverse": true}))) + .await + .unwrap(); + assert_eq!(r["suppressionCount"], 1); + assert_eq!(r["stillSuppressed"], true); + + // Reverse again — should go to 0 + let r = execute(&storage, Some(json!({"id": id.clone(), "reverse": true}))) + .await + .unwrap(); + assert_eq!(r["suppressionCount"], 0); + assert_eq!(r["stillSuppressed"], false); + } + + #[tokio::test] + async fn test_reverse_without_prior_suppression_fails() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Fresh memory"); + + let result = execute(&storage, Some(json!({"id": id.clone(), "reverse": true}))).await; + assert!(result.is_err()); + assert!(result.unwrap_err().contains("no active suppression")); + } + + #[tokio::test] + async fn test_suppress_records_timestamp() { + let (storage, _dir) = test_storage(); + let id = ingest(&storage, "Jake"); + + execute(&storage, Some(json!({"id": id.clone()}))) + .await + .unwrap(); + + let node = storage.get_node(&id).unwrap().unwrap(); + assert!(node.suppressed_at.is_some(), "suppressed_at must be set"); + } +} diff --git a/crates/vestige-mcp/src/tools/tagging.rs b/crates/vestige-mcp/src/tools/tagging.rs index e69c020..fd38888 100644 --- a/crates/vestige-mcp/src/tools/tagging.rs +++ b/crates/vestige-mcp/src/tools/tagging.rs @@ -7,8 +7,8 @@ use serde_json::Value; use std::sync::Arc; use vestige_core::{ - CaptureWindow, ImportanceEvent, ImportanceEventType, - SynapticTaggingConfig, SynapticTaggingSystem, Storage, + CaptureWindow, ImportanceEvent, ImportanceEventType, Storage, SynapticTaggingConfig, + SynapticTaggingSystem, }; /// Input schema for trigger_importance tool @@ -69,27 +69,22 @@ pub fn stats_schema() -> Value { } /// Trigger an importance event to retroactively strengthen recent memories -pub async fn execute_trigger( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_trigger(storage: &Arc, args: Option) -> Result { let args = args.ok_or("Missing arguments")?; let event_type_str = args["event_type"] .as_str() .ok_or("event_type is required")?; - let memory_id = args["memory_id"] - .as_str() - .ok_or("memory_id is required")?; + let memory_id = args["memory_id"].as_str().ok_or("memory_id is required")?; let description = args["description"].as_str(); let hours_back = args["hours_back"].as_f64().unwrap_or(9.0); let hours_forward = args["hours_forward"].as_f64().unwrap_or(2.0); - // Verify the trigger memory exists - let trigger_memory = storage.get_node(memory_id) + let trigger_memory = storage + .get_node(memory_id) .map_err(|e| format!("Error: {}", e))? .ok_or("Memory not found")?; @@ -121,8 +116,7 @@ pub async fn execute_trigger( let mut stc = SynapticTaggingSystem::with_config(config); // Get recent memories to tag - let recent = storage.get_all_nodes(100, 0) - .map_err(|e| e.to_string())?; + let recent = storage.get_all_nodes(100, 0).map_err(|e| e.to_string())?; // Tag all recent memories for mem in &recent { @@ -155,32 +149,30 @@ pub async fn execute_trigger( } /// Find memories with active synaptic tags -pub async fn execute_find( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute_find(storage: &Arc, args: Option) -> Result { let args = args.unwrap_or(serde_json::json!({})); let min_strength = args["min_strength"].as_f64().unwrap_or(0.3); let limit = args["limit"].as_i64().unwrap_or(20) as usize; - // Get memories with high retention (proxy for "tagged") - let memories = storage.get_all_nodes(200, 0) - .map_err(|e| e.to_string())?; + let memories = storage.get_all_nodes(200, 0).map_err(|e| e.to_string())?; // Filter by retention strength (tagged memories have higher retention) - let tagged: Vec = memories.into_iter() + let tagged: Vec = memories + .into_iter() .filter(|m| m.retention_strength >= min_strength) .take(limit) - .map(|m| serde_json::json!({ - "id": m.id, - "content": m.content, - "retentionStrength": m.retention_strength, - "storageStrength": m.storage_strength, - "lastAccessed": m.last_accessed.to_rfc3339(), - "tags": m.tags - })) + .map(|m| { + serde_json::json!({ + "id": m.id, + "content": m.content, + "retentionStrength": m.retention_strength, + "storageStrength": m.storage_strength, + "lastAccessed": m.last_accessed.to_rfc3339(), + "tags": m.tags + }) + }) .collect(); Ok(serde_json::json!({ @@ -192,17 +184,22 @@ pub async fn execute_find( } /// Get synaptic tagging statistics -pub async fn execute_stats( - storage: &Arc, -) -> Result { - - let memories = storage.get_all_nodes(500, 0) - .map_err(|e| e.to_string())?; +pub async fn execute_stats(storage: &Arc) -> Result { + let memories = storage.get_all_nodes(500, 0).map_err(|e| e.to_string())?; let total = memories.len(); - let high_retention = memories.iter().filter(|m| m.retention_strength >= 0.7).count(); - let medium_retention = memories.iter().filter(|m| m.retention_strength >= 0.4 && m.retention_strength < 0.7).count(); - let low_retention = memories.iter().filter(|m| m.retention_strength < 0.4).count(); + let high_retention = memories + .iter() + .filter(|m| m.retention_strength >= 0.7) + .count(); + let medium_retention = memories + .iter() + .filter(|m| m.retention_strength >= 0.4 && m.retention_strength < 0.7) + .count(); + let low_retention = memories + .iter() + .filter(|m| m.retention_strength < 0.4) + .count(); let avg_retention = if total > 0 { memories.iter().map(|m| m.retention_strength).sum::() / total as f64 diff --git a/crates/vestige-mcp/src/tools/timeline.rs b/crates/vestige-mcp/src/tools/timeline.rs index c049b91..d52588d 100644 --- a/crates/vestige-mcp/src/tools/timeline.rs +++ b/crates/vestige-mcp/src/tools/timeline.rs @@ -9,7 +9,6 @@ use serde_json::Value; use std::collections::BTreeMap; use std::sync::Arc; - use vestige_core::Storage; use super::search_unified::format_node; @@ -88,10 +87,7 @@ fn parse_datetime(s: &str) -> Result, String> { } /// Execute memory_timeline tool -pub async fn execute( - storage: &Arc, - args: Option, -) -> Result { +pub async fn execute(storage: &Arc, args: Option) -> Result { let args: TimelineArgs = match args { Some(v) => serde_json::from_value(v).map_err(|e| format!("Invalid arguments: {}", e))?, None => TimelineArgs { @@ -130,7 +126,6 @@ pub async fn execute( let limit = args.limit.unwrap_or(50).clamp(1, 200); - // Query memories in time range let mut results = storage .query_time_range(start, end, limit) @@ -195,17 +190,18 @@ mod tests { } async fn ingest_test_memory(storage: &Arc, content: &str) { - storage.ingest(vestige_core::IngestInput { - content: content.to_string(), - node_type: "fact".to_string(), - source: None, - sentiment_score: 0.0, - sentiment_magnitude: 0.0, - tags: vec!["timeline-test".to_string()], - valid_from: None, - valid_until: None, - }) - .unwrap(); + storage + .ingest(vestige_core::IngestInput { + content: content.to_string(), + node_type: "fact".to_string(), + source: None, + sentiment_score: 0.0, + sentiment_magnitude: 0.0, + tags: vec!["timeline-test".to_string()], + valid_from: None, + valid_until: None, + }) + .unwrap(); } #[test] diff --git a/packages/vestige-init/package.json b/packages/vestige-init/package.json index a7a8cee..27e3147 100644 --- a/packages/vestige-init/package.json +++ b/packages/vestige-init/package.json @@ -1,6 +1,6 @@ { "name": "@vestige/init", - "version": "2.0.1", + "version": "2.0.5", "description": "Give your AI a brain in 10 seconds — zero-config Vestige v2.0 installer with 3D dashboard", "bin": { "vestige-init": "bin/init.js" diff --git a/packages/vestige-mcp-npm/.gitignore b/packages/vestige-mcp-npm/.gitignore index 7c5d56c..d5d2535 100644 --- a/packages/vestige-mcp-npm/.gitignore +++ b/packages/vestige-mcp-npm/.gitignore @@ -3,5 +3,7 @@ bin/vestige bin/vestige.exe bin/vestige-mcp bin/vestige-mcp.exe +bin/vestige-restore +bin/vestige-restore.exe bin/*.tar.gz bin/*.zip diff --git a/packages/vestige-mcp-npm/package.json b/packages/vestige-mcp-npm/package.json index e50754d..1ee2332 100644 --- a/packages/vestige-mcp-npm/package.json +++ b/packages/vestige-mcp-npm/package.json @@ -1,6 +1,6 @@ { "name": "vestige-mcp-server", - "version": "2.0.1", + "version": "2.0.5", "description": "Vestige MCP Server — Cognitive memory for AI with FSRS-6, 3D dashboard, and 29 brain modules", "bin": { "vestige-mcp": "bin/vestige-mcp.js", diff --git a/tests/e2e/src/assertions/mod.rs b/tests/e2e/src/assertions/mod.rs index cf8d1ae..0de53e4 100644 --- a/tests/e2e/src/assertions/mod.rs +++ b/tests/e2e/src/assertions/mod.rs @@ -271,16 +271,11 @@ macro_rules! assert_search_count { #[macro_export] macro_rules! assert_search_order { ($results:expr, $expected_first:expr) => { - assert!( - !$results.is_empty(), - "Expected non-empty search results" - ); + assert!(!$results.is_empty(), "Expected non-empty search results"); assert_eq!( - $results[0].id, - $expected_first, + $results[0].id, $expected_first, "Expected first result to be {}, got {}", - $expected_first, - $results[0].id + $expected_first, $results[0].id ); }; } diff --git a/tests/e2e/src/harness/db_manager.rs b/tests/e2e/src/harness/db_manager.rs index f5ce71c..345a94c 100644 --- a/tests/e2e/src/harness/db_manager.rs +++ b/tests/e2e/src/harness/db_manager.rs @@ -6,9 +6,9 @@ //! - Database snapshots and restoration //! - Concurrent test isolation -use vestige_core::{KnowledgeNode, Rating, Storage}; use std::path::PathBuf; use tempfile::TempDir; +use vestige_core::{KnowledgeNode, Rating, Storage}; /// Helper to create IngestInput (works around non_exhaustive) #[allow(clippy::too_many_arguments)] @@ -107,10 +107,7 @@ impl TestDatabaseManager { /// Get the number of nodes in the database pub fn node_count(&self) -> i64 { - self.storage - .get_stats() - .map(|s| s.total_nodes) - .unwrap_or(0) + self.storage.get_stats().map(|s| s.total_nodes).unwrap_or(0) } // ======================================================================== @@ -257,10 +254,7 @@ impl TestDatabaseManager { /// Take a snapshot of current database state pub fn take_snapshot(&mut self) { - let nodes = self - .storage - .get_all_nodes(10000, 0) - .unwrap_or_default(); + let nodes = self.storage.get_all_nodes(10000, 0).unwrap_or_default(); self.snapshot = Some(nodes); } @@ -322,8 +316,8 @@ impl TestDatabaseManager { let _ = std::fs::remove_file(&self.db_path); // Recreate storage - self.storage = Storage::new(Some(self.db_path.clone())) - .expect("Failed to recreate storage"); + self.storage = + Storage::new(Some(self.db_path.clone())).expect("Failed to recreate storage"); } } diff --git a/tests/e2e/src/mocks/fixtures.rs b/tests/e2e/src/mocks/fixtures.rs index 05d2a22..6929e56 100644 --- a/tests/e2e/src/mocks/fixtures.rs +++ b/tests/e2e/src/mocks/fixtures.rs @@ -183,7 +183,13 @@ impl TestDataFactory { /// Create a batch of memories pub fn create_batch(storage: &mut Storage, count: usize) -> Vec { - Self::create_batch_with_config(storage, BatchConfig { count, ..Default::default() }) + Self::create_batch_with_config( + storage, + BatchConfig { + count, + ..Default::default() + }, + ) } /// Create a batch with custom configuration @@ -212,9 +218,15 @@ impl TestDataFactory { let (valid_from, valid_until) = if config.with_temporal { let now = Utc::now(); if i % 3 == 0 { - (Some(now - Duration::days(30)), Some(now + Duration::days(30))) + ( + Some(now - Duration::days(30)), + Some(now + Duration::days(30)), + ) } else if i % 3 == 1 { - (Some(now - Duration::days(60)), Some(now - Duration::days(30))) + ( + Some(now - Duration::days(60)), + Some(now - Duration::days(30)), + ) } else { (None, None) } @@ -273,12 +285,7 @@ impl TestDataFactory { } // Emotional memory (decay should be affected by sentiment) - let emotional = Self::create_emotional_memory( - storage, - "Important life event", - 0.9, - 0.95, - ); + let emotional = Self::create_emotional_memory(storage, "Important life event", 0.9, 0.95); if let Some(node) = emotional { metadata.insert("emotional".to_string(), node.id.clone()); ids.push(node.id); @@ -445,12 +452,8 @@ impl TestDataFactory { } // No bounds (always valid) - if let Some(node) = Self::create_temporal_memory( - storage, - "Always valid memory", - None, - None, - ) { + if let Some(node) = Self::create_temporal_memory(storage, "Always valid memory", None, None) + { metadata.insert("always_valid".to_string(), node.id.clone()); ids.push(node.id); } @@ -469,8 +472,15 @@ impl TestDataFactory { /// Get a random node type pub fn random_node_type(seed: usize) -> &'static str { const TYPES: [&str; 9] = [ - "fact", "concept", "procedure", "event", "relationship", - "quote", "code", "question", "insight", + "fact", + "concept", + "procedure", + "event", + "relationship", + "quote", + "code", + "question", + "insight", ]; TYPES[seed % TYPES.len()] } @@ -478,10 +488,26 @@ impl TestDataFactory { /// Generate lorem ipsum-like content pub fn lorem_content(words: usize, seed: usize) -> String { const WORDS: [&str; 20] = [ - "the", "memory", "learning", "knowledge", "algorithm", - "data", "system", "process", "function", "method", - "class", "object", "variable", "constant", "type", - "structure", "pattern", "design", "architecture", "code", + "the", + "memory", + "learning", + "knowledge", + "algorithm", + "data", + "system", + "process", + "function", + "method", + "class", + "object", + "variable", + "constant", + "type", + "structure", + "pattern", + "design", + "architecture", + "code", ]; (0..words) @@ -493,8 +519,16 @@ impl TestDataFactory { /// Generate tags pub fn generate_tags(count: usize, seed: usize) -> Vec { const TAGS: [&str; 10] = [ - "important", "review", "todo", "concept", "fact", - "code", "note", "idea", "question", "reference", + "important", + "review", + "todo", + "concept", + "fact", + "code", + "note", + "idea", + "question", + "reference", ]; (0..count) diff --git a/tests/e2e/src/mocks/mock_embedding.rs b/tests/e2e/src/mocks/mock_embedding.rs index 93f0363..02957f5 100644 --- a/tests/e2e/src/mocks/mock_embedding.rs +++ b/tests/e2e/src/mocks/mock_embedding.rs @@ -145,7 +145,11 @@ impl MockEmbeddingService { // Map word to a sparse set of dimensions for i in 0..16 { let dim = ((word_hash >> (i * 4)) as usize) % MOCK_EMBEDDING_DIM; - let sign = if (word_hash >> (i + 48)) & 1 == 0 { 1.0 } else { -1.0 }; + let sign = if (word_hash >> (i + 48)) & 1 == 0 { + 1.0 + } else { + -1.0 + }; let magnitude = ((word_hash >> (i * 2)) as f32 % 100.0) / 100.0 + 0.5; embedding[dim] += sign * magnitude; } @@ -342,9 +346,15 @@ mod tests { let query = service.embed("programming code"); let candidates = vec![ - ("doc1".to_string(), service.embed("python programming language")), + ( + "doc1".to_string(), + service.embed("python programming language"), + ), ("doc2".to_string(), service.embed("cooking recipes")), - ("doc3".to_string(), service.embed("software development code")), + ( + "doc3".to_string(), + service.embed("software development code"), + ), ]; let result = service.find_most_similar(&query, &candidates); diff --git a/tests/e2e/tests/cognitive/comparative_benchmarks.rs b/tests/e2e/tests/cognitive/comparative_benchmarks.rs index 957feb1..bac2582 100644 --- a/tests/e2e/tests/cognitive/comparative_benchmarks.rs +++ b/tests/e2e/tests/cognitive/comparative_benchmarks.rs @@ -17,12 +17,12 @@ use chrono::{DateTime, Duration, Utc}; use std::collections::{HashMap, HashSet}; -use vestige_core::neuroscience::spreading_activation::{ - ActivatedMemory, ActivationConfig, ActivationNetwork, LinkType, -}; use vestige_core::neuroscience::hippocampal_index::{ BarcodeGenerator, ContentPointer, ContentType, HippocampalIndex, HippocampalIndexConfig, - IndexQuery, MemoryBarcode, MemoryIndex, INDEX_EMBEDDING_DIM, + INDEX_EMBEDDING_DIM, IndexQuery, MemoryBarcode, MemoryIndex, +}; +use vestige_core::neuroscience::spreading_activation::{ + ActivatedMemory, ActivationConfig, ActivationNetwork, LinkType, }; use vestige_core::neuroscience::synaptic_tagging::{ CaptureWindow, DecayFunction, ImportanceEvent, ImportanceEventType, SynapticTaggingConfig, @@ -36,9 +36,9 @@ use vestige_core::neuroscience::synaptic_tagging::{ /// SM-2 state for a card #[derive(Debug, Clone)] struct SM2State { - easiness_factor: f64, // EF, starts at 2.5 - interval: i32, // Days until next review - repetitions: i32, // Number of successful reviews + easiness_factor: f64, // EF, starts at 2.5 + interval: i32, // Days until next review + repetitions: i32, // Number of successful reviews } impl Default for SM2State { @@ -73,8 +73,9 @@ fn sm2_review(state: &SM2State, grade: SM2Grade) -> SM2State { let q = grade.as_i32(); // Update easiness factor - let mut new_ef = state.easiness_factor + (0.1 - (5 - q) as f64 * (0.08 + (5 - q) as f64 * 0.02)); - new_ef = new_ef.max(1.3); // EF never goes below 1.3 + let mut new_ef = + state.easiness_factor + (0.1 - (5 - q) as f64 * (0.08 + (5 - q) as f64 * 0.02)); + new_ef = new_ef.max(1.3); // EF never goes below 1.3 if q < 3 { // Failed - restart learning @@ -117,9 +118,8 @@ fn sm2_retention(interval: i32, elapsed_days: i32) -> f64 { /// FSRS-6 default weights const FSRS6_WEIGHTS: [f64; 21] = [ - 0.212, 1.2931, 2.3065, 8.2956, 6.4133, 0.8334, 3.0194, 0.001, - 1.8722, 0.1666, 0.796, 1.4835, 0.0614, 0.2629, 1.6483, 0.6014, - 1.8729, 0.5425, 0.0912, 0.0658, 0.1542, + 0.212, 1.2931, 2.3065, 8.2956, 6.4133, 0.8334, 3.0194, 0.001, 1.8722, 0.1666, 0.796, 1.4835, + 0.0614, 0.2629, 1.6483, 0.6014, 1.8729, 0.5425, 0.0912, 0.0658, 0.1542, ]; /// FSRS-6 state @@ -160,7 +160,9 @@ fn fsrs6_retrievability(stability: f64, elapsed_days: f64, w20: f64) -> f64 { return 1.0; } let factor = fsrs6_factor(w20); - (1.0 + factor * elapsed_days / stability).powf(-w20).clamp(0.0, 1.0) + (1.0 + factor * elapsed_days / stability) + .powf(-w20) + .clamp(0.0, 1.0) } /// FSRS-6 interval calculation @@ -183,24 +185,32 @@ fn fsrs6_review(state: &FSRS6State, grade: FSRS6Grade, elapsed_days: f64) -> FSR let new_stability = match grade { FSRS6Grade::Again => { // Lapse formula - w[11] * state.difficulty.powf(-w[12]) + w[11] + * state.difficulty.powf(-w[12]) * ((state.stability + 1.0).powf(w[13]) - 1.0) * (w[14] * (1.0 - r)).exp() } _ => { // Recall formula - let hard_penalty = if matches!(grade, FSRS6Grade::Hard) { w[15] } else { 1.0 }; - let easy_bonus = if matches!(grade, FSRS6Grade::Easy) { w[16] } else { 1.0 }; + let hard_penalty = if matches!(grade, FSRS6Grade::Hard) { + w[15] + } else { + 1.0 + }; + let easy_bonus = if matches!(grade, FSRS6Grade::Easy) { + w[16] + } else { + 1.0 + }; - state.stability * ( - w[8].exp() - * (11.0 - state.difficulty) - * state.stability.powf(-w[9]) - * ((w[10] * (1.0 - r)).exp() - 1.0) - * hard_penalty - * easy_bonus - + 1.0 - ) + state.stability + * (w[8].exp() + * (11.0 - state.difficulty) + * state.stability.powf(-w[9]) + * ((w[10] * (1.0 - r)).exp() - 1.0) + * hard_penalty + * easy_bonus + + 1.0) } }; @@ -209,8 +219,8 @@ fn fsrs6_review(state: &FSRS6State, grade: FSRS6Grade, elapsed_days: f64) -> FSR let delta = -w[6] * (g - 3.0); let mean_reversion = (10.0 - state.difficulty) / 9.0; let d0 = w[4] - (w[5] * 2.0).exp() + 1.0; - let new_difficulty = (w[7] * d0 + (1.0 - w[7]) * (state.difficulty + delta * mean_reversion)) - .clamp(1.0, 10.0); + let new_difficulty = + (w[7] * d0 + (1.0 - w[7]) * (state.difficulty + delta * mean_reversion)).clamp(1.0, 10.0); FSRS6State { difficulty: new_difficulty, @@ -226,7 +236,7 @@ fn fsrs6_review(state: &FSRS6State, grade: FSRS6Grade, elapsed_days: f64) -> FSR /// Leitner box state #[derive(Debug, Clone)] struct LeitnerState { - box_number: i32, // 1-5 + box_number: i32, // 1-5 } impl Default for LeitnerState { @@ -288,7 +298,9 @@ impl SimilaritySearch { } fn search(&self, query_embedding: &[f32], top_k: usize) -> Vec<(String, f64)> { - let mut results: Vec<(String, f64)> = self.embeddings.iter() + let mut results: Vec<(String, f64)> = self + .embeddings + .iter() .map(|(id, emb)| { let sim = cosine_similarity(query_embedding, emb); (id.clone(), sim) @@ -331,9 +343,8 @@ fn test_fsrs6_vs_sm2_efficiency() { // Simulate SM-2 let mut sm2_reviews = 0; - let mut sm2_states: Vec<(SM2State, i32)> = (0..NUM_CARDS) - .map(|_| (SM2State::default(), 0)) - .collect(); + let mut sm2_states: Vec<(SM2State, i32)> = + (0..NUM_CARDS).map(|_| (SM2State::default(), 0)).collect(); for day in 1..=DAYS { for (state, next_review) in sm2_states.iter_mut() { @@ -349,9 +360,8 @@ fn test_fsrs6_vs_sm2_efficiency() { // Simulate FSRS-6 let mut fsrs_reviews = 0; - let mut fsrs_states: Vec<(FSRS6State, i32)> = (0..NUM_CARDS) - .map(|_| (FSRS6State::default(), 0)) - .collect(); + let mut fsrs_states: Vec<(FSRS6State, i32)> = + (0..NUM_CARDS).map(|_| (FSRS6State::default(), 0)).collect(); for day in 1..=DAYS { for (state, next_review) in fsrs_states.iter_mut() { @@ -432,7 +442,7 @@ fn test_fsrs6_vs_sm2_reviews_same_retention() { // SM-2: Interval growth is linear with EF // After n successful reviews: interval ≈ previous * 2.5 - let sm2_intervals = vec![1, 6, 15, 38, 95]; // Approximate SM-2 progression + let sm2_intervals = vec![1, 6, 15, 38, 95]; // Approximate SM-2 progression // FSRS-6: Stability grows based on forgetting curve parameters // This allows for more nuanced interval optimization @@ -469,13 +479,13 @@ fn test_fsrs6_vs_sm2_reviews_same_retention() { // Test the core FSRS-6 innovation: difficulty modulation // Create a "hard" card and compare stability growth let mut hard_state = FSRS6State { - difficulty: 8.0, // Hard card + difficulty: 8.0, // Hard card stability: FSRS6State::default().stability, reps: 0, }; let mut easy_state = FSRS6State { - difficulty: 2.0, // Easy card + difficulty: 2.0, // Easy card stability: FSRS6State::default().stability, reps: 0, }; @@ -593,7 +603,7 @@ fn test_fsrs6_vs_leitner() { /// get shorter intervals, and users with flatter curves (lower w20) get longer. #[test] fn test_fsrs6_personalization_improvement() { - let default_w20 = FSRS6_WEIGHTS[20]; // 0.1542 + let default_w20 = FSRS6_WEIGHTS[20]; // 0.1542 // User with faster forgetting (higher w20 = steeper curve) let fast_forgetter_w20 = 0.35; @@ -629,7 +639,7 @@ fn test_fsrs6_personalization_improvement() { // The key insight: w20 affects optimal interval calculation // For same desired_retention (0.9), different w20 gives different intervals - let desired_retention = 0.85; // Target 85% to see interval differences + let desired_retention = 0.85; // Target 85% to see interval differences let default_interval = fsrs6_interval(stability, desired_retention, default_w20); let fast_interval = fsrs6_interval(stability, desired_retention, fast_forgetter_w20); let slow_interval = fsrs6_interval(stability, desired_retention, slow_forgetter_w20); @@ -638,7 +648,9 @@ fn test_fsrs6_personalization_improvement() { assert!( default_interval > 0 && fast_interval > 0 && slow_interval > 0, "All intervals should be positive: default={}, fast={}, slow={}", - default_interval, fast_interval, slow_interval + default_interval, + fast_interval, + slow_interval ); // The total range of intervals demonstrates personalization value @@ -747,34 +759,55 @@ fn test_fsrs6_hard_penalty_effectiveness() { fn test_spreading_vs_similarity_1_hop() { // Setup spreading activation network let mut network = ActivationNetwork::new(); - network.add_edge("rust".to_string(), "cargo".to_string(), LinkType::Semantic, 0.9); - network.add_edge("rust".to_string(), "ownership".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "rust".to_string(), + "cargo".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "rust".to_string(), + "ownership".to_string(), + LinkType::Semantic, + 0.85, + ); // Setup similarity search with similar embeddings let mut sim_search = SimilaritySearch::new(); sim_search.add("rust", vec![1.0, 0.0, 0.0]); - sim_search.add("cargo", vec![0.9, 0.1, 0.0]); // Similar to rust - sim_search.add("ownership", vec![0.85, 0.15, 0.0]); // Similar to rust - sim_search.add("python", vec![0.0, 1.0, 0.0]); // Unrelated + sim_search.add("cargo", vec![0.9, 0.1, 0.0]); // Similar to rust + sim_search.add("ownership", vec![0.85, 0.15, 0.0]); // Similar to rust + sim_search.add("python", vec![0.0, 1.0, 0.0]); // Unrelated // Spreading activation let spreading_results = network.activate("rust", 1.0); - let spreading_found: HashSet<_> = spreading_results.iter() + let spreading_found: HashSet<_> = spreading_results + .iter() .map(|r| r.memory_id.as_str()) .collect(); // Similarity search let sim_results = sim_search.search(&[1.0, 0.0, 0.0], 3); - let sim_found: HashSet<_> = sim_results.iter() + let sim_found: HashSet<_> = sim_results + .iter() .filter(|(_, score)| *score > 0.8) .map(|(id, _)| id.as_str()) .collect(); // At 1-hop, both should find the direct connections - assert!(spreading_found.contains("cargo"), "Spreading should find cargo"); - assert!(spreading_found.contains("ownership"), "Spreading should find ownership"); + assert!( + spreading_found.contains("cargo"), + "Spreading should find cargo" + ); + assert!( + spreading_found.contains("ownership"), + "Spreading should find ownership" + ); assert!(sim_found.contains("cargo"), "Similarity should find cargo"); - assert!(sim_found.contains("ownership"), "Similarity should find ownership"); + assert!( + sim_found.contains("ownership"), + "Similarity should find ownership" + ); } /// Test 2-hop: Spreading activation finds indirect connections. @@ -790,23 +823,35 @@ fn test_spreading_vs_similarity_2_hop() { // Create a chain: rust -> tokio -> async_runtime // rust and async_runtime have NO direct similarity - network.add_edge("rust".to_string(), "tokio".to_string(), LinkType::Semantic, 0.9); - network.add_edge("tokio".to_string(), "async_runtime".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "rust".to_string(), + "tokio".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "tokio".to_string(), + "async_runtime".to_string(), + LinkType::Semantic, + 0.85, + ); // Similarity search - embeddings show NO similarity between rust and async_runtime let mut sim_search = SimilaritySearch::new(); sim_search.add("rust", vec![1.0, 0.0, 0.0, 0.0]); - sim_search.add("tokio", vec![0.7, 0.7, 0.0, 0.0]); // Bridge - sim_search.add("async_runtime", vec![0.0, 1.0, 0.0, 0.0]); // No similarity to rust + sim_search.add("tokio", vec![0.7, 0.7, 0.0, 0.0]); // Bridge + sim_search.add("async_runtime", vec![0.0, 1.0, 0.0, 0.0]); // No similarity to rust // Spreading finds async_runtime through the chain let spreading_results = network.activate("rust", 1.0); - let spreading_found_async = spreading_results.iter() + let spreading_found_async = spreading_results + .iter() .any(|r| r.memory_id == "async_runtime"); // Similarity from "rust" does NOT find async_runtime let sim_results = sim_search.search(&[1.0, 0.0, 0.0, 0.0], 5); - let sim_found_async = sim_results.iter() + let sim_found_async = sim_results + .iter() .any(|(id, score)| id == "async_runtime" && *score > 0.5); assert!( @@ -832,27 +877,52 @@ fn test_spreading_vs_similarity_3_hop() { // Create 3-hop chain: A -> B -> C -> D // Each step has semantic connection, but A and D have ZERO direct similarity - network.add_edge("concept_a".to_string(), "concept_b".to_string(), LinkType::Semantic, 0.9); - network.add_edge("concept_b".to_string(), "concept_c".to_string(), LinkType::Semantic, 0.9); - network.add_edge("concept_c".to_string(), "concept_d".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "concept_a".to_string(), + "concept_b".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "concept_b".to_string(), + "concept_c".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "concept_c".to_string(), + "concept_d".to_string(), + LinkType::Semantic, + 0.9, + ); // Embeddings: A and D are orthogonal (zero similarity) let mut sim_search = SimilaritySearch::new(); sim_search.add("concept_a", vec![1.0, 0.0, 0.0, 0.0]); sim_search.add("concept_b", vec![0.7, 0.7, 0.0, 0.0]); sim_search.add("concept_c", vec![0.0, 0.7, 0.7, 0.0]); - sim_search.add("concept_d", vec![0.0, 0.0, 0.0, 1.0]); // Orthogonal to A + sim_search.add("concept_d", vec![0.0, 0.0, 0.0, 1.0]); // Orthogonal to A // Spreading finds D let spreading_results = network.activate("concept_a", 1.0); - let d_result = spreading_results.iter().find(|r| r.memory_id == "concept_d"); + let d_result = spreading_results + .iter() + .find(|r| r.memory_id == "concept_d"); - assert!(d_result.is_some(), "Spreading MUST find concept_d at 3 hops"); - assert_eq!(d_result.unwrap().distance, 3, "Should be exactly 3 hops away"); + assert!( + d_result.is_some(), + "Spreading MUST find concept_d at 3 hops" + ); + assert_eq!( + d_result.unwrap().distance, + 3, + "Should be exactly 3 hops away" + ); // Similarity CANNOT find D from A let sim_results = sim_search.search(&[1.0, 0.0, 0.0, 0.0], 10); - let sim_d_score = sim_results.iter() + let sim_d_score = sim_results + .iter() .find(|(id, _)| id == "concept_d") .map(|(_, score)| *score) .unwrap_or(0.0); @@ -873,9 +943,24 @@ fn test_spreading_finds_chains_similarity_misses() { // Chain: "memory_leak" -> "reference_counting" -> "Arc_Weak" -> "cyclic_references" // The solution (cyclic_references) is NOT semantically similar to "memory_leak" - network.add_edge("memory_leak".to_string(), "reference_counting".to_string(), LinkType::Causal, 0.9); - network.add_edge("reference_counting".to_string(), "arc_weak".to_string(), LinkType::Semantic, 0.85); - network.add_edge("arc_weak".to_string(), "cyclic_references".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "memory_leak".to_string(), + "reference_counting".to_string(), + LinkType::Causal, + 0.9, + ); + network.add_edge( + "reference_counting".to_string(), + "arc_weak".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "arc_weak".to_string(), + "cyclic_references".to_string(), + LinkType::Semantic, + 0.9, + ); // The problem: "cyclic_references" has zero direct similarity to "memory_leak" // (they use completely different vocabulary) @@ -883,16 +968,18 @@ fn test_spreading_finds_chains_similarity_misses() { sim_search.add("memory_leak", vec![1.0, 0.0, 0.0, 0.0]); sim_search.add("reference_counting", vec![0.5, 0.5, 0.0, 0.0]); sim_search.add("arc_weak", vec![0.0, 0.7, 0.3, 0.0]); - sim_search.add("cyclic_references", vec![0.0, 0.0, 0.0, 1.0]); // Totally different! + sim_search.add("cyclic_references", vec![0.0, 0.0, 0.0, 1.0]); // Totally different! // Spreading activation finds the solution let spreading_results = network.activate("memory_leak", 1.0); - let found_solution = spreading_results.iter() + let found_solution = spreading_results + .iter() .any(|r| r.memory_id == "cyclic_references"); // Similarity search cannot find it let sim_results = sim_search.search(&[1.0, 0.0, 0.0, 0.0], 10); - let sim_found = sim_results.iter() + let sim_found = sim_results + .iter() .any(|(id, score)| id == "cyclic_references" && *score > 0.3); assert!( @@ -911,26 +998,47 @@ fn test_spreading_path_quality() { let mut network = ActivationNetwork::new(); // Create a knowledge graph about Rust error handling - network.add_edge("error_handling".to_string(), "result_type".to_string(), LinkType::Semantic, 0.9); - network.add_edge("result_type".to_string(), "question_mark_operator".to_string(), LinkType::Semantic, 0.85); - network.add_edge("question_mark_operator".to_string(), "early_return".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "error_handling".to_string(), + "result_type".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "result_type".to_string(), + "question_mark_operator".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "question_mark_operator".to_string(), + "early_return".to_string(), + LinkType::Semantic, + 0.8, + ); let results = network.activate("error_handling", 1.0); // Find the path to early_return - let early_return_result = results.iter() + let early_return_result = results + .iter() .find(|r| r.memory_id == "early_return") .expect("Should find early_return"); // Verify the path makes sense - assert_eq!(early_return_result.path.len(), 4, "Path should have 4 nodes"); + assert_eq!( + early_return_result.path.len(), + 4, + "Path should have 4 nodes" + ); assert_eq!(early_return_result.path[0], "error_handling"); assert_eq!(early_return_result.path[1], "result_type"); assert_eq!(early_return_result.path[2], "question_mark_operator"); assert_eq!(early_return_result.path[3], "early_return"); // Activation should decay along the path - let result_type_activation = results.iter() + let result_type_activation = results + .iter() .find(|r| r.memory_id == "result_type") .map(|r| r.activation) .unwrap_or(0.0); @@ -1056,20 +1164,52 @@ fn test_spreading_mixed_link_types() { let mut network = ActivationNetwork::new(); // Create edges with different link types - network.add_edge("event".to_string(), "semantic_relation".to_string(), LinkType::Semantic, 0.9); - network.add_edge("event".to_string(), "temporal_relation".to_string(), LinkType::Temporal, 0.9); - network.add_edge("event".to_string(), "causal_relation".to_string(), LinkType::Causal, 0.9); - network.add_edge("event".to_string(), "spatial_relation".to_string(), LinkType::Spatial, 0.9); + network.add_edge( + "event".to_string(), + "semantic_relation".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "event".to_string(), + "temporal_relation".to_string(), + LinkType::Temporal, + 0.9, + ); + network.add_edge( + "event".to_string(), + "causal_relation".to_string(), + LinkType::Causal, + 0.9, + ); + network.add_edge( + "event".to_string(), + "spatial_relation".to_string(), + LinkType::Spatial, + 0.9, + ); let results = network.activate("event", 1.0); // Should find all related nodes let found_ids: HashSet<_> = results.iter().map(|r| r.memory_id.as_str()).collect(); - assert!(found_ids.contains("semantic_relation"), "Should find semantic relation"); - assert!(found_ids.contains("temporal_relation"), "Should find temporal relation"); - assert!(found_ids.contains("causal_relation"), "Should find causal relation"); - assert!(found_ids.contains("spatial_relation"), "Should find spatial relation"); + assert!( + found_ids.contains("semantic_relation"), + "Should find semantic relation" + ); + assert!( + found_ids.contains("temporal_relation"), + "Should find temporal relation" + ); + assert!( + found_ids.contains("causal_relation"), + "Should find causal relation" + ); + assert!( + found_ids.contains("spatial_relation"), + "Should find spatial relation" + ); // Verify link types are preserved for result in &results { @@ -1094,7 +1234,7 @@ fn test_spreading_mixed_link_types() { #[test] fn test_retroactive_vs_timestamp_importance() { let config = SynapticTaggingConfig { - capture_window: CaptureWindow::new(9.0, 2.0), // 9 hours back, 2 hours forward + capture_window: CaptureWindow::new(9.0, 2.0), // 9 hours back, 2 hours forward prp_threshold: 0.7, tag_lifetime_hours: 12.0, min_tag_strength: 0.3, @@ -1130,7 +1270,8 @@ fn test_retroactive_vs_timestamp_importance() { // (In tests, tag_memory() uses Utc::now(), so temporal_distance ~= 0) for captured in &result.captured_memories { assert!( - captured.temporal_distance_hours >= 0.0 || captured.temporal_distance_hours.abs() < 0.01, + captured.temporal_distance_hours >= 0.0 + || captured.temporal_distance_hours.abs() < 0.01, "Captured memory {} should be encoded at or before event (distance: {:.4}h)", captured.memory_id, captured.temporal_distance_hours @@ -1166,7 +1307,10 @@ fn test_retroactive_captures_related_memories() { ); // Verify cluster properties - assert!(cluster.average_importance > 0.0, "Cluster should have positive importance"); + assert!( + cluster.average_importance > 0.0, + "Cluster should have positive importance" + ); assert_eq!( cluster.trigger_event_type, ImportanceEventType::EmotionalContent @@ -1184,7 +1328,11 @@ fn test_retroactive_window_effectiveness() { (Duration::hours(1), true, "1 hour before"), (Duration::hours(4), true, "4 hours before"), (Duration::hours(8), true, "8 hours before"), - (Duration::hours(10), false, "10 hours before (outside window)"), + ( + Duration::hours(10), + false, + "10 hours before (outside window)", + ), (Duration::minutes(-30), true, "30 minutes after"), (Duration::hours(-3), false, "3 hours after (outside window)"), ]; @@ -1201,7 +1349,11 @@ fn test_retroactive_window_effectiveness() { if should_capture { let prob = window.capture_probability(memory_time, event_time); - assert!(prob.is_some(), "{} should have capture probability", description); + assert!( + prob.is_some(), + "{} should have capture probability", + description + ); assert!( prob.unwrap() > 0.0, "{} should have positive capture probability", @@ -1218,7 +1370,7 @@ fn test_retroactive_semantic_filtering() { capture_window: CaptureWindow::new(9.0, 2.0), prp_threshold: 0.7, tag_lifetime_hours: 12.0, - min_tag_strength: 0.1, // Low threshold to test strength effects + min_tag_strength: 0.1, // Low threshold to test strength effects max_cluster_size: 100, enable_clustering: true, auto_decay: true, @@ -1232,14 +1384,16 @@ fn test_retroactive_semantic_filtering() { stc.tag_memory_with_strength("highly_relevant", 0.95); stc.tag_memory_with_strength("moderately_relevant", 0.6); stc.tag_memory_with_strength("barely_relevant", 0.35); - stc.tag_memory_with_strength("irrelevant", 0.05); // Below threshold + stc.tag_memory_with_strength("irrelevant", 0.05); // Below threshold // Trigger importance event let event = ImportanceEvent::user_flag("trigger", None); let result = stc.trigger_prp(event); // Higher strength memories should be captured with higher consolidated importance - let captured_ids: HashSet<_> = result.captured_memories.iter() + let captured_ids: HashSet<_> = result + .captured_memories + .iter() .map(|c| c.memory_id.as_str()) .collect(); @@ -1253,12 +1407,16 @@ fn test_retroactive_semantic_filtering() { ); // Find consolidated importance values - let highly_relevant_importance = result.captured_memories.iter() + let highly_relevant_importance = result + .captured_memories + .iter() .find(|c| c.memory_id == "highly_relevant") .map(|c| c.consolidated_importance) .unwrap_or(0.0); - let moderately_relevant_importance = result.captured_memories.iter() + let moderately_relevant_importance = result + .captured_memories + .iter() .find(|c| c.memory_id == "moderately_relevant") .map(|c| c.consolidated_importance) .unwrap_or(0.0); @@ -1285,10 +1443,8 @@ fn test_proof_unique_to_vestige() { let mut stc = SynapticTaggingSystem::new(); // Memory 1: Ordinary conversation about vacation (time T) - let _vacation_memory = stc.tag_memory_with_context( - "vacation_mention", - "User mentioned Bob's vacation plans" - ); + let _vacation_memory = + stc.tag_memory_with_context("vacation_mention", "User mentioned Bob's vacation plans"); // Memory 2: Some other ordinary memories stc.tag_memory("unrelated_memory_1"); @@ -1300,14 +1456,16 @@ fn test_proof_unique_to_vestige() { event_type: ImportanceEventType::UserFlag, memory_id: Some("departure_announcement".to_string()), timestamp: Utc::now(), - strength: 1.0, // Maximum importance + strength: 1.0, // Maximum importance context: Some("Bob is leaving - this makes prior context important".to_string()), }; let result = stc.trigger_prp(event); // The vacation memory should be captured! - let vacation_captured = result.captured_memories.iter() + let vacation_captured = result + .captured_memories + .iter() .any(|c| c.memory_id == "vacation_mention"); assert!( @@ -1316,7 +1474,9 @@ fn test_proof_unique_to_vestige() { ); // Verify the capture details - let vacation_capture = result.captured_memories.iter() + let vacation_capture = result + .captured_memories + .iter() .find(|c| c.memory_id == "vacation_mention") .unwrap(); @@ -1324,7 +1484,8 @@ fn test_proof_unique_to_vestige() { // so temporal_distance is ~0 (but conceptually it's a "backward" capture // since the memory existed BEFORE it became important) assert!( - vacation_capture.temporal_distance_hours >= 0.0 || vacation_capture.temporal_distance_hours.abs() < 0.01, + vacation_capture.temporal_distance_hours >= 0.0 + || vacation_capture.temporal_distance_hours.abs() < 0.01, "Memory should be encoded at or before the importance event (distance: {:.4}h)", vacation_capture.temporal_distance_hours ); @@ -1406,7 +1567,7 @@ fn test_index_compression_ratio() { let full_embedding_dim = 384; // Index embedding size - let index_embedding_dim = config.summary_dimensions; // 128 by default + let index_embedding_dim = config.summary_dimensions; // 128 by default // Compression ratio let compression_ratio = full_embedding_dim as f64 / index_embedding_dim as f64; @@ -1425,7 +1586,7 @@ fn test_index_compression_ratio() { ); // Memory savings per memory - let full_size_bytes = full_embedding_dim * 4; // f32 = 4 bytes + let full_size_bytes = full_embedding_dim * 4; // f32 = 4 bytes let index_size_bytes = index_embedding_dim * 4; let savings_per_memory = full_size_bytes - index_size_bytes; @@ -1522,8 +1683,7 @@ fn test_content_pointer_accuracy() { assert_eq!(chunked_ptr.size_bytes, Some(100)); // Test with hash - let hashed_ptr = ContentPointer::sqlite("data", 1, ContentType::Text) - .with_hash(0xDEADBEEF); + let hashed_ptr = ContentPointer::sqlite("data", 1, ContentType::Text).with_hash(0xDEADBEEF); assert_eq!(hashed_ptr.content_hash, Some(0xDEADBEEF)); @@ -1531,19 +1691,24 @@ fn test_content_pointer_accuracy() { let index = HippocampalIndex::new(); let now = Utc::now(); - let barcode = index.index_memory( - "test_memory", - "Test content for pointer verification", - "fact", - now, - None, - ).unwrap(); + let barcode = index + .index_memory( + "test_memory", + "Test content for pointer verification", + "fact", + now, + None, + ) + .unwrap(); // Retrieve and verify let retrieved = index.get_index("test_memory").unwrap().unwrap(); assert_eq!(retrieved.barcode, barcode); - assert!(!retrieved.content_pointers.is_empty(), "Should have content pointer"); + assert!( + !retrieved.content_pointers.is_empty(), + "Should have content pointer" + ); // Verify the default pointer is SQLite let default_ptr = &retrieved.content_pointers[0]; diff --git a/tests/e2e/tests/cognitive/dreams_tests.rs b/tests/e2e/tests/cognitive/dreams_tests.rs index 9835dee..25084b1 100644 --- a/tests/e2e/tests/cognitive/dreams_tests.rs +++ b/tests/e2e/tests/cognitive/dreams_tests.rs @@ -15,11 +15,11 @@ //! 3. **Scheduler & Timing**: Tests for activity detection and idle triggers use chrono::{Duration, Utc}; +use std::collections::HashSet; use vestige_core::advanced::dreams::{ ActivityTracker, ConnectionGraph, ConnectionReason, ConsolidationScheduler, DreamConfig, DreamMemory, InsightType, MemoryDreamer, }; -use std::collections::HashSet; // ============================================================================ // HELPER FUNCTIONS @@ -66,7 +66,6 @@ fn make_memory_with_access( } } - // ============================================================================ // INSIGHT GENERATION TESTS (5 tests) // ============================================================================ @@ -448,11 +447,7 @@ async fn test_consolidation_decay_stage() { let replay = report.stage1_replay.as_ref().unwrap(); // Should replay memories in chronological order - assert_eq!( - replay.sequence.len(), - 3, - "Should replay all 3 memories" - ); + assert_eq!(replay.sequence.len(), 3, "Should replay all 3 memories"); // Older memory should come first in replay sequence assert_eq!( @@ -616,12 +611,7 @@ async fn test_consolidation_transfer_stage() { vec!["important"], 5, ), - make_memory_with_access( - "low_access", - "Rarely accessed memory", - vec!["minor"], - 1, - ), + make_memory_with_access("low_access", "Rarely accessed memory", vec!["minor"], 1), ]; let report = scheduler.run_consolidation_cycle(&memories).await; @@ -911,7 +901,10 @@ fn test_connection_graph_comprehensive() { // Test strengthening assert!(graph.strengthen_connection("a", "b", 0.1)); let new_strength = graph.total_connection_strength("a"); - assert!(new_strength > a_strength, "Strength should increase after reinforcement"); + assert!( + new_strength > a_strength, + "Strength should increase after reinforcement" + ); // Test decay and pruning graph.apply_decay(0.5); diff --git a/tests/e2e/tests/cognitive/neuroscience_tests.rs b/tests/e2e/tests/cognitive/neuroscience_tests.rs index 5fb2db9..8a2506f 100644 --- a/tests/e2e/tests/cognitive/neuroscience_tests.rs +++ b/tests/e2e/tests/cognitive/neuroscience_tests.rs @@ -22,19 +22,39 @@ use chrono::{Duration, Utc}; use vestige_core::{ // Advanced reconsolidation - AccessContext, AccessTrigger, Modification, ReconsolidationManager, RelationshipType, - // FSRS - Rating, retrievability, retrievability_with_decay, initial_difficulty, - next_interval, FSRSScheduler, - // Neuroscience - Synaptic Tagging - SynapticTaggingSystem, ImportanceEvent, ImportanceEventType, - CaptureWindow, DecayFunction, - // Neuroscience - Memory States - MemoryState, MemoryLifecycle, AccessibilityCalculator, - CompetitionManager, CompetitionCandidate, + AccessContext, + AccessTrigger, + AccessibilityCalculator, + ArousalSignal, + AttentionSession, + AttentionSignal, + CaptureWindow, + CompetitionCandidate, + CompetitionManager, + DecayFunction, + FSRSScheduler, + ImportanceContext, + ImportanceEvent, + ImportanceEventType, // Neuroscience - Importance Signals - ImportanceSignals, NoveltySignal, ArousalSignal, RewardSignal, AttentionSignal, - ImportanceContext, AttentionSession, OutcomeType, + ImportanceSignals, + MemoryLifecycle, + // Neuroscience - Memory States + MemoryState, + Modification, + NoveltySignal, + OutcomeType, + // FSRS + Rating, + ReconsolidationManager, + RelationshipType, + RewardSignal, + // Neuroscience - Synaptic Tagging + SynapticTaggingSystem, + initial_difficulty, + next_interval, + retrievability, + retrievability_with_decay, }; // ============================================================================ @@ -91,7 +111,12 @@ fn test_stc_prp_trigger_captures_memories() { // The tagged memory should be captured assert!(result.has_captures()); - assert!(result.captured_memories.iter().any(|c| c.memory_id == "mem-background")); + assert!( + result + .captured_memories + .iter() + .any(|c| c.memory_id == "mem-background") + ); assert!(stc.is_captured("mem-background")); } @@ -140,13 +165,20 @@ fn test_stc_capture_window_probability() { // Memory just before event - high probability (exponential decay with λ=4.605/9) let recent_before = event_time - Duration::hours(1); - let prob_recent = window.capture_probability(recent_before, event_time).unwrap(); + let prob_recent = window + .capture_probability(recent_before, event_time) + .unwrap(); // At 1h out of 9h with exponential decay: e^(-4.605/9 * 1) ≈ 0.6 - assert!(prob_recent > 0.5, "Recent memory should have high capture probability"); + assert!( + prob_recent > 0.5, + "Recent memory should have high capture probability" + ); // Memory 6 hours before event - moderate probability let medium_before = event_time - Duration::hours(6); - let prob_medium = window.capture_probability(medium_before, event_time).unwrap(); + let prob_medium = window + .capture_probability(medium_before, event_time) + .unwrap(); assert!(prob_medium > 0.0 && prob_medium < prob_recent); // Memory outside window - no capture @@ -165,14 +197,26 @@ fn test_stc_decay_functions() { let exp_at_half = exp_decay.apply(1.0, 6.0, 12.0); let exp_at_end = exp_decay.apply(1.0, 12.0, 12.0); - assert!((exp_at_zero - 1.0).abs() < 0.01, "Should be full strength at t=0"); - assert!(exp_at_half > 0.0 && exp_at_half < 0.5, "Significant decay at halfway"); + assert!( + (exp_at_zero - 1.0).abs() < 0.01, + "Should be full strength at t=0" + ); + assert!( + exp_at_half > 0.0 && exp_at_half < 0.5, + "Significant decay at halfway" + ); assert!(exp_at_end < 0.02, "Near zero at lifetime end"); // Linear decay let linear_decay = DecayFunction::Linear; - assert!((linear_decay.apply(1.0, 5.0, 10.0) - 0.5).abs() < 0.01, "Linear: 50% at halfway"); - assert!((linear_decay.apply(1.0, 10.0, 10.0) - 0.0).abs() < 0.01, "Linear: 0% at end"); + assert!( + (linear_decay.apply(1.0, 5.0, 10.0) - 0.5).abs() < 0.01, + "Linear: 50% at halfway" + ); + assert!( + (linear_decay.apply(1.0, 10.0, 10.0) - 0.0).abs() < 0.01, + "Linear: 0% at end" + ); // Power decay (matches FSRS-6) let power_decay = DecayFunction::Power; @@ -259,7 +303,10 @@ fn test_reconsolidation_marks_memory_labile() { let snapshot = vestige_core::MemorySnapshot::capture( "Test content".to_string(), vec!["test".to_string()], - 0.8, 5.0, 0.9, vec![], + 0.8, + 5.0, + 0.9, + vec![], ); manager.mark_labile("mem-123", snapshot); @@ -277,22 +324,30 @@ fn test_reconsolidation_apply_modifications() { let snapshot = vestige_core::MemorySnapshot::capture( "Original content".to_string(), vec!["original".to_string()], - 0.8, 5.0, 0.9, vec![], + 0.8, + 5.0, + 0.9, + vec![], ); manager.mark_labile("mem-123", snapshot); // Apply various modifications - let success1 = manager.apply_modification("mem-123", Modification::AddTag { - tag: "new-tag".to_string(), - }); - let success2 = manager.apply_modification("mem-123", Modification::BoostRetrieval { - boost: 0.1, - }); - let success3 = manager.apply_modification("mem-123", Modification::LinkMemory { - related_memory_id: "mem-456".to_string(), - relationship: RelationshipType::Supports, - }); + let success1 = manager.apply_modification( + "mem-123", + Modification::AddTag { + tag: "new-tag".to_string(), + }, + ); + let success2 = + manager.apply_modification("mem-123", Modification::BoostRetrieval { boost: 0.1 }); + let success3 = manager.apply_modification( + "mem-123", + Modification::LinkMemory { + related_memory_id: "mem-456".to_string(), + relationship: RelationshipType::Supports, + }, + ); assert!(success1 && success2 && success3); assert_eq!(manager.get_stats().total_modifications, 3); @@ -307,16 +362,25 @@ fn test_reconsolidation_finalizes_changes() { let snapshot = vestige_core::MemorySnapshot::capture( "Content".to_string(), vec!["tag".to_string()], - 0.8, 5.0, 0.9, vec![], + 0.8, + 5.0, + 0.9, + vec![], ); manager.mark_labile("mem-123", snapshot); - manager.apply_modification("mem-123", Modification::AddTag { - tag: "new-tag".to_string(), - }); - manager.apply_modification("mem-123", Modification::AddContext { - context: "Important meeting notes".to_string(), - }); + manager.apply_modification( + "mem-123", + Modification::AddTag { + tag: "new-tag".to_string(), + }, + ); + manager.apply_modification( + "mem-123", + Modification::AddContext { + context: "Important meeting notes".to_string(), + }, + ); let result = manager.reconsolidate("mem-123"); @@ -333,10 +397,8 @@ fn test_reconsolidation_finalizes_changes() { #[test] fn test_reconsolidation_tracks_access_context() { let mut manager = ReconsolidationManager::new(); - let snapshot = vestige_core::MemorySnapshot::capture( - "Content".to_string(), - vec![], 0.8, 5.0, 0.9, vec![], - ); + let snapshot = + vestige_core::MemorySnapshot::capture("Content".to_string(), vec![], 0.8, 5.0, 0.9, vec![]); let context = AccessContext { trigger: AccessTrigger::Search, query: Some("test query".to_string()), @@ -357,10 +419,8 @@ fn test_reconsolidation_tracks_access_context() { #[test] fn test_reconsolidation_retrieval_history() { let mut manager = ReconsolidationManager::new(); - let snapshot = vestige_core::MemorySnapshot::capture( - "Content".to_string(), - vec![], 0.8, 5.0, 0.9, vec![], - ); + let snapshot = + vestige_core::MemorySnapshot::capture("Content".to_string(), vec![], 0.8, 5.0, 0.9, vec![]); // Multiple retrievals for _ in 0..3 { @@ -417,8 +477,10 @@ fn test_fsrs_custom_decay_parameter() { let r_high_decay = retrievability_with_decay(stability, elapsed, 0.5); // Lower decay = steeper curve = lower retrievability for same time - assert!(r_low_decay < r_high_decay, - "Lower decay parameter should result in faster forgetting"); + assert!( + r_low_decay < r_high_decay, + "Lower decay parameter should result in faster forgetting" + ); } /// Test interval calculation round-trips with retrievability. @@ -436,7 +498,9 @@ fn test_fsrs_interval_retrievability_roundtrip() { assert!( (actual_r - target_r).abs() < 0.05, "Round-trip: interval={}, actual_R={:.3}, target_R={:.3}", - interval, actual_r, target_r + interval, + actual_r, + target_r ); } @@ -492,7 +556,10 @@ fn test_fsrs_difficulty_mean_reversion() { let high_d_after = result.state.difficulty; // Mean reversion should pull high difficulty down - assert!(high_d_after < high_d_before, "High difficulty should decrease"); + assert!( + high_d_after < high_d_before, + "High difficulty should decrease" + ); // Create card with low difficulty let mut low_d_card = scheduler.new_card(); @@ -502,7 +569,10 @@ fn test_fsrs_difficulty_mean_reversion() { // Again rating should increase difficulty let result = scheduler.review(&low_d_card, Rating::Again, 0.0, None); let low_d_after = result.state.difficulty; - assert!(low_d_after > low_d_before, "Again should increase low difficulty"); + assert!( + low_d_after > low_d_before, + "Again should increase low difficulty" + ); } /// Test scheduler lapse tracking. @@ -541,12 +611,18 @@ fn test_memory_state_accessibility_multipliers() { assert!((MemoryState::Unavailable.accessibility_multiplier() - 0.05).abs() < 0.001); // Active > Dormant > Silent > Unavailable - assert!(MemoryState::Active.accessibility_multiplier() > - MemoryState::Dormant.accessibility_multiplier()); - assert!(MemoryState::Dormant.accessibility_multiplier() > - MemoryState::Silent.accessibility_multiplier()); - assert!(MemoryState::Silent.accessibility_multiplier() > - MemoryState::Unavailable.accessibility_multiplier()); + assert!( + MemoryState::Active.accessibility_multiplier() + > MemoryState::Dormant.accessibility_multiplier() + ); + assert!( + MemoryState::Dormant.accessibility_multiplier() + > MemoryState::Silent.accessibility_multiplier() + ); + assert!( + MemoryState::Silent.accessibility_multiplier() + > MemoryState::Unavailable.accessibility_multiplier() + ); } /// Test state retrievability properties. @@ -589,11 +665,7 @@ fn test_memory_lifecycle_transitions() { fn test_memory_state_competition_suppression() { let mut lifecycle = MemoryLifecycle::new(); - lifecycle.suppress_from_competition( - "winner-123".to_string(), - 0.85, - Duration::hours(2), - ); + lifecycle.suppress_from_competition("winner-123".to_string(), 0.85, Duration::hours(2)); assert_eq!(lifecycle.state, MemoryState::Unavailable); assert!(!lifecycle.is_suppression_expired()); @@ -671,7 +743,10 @@ fn test_memory_state_accessibility_calculator() { assert!(active_threshold < 0.5, "Active has lower threshold"); assert!(silent_threshold > 0.5, "Silent has higher threshold"); - assert!(unavailable_threshold > 1.0, "Unavailable is effectively unreachable"); + assert!( + unavailable_threshold > 1.0, + "Unavailable is effectively unreachable" + ); } // ============================================================================ @@ -713,14 +788,19 @@ fn test_importance_arousal_signal() { let neutral_score = arousal.compute("The meeting is scheduled for tomorrow at 3pm."); // Highly emotional content - let emotional_score = arousal.compute( - "CRITICAL ERROR!!! Production database is DOWN! Data loss imminent!!!" - ); + let emotional_score = + arousal.compute("CRITICAL ERROR!!! Production database is DOWN! Data loss imminent!!!"); - assert!(emotional_score > neutral_score, + assert!( + emotional_score > neutral_score, "Emotional content should have higher arousal: {} vs {}", - emotional_score, neutral_score); - assert!(emotional_score > 0.5, "Highly emotional content should score high"); + emotional_score, + neutral_score + ); + assert!( + emotional_score > 0.5, + "Highly emotional content should score high" + ); // Detect emotional markers let markers = arousal.detect_emotional_markers("URGENT: Critical failure!!!"); @@ -740,14 +820,20 @@ fn test_importance_reward_signal() { reward.record_outcome("mem-helpful", OutcomeType::Helpful); let helpful_score = reward.compute("mem-helpful"); - assert!(helpful_score > 0.5, "Memory with positive outcomes should score high"); + assert!( + helpful_score > 0.5, + "Memory with positive outcomes should score high" + ); // Record negative outcomes reward.record_outcome("mem-unhelpful", OutcomeType::NotHelpful); reward.record_outcome("mem-unhelpful", OutcomeType::NotHelpful); let unhelpful_score = reward.compute("mem-unhelpful"); - assert!(unhelpful_score < 0.5, "Memory with negative outcomes should score low"); + assert!( + unhelpful_score < 0.5, + "Memory with negative outcomes should score low" + ); assert!(helpful_score > unhelpful_score); } @@ -768,11 +854,17 @@ fn test_importance_attention_signal() { edit_count: 2, unique_memories_accessed: 15, viewed_docs: true, - query_topics: vec!["rust".to_string(), "async".to_string(), "memory".to_string()], + query_topics: vec![ + "rust".to_string(), + "async".to_string(), + "memory".to_string(), + ], }; - assert!(attention.detect_learning_mode(&learning_session), - "Should detect learning mode from session patterns"); + assert!( + attention.detect_learning_mode(&learning_session), + "Should detect learning mode from session patterns" + ); // Non-learning session (quick edit) let quick_session = AttentionSession { @@ -786,8 +878,10 @@ fn test_importance_attention_signal() { query_topics: vec![], }; - assert!(!attention.detect_learning_mode(&quick_session), - "Quick edit session should not be learning mode"); + assert!( + !attention.detect_learning_mode(&quick_session), + "Quick edit session should not be learning mode" + ); } /// Test composite importance combines all signals. @@ -806,9 +900,15 @@ fn test_importance_composite_score() { &context, ); - assert!(score.composite > 0.4, "Important content should score moderately high"); + assert!( + score.composite > 0.4, + "Important content should score moderately high" + ); assert!(score.arousal > 0.4, "Emotional content should have arousal"); - assert!(score.encoding_boost >= 1.0, "High importance should boost encoding"); + assert!( + score.encoding_boost >= 1.0, + "High importance should boost encoding" + ); // Verify all components are present assert!(score.novelty >= 0.0 && score.novelty <= 1.0); diff --git a/tests/e2e/tests/cognitive/psychology_tests.rs b/tests/e2e/tests/cognitive/psychology_tests.rs index d89aaed..e794fde 100644 --- a/tests/e2e/tests/cognitive/psychology_tests.rs +++ b/tests/e2e/tests/cognitive/psychology_tests.rs @@ -129,15 +129,15 @@ fn test_serial_position_u_shaped_curve() { // U-shaped curve: high-low-high pattern let items = vec![ - ("pos_1", 0.90), // High (primacy) + ("pos_1", 0.90), // High (primacy) ("pos_2", 0.80), ("pos_3", 0.65), - ("pos_4", 0.55), // Low (middle) - ("pos_5", 0.50), // Low (middle) + ("pos_4", 0.55), // Low (middle) + ("pos_5", 0.50), // Low (middle) ("pos_6", 0.55), ("pos_7", 0.70), ("pos_8", 0.85), - ("pos_9", 0.95), // High (recency) + ("pos_9", 0.95), // High (recency) ]; for (item, strength) in &items { @@ -151,13 +151,35 @@ fn test_serial_position_u_shaped_curve() { let results = network.activate("list_context", 1.0); - let pos_1 = results.iter().find(|r| r.memory_id == "pos_1").map(|r| r.activation).unwrap_or(0.0); - let pos_5 = results.iter().find(|r| r.memory_id == "pos_5").map(|r| r.activation).unwrap_or(0.0); - let pos_9 = results.iter().find(|r| r.memory_id == "pos_9").map(|r| r.activation).unwrap_or(0.0); + let pos_1 = results + .iter() + .find(|r| r.memory_id == "pos_1") + .map(|r| r.activation) + .unwrap_or(0.0); + let pos_5 = results + .iter() + .find(|r| r.memory_id == "pos_5") + .map(|r| r.activation) + .unwrap_or(0.0); + let pos_9 = results + .iter() + .find(|r| r.memory_id == "pos_9") + .map(|r| r.activation) + .unwrap_or(0.0); // U-shape: ends higher than middle - assert!(pos_1 > pos_5, "First position ({}) > middle position ({})", pos_1, pos_5); - assert!(pos_9 > pos_5, "Last position ({}) > middle position ({})", pos_9, pos_5); + assert!( + pos_1 > pos_5, + "First position ({}) > middle position ({})", + pos_1, + pos_5 + ); + assert!( + pos_9 > pos_5, + "Last position ({}) > middle position ({})", + pos_9, + pos_5 + ); } /// Test that rehearsal strengthens primacy items. @@ -168,9 +190,24 @@ fn test_serial_position_rehearsal_strengthens_primacy() { let mut network = ActivationNetwork::new(); // Initial weak connections - network.add_edge("learning".to_string(), "first_concept".to_string(), LinkType::Semantic, 0.3); - network.add_edge("learning".to_string(), "middle_concept".to_string(), LinkType::Semantic, 0.3); - network.add_edge("learning".to_string(), "last_concept".to_string(), LinkType::Semantic, 0.3); + network.add_edge( + "learning".to_string(), + "first_concept".to_string(), + LinkType::Semantic, + 0.3, + ); + network.add_edge( + "learning".to_string(), + "middle_concept".to_string(), + LinkType::Semantic, + 0.3, + ); + network.add_edge( + "learning".to_string(), + "last_concept".to_string(), + LinkType::Semantic, + 0.3, + ); // Simulate rehearsal - first items get more rehearsal // (5 rehearsals for first, 2 for middle, 3 for last) @@ -217,12 +254,12 @@ fn test_serial_position_delay_eliminates_recency() { // After delay: primacy preserved, recency diminished // (modeling that working memory has cleared) let delayed_items = vec![ - ("early_1", 0.85), // Primacy preserved + ("early_1", 0.85), // Primacy preserved ("early_2", 0.75), ("middle_1", 0.50), ("middle_2", 0.45), - ("late_1", 0.40), // Recency lost after delay - ("late_2", 0.35), // (items not transferred to LTM) + ("late_1", 0.40), // Recency lost after delay + ("late_2", 0.35), // (items not transferred to LTM) ]; for (item, strength) in &delayed_items { @@ -271,7 +308,12 @@ fn test_spacing_effect_distributed_vs_massed() { let mut network = ActivationNetwork::new(); // Massed practice: all reinforcements close together (less effective) - network.add_edge("massed".to_string(), "concept_a".to_string(), LinkType::Semantic, 0.2); + network.add_edge( + "massed".to_string(), + "concept_a".to_string(), + LinkType::Semantic, + 0.2, + ); // 5 rapid reinforcements for _ in 0..5 { network.reinforce_edge("massed", "concept_a", 0.1); @@ -279,7 +321,12 @@ fn test_spacing_effect_distributed_vs_massed() { // Spaced practice: reinforcements distributed (more effective) // Simulated by giving higher reinforcement values (representing better encoding) - network.add_edge("spaced".to_string(), "concept_b".to_string(), LinkType::Semantic, 0.2); + network.add_edge( + "spaced".to_string(), + "concept_b".to_string(), + LinkType::Semantic, + 0.2, + ); // 5 spaced reinforcements with better encoding for _ in 0..5 { network.reinforce_edge("spaced", "concept_b", 0.15); // Higher value = better encoding @@ -316,12 +363,22 @@ fn test_spacing_effect_optimal_interval() { let mut network = ActivationNetwork::new(); // Short retention interval: shorter spacing optimal - network.add_edge("short_retention".to_string(), "fact_1".to_string(), LinkType::Semantic, 0.3); + network.add_edge( + "short_retention".to_string(), + "fact_1".to_string(), + LinkType::Semantic, + 0.3, + ); network.reinforce_edge("short_retention", "fact_1", 0.2); network.reinforce_edge("short_retention", "fact_1", 0.2); // Long retention interval: longer spacing optimal (simulated with stronger encoding) - network.add_edge("long_retention".to_string(), "fact_2".to_string(), LinkType::Semantic, 0.3); + network.add_edge( + "long_retention".to_string(), + "fact_2".to_string(), + LinkType::Semantic, + 0.3, + ); network.reinforce_edge("long_retention", "fact_2", 0.25); network.reinforce_edge("long_retention", "fact_2", 0.25); @@ -346,9 +403,24 @@ fn test_spacing_effect_semantic_associations() { let mut network = ActivationNetwork::new(); // Create semantic network with spaced learning - network.add_edge("programming".to_string(), "rust".to_string(), LinkType::Semantic, 0.5); - network.add_edge("rust".to_string(), "ownership".to_string(), LinkType::Semantic, 0.5); - network.add_edge("ownership".to_string(), "borrowing".to_string(), LinkType::Semantic, 0.5); + network.add_edge( + "programming".to_string(), + "rust".to_string(), + LinkType::Semantic, + 0.5, + ); + network.add_edge( + "rust".to_string(), + "ownership".to_string(), + LinkType::Semantic, + 0.5, + ); + network.add_edge( + "ownership".to_string(), + "borrowing".to_string(), + LinkType::Semantic, + 0.5, + ); // Spaced reinforcement of the path for _ in 0..3 { @@ -361,7 +433,10 @@ fn test_spacing_effect_semantic_associations() { // Should reach borrowing through the strengthened path let borrowing_result = results.iter().find(|r| r.memory_id == "borrowing"); - assert!(borrowing_result.is_some(), "Spaced learning should strengthen multi-hop paths"); + assert!( + borrowing_result.is_some(), + "Spaced learning should strengthen multi-hop paths" + ); let borrowing_activation = borrowing_result.unwrap().activation; assert!( @@ -379,7 +454,12 @@ fn test_spacing_effect_expanding_retrieval() { let mut network = ActivationNetwork::new(); // Expanding intervals: each retrieval strengthens more as intervals grow - network.add_edge("expanding".to_string(), "memory".to_string(), LinkType::Semantic, 0.2); + network.add_edge( + "expanding".to_string(), + "memory".to_string(), + LinkType::Semantic, + 0.2, + ); // Simulate expanding intervals with increasing reinforcement let expanding_reinforcements = [0.1, 0.12, 0.15, 0.18, 0.22]; // Increasing gains @@ -411,9 +491,24 @@ fn test_spacing_effect_multi_hop_paths() { let mut network = ActivationNetwork::with_config(config); // Create a learning chain - network.add_edge("topic".to_string(), "subtopic_a".to_string(), LinkType::Semantic, 0.4); - network.add_edge("subtopic_a".to_string(), "detail_1".to_string(), LinkType::Semantic, 0.4); - network.add_edge("detail_1".to_string(), "example".to_string(), LinkType::Semantic, 0.4); + network.add_edge( + "topic".to_string(), + "subtopic_a".to_string(), + LinkType::Semantic, + 0.4, + ); + network.add_edge( + "subtopic_a".to_string(), + "detail_1".to_string(), + LinkType::Semantic, + 0.4, + ); + network.add_edge( + "detail_1".to_string(), + "example".to_string(), + LinkType::Semantic, + 0.4, + ); // Spaced practice on entire chain for _ in 0..4 { @@ -426,11 +521,18 @@ fn test_spacing_effect_multi_hop_paths() { // Example should be reachable with good activation let example_result = results.iter().find(|r| r.memory_id == "example"); - assert!(example_result.is_some(), "Spaced practice should enable deep retrieval"); + assert!( + example_result.is_some(), + "Spaced practice should enable deep retrieval" + ); let example = example_result.unwrap(); assert_eq!(example.distance, 3, "Example should be 3 hops away"); - assert!(example.activation > 0.1, "Example should have sufficient activation: {}", example.activation); + assert!( + example.activation > 0.1, + "Example should have sufficient activation: {}", + example.activation + ); } // ============================================================================ @@ -448,27 +550,58 @@ fn test_context_dependent_matching_context() { let mut network = ActivationNetwork::new(); // Memory encoded in "office" context - network.add_edge("office_context".to_string(), "project_deadline".to_string(), LinkType::Semantic, 0.9); - network.add_edge("office_context".to_string(), "meeting_notes".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "office_context".to_string(), + "project_deadline".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "office_context".to_string(), + "meeting_notes".to_string(), + LinkType::Semantic, + 0.85, + ); // Memory encoded in "home" context - network.add_edge("home_context".to_string(), "grocery_list".to_string(), LinkType::Semantic, 0.9); - network.add_edge("home_context".to_string(), "family_event".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "home_context".to_string(), + "grocery_list".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "home_context".to_string(), + "family_event".to_string(), + LinkType::Semantic, + 0.85, + ); // Recall from office context let office_results = network.activate("office_context", 1.0); let home_results = network.activate("home_context", 1.0); // Office context should find office memories - let found_deadline = office_results.iter().any(|r| r.memory_id == "project_deadline"); + let found_deadline = office_results + .iter() + .any(|r| r.memory_id == "project_deadline"); let found_grocery = office_results.iter().any(|r| r.memory_id == "grocery_list"); - assert!(found_deadline, "Office context should activate office memories"); - assert!(!found_grocery, "Office context should NOT directly activate home memories"); + assert!( + found_deadline, + "Office context should activate office memories" + ); + assert!( + !found_grocery, + "Office context should NOT directly activate home memories" + ); // Home context should find home memories let home_found_grocery = home_results.iter().any(|r| r.memory_id == "grocery_list"); - assert!(home_found_grocery, "Home context should activate home memories"); + assert!( + home_found_grocery, + "Home context should activate home memories" + ); } /// Test encoding specificity principle. @@ -479,12 +612,32 @@ fn test_context_dependent_encoding_specificity() { let mut network = ActivationNetwork::new(); // Highly specific encoding context - network.add_edge("rainy_monday_morning".to_string(), "specific_memory".to_string(), LinkType::Temporal, 0.95); - network.add_edge("rainy_monday_morning".to_string(), "coffee_shop_idea".to_string(), LinkType::Temporal, 0.9); + network.add_edge( + "rainy_monday_morning".to_string(), + "specific_memory".to_string(), + LinkType::Temporal, + 0.95, + ); + network.add_edge( + "rainy_monday_morning".to_string(), + "coffee_shop_idea".to_string(), + LinkType::Temporal, + 0.9, + ); // General context (partial match) - network.add_edge("monday".to_string(), "rainy_monday_morning".to_string(), LinkType::Temporal, 0.6); - network.add_edge("morning".to_string(), "rainy_monday_morning".to_string(), LinkType::Temporal, 0.5); + network.add_edge( + "monday".to_string(), + "rainy_monday_morning".to_string(), + LinkType::Temporal, + 0.6, + ); + network.add_edge( + "morning".to_string(), + "rainy_monday_morning".to_string(), + LinkType::Temporal, + 0.5, + ); // Specific context retrieval let specific_results = network.activate("rainy_monday_morning", 1.0); @@ -520,20 +673,50 @@ fn test_context_dependent_state_dependent() { let mut network = ActivationNetwork::new(); // Memories encoded in different emotional states - network.add_edge("happy_state".to_string(), "positive_memory_1".to_string(), LinkType::Semantic, 0.9); - network.add_edge("happy_state".to_string(), "positive_memory_2".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "happy_state".to_string(), + "positive_memory_1".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "happy_state".to_string(), + "positive_memory_2".to_string(), + LinkType::Semantic, + 0.85, + ); - network.add_edge("stressed_state".to_string(), "work_problem_1".to_string(), LinkType::Semantic, 0.9); - network.add_edge("stressed_state".to_string(), "work_problem_2".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "stressed_state".to_string(), + "work_problem_1".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "stressed_state".to_string(), + "work_problem_2".to_string(), + LinkType::Semantic, + 0.85, + ); // Retrieve from happy state let happy_results = network.activate("happy_state", 1.0); - let found_positive = happy_results.iter().any(|r| r.memory_id == "positive_memory_1"); - let found_work = happy_results.iter().any(|r| r.memory_id == "work_problem_1"); + let found_positive = happy_results + .iter() + .any(|r| r.memory_id == "positive_memory_1"); + let found_work = happy_results + .iter() + .any(|r| r.memory_id == "work_problem_1"); - assert!(found_positive, "Happy state should activate positive memories"); - assert!(!found_work, "Happy state should NOT directly activate stressed memories"); + assert!( + found_positive, + "Happy state should activate positive memories" + ); + assert!( + !found_work, + "Happy state should NOT directly activate stressed memories" + ); } /// Test context reinstatement improves retrieval. @@ -544,20 +727,55 @@ fn test_context_dependent_reinstatement() { let mut network = ActivationNetwork::new(); // Memory with multiple context cues - network.add_edge("library".to_string(), "study_session".to_string(), LinkType::Temporal, 0.8); - network.add_edge("quiet".to_string(), "study_session".to_string(), LinkType::Semantic, 0.7); - network.add_edge("evening".to_string(), "study_session".to_string(), LinkType::Temporal, 0.6); + network.add_edge( + "library".to_string(), + "study_session".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "quiet".to_string(), + "study_session".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "evening".to_string(), + "study_session".to_string(), + LinkType::Temporal, + 0.6, + ); // Study session links to learned material - network.add_edge("study_session".to_string(), "learned_concept".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "study_session".to_string(), + "learned_concept".to_string(), + LinkType::Semantic, + 0.9, + ); // Single context cue let single_cue = network.activate("library", 1.0); // Multiple context cues (reinstatement) - we need to create a combined node - network.add_edge("reinstated_context".to_string(), "library".to_string(), LinkType::Semantic, 0.9); - network.add_edge("reinstated_context".to_string(), "quiet".to_string(), LinkType::Semantic, 0.9); - network.add_edge("reinstated_context".to_string(), "evening".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "reinstated_context".to_string(), + "library".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "reinstated_context".to_string(), + "quiet".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "reinstated_context".to_string(), + "evening".to_string(), + LinkType::Semantic, + 0.9, + ); let reinstated_results = network.activate("reinstated_context", 1.0); @@ -587,10 +805,20 @@ fn test_context_dependent_transfer_appropriate() { let mut network = ActivationNetwork::new(); // Semantic encoding (deep processing) - network.add_edge("meaning_focused".to_string(), "concept_meaning".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "meaning_focused".to_string(), + "concept_meaning".to_string(), + LinkType::Semantic, + 0.9, + ); // Perceptual encoding (shallow processing) - network.add_edge("appearance_focused".to_string(), "concept_appearance".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "appearance_focused".to_string(), + "concept_appearance".to_string(), + LinkType::Semantic, + 0.9, + ); // Semantic retrieval cue let semantic_results = network.activate("meaning_focused", 1.0); @@ -599,15 +827,30 @@ fn test_context_dependent_transfer_appropriate() { let perceptual_results = network.activate("appearance_focused", 1.0); // Matching encoding-retrieval processing should work best - let semantic_found = semantic_results.iter().any(|r| r.memory_id == "concept_meaning"); - let perceptual_found = perceptual_results.iter().any(|r| r.memory_id == "concept_appearance"); + let semantic_found = semantic_results + .iter() + .any(|r| r.memory_id == "concept_meaning"); + let perceptual_found = perceptual_results + .iter() + .any(|r| r.memory_id == "concept_appearance"); - assert!(semantic_found, "Semantic cue should retrieve semantically encoded info"); - assert!(perceptual_found, "Perceptual cue should retrieve perceptually encoded info"); + assert!( + semantic_found, + "Semantic cue should retrieve semantically encoded info" + ); + assert!( + perceptual_found, + "Perceptual cue should retrieve perceptually encoded info" + ); // Cross-retrieval should be weaker (not directly connected) - let cross_found = semantic_results.iter().any(|r| r.memory_id == "concept_appearance"); - assert!(!cross_found, "Semantic cue should NOT directly retrieve perceptual encoding"); + let cross_found = semantic_results + .iter() + .any(|r| r.memory_id == "concept_appearance"); + assert!( + !cross_found, + "Semantic cue should NOT directly retrieve perceptual encoding" + ); } // ============================================================================ @@ -622,26 +865,51 @@ fn test_context_dependent_transfer_appropriate() { #[test] fn test_tot_partial_activation() { let config = ActivationConfig { - decay_factor: 0.6, // Higher decay = weaker far connections + decay_factor: 0.6, // Higher decay = weaker far connections max_hops: 3, - min_threshold: 0.15, // Higher threshold = some items not retrieved + min_threshold: 0.15, // Higher threshold = some items not retrieved allow_cycles: false, }; let mut network = ActivationNetwork::with_config(config); // Target word "serendipity" with various features - network.add_edge("word_search".to_string(), "starts_with_s".to_string(), LinkType::Semantic, 0.8); - network.add_edge("word_search".to_string(), "four_syllables".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_search".to_string(), "meaning_lucky_discovery".to_string(), LinkType::Semantic, 0.85); - network.add_edge("starts_with_s".to_string(), "serendipity".to_string(), LinkType::Semantic, 0.3); // Weak link to target + network.add_edge( + "word_search".to_string(), + "starts_with_s".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "word_search".to_string(), + "four_syllables".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_search".to_string(), + "meaning_lucky_discovery".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "starts_with_s".to_string(), + "serendipity".to_string(), + LinkType::Semantic, + 0.3, + ); // Weak link to target let results = network.activate("word_search", 1.0); // Should find partial information let found_starts_s = results.iter().any(|r| r.memory_id == "starts_with_s"); - let found_meaning = results.iter().any(|r| r.memory_id == "meaning_lucky_discovery"); + let found_meaning = results + .iter() + .any(|r| r.memory_id == "meaning_lucky_discovery"); - assert!(found_starts_s, "Should retrieve partial info (first letter)"); + assert!( + found_starts_s, + "Should retrieve partial info (first letter)" + ); assert!(found_meaning, "Should retrieve partial info (meaning)"); // Target might not be found due to weak link and threshold @@ -669,17 +937,49 @@ fn test_tot_related_words_activated() { // Searching for "archipelago" // Related words get activated instead - network.add_edge("island_chain_concept".to_string(), "archipelago".to_string(), LinkType::Semantic, 0.4); // Weak - network.add_edge("island_chain_concept".to_string(), "peninsula".to_string(), LinkType::Semantic, 0.7); // Related, stronger - network.add_edge("island_chain_concept".to_string(), "atoll".to_string(), LinkType::Semantic, 0.65); // Related - network.add_edge("island_chain_concept".to_string(), "islands".to_string(), LinkType::Semantic, 0.8); // Generic, strong + network.add_edge( + "island_chain_concept".to_string(), + "archipelago".to_string(), + LinkType::Semantic, + 0.4, + ); // Weak + network.add_edge( + "island_chain_concept".to_string(), + "peninsula".to_string(), + LinkType::Semantic, + 0.7, + ); // Related, stronger + network.add_edge( + "island_chain_concept".to_string(), + "atoll".to_string(), + LinkType::Semantic, + 0.65, + ); // Related + network.add_edge( + "island_chain_concept".to_string(), + "islands".to_string(), + LinkType::Semantic, + 0.8, + ); // Generic, strong let results = network.activate("island_chain_concept", 1.0); // Generic/related words should be more activated than target - let archipelago_act = results.iter().find(|r| r.memory_id == "archipelago").map(|r| r.activation).unwrap_or(0.0); - let islands_act = results.iter().find(|r| r.memory_id == "islands").map(|r| r.activation).unwrap_or(0.0); - let peninsula_act = results.iter().find(|r| r.memory_id == "peninsula").map(|r| r.activation).unwrap_or(0.0); + let archipelago_act = results + .iter() + .find(|r| r.memory_id == "archipelago") + .map(|r| r.activation) + .unwrap_or(0.0); + let islands_act = results + .iter() + .find(|r| r.memory_id == "islands") + .map(|r| r.activation) + .unwrap_or(0.0); + let peninsula_act = results + .iter() + .find(|r| r.memory_id == "peninsula") + .map(|r| r.activation) + .unwrap_or(0.0); assert!( islands_act > archipelago_act, @@ -703,10 +1003,25 @@ fn test_tot_phonological_cue_resolution() { // Target: "ephemeral" // Weak semantic link - network.add_edge("temporary_concept".to_string(), "ephemeral".to_string(), LinkType::Semantic, 0.3); + network.add_edge( + "temporary_concept".to_string(), + "ephemeral".to_string(), + LinkType::Semantic, + 0.3, + ); // Strong phonological link - network.add_edge("starts_with_eph".to_string(), "ephemeral".to_string(), LinkType::Semantic, 0.85); - network.add_edge("temporary_concept".to_string(), "starts_with_eph".to_string(), LinkType::Semantic, 0.5); + network.add_edge( + "starts_with_eph".to_string(), + "ephemeral".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "temporary_concept".to_string(), + "starts_with_eph".to_string(), + LinkType::Semantic, + 0.5, + ); // Without phonological cue (just semantic) let semantic_only = network.activate("temporary_concept", 1.0); @@ -741,11 +1056,21 @@ fn test_tot_phonological_cue_resolution() { fn test_tot_age_related_increase() { // "Young" network - strong connections let mut young_network = ActivationNetwork::new(); - young_network.add_edge("cue".to_string(), "target_word".to_string(), LinkType::Semantic, 0.85); + young_network.add_edge( + "cue".to_string(), + "target_word".to_string(), + LinkType::Semantic, + 0.85, + ); // "Older" network - weakened connections let mut older_network = ActivationNetwork::new(); - older_network.add_edge("cue".to_string(), "target_word".to_string(), LinkType::Semantic, 0.45); + older_network.add_edge( + "cue".to_string(), + "target_word".to_string(), + LinkType::Semantic, + 0.45, + ); let young_results = young_network.activate("cue", 1.0); let older_results = older_network.activate("cue", 1.0); @@ -778,8 +1103,18 @@ fn test_tot_blocking_effect() { let mut network = ActivationNetwork::new(); // Target and blocker both connected to cue - network.add_edge("definition_cue".to_string(), "blocker_word".to_string(), LinkType::Semantic, 0.9); // Strong - network.add_edge("definition_cue".to_string(), "target_word".to_string(), LinkType::Semantic, 0.5); // Weaker + network.add_edge( + "definition_cue".to_string(), + "blocker_word".to_string(), + LinkType::Semantic, + 0.9, + ); // Strong + network.add_edge( + "definition_cue".to_string(), + "target_word".to_string(), + LinkType::Semantic, + 0.5, + ); // Weaker let results = network.activate("definition_cue", 1.0); @@ -819,13 +1154,15 @@ fn test_drm_basic_false_memory() { let mut network = ActivationNetwork::new(); // Study list - all semantically related to "sleep" (the critical lure) - let study_words = ["bed", "rest", "awake", "tired", "dream", "pillow", "blanket", "nap"]; + let study_words = [ + "bed", "rest", "awake", "tired", "dream", "pillow", "blanket", "nap", + ]; // Create associations from study words to the critical lure for word in &study_words { network.add_edge( word.to_string(), - "sleep".to_string(), // Critical lure (never studied) + "sleep".to_string(), // Critical lure (never studied) LinkType::Semantic, 0.7, ); @@ -833,7 +1170,12 @@ fn test_drm_basic_false_memory() { // Also link study words to a study context for word in &study_words { - network.add_edge("study_list".to_string(), word.to_string(), LinkType::Temporal, 0.8); + network.add_edge( + "study_list".to_string(), + word.to_string(), + LinkType::Temporal, + 0.8, + ); } // Activate from study context @@ -856,15 +1198,45 @@ fn test_drm_convergent_activation() { let mut network = ActivationNetwork::new(); // Multiple words converging on critical lure - network.add_edge("cold".to_string(), "hot".to_string(), LinkType::Semantic, 0.8); - network.add_edge("warm".to_string(), "hot".to_string(), LinkType::Semantic, 0.85); - network.add_edge("heat".to_string(), "hot".to_string(), LinkType::Semantic, 0.9); - network.add_edge("burn".to_string(), "hot".to_string(), LinkType::Semantic, 0.75); - network.add_edge("fire".to_string(), "hot".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "cold".to_string(), + "hot".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "warm".to_string(), + "hot".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "heat".to_string(), + "hot".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "burn".to_string(), + "hot".to_string(), + LinkType::Semantic, + 0.75, + ); + network.add_edge( + "fire".to_string(), + "hot".to_string(), + LinkType::Semantic, + 0.8, + ); // Study context for word in ["cold", "warm", "heat", "burn", "fire"] { - network.add_edge("study_context".to_string(), word.to_string(), LinkType::Temporal, 0.8); + network.add_edge( + "study_context".to_string(), + word.to_string(), + LinkType::Temporal, + 0.8, + ); } let results = network.activate("study_context", 1.0); @@ -894,20 +1266,80 @@ fn test_drm_semantic_relatedness() { let mut network = ActivationNetwork::new(); // Strongly related list - network.add_edge("strong_list".to_string(), "nurse".to_string(), LinkType::Temporal, 0.8); - network.add_edge("strong_list".to_string(), "hospital".to_string(), LinkType::Temporal, 0.8); - network.add_edge("strong_list".to_string(), "medicine".to_string(), LinkType::Temporal, 0.8); - network.add_edge("nurse".to_string(), "doctor".to_string(), LinkType::Semantic, 0.9); - network.add_edge("hospital".to_string(), "doctor".to_string(), LinkType::Semantic, 0.85); - network.add_edge("medicine".to_string(), "doctor".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "strong_list".to_string(), + "nurse".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "strong_list".to_string(), + "hospital".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "strong_list".to_string(), + "medicine".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "nurse".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "hospital".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "medicine".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.8, + ); // Weakly related list - network.add_edge("weak_list".to_string(), "white".to_string(), LinkType::Temporal, 0.8); - network.add_edge("weak_list".to_string(), "smart".to_string(), LinkType::Temporal, 0.8); - network.add_edge("weak_list".to_string(), "office".to_string(), LinkType::Temporal, 0.8); - network.add_edge("white".to_string(), "doctor".to_string(), LinkType::Semantic, 0.3); // Weak - network.add_edge("smart".to_string(), "doctor".to_string(), LinkType::Semantic, 0.25); // Weak - network.add_edge("office".to_string(), "doctor".to_string(), LinkType::Semantic, 0.2); // Weak + network.add_edge( + "weak_list".to_string(), + "white".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "weak_list".to_string(), + "smart".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "weak_list".to_string(), + "office".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "white".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.3, + ); // Weak + network.add_edge( + "smart".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.25, + ); // Weak + network.add_edge( + "office".to_string(), + "doctor".to_string(), + LinkType::Semantic, + 0.2, + ); // Weak let strong_results = network.activate("strong_list", 1.0); let weak_results = network.activate("weak_list", 1.0); @@ -940,11 +1372,26 @@ fn test_drm_source_monitoring() { let mut network = ActivationNetwork::new(); // Studied word - network.add_edge("study_session".to_string(), "actually_studied".to_string(), LinkType::Temporal, 0.85); + network.add_edge( + "study_session".to_string(), + "actually_studied".to_string(), + LinkType::Temporal, + 0.85, + ); // Critical lure (activated through association, not direct study) - network.add_edge("study_session".to_string(), "related_word".to_string(), LinkType::Temporal, 0.8); - network.add_edge("related_word".to_string(), "critical_lure".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "study_session".to_string(), + "related_word".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "related_word".to_string(), + "critical_lure".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("study_session", 1.0); @@ -963,10 +1410,16 @@ fn test_drm_source_monitoring() { // Both should have activation (source confusion) assert!(studied_activation > 0.0, "Studied word should be activated"); - assert!(lure_activation > 0.0, "Lure should also be activated, creating potential source confusion"); + assert!( + lure_activation > 0.0, + "Lure should also be activated, creating potential source confusion" + ); // The lure should have distance > 1 (indirect) but this is the only way to distinguish - let lure_result = results.iter().find(|r| r.memory_id == "critical_lure").unwrap(); + let lure_result = results + .iter() + .find(|r| r.memory_id == "critical_lure") + .unwrap(); assert!( lure_result.distance > 1, "Lure came through indirect activation (distance {}), but feels like direct memory", @@ -982,31 +1435,117 @@ fn test_drm_list_length_effect() { let mut network = ActivationNetwork::new(); // Short list - network.add_edge("short_list".to_string(), "word1".to_string(), LinkType::Temporal, 0.8); - network.add_edge("short_list".to_string(), "word2".to_string(), LinkType::Temporal, 0.8); - network.add_edge("word1".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word2".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); + network.add_edge( + "short_list".to_string(), + "word1".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "short_list".to_string(), + "word2".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "word1".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word2".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); // Long list - network.add_edge("long_list".to_string(), "word_a".to_string(), LinkType::Temporal, 0.8); - network.add_edge("long_list".to_string(), "word_b".to_string(), LinkType::Temporal, 0.8); - network.add_edge("long_list".to_string(), "word_c".to_string(), LinkType::Temporal, 0.8); - network.add_edge("long_list".to_string(), "word_d".to_string(), LinkType::Temporal, 0.8); - network.add_edge("long_list".to_string(), "word_e".to_string(), LinkType::Temporal, 0.8); - network.add_edge("long_list".to_string(), "word_f".to_string(), LinkType::Temporal, 0.8); - network.add_edge("word_a".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_b".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_c".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_d".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_e".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); - network.add_edge("word_f".to_string(), "lure".to_string(), LinkType::Semantic, 0.7); + network.add_edge( + "long_list".to_string(), + "word_a".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "long_list".to_string(), + "word_b".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "long_list".to_string(), + "word_c".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "long_list".to_string(), + "word_d".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "long_list".to_string(), + "word_e".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "long_list".to_string(), + "word_f".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "word_a".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_b".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_c".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_d".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_e".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "word_f".to_string(), + "lure".to_string(), + LinkType::Semantic, + 0.7, + ); let short_results = network.activate("short_list", 1.0); let long_results = network.activate("long_list", 1.0); // Count total activation paths to lure - let short_lure_count = short_results.iter().filter(|r| r.memory_id == "lure").count(); - let long_lure_count = long_results.iter().filter(|r| r.memory_id == "lure").count(); + let short_lure_count = short_results + .iter() + .filter(|r| r.memory_id == "lure") + .count(); + let long_lure_count = long_results + .iter() + .filter(|r| r.memory_id == "lure") + .count(); assert!( long_lure_count >= short_lure_count, @@ -1029,10 +1568,20 @@ fn test_interference_proactive() { let mut network = ActivationNetwork::new(); // Old learning (List A paired associates) - network.add_edge("cue_word".to_string(), "old_response".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "cue_word".to_string(), + "old_response".to_string(), + LinkType::Semantic, + 0.8, + ); // New learning (List B with same cues) - network.add_edge("cue_word".to_string(), "new_response".to_string(), LinkType::Semantic, 0.5); // Weaker - harder to learn + network.add_edge( + "cue_word".to_string(), + "new_response".to_string(), + LinkType::Semantic, + 0.5, + ); // Weaker - harder to learn let results = network.activate("cue_word", 1.0); @@ -1065,10 +1614,20 @@ fn test_interference_retroactive() { let mut network = ActivationNetwork::new(); // Original learning - network.add_edge("stimulus".to_string(), "original_memory".to_string(), LinkType::Semantic, 0.7); + network.add_edge( + "stimulus".to_string(), + "original_memory".to_string(), + LinkType::Semantic, + 0.7, + ); // Interpolated learning (new, stronger) - network.add_edge("stimulus".to_string(), "new_memory".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "stimulus".to_string(), + "new_memory".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("stimulus", 1.0); @@ -1101,12 +1660,32 @@ fn test_interference_similarity_based() { let mut network = ActivationNetwork::new(); // Similar competing memories - network.add_edge("topic".to_string(), "similar_fact_1".to_string(), LinkType::Semantic, 0.75); - network.add_edge("topic".to_string(), "similar_fact_2".to_string(), LinkType::Semantic, 0.73); - network.add_edge("topic".to_string(), "similar_fact_3".to_string(), LinkType::Semantic, 0.71); + network.add_edge( + "topic".to_string(), + "similar_fact_1".to_string(), + LinkType::Semantic, + 0.75, + ); + network.add_edge( + "topic".to_string(), + "similar_fact_2".to_string(), + LinkType::Semantic, + 0.73, + ); + network.add_edge( + "topic".to_string(), + "similar_fact_3".to_string(), + LinkType::Semantic, + 0.71, + ); // Dissimilar memory (should be easier to distinguish) - network.add_edge("topic".to_string(), "dissimilar_fact".to_string(), LinkType::Semantic, 0.80); + network.add_edge( + "topic".to_string(), + "dissimilar_fact".to_string(), + LinkType::Semantic, + 0.80, + ); let results = network.activate("topic", 1.0); @@ -1160,13 +1739,23 @@ fn test_interference_fan_effect() { // Low fan: concept with few associations let mut low_fan_network = ActivationNetwork::with_config(config.clone()); - low_fan_network.add_edge("low_fan_concept".to_string(), "fact_1".to_string(), LinkType::Semantic, 0.9); - low_fan_network.add_edge("low_fan_concept".to_string(), "fact_2".to_string(), LinkType::Semantic, 0.85); + low_fan_network.add_edge( + "low_fan_concept".to_string(), + "fact_1".to_string(), + LinkType::Semantic, + 0.9, + ); + low_fan_network.add_edge( + "low_fan_concept".to_string(), + "fact_2".to_string(), + LinkType::Semantic, + 0.85, + ); // High fan: concept with many associations let mut high_fan_network = ActivationNetwork::with_config(config); for i in 1..=8 { - let strength = 0.9 - (i as f64 * 0.05); // Decreasing strength due to fan + let strength = 0.9 - (i as f64 * 0.05); // Decreasing strength due to fan high_fan_network.add_edge( "high_fan_concept".to_string(), format!("fact_{}", i), @@ -1179,16 +1768,16 @@ fn test_interference_fan_effect() { let high_results = high_fan_network.activate("high_fan_concept", 1.0); // Average activation for low fan - let low_avg: f64 = low_results.iter().map(|r| r.activation).sum::() - / low_results.len().max(1) as f64; + let low_avg: f64 = + low_results.iter().map(|r| r.activation).sum::() / low_results.len().max(1) as f64; // Average activation for high fan - let high_avg: f64 = high_results.iter().map(|r| r.activation).sum::() - / high_results.len().max(1) as f64; + let high_avg: f64 = + high_results.iter().map(|r| r.activation).sum::() / high_results.len().max(1) as f64; // Low fan should have higher average activation (less interference) assert!( - low_avg >= high_avg * 0.8, // Allow some tolerance + low_avg >= high_avg * 0.8, // Allow some tolerance "Low fan concept should have higher average activation: low={}, high={}", low_avg, high_avg @@ -1203,12 +1792,32 @@ fn test_interference_release_from_pi() { let mut network = ActivationNetwork::new(); // Build up PI with category A items - network.add_edge("trial_1".to_string(), "category_a_item_1".to_string(), LinkType::Temporal, 0.7); - network.add_edge("trial_2".to_string(), "category_a_item_2".to_string(), LinkType::Temporal, 0.6); // PI building - network.add_edge("trial_3".to_string(), "category_a_item_3".to_string(), LinkType::Temporal, 0.5); // More PI + network.add_edge( + "trial_1".to_string(), + "category_a_item_1".to_string(), + LinkType::Temporal, + 0.7, + ); + network.add_edge( + "trial_2".to_string(), + "category_a_item_2".to_string(), + LinkType::Temporal, + 0.6, + ); // PI building + network.add_edge( + "trial_3".to_string(), + "category_a_item_3".to_string(), + LinkType::Temporal, + 0.5, + ); // More PI // Category shift (release from PI) - network.add_edge("trial_4".to_string(), "category_b_item_1".to_string(), LinkType::Temporal, 0.85); // Recovery + network.add_edge( + "trial_4".to_string(), + "category_b_item_1".to_string(), + LinkType::Temporal, + 0.85, + ); // Recovery let trial_3_results = network.activate("trial_3", 1.0); let trial_4_results = network.activate("trial_4", 1.0); diff --git a/tests/e2e/tests/cognitive/spreading_activation_tests.rs b/tests/e2e/tests/cognitive/spreading_activation_tests.rs index 78b5fcb..2f91ffe 100644 --- a/tests/e2e/tests/cognitive/spreading_activation_tests.rs +++ b/tests/e2e/tests/cognitive/spreading_activation_tests.rs @@ -5,10 +5,10 @@ //! //! Based on Collins & Loftus (1975) spreading activation theory. +use std::collections::HashSet; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; -use std::collections::HashSet; // ============================================================================ // MULTI-HOP ASSOCIATION TESTS (6 tests) @@ -41,9 +41,7 @@ fn test_spreading_finds_hidden_chains() { let results = network.activate("rust_async", 1.0); // Should find "green_threads" through the chain - let found_green_threads = results - .iter() - .any(|r| r.memory_id == "green_threads"); + let found_green_threads = results.iter().any(|r| r.memory_id == "green_threads"); assert!( found_green_threads, @@ -71,9 +69,24 @@ fn test_spreading_3_hop_discovery() { let mut network = ActivationNetwork::with_config(config); // Create a 3-hop chain: A -> B -> C -> D - network.add_edge("memory_a".to_string(), "memory_b".to_string(), LinkType::Semantic, 0.9); - network.add_edge("memory_b".to_string(), "memory_c".to_string(), LinkType::Semantic, 0.9); - network.add_edge("memory_c".to_string(), "memory_d".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "memory_a".to_string(), + "memory_b".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "memory_b".to_string(), + "memory_c".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "memory_c".to_string(), + "memory_d".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("memory_a", 1.0); @@ -147,8 +160,18 @@ fn test_spreading_beats_similarity_search() { fn test_spreading_path_tracking() { let mut network = ActivationNetwork::new(); - network.add_edge("start".to_string(), "middle".to_string(), LinkType::Semantic, 0.9); - network.add_edge("middle".to_string(), "end".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "start".to_string(), + "middle".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "middle".to_string(), + "end".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("start", 1.0); @@ -167,10 +190,30 @@ fn test_spreading_convergent_activation() { let mut network = ActivationNetwork::new(); // Create convergent paths: A -> B -> D and A -> C -> D - network.add_edge("source".to_string(), "path1".to_string(), LinkType::Semantic, 0.8); - network.add_edge("source".to_string(), "path2".to_string(), LinkType::Semantic, 0.8); - network.add_edge("path1".to_string(), "target".to_string(), LinkType::Semantic, 0.8); - network.add_edge("path2".to_string(), "target".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "source".to_string(), + "path1".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "source".to_string(), + "path2".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "path1".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "path2".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.8, + ); let results = network.activate("source", 1.0); @@ -244,13 +287,35 @@ fn test_activation_decay_per_hop() { let results = network.activate("a", 1.0); - let b_activation = results.iter().find(|r| r.memory_id == "b").map(|r| r.activation).unwrap_or(0.0); - let c_activation = results.iter().find(|r| r.memory_id == "c").map(|r| r.activation).unwrap_or(0.0); - let d_activation = results.iter().find(|r| r.memory_id == "d").map(|r| r.activation).unwrap_or(0.0); + let b_activation = results + .iter() + .find(|r| r.memory_id == "b") + .map(|r| r.activation) + .unwrap_or(0.0); + let c_activation = results + .iter() + .find(|r| r.memory_id == "c") + .map(|r| r.activation) + .unwrap_or(0.0); + let d_activation = results + .iter() + .find(|r| r.memory_id == "d") + .map(|r| r.activation) + .unwrap_or(0.0); // Each hop should reduce activation by decay factor (0.7) - assert!(b_activation > c_activation, "Activation should decay: b ({}) > c ({})", b_activation, c_activation); - assert!(c_activation > d_activation, "Activation should decay: c ({}) > d ({})", c_activation, d_activation); + assert!( + b_activation > c_activation, + "Activation should decay: b ({}) > c ({})", + b_activation, + c_activation + ); + assert!( + c_activation > d_activation, + "Activation should decay: c ({}) > d ({})", + c_activation, + d_activation + ); // Verify approximate decay rate (allowing for floating point) let ratio_bc = c_activation / b_activation; @@ -289,8 +354,16 @@ fn test_activation_decay_factor_configurable() { let high_results = high_network.activate("a", 1.0); let low_results = low_network.activate("a", 1.0); - let high_c = high_results.iter().find(|r| r.memory_id == "c").map(|r| r.activation).unwrap_or(0.0); - let low_c = low_results.iter().find(|r| r.memory_id == "c").map(|r| r.activation).unwrap_or(0.0); + let high_c = high_results + .iter() + .find(|r| r.memory_id == "c") + .map(|r| r.activation) + .unwrap_or(0.0); + let low_c = low_results + .iter() + .find(|r| r.memory_id == "c") + .map(|r| r.activation) + .unwrap_or(0.0); assert!( high_c > low_c, @@ -320,10 +393,8 @@ fn test_activation_distance_law() { let results = network.activate("n0", 1.0); // Collect activations by distance - let mut activations_by_distance: Vec<(u32, f64)> = results - .iter() - .map(|r| (r.distance, r.activation)) - .collect(); + let mut activations_by_distance: Vec<(u32, f64)> = + results.iter().map(|r| (r.distance, r.activation)).collect(); activations_by_distance.sort_by_key(|(d, _)| *d); // Verify monotonic decrease with distance @@ -559,9 +630,21 @@ fn test_link_type_weights() { let results = network.activate("event", 1.0); // Verify different activations based on edge strength - let semantic_act = results.iter().find(|r| r.memory_id == "semantic_link").map(|r| r.activation).unwrap_or(0.0); - let temporal_act = results.iter().find(|r| r.memory_id == "temporal_link").map(|r| r.activation).unwrap_or(0.0); - let causal_act = results.iter().find(|r| r.memory_id == "causal_link").map(|r| r.activation).unwrap_or(0.0); + let semantic_act = results + .iter() + .find(|r| r.memory_id == "semantic_link") + .map(|r| r.activation) + .unwrap_or(0.0); + let temporal_act = results + .iter() + .find(|r| r.memory_id == "temporal_link") + .map(|r| r.activation) + .unwrap_or(0.0); + let causal_act = results + .iter() + .find(|r| r.memory_id == "causal_link") + .map(|r| r.activation) + .unwrap_or(0.0); // Semantic (0.9) > Causal (0.7) > Temporal (0.5) assert!( @@ -617,10 +700,30 @@ fn test_network_builds_from_semantic_similarity() { // These would typically be built from embedding similarity // Rust async ecosystem - network.add_edge("async_rust".to_string(), "tokio".to_string(), LinkType::Semantic, 0.9); - network.add_edge("async_rust".to_string(), "async_await".to_string(), LinkType::Semantic, 0.95); - network.add_edge("tokio".to_string(), "runtime".to_string(), LinkType::Semantic, 0.8); - network.add_edge("tokio".to_string(), "spawn".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "async_rust".to_string(), + "tokio".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "async_rust".to_string(), + "async_await".to_string(), + LinkType::Semantic, + 0.95, + ); + network.add_edge( + "tokio".to_string(), + "runtime".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "tokio".to_string(), + "spawn".to_string(), + LinkType::Semantic, + 0.85, + ); assert_eq!(network.node_count(), 5); assert_eq!(network.edge_count(), 4); @@ -642,9 +745,24 @@ fn test_network_builds_from_temporal_proximity() { // Events that happened close in time // Morning standup sequence - network.add_edge("standup".to_string(), "jira_update".to_string(), LinkType::Temporal, 0.9); - network.add_edge("jira_update".to_string(), "code_review".to_string(), LinkType::Temporal, 0.85); - network.add_edge("code_review".to_string(), "merge_pr".to_string(), LinkType::Temporal, 0.8); + network.add_edge( + "standup".to_string(), + "jira_update".to_string(), + LinkType::Temporal, + 0.9, + ); + network.add_edge( + "jira_update".to_string(), + "code_review".to_string(), + LinkType::Temporal, + 0.85, + ); + network.add_edge( + "code_review".to_string(), + "merge_pr".to_string(), + LinkType::Temporal, + 0.8, + ); // Verify temporal chain let results = network.activate("standup", 1.0); @@ -748,6 +866,13 @@ fn test_network_batch_construction() { let distance_1: Vec<_> = results.iter().filter(|r| r.distance == 1).collect(); let distance_2: Vec<_> = results.iter().filter(|r| r.distance == 2).collect(); - assert_eq!(distance_1.len(), 3, "Should have 3 nodes at distance 1 (cargo, ownership, traits)"); - assert!(distance_2.len() >= 4, "Should have at least 4 nodes at distance 2"); + assert_eq!( + distance_1.len(), + 3, + "Should have 3 nodes at distance 1 (cargo, ownership, traits)" + ); + assert!( + distance_2.len() >= 4, + "Should have at least 4 nodes at distance 2" + ); } diff --git a/tests/e2e/tests/extreme/adversarial_tests.rs b/tests/e2e/tests/extreme/adversarial_tests.rs index 2fcc042..c179d65 100644 --- a/tests/e2e/tests/extreme/adversarial_tests.rs +++ b/tests/e2e/tests/extreme/adversarial_tests.rs @@ -11,12 +11,12 @@ //! //! Based on security testing principles and fuzzing methodologies +use chrono::Utc; +use vestige_core::neuroscience::hippocampal_index::HippocampalIndex; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; use vestige_core::neuroscience::synaptic_tagging::SynapticTaggingSystem; -use vestige_core::neuroscience::hippocampal_index::HippocampalIndex; -use chrono::Utc; // ============================================================================ // MALFORMED INPUT HANDLING (2 tests) @@ -30,8 +30,18 @@ fn test_adversarial_empty_inputs() { let mut network = ActivationNetwork::new(); // Empty string node IDs - network.add_edge("".to_string(), "target".to_string(), LinkType::Semantic, 0.5); - network.add_edge("source".to_string(), "".to_string(), LinkType::Semantic, 0.5); + network.add_edge( + "".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.5, + ); + network.add_edge( + "source".to_string(), + "".to_string(), + LinkType::Semantic, + 0.5, + ); network.add_edge("".to_string(), "".to_string(), LinkType::Semantic, 0.5); // Should handle gracefully @@ -40,8 +50,18 @@ fn test_adversarial_empty_inputs() { let _ = results.len(); // Whitespace-only IDs - network.add_edge(" ".to_string(), "normal".to_string(), LinkType::Semantic, 0.6); - network.add_edge("\t\n".to_string(), "normal".to_string(), LinkType::Temporal, 0.5); + network.add_edge( + " ".to_string(), + "normal".to_string(), + LinkType::Semantic, + 0.6, + ); + network.add_edge( + "\t\n".to_string(), + "normal".to_string(), + LinkType::Temporal, + 0.5, + ); let whitespace_results = network.activate(" ", 1.0); let _ = whitespace_results.len(); @@ -65,16 +85,24 @@ fn test_adversarial_extremely_long_inputs() { let long_id_1: String = "a".repeat(10000); let long_id_2: String = "b".repeat(10000); - network.add_edge(long_id_1.clone(), long_id_2.clone(), LinkType::Semantic, 0.8); + network.add_edge( + long_id_1.clone(), + long_id_2.clone(), + LinkType::Semantic, + 0.8, + ); // Should handle long IDs let results = network.activate(&long_id_1, 1.0); assert_eq!(results.len(), 1, "Should find connection to long_id_2"); - assert_eq!(results[0].memory_id, long_id_2, "Result should have correct long ID"); + assert_eq!( + results[0].memory_id, long_id_2, + "Result should have correct long ID" + ); // Test with hippocampal index let index = HippocampalIndex::new(); - let very_long_content = "word ".repeat(50000); // ~300KB of text + let very_long_content = "word ".repeat(50000); // ~300KB of text let result = index.index_memory( "long_content_memory", @@ -100,18 +128,18 @@ fn test_adversarial_unicode_handling() { // Various Unicode edge cases let unicode_ids = vec![ - "简体中文", // Chinese - "日本語テキスト", // Japanese - "한국어", // Korean - "مرحبا", // Arabic (RTL) - "שלום", // Hebrew (RTL) - "🦀🔥💯", // Emojis - "Ã̲̊", // Combining characters - "\u{200B}", // Zero-width space - "\u{FEFF}", // BOM - "a\u{0308}", // 'a' with combining umlaut - "🏳️‍🌈", // Emoji sequence with ZWJ - "\u{202E}reversed\u{202C}", // RTL override + "简体中文", // Chinese + "日本語テキスト", // Japanese + "한국어", // Korean + "مرحبا", // Arabic (RTL) + "שלום", // Hebrew (RTL) + "🦀🔥💯", // Emojis + "Ã̲̊", // Combining characters + "\u{200B}", // Zero-width space + "\u{FEFF}", // BOM + "a\u{0308}", // 'a' with combining umlaut + "🏳️‍🌈", // Emoji sequence with ZWJ + "\u{202E}reversed\u{202C}", // RTL override ]; for (i, id) in unicode_ids.iter().enumerate() { @@ -153,13 +181,13 @@ fn test_adversarial_control_characters() { // IDs with embedded control characters let control_ids = vec![ - "before\0after", // Null byte - "line1\nline2", // Newline - "tab\there", // Tab - "return\rhere", // Carriage return - "bell\x07ring", // Bell - "escape\x1B[31m", // ANSI escape - "backspace\x08x", // Backspace + "before\0after", // Null byte + "line1\nline2", // Newline + "tab\there", // Tab + "return\rhere", // Carriage return + "bell\x07ring", // Bell + "escape\x1B[31m", // ANSI escape + "backspace\x08x", // Backspace ]; for (i, id) in control_ids.iter().enumerate() { @@ -227,9 +255,11 @@ fn test_adversarial_weight_boundaries() { let results = network.activate("hub", 1.0); // Higher weights should produce higher activation - let mut activations: Vec<(&str, f64)> = weight_cases.iter() + let mut activations: Vec<(&str, f64)> = weight_cases + .iter() .filter_map(|(name, _)| { - results.iter() + results + .iter() .find(|r| r.memory_id == format!("weight_{}", name)) .map(|r| (*name, r.activation)) }) @@ -249,7 +279,8 @@ fn test_adversarial_weight_boundaries() { } // Zero weight edges might not propagate activation at all - let zero_activation = results.iter() + let zero_activation = results + .iter() .find(|r| r.memory_id == "weight_zero") .map(|r| r.activation); @@ -307,10 +338,7 @@ fn test_adversarial_config_boundaries() { zero_hops_net.add_edge("a".to_string(), "b".to_string(), LinkType::Semantic, 0.9); let zero_results = zero_hops_net.activate("a", 1.0); - assert!( - zero_results.is_empty(), - "Zero max_hops should find nothing" - ); + assert!(zero_results.is_empty(), "Zero max_hops should find nothing"); } // ============================================================================ @@ -332,9 +360,24 @@ fn test_adversarial_cyclic_graphs() { let mut no_cycle_net = ActivationNetwork::with_config(no_cycle_config); // Create a simple cycle: A -> B -> C -> A - no_cycle_net.add_edge("cycle_a".to_string(), "cycle_b".to_string(), LinkType::Semantic, 0.9); - no_cycle_net.add_edge("cycle_b".to_string(), "cycle_c".to_string(), LinkType::Semantic, 0.9); - no_cycle_net.add_edge("cycle_c".to_string(), "cycle_a".to_string(), LinkType::Semantic, 0.9); + no_cycle_net.add_edge( + "cycle_a".to_string(), + "cycle_b".to_string(), + LinkType::Semantic, + 0.9, + ); + no_cycle_net.add_edge( + "cycle_b".to_string(), + "cycle_c".to_string(), + LinkType::Semantic, + 0.9, + ); + no_cycle_net.add_edge( + "cycle_c".to_string(), + "cycle_a".to_string(), + LinkType::Semantic, + 0.9, + ); let start = std::time::Instant::now(); let results = no_cycle_net.activate("cycle_a", 1.0); @@ -387,10 +430,20 @@ fn test_adversarial_self_loops() { let mut network = ActivationNetwork::new(); // Create self-loop - network.add_edge("self_loop".to_string(), "self_loop".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "self_loop".to_string(), + "self_loop".to_string(), + LinkType::Semantic, + 0.9, + ); // Also connect to other nodes - network.add_edge("self_loop".to_string(), "other".to_string(), LinkType::Semantic, 0.7); + network.add_edge( + "self_loop".to_string(), + "other".to_string(), + LinkType::Semantic, + 0.7, + ); let start = std::time::Instant::now(); let results = network.activate("self_loop", 1.0); @@ -423,7 +476,12 @@ fn test_adversarial_special_numeric_values() { // We're testing that the system doesn't crash // Normal edge for baseline - network.add_edge("normal".to_string(), "target".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "normal".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.8, + ); // Test activation with edge case values // (The implementation should clamp or validate these) @@ -457,5 +515,8 @@ fn test_adversarial_special_numeric_values() { // Edge should still exist and be valid let assoc = network.get_associations("normal"); - assert!(!assoc.is_empty(), "Edge should still exist after negative reinforce attempt"); + assert!( + !assoc.is_empty(), + "Edge should still exist after negative reinforce attempt" + ); } diff --git a/tests/e2e/tests/extreme/chaos_tests.rs b/tests/e2e/tests/extreme/chaos_tests.rs index 86f1dd6..5811f6a 100644 --- a/tests/e2e/tests/extreme/chaos_tests.rs +++ b/tests/e2e/tests/extreme/chaos_tests.rs @@ -13,15 +13,13 @@ //! Based on Chaos Engineering principles (Netflix, 2011) use chrono::{Duration, Utc}; +use vestige_core::neuroscience::hippocampal_index::{HippocampalIndex, IndexQuery}; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; use vestige_core::neuroscience::synaptic_tagging::{ CaptureWindow, ImportanceEvent, SynapticTaggingConfig, SynapticTaggingSystem, }; -use vestige_core::neuroscience::hippocampal_index::{ - HippocampalIndex, IndexQuery, -}; // ============================================================================ // RANDOM OPERATION SEQUENCE TESTS (2 tests) @@ -68,11 +66,7 @@ fn test_chaos_random_operation_sequence() { // Interleave reinforcement if i >= 7 { - network2.reinforce_edge( - &format!("node_{}", i - 7), - &format!("node_{}", i % 50), - 0.1, - ); + network2.reinforce_edge(&format!("node_{}", i - 7), &format!("node_{}", i % 50), 0.1); } } @@ -135,7 +129,10 @@ fn test_chaos_add_remove_cycles() { // Verify system still works let results = network.activate(&format!("stable_{}", cycle % 20), 1.0); - assert!(!results.is_empty(), "System should remain functional during chaos"); + assert!( + !results.is_empty(), + "System should remain functional during chaos" + ); } // Final activation should still work @@ -229,7 +226,12 @@ fn test_chaos_continuous_growth_under_load() { let mut network = ActivationNetwork::new(); // Initial seed - network.add_edge("root".to_string(), "child_0".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "root".to_string(), + "child_0".to_string(), + LinkType::Semantic, + 0.8, + ); // Continuously grow while querying for iteration in 0..500 { @@ -270,10 +272,7 @@ fn test_chaos_continuous_growth_under_load() { ); let final_results = network.activate("root", 1.0); - assert!( - !final_results.is_empty(), - "Final activation should succeed" - ); + assert!(!final_results.is_empty(), "Final activation should succeed"); } // ============================================================================ @@ -286,8 +285,8 @@ fn test_chaos_continuous_growth_under_load() { #[test] fn test_chaos_deep_chain_handling() { let config = ActivationConfig { - decay_factor: 0.95, // High to allow deep traversal - max_hops: 100, // Allow deep exploration + decay_factor: 0.95, // High to allow deep traversal + max_hops: 100, // Allow deep exploration min_threshold: 0.001, // Low threshold allow_cycles: false, }; @@ -299,7 +298,7 @@ fn test_chaos_deep_chain_handling() { format!("deep_{}", i), format!("deep_{}", i + 1), LinkType::Semantic, - 0.99, // Very strong links + 0.99, // Very strong links ); } @@ -389,21 +388,21 @@ fn test_chaos_high_fanout_handling() { /// Validates that the capture window handles edge cases correctly. #[test] fn test_chaos_capture_window_edge_cases() { - let window = CaptureWindow::new(9.0, 2.0); // 9 hours back, 2 forward + let window = CaptureWindow::new(9.0, 2.0); // 9 hours back, 2 forward let event_time = Utc::now(); // Test exact boundary conditions let test_cases = vec![ // (hours offset, expected in window) - (0.0, true), // Exactly at event - (8.99, true), // Just inside back window - (9.0, true), // At back boundary - (9.01, false), // Just outside back window - (-1.99, true), // Just inside forward window - (-2.0, true), // At forward boundary - (-2.01, false), // Just outside forward window - (100.0, false), // Way outside - (-100.0, false), // Way outside forward + (0.0, true), // Exactly at event + (8.99, true), // Just inside back window + (9.0, true), // At back boundary + (9.01, false), // Just outside back window + (-1.99, true), // Just inside forward window + (-2.0, true), // At forward boundary + (-2.01, false), // Just outside forward window + (100.0, false), // Way outside + (-100.0, false), // Way outside forward ]; for (hours_offset, expected) in test_cases { @@ -441,7 +440,7 @@ fn test_chaos_ancient_memories() { let mut stc = SynapticTaggingSystem::with_config(config); // Tag memories at various ages - stc.tag_memory("very_old"); // Will be tagged "now" for testing + stc.tag_memory("very_old"); // Will be tagged "now" for testing stc.tag_memory("old"); stc.tag_memory("recent"); @@ -478,11 +477,17 @@ fn test_chaos_isolated_subsystem_failures() { // Query non-existent node should return empty, not crash let results = network.activate("nonexistent", 1.0); - assert!(results.is_empty(), "Non-existent node should return empty results"); + assert!( + results.is_empty(), + "Non-existent node should return empty results" + ); // System should still work after "failed" query let valid_results = network.activate("a", 1.0); - assert!(!valid_results.is_empty(), "System should work after handling missing node"); + assert!( + !valid_results.is_empty(), + "System should work after handling missing node" + ); // Test 2: STC with edge case inputs let mut stc = SynapticTaggingSystem::new(); diff --git a/tests/e2e/tests/extreme/mathematical_tests.rs b/tests/e2e/tests/extreme/mathematical_tests.rs index 7a9aadc..e2d7f8c 100644 --- a/tests/e2e/tests/extreme/mathematical_tests.rs +++ b/tests/e2e/tests/extreme/mathematical_tests.rs @@ -9,14 +9,14 @@ //! //! Based on mathematical foundations of memory systems and neuroscience -use vestige_core::neuroscience::spreading_activation::{ - ActivationConfig, ActivationNetwork, LinkType, -}; +use chrono::{Duration, Utc}; +use std::collections::HashMap; use vestige_core::neuroscience::hippocampal_index::{ BarcodeGenerator, HippocampalIndex, INDEX_EMBEDDING_DIM, }; -use chrono::{Duration, Utc}; -use std::collections::HashMap; +use vestige_core::neuroscience::spreading_activation::{ + ActivationConfig, ActivationNetwork, LinkType, +}; // ============================================================================ // EXPONENTIAL DECAY VALIDATION (1 test) @@ -43,7 +43,7 @@ fn test_math_exponential_decay_law() { format!("node_{}", i), format!("node_{}", i + 1), LinkType::Semantic, - 1.0, // Unit weight to isolate decay effect + 1.0, // Unit weight to isolate decay effect ); } @@ -218,10 +218,10 @@ fn test_math_activation_bounds() { // Total activation should be bounded // (for a tree with decay d, total <= 1 / (1 - d) for geometric series) let total_activation: f64 = results.iter().map(|r| r.activation).sum(); - let theoretical_max = 1.0 / (1.0 - 0.8); // = 5.0 for infinite series + let theoretical_max = 1.0 / (1.0 - 0.8); // = 5.0 for infinite series assert!( - total_activation < theoretical_max * 3.0, // Allow margin for fan-out and multi-source + total_activation < theoretical_max * 3.0, // Allow margin for fan-out and multi-source "Total activation should be bounded: {} < {}", total_activation, theoretical_max * 3.0 @@ -276,7 +276,8 @@ fn test_math_barcode_statistics() { // Test 3: Content fingerprints should be mostly unique // (with 10000 samples, collision probability is low for good hash) - let unique_fingerprints: std::collections::HashSet = fingerprints.iter().copied().collect(); + let unique_fingerprints: std::collections::HashSet = + fingerprints.iter().copied().collect(); let uniqueness_ratio = unique_fingerprints.len() as f64 / num_barcodes as f64; assert!( @@ -322,9 +323,7 @@ fn test_math_embedding_dimensions() { let now = Utc::now(); // Create full-size embedding (384 dimensions) - let full_embedding: Vec = (0..384) - .map(|i| (i as f32 / 384.0).sin()) - .collect(); + let full_embedding: Vec = (0..384).map(|i| (i as f32 / 384.0).sin()).collect(); // Index memory with embedding let result = index.index_memory( @@ -340,8 +339,7 @@ fn test_math_embedding_dimensions() { // Verify index stats show correct dimensions let stats = index.stats(); assert_eq!( - stats.index_dimensions, - INDEX_EMBEDDING_DIM, + stats.index_dimensions, INDEX_EMBEDDING_DIM, "Index should use compressed embedding dimension ({})", INDEX_EMBEDDING_DIM ); diff --git a/tests/e2e/tests/extreme/proof_of_superiority.rs b/tests/e2e/tests/extreme/proof_of_superiority.rs index 7875a7e..a63acc1 100644 --- a/tests/e2e/tests/extreme/proof_of_superiority.rs +++ b/tests/e2e/tests/extreme/proof_of_superiority.rs @@ -10,6 +10,10 @@ //! Each test demonstrates a capability that traditional systems cannot match. use chrono::{Duration, Utc}; +use std::collections::{HashMap, HashSet}; +use vestige_core::neuroscience::hippocampal_index::{ + HippocampalIndex, INDEX_EMBEDDING_DIM, IndexQuery, +}; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; @@ -17,10 +21,6 @@ use vestige_core::neuroscience::synaptic_tagging::{ CaptureWindow, ImportanceEvent, ImportanceEventType, SynapticTaggingConfig, SynapticTaggingSystem, }; -use vestige_core::neuroscience::hippocampal_index::{ - HippocampalIndex, IndexQuery, INDEX_EMBEDDING_DIM, -}; -use std::collections::{HashMap, HashSet}; // ============================================================================ // RETROACTIVE IMPORTANCE - UNIQUE TO VESTIGE (1 test) @@ -43,7 +43,7 @@ fn test_proof_retroactive_importance_unique() { min_tag_strength: 0.2, max_cluster_size: 100, enable_clustering: true, - auto_decay: false, // Disable for test stability + auto_decay: false, // Disable for test stability cleanup_interval_hours: 24.0, }; @@ -75,7 +75,7 @@ fn test_proof_retroactive_importance_unique() { event_type: ImportanceEventType::EmotionalContent, memory_id: Some("bob_departure".to_string()), timestamp: Utc::now(), - strength: 1.0, // Maximum importance + strength: 1.0, // Maximum importance context: Some("BREAKING: Bob is leaving the company!".to_string()), }; @@ -90,7 +90,8 @@ fn test_proof_retroactive_importance_unique() { ); // 2. Earlier Bob-related memories should be captured - let captured_ids: HashSet<_> = capture_result.captured_memories + let captured_ids: HashSet<_> = capture_result + .captured_memories .iter() .map(|c| c.memory_id.as_str()) .collect(); @@ -170,20 +171,51 @@ fn test_proof_multi_hop_beats_similarity() { let mut network = ActivationNetwork::with_config(config); // Create the knowledge chain (domain knowledge graph) - network.add_edge("memory_leaks".to_string(), "reference_counting".to_string(), LinkType::Causal, 0.9); - network.add_edge("reference_counting".to_string(), "arc_weak".to_string(), LinkType::Semantic, 0.85); - network.add_edge("arc_weak".to_string(), "cyclic_references".to_string(), LinkType::Semantic, 0.9); - network.add_edge("cyclic_references".to_string(), "solution_weak_refs".to_string(), LinkType::Semantic, 0.95); + network.add_edge( + "memory_leaks".to_string(), + "reference_counting".to_string(), + LinkType::Causal, + 0.9, + ); + network.add_edge( + "reference_counting".to_string(), + "arc_weak".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "arc_weak".to_string(), + "cyclic_references".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "cyclic_references".to_string(), + "solution_weak_refs".to_string(), + LinkType::Semantic, + 0.95, + ); // Also add some direct but less relevant connections - network.add_edge("memory_leaks".to_string(), "valgrind".to_string(), LinkType::Semantic, 0.7); - network.add_edge("memory_leaks".to_string(), "profiling".to_string(), LinkType::Semantic, 0.6); + network.add_edge( + "memory_leaks".to_string(), + "valgrind".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "memory_leaks".to_string(), + "profiling".to_string(), + LinkType::Semantic, + 0.6, + ); // === SPREADING ACTIVATION SEARCH === let spreading_results = network.activate("memory_leaks", 1.0); // Collect what spreading activation found - let spreading_found: HashSet<_> = spreading_results.iter() + let spreading_found: HashSet<_> = spreading_results + .iter() .map(|r| r.memory_id.as_str()) .collect(); @@ -198,7 +230,9 @@ fn test_proof_multi_hop_beats_similarity() { impl MockSimilaritySearch { fn search(&self, query: &str, top_k: usize) -> Vec<(&str, f64)> { let query_emb = self.embeddings.get(query).unwrap(); - let mut results: Vec<_> = self.embeddings.iter() + let mut results: Vec<_> = self + .embeddings + .iter() .filter(|(k, _)| k.as_str() != query) .map(|(k, emb)| { let sim = cosine_sim(query_emb, emb); @@ -223,17 +257,27 @@ fn test_proof_multi_hop_beats_similarity() { } // Create mock embeddings where memory_leaks and cyclic_references are ORTHOGONAL - let mut mock = MockSimilaritySearch { embeddings: HashMap::new() }; - mock.embeddings.insert("memory_leaks".to_string(), vec![1.0, 0.0, 0.0, 0.0]); - mock.embeddings.insert("reference_counting".to_string(), vec![0.7, 0.7, 0.0, 0.0]); - mock.embeddings.insert("arc_weak".to_string(), vec![0.0, 0.7, 0.7, 0.0]); - mock.embeddings.insert("cyclic_references".to_string(), vec![0.0, 0.0, 0.0, 1.0]); // ORTHOGONAL! - mock.embeddings.insert("solution_weak_refs".to_string(), vec![0.0, 0.0, 0.2, 0.9]); - mock.embeddings.insert("valgrind".to_string(), vec![0.8, 0.2, 0.0, 0.0]); // Similar - mock.embeddings.insert("profiling".to_string(), vec![0.6, 0.4, 0.0, 0.0]); // Similar + let mut mock = MockSimilaritySearch { + embeddings: HashMap::new(), + }; + mock.embeddings + .insert("memory_leaks".to_string(), vec![1.0, 0.0, 0.0, 0.0]); + mock.embeddings + .insert("reference_counting".to_string(), vec![0.7, 0.7, 0.0, 0.0]); + mock.embeddings + .insert("arc_weak".to_string(), vec![0.0, 0.7, 0.7, 0.0]); + mock.embeddings + .insert("cyclic_references".to_string(), vec![0.0, 0.0, 0.0, 1.0]); // ORTHOGONAL! + mock.embeddings + .insert("solution_weak_refs".to_string(), vec![0.0, 0.0, 0.2, 0.9]); + mock.embeddings + .insert("valgrind".to_string(), vec![0.8, 0.2, 0.0, 0.0]); // Similar + mock.embeddings + .insert("profiling".to_string(), vec![0.6, 0.4, 0.0, 0.0]); // Similar let similarity_results = mock.search("memory_leaks", 10); - let similarity_found: HashSet<_> = similarity_results.iter() + let similarity_found: HashSet<_> = similarity_results + .iter() .filter(|(_, sim)| *sim > 0.3) .map(|(id, _)| *id) .collect(); @@ -257,13 +301,16 @@ fn test_proof_multi_hop_beats_similarity() { ); // Verify the discovery path - let solution_result = spreading_results.iter() + let solution_result = spreading_results + .iter() .find(|r| r.memory_id == "solution_weak_refs") .expect("Should find solution"); assert_eq!(solution_result.distance, 4, "Solution is 4 hops away"); assert!( - solution_result.path.contains(&"cyclic_references".to_string()), + solution_result + .path + .contains(&"cyclic_references".to_string()), "Path should include cyclic_references" ); } @@ -291,8 +338,12 @@ fn test_proof_hippocampal_indexing_efficiency() { let _ = index.index_memory( &format!("memory_{}", i), - &format!("This is memory number {} with content about topic {} and subtopic {}", - i, i % 50, i % 10), + &format!( + "This is memory number {} with content about topic {} and subtopic {}", + i, + i % 50, + i % 10 + ), "fact", now, Some(embedding), @@ -356,7 +407,7 @@ fn test_proof_hippocampal_indexing_efficiency() { ); // 5. Memory efficiency - let memory_per_full = 384 * 4; // 384 floats * 4 bytes + let memory_per_full = 384 * 4; // 384 floats * 4 bytes let memory_per_index = INDEX_EMBEDDING_DIM * 4; let savings_per_memory = memory_per_full - memory_per_index; let total_savings = savings_per_memory * NUM_MEMORIES; @@ -389,10 +440,10 @@ fn test_proof_temporal_capture_accuracy() { // Memories encoded BEFORE the important event can be captured let backward_tests = vec![ - (Duration::hours(1), true, 1.0), // 1h before - should be captured with high prob - (Duration::hours(4), true, 0.9), // 4h before - should be captured - (Duration::hours(8), true, 0.5), // 8h before - edge of window - (Duration::hours(9), true, 0.0), // 9h before - at boundary + (Duration::hours(1), true, 1.0), // 1h before - should be captured with high prob + (Duration::hours(4), true, 0.9), // 4h before - should be captured + (Duration::hours(8), true, 0.5), // 8h before - edge of window + (Duration::hours(9), true, 0.0), // 9h before - at boundary (Duration::hours(10), false, 0.0), // 10h before - outside window ]; @@ -401,7 +452,8 @@ fn test_proof_temporal_capture_accuracy() { let in_window = window.is_in_window(memory_time, event_time); assert_eq!( - in_window, *should_be_in_window, + in_window, + *should_be_in_window, "PROOF: Memory {}h before event: in_window={}, expected={}", offset.num_hours(), in_window, @@ -421,10 +473,10 @@ fn test_proof_temporal_capture_accuracy() { // Brief period for memories encoded shortly after let forward_tests = vec![ - (Duration::minutes(30), true), // 30min after - in window - (Duration::hours(1), true), // 1h after - in window - (Duration::hours(2), true), // 2h after - at boundary - (Duration::hours(3), false), // 3h after - outside + (Duration::minutes(30), true), // 30min after - in window + (Duration::hours(1), true), // 1h after - in window + (Duration::hours(2), true), // 2h after - at boundary + (Duration::hours(3), false), // 3h after - outside ]; for (offset, should_be_in_window) in &forward_tests { @@ -432,7 +484,8 @@ fn test_proof_temporal_capture_accuracy() { let in_window = window.is_in_window(memory_time, event_time); assert_eq!( - in_window, *should_be_in_window, + in_window, + *should_be_in_window, "PROOF: Memory {}min after event: in_window={}, expected={}", offset.num_minutes(), in_window, @@ -472,7 +525,10 @@ fn test_proof_comprehensive_capability_summary() { let result = stc.trigger_prp(event); let has_retroactive = result.has_captures(); - assert!(has_retroactive, "Capability 1: Retroactive importance - PROVEN"); + assert!( + has_retroactive, + "Capability 1: Retroactive importance - PROVEN" + ); // === CAPABILITY 2: Multi-Hop Discovery === // Traditional: NO (1-hop only) | Vestige: YES (configurable depth) @@ -492,25 +548,36 @@ fn test_proof_comprehensive_capability_summary() { let results = network.activate("a", 1.0); let max_distance = results.iter().map(|r| r.distance).max().unwrap_or(0); - assert!(max_distance >= 4, "Capability 2: Multi-hop discovery (4+ hops) - PROVEN"); + assert!( + max_distance >= 4, + "Capability 2: Multi-hop discovery (4+ hops) - PROVEN" + ); // === CAPABILITY 3: Compressed Hippocampal Index === // Traditional: Full embeddings | Vestige: Compressed index let compression = 384.0 / INDEX_EMBEDDING_DIM as f64; - assert!(compression >= 2.0, "Capability 3: Hippocampal compression ({:.1}x) - PROVEN", compression); + assert!( + compression >= 2.0, + "Capability 3: Hippocampal compression ({:.1}x) - PROVEN", + compression + ); // === CAPABILITY 4: Asymmetric Temporal Windows === // Traditional: NO temporal reasoning | Vestige: Biologically-grounded windows let window = CaptureWindow::new(9.0, 2.0); let asymmetric = 9.0 / 2.0; - assert!(asymmetric > 4.0, "Capability 4: Asymmetric capture windows ({}:1) - PROVEN", asymmetric); + assert!( + asymmetric > 4.0, + "Capability 4: Asymmetric capture windows ({}:1) - PROVEN", + asymmetric + ); // === CAPABILITY 5: Path Tracking === // Traditional: Returns items only | Vestige: Returns full association paths - let path_result = &results[results.len() - 1]; // Furthest result + let path_result = &results[results.len() - 1]; // Furthest result let has_path = !path_result.path.is_empty(); assert!(has_path, "Capability 5: Association path tracking - PROVEN"); @@ -518,10 +585,30 @@ fn test_proof_comprehensive_capability_summary() { // Traditional: Single similarity metric | Vestige: Multiple link types let mut typed_network = ActivationNetwork::new(); - typed_network.add_edge("event".to_string(), "cause".to_string(), LinkType::Causal, 0.9); - typed_network.add_edge("event".to_string(), "time".to_string(), LinkType::Temporal, 0.9); - typed_network.add_edge("event".to_string(), "concept".to_string(), LinkType::Semantic, 0.9); - typed_network.add_edge("event".to_string(), "location".to_string(), LinkType::Spatial, 0.9); + typed_network.add_edge( + "event".to_string(), + "cause".to_string(), + LinkType::Causal, + 0.9, + ); + typed_network.add_edge( + "event".to_string(), + "time".to_string(), + LinkType::Temporal, + 0.9, + ); + typed_network.add_edge( + "event".to_string(), + "concept".to_string(), + LinkType::Semantic, + 0.9, + ); + typed_network.add_edge( + "event".to_string(), + "location".to_string(), + LinkType::Spatial, + 0.9, + ); let typed_results = typed_network.activate("event", 1.0); let link_types: HashSet<_> = typed_results.iter().map(|r| r.link_type).collect(); diff --git a/tests/e2e/tests/extreme/research_validation_tests.rs b/tests/e2e/tests/extreme/research_validation_tests.rs index 2fe7716..11006c9 100644 --- a/tests/e2e/tests/extreme/research_validation_tests.rs +++ b/tests/e2e/tests/extreme/research_validation_tests.rs @@ -10,6 +10,10 @@ //! Each test cites the specific research findings being validated. use chrono::{Duration, Utc}; +use std::collections::HashSet; +use vestige_core::neuroscience::hippocampal_index::{ + HippocampalIndex, HippocampalIndexConfig, IndexQuery, +}; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; @@ -17,10 +21,6 @@ use vestige_core::neuroscience::synaptic_tagging::{ CaptureWindow, ImportanceEvent, ImportanceEventType, SynapticTaggingConfig, SynapticTaggingSystem, }; -use vestige_core::neuroscience::hippocampal_index::{ - HippocampalIndex, HippocampalIndexConfig, IndexQuery, -}; -use std::collections::HashSet; // ============================================================================ // COLLINS & LOFTUS (1975) SPREADING ACTIVATION VALIDATION (1 test) @@ -39,7 +39,7 @@ use std::collections::HashSet; #[test] fn test_research_collins_loftus_spreading_activation() { let config = ActivationConfig { - decay_factor: 0.75, // Semantic distance decay + decay_factor: 0.75, // Semantic distance decay max_hops: 4, min_threshold: 0.05, allow_cycles: false, @@ -48,29 +48,91 @@ fn test_research_collins_loftus_spreading_activation() { // Recreate classic semantic network from the paper // "Fire truck" example: fire_truck -> red -> roses, fire_truck -> vehicle - network.add_edge("fire_truck".to_string(), "red".to_string(), LinkType::Semantic, 0.9); - network.add_edge("fire_truck".to_string(), "vehicle".to_string(), LinkType::Semantic, 0.85); - network.add_edge("fire_truck".to_string(), "fire".to_string(), LinkType::Semantic, 0.9); - network.add_edge("red".to_string(), "roses".to_string(), LinkType::Semantic, 0.7); - network.add_edge("red".to_string(), "cherries".to_string(), LinkType::Semantic, 0.65); - network.add_edge("red".to_string(), "apples".to_string(), LinkType::Semantic, 0.7); - network.add_edge("vehicle".to_string(), "car".to_string(), LinkType::Semantic, 0.8); - network.add_edge("vehicle".to_string(), "truck".to_string(), LinkType::Semantic, 0.85); - network.add_edge("fire".to_string(), "flames".to_string(), LinkType::Semantic, 0.9); - network.add_edge("fire".to_string(), "heat".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "fire_truck".to_string(), + "red".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "fire_truck".to_string(), + "vehicle".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "fire_truck".to_string(), + "fire".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "red".to_string(), + "roses".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "red".to_string(), + "cherries".to_string(), + LinkType::Semantic, + 0.65, + ); + network.add_edge( + "red".to_string(), + "apples".to_string(), + LinkType::Semantic, + 0.7, + ); + network.add_edge( + "vehicle".to_string(), + "car".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "vehicle".to_string(), + "truck".to_string(), + LinkType::Semantic, + 0.85, + ); + network.add_edge( + "fire".to_string(), + "flames".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "fire".to_string(), + "heat".to_string(), + LinkType::Semantic, + 0.8, + ); // Add convergent paths (multiple routes to same concept) - network.add_edge("apples".to_string(), "fruit".to_string(), LinkType::Semantic, 0.9); - network.add_edge("cherries".to_string(), "fruit".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "apples".to_string(), + "fruit".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "cherries".to_string(), + "fruit".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("fire_truck", 1.0); // Validation 1: Direct connections (distance 1) have highest activation - let red_activation = results.iter() + let red_activation = results + .iter() .find(|r| r.memory_id == "red") .map(|r| r.activation) .unwrap_or(0.0); - let roses_activation = results.iter() + let roses_activation = results + .iter() .find(|r| r.memory_id == "roses") .map(|r| r.activation) .unwrap_or(0.0); @@ -83,11 +145,13 @@ fn test_research_collins_loftus_spreading_activation() { ); // Validation 2: Activation decreases with semantic distance - let distance_1: Vec = results.iter() + let distance_1: Vec = results + .iter() .filter(|r| r.distance == 1) .map(|r| r.activation) .collect(); - let distance_2: Vec = results.iter() + let distance_2: Vec = results + .iter() .filter(|r| r.distance == 2) .map(|r| r.activation) .collect(); @@ -107,7 +171,10 @@ fn test_research_collins_loftus_spreading_activation() { assert!(reachable.contains("red"), "Should reach 'red'"); assert!(reachable.contains("vehicle"), "Should reach 'vehicle'"); assert!(reachable.contains("fire"), "Should reach 'fire'"); - assert!(reachable.contains("roses"), "Should reach 'roses' through 'red'"); + assert!( + reachable.contains("roses"), + "Should reach 'roses' through 'red'" + ); // Validation 4: Path information is preserved let roses_result = results.iter().find(|r| r.memory_id == "roses").unwrap(); @@ -135,7 +202,7 @@ fn test_research_collins_loftus_spreading_activation() { #[test] fn test_research_frey_morris_synaptic_tagging() { let config = SynapticTaggingConfig { - capture_window: CaptureWindow::new(9.0, 2.0), // Hours: 9 back, 2 forward + capture_window: CaptureWindow::new(9.0, 2.0), // Hours: 9 back, 2 forward prp_threshold: 0.7, tag_lifetime_hours: 12.0, min_tag_strength: 0.3, @@ -148,7 +215,7 @@ fn test_research_frey_morris_synaptic_tagging() { let mut stc = SynapticTaggingSystem::with_config(config); // Finding 1: Weak stimulation creates tags - stc.tag_memory_with_strength("weak_stim_1", 0.4); // Above min (0.3), weak + stc.tag_memory_with_strength("weak_stim_1", 0.4); // Above min (0.3), weak stc.tag_memory_with_strength("weak_stim_2", 0.5); let stats_after_weak = stc.stats(); @@ -164,7 +231,7 @@ fn test_research_frey_morris_synaptic_tagging() { event_type: ImportanceEventType::EmotionalContent, memory_id: Some("strong_trigger".to_string()), timestamp: Utc::now(), - strength: 0.95, // Above threshold (0.7) + strength: 0.95, // Above threshold (0.7) context: Some("Strong emotional event triggers PRP".to_string()), }; @@ -245,21 +312,26 @@ fn test_research_teyler_rudy_hippocampal_indexing() { .map(|i| ((i as f32 / 100.0) * std::f32::consts::PI).sin()) .collect(); - let barcode = index.index_memory( - "episodic_memory_1", - "Detailed episodic memory content with rich context", - "episodic", - now, - Some(full_embedding.clone()), - ).expect("Should create barcode"); + let barcode = index + .index_memory( + "episodic_memory_1", + "Detailed episodic memory content with rich context", + "episodic", + now, + Some(full_embedding.clone()), + ) + .expect("Should create barcode"); // Barcode should be a valid identifier (u64 ID) // First barcode may have id=0, which is valid - assert!(barcode.creation_hash > 0 || barcode.content_fingerprint > 0, - "T&R Finding 1: Barcode should have valid fingerprints"); + assert!( + barcode.creation_hash > 0 || barcode.content_fingerprint > 0, + "T&R Finding 1: Barcode should have valid fingerprints" + ); // Finding 2: Index points to content (content pointers) - let memory_index = index.get_index("episodic_memory_1") + let memory_index = index + .get_index("episodic_memory_1") .expect("Should retrieve") .expect("Should exist"); @@ -348,7 +420,7 @@ fn test_research_ebbinghaus_forgetting_curve() { let forgetting_curve = |t: f64| -> f64 { // Ebbinghaus formula: R = e^(-t/S) where S is stability - let stability = 2.0; // Memory stability parameter + let stability = 2.0; // Memory stability parameter (-t / stability).exp() }; @@ -368,7 +440,10 @@ fn test_research_ebbinghaus_forgetting_curve() { // Collect activations by "age" let mut age_activations: Vec<(u32, f64)> = Vec::new(); for t in 0..10 { - if let Some(result) = results.iter().find(|r| r.memory_id == format!("memory_age_{}", t)) { + if let Some(result) = results + .iter() + .find(|r| r.memory_id == format!("memory_age_{}", t)) + { age_activations.push((t, result.activation)); } } @@ -387,7 +462,8 @@ fn test_research_ebbinghaus_forgetting_curve() { // Check that differences decrease over time if age_activations.len() >= 3 { let diff_early = age_activations[0].1 - age_activations[1].1; - let diff_late = age_activations[age_activations.len() - 2].1 - age_activations[age_activations.len() - 1].1; + let diff_late = age_activations[age_activations.len() - 2].1 + - age_activations[age_activations.len() - 1].1; // Early differences should be larger (rapid initial forgetting) // But we need to account for near-zero values at the end @@ -403,8 +479,18 @@ fn test_research_ebbinghaus_forgetting_curve() { // Finding 3: Test overlearning (reinforcement) let mut overlearned_network = ActivationNetwork::new(); - overlearned_network.add_edge("study".to_string(), "normal_learning".to_string(), LinkType::Semantic, 0.5); - overlearned_network.add_edge("study".to_string(), "overlearned".to_string(), LinkType::Semantic, 0.5); + overlearned_network.add_edge( + "study".to_string(), + "normal_learning".to_string(), + LinkType::Semantic, + 0.5, + ); + overlearned_network.add_edge( + "study".to_string(), + "overlearned".to_string(), + LinkType::Semantic, + 0.5, + ); // Simulate overlearning with multiple reinforcements for _ in 0..5 { @@ -413,11 +499,13 @@ fn test_research_ebbinghaus_forgetting_curve() { let study_results = overlearned_network.activate("study", 1.0); - let normal_act = study_results.iter() + let normal_act = study_results + .iter() .find(|r| r.memory_id == "normal_learning") .map(|r| r.activation) .unwrap_or(0.0); - let overlearned_act = study_results.iter() + let overlearned_act = study_results + .iter() .find(|r| r.memory_id == "overlearned") .map(|r| r.activation) .unwrap_or(0.0); @@ -447,7 +535,7 @@ fn test_research_ebbinghaus_forgetting_curve() { #[test] fn test_research_fsrs6_properties() { // FSRS-6 default weights - const W20: f64 = 0.1542; // Forgetting curve exponent + const W20: f64 = 0.1542; // Forgetting curve exponent // FSRS-6 retrievability formula fn fsrs6_retrievability(stability: f64, elapsed_days: f64, w20: f64) -> f64 { @@ -455,7 +543,9 @@ fn test_research_fsrs6_properties() { return 1.0; } let factor = 0.9_f64.powf(-1.0 / w20) - 1.0; - (1.0 + factor * elapsed_days / stability).powf(-w20).clamp(0.0, 1.0) + (1.0 + factor * elapsed_days / stability) + .powf(-w20) + .clamp(0.0, 1.0) } // Property 1: R = 0.9 when t = S (by design) diff --git a/tests/e2e/tests/journeys/consolidation_workflow.rs b/tests/e2e/tests/journeys/consolidation_workflow.rs index 6577c89..633c5a3 100644 --- a/tests/e2e/tests/journeys/consolidation_workflow.rs +++ b/tests/e2e/tests/journeys/consolidation_workflow.rs @@ -15,8 +15,8 @@ use chrono::{Duration, Utc}; use vestige_core::{ advanced::dreams::{ - ActivityTracker, ConnectionGraph, ConnectionReason, ConsolidationScheduler, - DreamConfig, DreamMemory, MemoryDreamer, + ActivityTracker, ConnectionGraph, ConnectionReason, ConsolidationScheduler, DreamConfig, + DreamMemory, MemoryDreamer, }, consolidation::SleepConsolidation, }; @@ -82,10 +82,7 @@ fn test_consolidation_detects_idle_periods() { // Initially should be idle (no activity) let stats = scheduler.get_activity_stats(); - assert!( - stats.is_idle, - "Fresh scheduler should be idle" - ); + assert!(stats.is_idle, "Fresh scheduler should be idle"); // Record activity - should no longer be idle scheduler.record_activity(); @@ -93,10 +90,7 @@ fn test_consolidation_detects_idle_periods() { scheduler.record_activity(); let active_stats = scheduler.get_activity_stats(); - assert!( - !active_stats.is_idle, - "Should not be idle after activity" - ); + assert!(!active_stats.is_idle, "Should not be idle after activity"); assert_eq!( active_stats.total_events, 3, "Should track 3 activity events" @@ -176,9 +170,24 @@ fn test_connections_form_between_related_memories() { let mut graph = ConnectionGraph::new(); // Add connections simulating discovered relationships - graph.add_connection("rust_async", "tokio_runtime", 0.9, ConnectionReason::Semantic); - graph.add_connection("tokio_runtime", "green_threads", 0.8, ConnectionReason::Semantic); - graph.add_connection("rust_async", "futures_crate", 0.85, ConnectionReason::SharedConcepts); + graph.add_connection( + "rust_async", + "tokio_runtime", + 0.9, + ConnectionReason::Semantic, + ); + graph.add_connection( + "tokio_runtime", + "green_threads", + 0.8, + ConnectionReason::Semantic, + ); + graph.add_connection( + "rust_async", + "futures_crate", + 0.85, + ConnectionReason::SharedConcepts, + ); // Verify graph structure let stats = graph.get_stats(); @@ -329,9 +338,18 @@ fn test_pruning_removes_weak_memories() { // Verify the config accessor works let config = consolidation.config(); - assert!(!config.enable_pruning, "Default should have pruning disabled"); - assert!(config.pruning_threshold > 0.0, "Should have a threshold configured"); - assert!(config.pruning_min_age_days > 0, "Should have a min age configured"); + assert!( + !config.enable_pruning, + "Default should have pruning disabled" + ); + assert!( + config.pruning_threshold > 0.0, + "Should have a threshold configured" + ); + assert!( + config.pruning_min_age_days > 0, + "Should have a min age configured" + ); } // ============================================================================ @@ -419,22 +437,13 @@ fn test_retention_calculation() { // Full retrieval, max storage let r2 = consolidation.calculate_retention(10.0, 1.0); - assert!( - (r2 - 1.0).abs() < 0.01, - "Max everything should be ~1.0" - ); + assert!((r2 - 1.0).abs() < 0.01, "Max everything should be ~1.0"); // Low retrieval, max storage let r3 = consolidation.calculate_retention(10.0, 0.0); - assert!( - (r3 - 0.3).abs() < 0.01, - "Low retrieval should cap at ~0.3" - ); + assert!((r3 - 0.3).abs() < 0.01, "Low retrieval should cap at ~0.3"); // Both low let r4 = consolidation.calculate_retention(0.0, 0.0); - assert!( - r4 < 0.1, - "Both low should mean low retention" - ); + assert!(r4 < 0.1, "Both low should mean low retention"); } diff --git a/tests/e2e/tests/journeys/import_export.rs b/tests/e2e/tests/journeys/import_export.rs index fbea1ba..91847ff 100644 --- a/tests/e2e/tests/journeys/import_export.rs +++ b/tests/e2e/tests/journeys/import_export.rs @@ -13,9 +13,9 @@ //! 5. User merges memories from multiple sources use chrono::{DateTime, Duration, Utc}; -use vestige_core::memory::IngestInput; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use vestige_core::memory::IngestInput; // ============================================================================ // EXPORT/IMPORT FORMAT @@ -183,7 +183,10 @@ fn test_export_serializes_memories_to_json() { assert!(json.contains("\"metadata\""), "Should contain metadata"); // Verify content is present - assert!(json.contains("Rust ownership"), "Should contain memory content"); + assert!( + json.contains("Rust ownership"), + "Should contain memory content" + ); assert!(json.contains("rust"), "Should contain tags"); // Verify FSRS state @@ -219,12 +222,21 @@ fn test_import_deserializes_json_to_memories() { // Verify memories let mem1 = &imported.memories[0]; - assert!(mem1.content.contains("ownership"), "Content should be preserved"); - assert!(mem1.tags.contains(&"rust".to_string()), "Tags should be preserved"); + assert!( + mem1.content.contains("ownership"), + "Content should be preserved" + ); + assert!( + mem1.tags.contains(&"rust".to_string()), + "Tags should be preserved" + ); assert!(mem1.stability > 0.0, "Stability should be preserved"); // Verify metadata - assert_eq!(imported.metadata.get("project"), Some(&"vestige".to_string())); + assert_eq!( + imported.metadata.get("project"), + Some(&"vestige".to_string()) + ); } // ============================================================================ @@ -268,12 +280,24 @@ fn test_roundtrip_preserves_all_data() { assert_eq!(imported.content, original.content, "Content should match"); assert_eq!(imported.node_type, original.node_type, "Type should match"); assert_eq!(imported.tags, original.tags, "Tags should match"); - assert_eq!(imported.stability, original.stability, "Stability should match"); - assert_eq!(imported.difficulty, original.difficulty, "Difficulty should match"); + assert_eq!( + imported.stability, original.stability, + "Stability should match" + ); + assert_eq!( + imported.difficulty, original.difficulty, + "Difficulty should match" + ); assert_eq!(imported.reps, original.reps, "Reps should match"); assert_eq!(imported.lapses, original.lapses, "Lapses should match"); - assert_eq!(imported.sentiment_score, original.sentiment_score, "Sentiment score should match"); - assert_eq!(imported.sentiment_magnitude, original.sentiment_magnitude, "Sentiment magnitude should match"); + assert_eq!( + imported.sentiment_score, original.sentiment_score, + "Sentiment score should match" + ); + assert_eq!( + imported.sentiment_magnitude, original.sentiment_magnitude, + "Sentiment magnitude should match" + ); assert_eq!(imported.source, original.source, "Source should match"); } @@ -290,11 +314,13 @@ fn test_roundtrip_preserves_all_data() { #[test] fn test_selective_export_by_tags() { // Create memories with different tags - let memories = [ExportedMemory::new("Rust ownership", "concept", vec!["rust", "memory"]), + let memories = [ + ExportedMemory::new("Rust ownership", "concept", vec!["rust", "memory"]), ExportedMemory::new("Python generators", "concept", vec!["python", "generators"]), ExportedMemory::new("Rust borrowing", "concept", vec!["rust", "borrowing"]), ExportedMemory::new("JavaScript async", "concept", vec!["javascript", "async"]), - ExportedMemory::new("Rust async", "concept", vec!["rust", "async"])]; + ExportedMemory::new("Rust async", "concept", vec!["rust", "async"]), + ]; // Filter by "rust" tag let rust_memories: Vec<_> = memories @@ -307,12 +333,14 @@ fn test_selective_export_by_tags() { // Filter by multiple tags (rust AND async) let rust_async_memories: Vec<_> = memories .iter() - .filter(|m| { - m.tags.contains(&"rust".to_string()) && m.tags.contains(&"async".to_string()) - }) + .filter(|m| m.tags.contains(&"rust".to_string()) && m.tags.contains(&"async".to_string())) .collect(); - assert_eq!(rust_async_memories.len(), 1, "Should filter to 1 Rust async memory"); + assert_eq!( + rust_async_memories.len(), + 1, + "Should filter to 1 Rust async memory" + ); assert!(rust_async_memories[0].content.contains("Rust async")); // Export filtered @@ -338,8 +366,14 @@ fn test_selective_export_by_tags() { fn test_import_merges_with_existing_data() { // Simulate existing memories let existing: HashMap = [ - ("1".to_string(), ExportedMemory::new("Rust ownership memory safety", "concept", vec!["rust"])), - ("2".to_string(), ExportedMemory::new("Rust borrowing rules explained", "concept", vec!["rust"])), + ( + "1".to_string(), + ExportedMemory::new("Rust ownership memory safety", "concept", vec!["rust"]), + ), + ( + "2".to_string(), + ExportedMemory::new("Rust borrowing rules explained", "concept", vec!["rust"]), + ), ] .into_iter() .collect(); @@ -427,7 +461,10 @@ fn test_empty_bundle_handling() { // Serialize empty bundle let json = bundle.to_json().unwrap(); - assert!(json.contains("\"memories\": []"), "Should have empty memories array"); + assert!( + json.contains("\"memories\": []"), + "Should have empty memories array" + ); // Deserialize and verify let imported = ExportBundle::from_json(&json).unwrap(); diff --git a/tests/e2e/tests/journeys/ingest_recall_review.rs b/tests/e2e/tests/journeys/ingest_recall_review.rs index fb463b1..cecb5b8 100644 --- a/tests/e2e/tests/journeys/ingest_recall_review.rs +++ b/tests/e2e/tests/journeys/ingest_recall_review.rs @@ -12,9 +12,9 @@ //! 5. User benefits from improved recall over time use vestige_core::{ + consolidation::SleepConsolidation, fsrs::{FSRSScheduler, LearningState, Rating}, memory::{IngestInput, RecallInput, SearchMode}, - consolidation::SleepConsolidation, }; // ============================================================================ @@ -139,7 +139,10 @@ fn test_review_strengthens_memory_with_fsrs() { let result = scheduler.review(&initial_state, Rating::Good, 0.0, None); // Stability should be set from initial parameters - assert!(result.state.stability > 0.0, "Stability should be positive after review"); + assert!( + result.state.stability > 0.0, + "Stability should be positive after review" + ); // Reps should increase assert_eq!(result.state.reps, 1, "Reps should increase after review"); @@ -160,7 +163,10 @@ fn test_review_strengthens_memory_with_fsrs() { again_result.interval <= second_result.interval, "Again rating should reduce interval" ); - assert_eq!(again_result.state.lapses, 1, "Lapses should increase on Again"); + assert_eq!( + again_result.state.lapses, 1, + "Lapses should increase on Again" + ); } // ============================================================================ @@ -184,7 +190,11 @@ fn test_memory_lifecycle_follows_expected_pattern() { // Simulate 10 successful reviews for i in 0..10 { - let elapsed = if i == 0 { 0.0 } else { intervals.last().copied().unwrap_or(1) as f64 }; + let elapsed = if i == 0 { + 0.0 + } else { + intervals.last().copied().unwrap_or(1) as f64 + }; let result = scheduler.review(&state, Rating::Good, elapsed, None); intervals.push(result.interval); state = result.state; @@ -192,7 +202,10 @@ fn test_memory_lifecycle_follows_expected_pattern() { // Verify lifecycle progression assert!(state.reps >= 10, "Should have at least 10 reps"); - assert_eq!(state.lapses, 0, "Should have no lapses with all Good ratings"); + assert_eq!( + state.lapses, 0, + "Should have no lapses with all Good ratings" + ); // Verify interval growth (early intervals may be similar, but should eventually grow) let early_avg: f64 = intervals[..3].iter().map(|&i| i as f64).sum::() / 3.0; @@ -260,10 +273,7 @@ fn test_sentiment_affects_memory_consolidation() { // Test promotion boost let boosted = consolidation.promotion_boost(5.0); - assert!( - boosted > 5.0, - "Promotion should increase storage strength" - ); + assert!(boosted > 5.0, "Promotion should increase storage strength"); assert!( boosted <= 10.0, "Promotion should cap at max storage strength" diff --git a/tests/e2e/tests/journeys/intentions_workflow.rs b/tests/e2e/tests/journeys/intentions_workflow.rs index a9b2b8a..f0530ed 100644 --- a/tests/e2e/tests/journeys/intentions_workflow.rs +++ b/tests/e2e/tests/journeys/intentions_workflow.rs @@ -13,8 +13,8 @@ //! 5. User benefits from context-aware assistance use vestige_core::advanced::intent::{ - ActionType, DetectedIntent, IntentDetector, LearningLevel, MaintenanceType, - OptimizationType, UserAction, + ActionType, DetectedIntent, IntentDetector, LearningLevel, MaintenanceType, OptimizationType, + UserAction, }; // ============================================================================ @@ -89,7 +89,10 @@ fn test_debugging_intent_detection() { // Check intent properties match &result.primary_intent { - DetectedIntent::Debugging { suspected_area, symptoms } => { + DetectedIntent::Debugging { + suspected_area, + symptoms, + } => { assert!(!suspected_area.is_empty(), "Should identify suspected area"); // Symptoms may or may not be captured depending on action order } @@ -129,10 +132,7 @@ fn test_learning_intent_detection() { _ => { // Learning actions should typically detect learning intent // But other intents may score higher in some cases - assert!( - result.confidence > 0.0, - "Should detect some intent" - ); + assert!(result.confidence > 0.0, "Should detect some intent"); } } @@ -169,7 +169,9 @@ fn test_refactoring_intent_detection() { assert!(!target.is_empty(), "Should identify refactoring target"); assert!(!goal.is_empty(), "Should identify refactoring goal"); } - DetectedIntent::NewFeature { related_components, .. } => { + DetectedIntent::NewFeature { + related_components, .. + } => { // Multiple edits could also suggest new feature assert!( related_components.len() >= 0, diff --git a/tests/e2e/tests/journeys/spreading_activation.rs b/tests/e2e/tests/journeys/spreading_activation.rs index d8117a5..7ac345c 100644 --- a/tests/e2e/tests/journeys/spreading_activation.rs +++ b/tests/e2e/tests/journeys/spreading_activation.rs @@ -12,10 +12,10 @@ //! 4. Activation spreads to related memories via association links //! 5. User discovers hidden connections they didn't explicitly search for +use std::collections::HashSet; use vestige_core::neuroscience::spreading_activation::{ ActivationConfig, ActivationNetwork, LinkType, }; -use std::collections::HashSet; // ============================================================================ // HELPER FUNCTIONS @@ -26,17 +26,62 @@ fn create_coding_network() -> ActivationNetwork { let mut network = ActivationNetwork::new(); // Rust ecosystem - network.add_edge("rust".to_string(), "ownership".to_string(), LinkType::Semantic, 0.95); - network.add_edge("rust".to_string(), "borrowing".to_string(), LinkType::Semantic, 0.9); - network.add_edge("rust".to_string(), "cargo".to_string(), LinkType::PartOf, 0.85); - network.add_edge("ownership".to_string(), "memory_safety".to_string(), LinkType::Causal, 0.9); - network.add_edge("borrowing".to_string(), "lifetimes".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "rust".to_string(), + "ownership".to_string(), + LinkType::Semantic, + 0.95, + ); + network.add_edge( + "rust".to_string(), + "borrowing".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "rust".to_string(), + "cargo".to_string(), + LinkType::PartOf, + 0.85, + ); + network.add_edge( + "ownership".to_string(), + "memory_safety".to_string(), + LinkType::Causal, + 0.9, + ); + network.add_edge( + "borrowing".to_string(), + "lifetimes".to_string(), + LinkType::Semantic, + 0.85, + ); // Async ecosystem - network.add_edge("rust".to_string(), "async_rust".to_string(), LinkType::Semantic, 0.8); - network.add_edge("async_rust".to_string(), "tokio".to_string(), LinkType::Semantic, 0.9); - network.add_edge("tokio".to_string(), "runtime".to_string(), LinkType::PartOf, 0.85); - network.add_edge("async_rust".to_string(), "futures".to_string(), LinkType::Semantic, 0.85); + network.add_edge( + "rust".to_string(), + "async_rust".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "async_rust".to_string(), + "tokio".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "tokio".to_string(), + "runtime".to_string(), + LinkType::PartOf, + 0.85, + ); + network.add_edge( + "async_rust".to_string(), + "futures".to_string(), + LinkType::Semantic, + 0.85, + ); network } @@ -52,10 +97,30 @@ fn create_chain_network() -> ActivationNetwork { let mut network = ActivationNetwork::with_config(config); // Create a chain: A -> B -> C -> D -> E - network.add_edge("node_a".to_string(), "node_b".to_string(), LinkType::Semantic, 0.9); - network.add_edge("node_b".to_string(), "node_c".to_string(), LinkType::Semantic, 0.9); - network.add_edge("node_c".to_string(), "node_d".to_string(), LinkType::Semantic, 0.9); - network.add_edge("node_d".to_string(), "node_e".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "node_a".to_string(), + "node_b".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "node_b".to_string(), + "node_c".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "node_c".to_string(), + "node_d".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "node_d".to_string(), + "node_e".to_string(), + LinkType::Semantic, + 0.9, + ); network } @@ -81,7 +146,10 @@ fn test_spreading_finds_hidden_chains() { // Should find all nodes in the chain let found_ids: HashSet<_> = results.iter().map(|r| r.memory_id.as_str()).collect(); - assert!(found_ids.contains("node_b"), "Should find direct neighbor node_b"); + assert!( + found_ids.contains("node_b"), + "Should find direct neighbor node_b" + ); assert!(found_ids.contains("node_c"), "Should find 2-hop node_c"); assert!(found_ids.contains("node_d"), "Should find 3-hop node_d"); assert!(found_ids.contains("node_e"), "Should find 4-hop node_e"); @@ -127,9 +195,21 @@ fn test_activation_decays_with_distance() { let results = network.activate("a", 1.0); - let act_b = results.iter().find(|r| r.memory_id == "b").map(|r| r.activation).unwrap_or(0.0); - let act_c = results.iter().find(|r| r.memory_id == "c").map(|r| r.activation).unwrap_or(0.0); - let act_d = results.iter().find(|r| r.memory_id == "d").map(|r| r.activation).unwrap_or(0.0); + let act_b = results + .iter() + .find(|r| r.memory_id == "b") + .map(|r| r.activation) + .unwrap_or(0.0); + let act_c = results + .iter() + .find(|r| r.memory_id == "c") + .map(|r| r.activation) + .unwrap_or(0.0); + let act_d = results + .iter() + .find(|r| r.memory_id == "d") + .map(|r| r.activation) + .unwrap_or(0.0); // Verify monotonic decrease assert!(act_b > act_c, "b ({:.3}) > c ({:.3})", act_b, act_c); @@ -159,7 +239,12 @@ fn test_edge_reinforcement_hebbian() { let mut network = ActivationNetwork::new(); // Add edge with moderate strength - network.add_edge("concept_a".to_string(), "concept_b".to_string(), LinkType::Semantic, 0.5); + network.add_edge( + "concept_a".to_string(), + "concept_b".to_string(), + LinkType::Semantic, + 0.5, + ); // Get initial associations let initial = network.get_associations("concept_a"); @@ -169,7 +254,10 @@ fn test_edge_reinforcement_hebbian() { .map(|a| a.association_strength) .unwrap_or(0.0); - assert!((initial_strength - 0.5).abs() < 0.01, "Initial should be 0.5"); + assert!( + (initial_strength - 0.5).abs() < 0.01, + "Initial should be 0.5" + ); // Reinforce the connection network.reinforce_edge("concept_a", "concept_b", 0.2); @@ -270,10 +358,30 @@ fn test_different_link_types_affect_activation() { let mut network = ActivationNetwork::new(); // Add edges with different link types - network.add_edge("event".to_string(), "semantic_rel".to_string(), LinkType::Semantic, 0.9); - network.add_edge("event".to_string(), "temporal_rel".to_string(), LinkType::Temporal, 0.8); - network.add_edge("event".to_string(), "causal_rel".to_string(), LinkType::Causal, 0.85); - network.add_edge("event".to_string(), "part_of_rel".to_string(), LinkType::PartOf, 0.7); + network.add_edge( + "event".to_string(), + "semantic_rel".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "event".to_string(), + "temporal_rel".to_string(), + LinkType::Temporal, + 0.8, + ); + network.add_edge( + "event".to_string(), + "causal_rel".to_string(), + LinkType::Causal, + 0.85, + ); + network.add_edge( + "event".to_string(), + "part_of_rel".to_string(), + LinkType::PartOf, + 0.7, + ); let results = network.activate("event", 1.0); @@ -285,10 +393,22 @@ fn test_different_link_types_affect_activation() { assert!(found.contains("part_of_rel")); // Verify link types are preserved - let semantic = results.iter().find(|r| r.memory_id == "semantic_rel").unwrap(); - let temporal = results.iter().find(|r| r.memory_id == "temporal_rel").unwrap(); - let causal = results.iter().find(|r| r.memory_id == "causal_rel").unwrap(); - let part_of = results.iter().find(|r| r.memory_id == "part_of_rel").unwrap(); + let semantic = results + .iter() + .find(|r| r.memory_id == "semantic_rel") + .unwrap(); + let temporal = results + .iter() + .find(|r| r.memory_id == "temporal_rel") + .unwrap(); + let causal = results + .iter() + .find(|r| r.memory_id == "causal_rel") + .unwrap(); + let part_of = results + .iter() + .find(|r| r.memory_id == "part_of_rel") + .unwrap(); assert_eq!(semantic.link_type, LinkType::Semantic); assert_eq!(temporal.link_type, LinkType::Temporal); @@ -339,9 +459,9 @@ fn test_max_hops_limit() { #[test] fn test_minimum_threshold() { let config = ActivationConfig { - decay_factor: 0.5, // 50% decay per hop - max_hops: 10, // High limit - min_threshold: 0.2, // But high threshold + decay_factor: 0.5, // 50% decay per hop + max_hops: 10, // High limit + min_threshold: 0.2, // But high threshold allow_cycles: false, }; let mut network = ActivationNetwork::with_config(config); @@ -370,8 +490,18 @@ fn test_minimum_threshold() { fn test_path_tracking() { let mut network = ActivationNetwork::new(); - network.add_edge("start".to_string(), "middle".to_string(), LinkType::Semantic, 0.9); - network.add_edge("middle".to_string(), "end".to_string(), LinkType::Semantic, 0.9); + network.add_edge( + "start".to_string(), + "middle".to_string(), + LinkType::Semantic, + 0.9, + ); + network.add_edge( + "middle".to_string(), + "end".to_string(), + LinkType::Semantic, + 0.9, + ); let results = network.activate("start", 1.0); @@ -390,10 +520,30 @@ fn test_convergent_paths() { let mut network = ActivationNetwork::new(); // Create convergent paths: source -> a -> target and source -> b -> target - network.add_edge("source".to_string(), "path_a".to_string(), LinkType::Semantic, 0.8); - network.add_edge("source".to_string(), "path_b".to_string(), LinkType::Semantic, 0.8); - network.add_edge("path_a".to_string(), "target".to_string(), LinkType::Semantic, 0.8); - network.add_edge("path_b".to_string(), "target".to_string(), LinkType::Semantic, 0.8); + network.add_edge( + "source".to_string(), + "path_a".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "source".to_string(), + "path_b".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "path_a".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.8, + ); + network.add_edge( + "path_b".to_string(), + "target".to_string(), + LinkType::Semantic, + 0.8, + ); let results = network.activate("source", 1.0); diff --git a/tests/e2e/tests/mcp/protocol_tests.rs b/tests/e2e/tests/mcp/protocol_tests.rs index 20bed76..f3a247f 100644 --- a/tests/e2e/tests/mcp/protocol_tests.rs +++ b/tests/e2e/tests/mcp/protocol_tests.rs @@ -25,9 +25,18 @@ fn test_jsonrpc_request_required_fields() { "params": {} }); - assert_eq!(valid_request["jsonrpc"], "2.0", "jsonrpc version must be 2.0"); - assert!(valid_request["method"].is_string(), "method must be a string"); - assert!(valid_request["id"].is_number(), "id should be present for requests"); + assert_eq!( + valid_request["jsonrpc"], "2.0", + "jsonrpc version must be 2.0" + ); + assert!( + valid_request["method"].is_string(), + "method must be a string" + ); + assert!( + valid_request["id"].is_number(), + "id should be present for requests" + ); } /// Test that JSON-RPC notifications have no id field. @@ -40,7 +49,10 @@ fn test_jsonrpc_notification_has_no_id() { "method": "notifications/initialized" }); - assert!(notification.get("id").is_none(), "Notifications must not have an id field"); + assert!( + notification.get("id").is_none(), + "Notifications must not have an id field" + ); assert_eq!(notification["method"], "notifications/initialized"); } @@ -66,8 +78,14 @@ fn test_jsonrpc_success_response_format() { }); assert_eq!(success_response["jsonrpc"], "2.0"); - assert!(success_response["result"].is_object(), "Success response must have result"); - assert!(success_response.get("error").is_none(), "Success response must not have error"); + assert!( + success_response["result"].is_object(), + "Success response must have result" + ); + assert!( + success_response.get("error").is_none(), + "Success response must not have error" + ); } /// Test JSON-RPC response format for errors. @@ -89,10 +107,22 @@ fn test_jsonrpc_error_response_format() { }); assert_eq!(error_response["jsonrpc"], "2.0"); - assert!(error_response["error"].is_object(), "Error response must have error object"); - assert!(error_response["error"]["code"].is_number(), "Error must have code"); - assert!(error_response["error"]["message"].is_string(), "Error must have message"); - assert!(error_response.get("result").is_none(), "Error response must not have result"); + assert!( + error_response["error"].is_object(), + "Error response must have error object" + ); + assert!( + error_response["error"]["code"].is_number(), + "Error must have code" + ); + assert!( + error_response["error"]["message"].is_string(), + "Error must have message" + ); + assert!( + error_response.get("result").is_none(), + "Error response must not have result" + ); } // ============================================================================ @@ -119,8 +149,12 @@ fn test_standard_jsonrpc_error_codes() { for (code, message) in error_codes { // All standard codes are in the reserved range - assert!((-32700..=-32600).contains(&code), - "Standard error code {} ({}) must be in reserved range", code, message); + assert!( + (-32700..=-32600).contains(&code), + "Standard error code {} ({}) must be in reserved range", + code, + message + ); } } @@ -142,8 +176,12 @@ fn test_mcp_specific_error_codes() { for (code, name) in mcp_error_codes { // MCP-specific codes are in the server error range - assert!((-32099..=-32000).contains(&code), - "MCP error code {} ({}) must be in server error range", code, name); + assert!( + (-32099..=-32000).contains(&code), + "MCP error code {} ({}) must be in server error range", + code, + name + ); } } @@ -177,11 +215,20 @@ fn test_mcp_initialize_request_format() { }); let params = &init_request["params"]; - assert!(params["protocolVersion"].is_string(), "protocolVersion required"); + assert!( + params["protocolVersion"].is_string(), + "protocolVersion required" + ); assert!(params["capabilities"].is_object(), "capabilities required"); assert!(params["clientInfo"].is_object(), "clientInfo required"); - assert!(params["clientInfo"]["name"].is_string(), "clientInfo.name required"); - assert!(params["clientInfo"]["version"].is_string(), "clientInfo.version required"); + assert!( + params["clientInfo"]["name"].is_string(), + "clientInfo.name required" + ); + assert!( + params["clientInfo"]["version"].is_string(), + "clientInfo.version required" + ); } /// Test MCP initialize response format. @@ -206,11 +253,26 @@ fn test_mcp_initialize_response_format() { "instructions": "Vestige is your long-term memory system." }); - assert!(init_response["protocolVersion"].is_string(), "protocolVersion required"); - assert!(init_response["serverInfo"].is_object(), "serverInfo required"); - assert!(init_response["serverInfo"]["name"].is_string(), "serverInfo.name required"); - assert!(init_response["serverInfo"]["version"].is_string(), "serverInfo.version required"); - assert!(init_response["capabilities"].is_object(), "capabilities required"); + assert!( + init_response["protocolVersion"].is_string(), + "protocolVersion required" + ); + assert!( + init_response["serverInfo"].is_object(), + "serverInfo required" + ); + assert!( + init_response["serverInfo"]["name"].is_string(), + "serverInfo.name required" + ); + assert!( + init_response["serverInfo"]["version"].is_string(), + "serverInfo.version required" + ); + assert!( + init_response["capabilities"].is_object(), + "capabilities required" + ); } /// Test that requests before initialization are rejected. @@ -229,8 +291,10 @@ fn test_server_rejects_requests_before_initialize() { } }); - assert_eq!(pre_init_error["error"]["code"], -32003, - "Pre-initialization requests should return ServerNotInitialized error"); + assert_eq!( + pre_init_error["error"]["code"], -32003, + "Pre-initialization requests should return ServerNotInitialized error" + ); } // ============================================================================ @@ -277,9 +341,14 @@ fn test_tools_list_response_format() { for tool in tools { assert!(tool["name"].is_string(), "Tool must have name"); - assert!(tool["inputSchema"].is_object(), "Tool must have inputSchema"); - assert_eq!(tool["inputSchema"]["type"], "object", - "inputSchema must be an object type"); + assert!( + tool["inputSchema"].is_object(), + "Tool must have inputSchema" + ); + assert_eq!( + tool["inputSchema"]["type"], "object", + "inputSchema must be an object type" + ); } } @@ -306,7 +375,10 @@ fn test_tools_call_request_format() { let params = &tools_call_request["params"]; assert!(params["name"].is_string(), "Tool name required"); - assert!(params["arguments"].is_object(), "Arguments should be an object"); + assert!( + params["arguments"].is_object(), + "Arguments should be an object" + ); } /// Test tools/call response format. @@ -328,8 +400,14 @@ fn test_tools_call_response_format() { let content = tools_call_response["content"].as_array().unwrap(); assert!(!content.is_empty(), "Content array should not be empty"); - assert!(content[0]["type"].is_string(), "Content item must have type"); - assert!(content[0]["text"].is_string(), "Text content must have text field"); + assert!( + content[0]["type"].is_string(), + "Content item must have type" + ); + assert!( + content[0]["text"].is_string(), + "Text content must have text field" + ); } // ============================================================================ @@ -407,6 +485,8 @@ fn test_resources_read_response_format() { assert!(!contents.is_empty(), "Contents should not be empty"); assert!(contents[0]["uri"].is_string(), "Content must have uri"); // Must have either text or blob - assert!(contents[0]["text"].is_string() || contents[0]["blob"].is_string(), - "Content must have text or blob"); + assert!( + contents[0]["text"].is_string() || contents[0]["blob"].is_string(), + "Content must have text or blob" + ); } diff --git a/tests/e2e/tests/mcp/tool_tests.rs b/tests/e2e/tests/mcp/tool_tests.rs index 4eaaa17..cbc43b5 100644 --- a/tests/e2e/tests/mcp/tool_tests.rs +++ b/tests/e2e/tests/mcp/tool_tests.rs @@ -3,7 +3,7 @@ //! Comprehensive tests for all MCP tools provided by Vestige. //! Tests cover input validation, execution, and response formats. -use serde_json::{json, Value}; +use serde_json::{Value, json}; // ============================================================================ // HELPER FUNCTIONS @@ -11,7 +11,10 @@ use serde_json::{json, Value}; /// Validate a tool call response structure fn validate_tool_response(response: &Value) { - assert!(response["content"].is_array(), "Response must have content array"); + assert!( + response["content"].is_array(), + "Response must have content array" + ); let content = response["content"].as_array().unwrap(); assert!(!content.is_empty(), "Content array must not be empty"); assert!(content[0]["type"].is_string(), "Content must have type"); @@ -74,7 +77,10 @@ fn test_ingest_tool_rejects_empty_content() { "isError": true }); - assert_eq!(expected_error["isError"], true, "Empty content should be an error"); + assert_eq!( + expected_error["isError"], true, + "Empty content should be an error" + ); } /// Test ingest tool with all optional fields. @@ -193,7 +199,10 @@ fn test_semantic_search_valid() { validate_tool_response(&expected_response); let parsed = parse_response_text(&expected_response); - assert_eq!(parsed["method"], "semantic", "Should indicate semantic search"); + assert_eq!( + parsed["method"], "semantic", + "Should indicate semantic search" + ); } /// Test semantic search handles embedding not ready. @@ -209,7 +218,10 @@ fn test_semantic_search_embedding_not_ready() { }); let parsed = parse_response_text(&expected_response); - assert!(parsed["error"].is_string(), "Should explain embedding not ready"); + assert!( + parsed["error"].is_string(), + "Should explain embedding not ready" + ); assert!(parsed["hint"].is_string(), "Should provide hint"); } @@ -337,7 +349,10 @@ fn test_mark_reviewed_with_rating() { let parsed = parse_response_text(&expected_response); assert_eq!(parsed["success"], true, "Review should succeed"); - assert!(parsed["nextReview"].is_string(), "Should return next review date"); + assert!( + parsed["nextReview"].is_string(), + "Should return next review date" + ); } /// Test mark_reviewed with invalid rating. @@ -382,8 +397,14 @@ fn test_get_stats() { validate_tool_response(&expected_response); let parsed = parse_response_text(&expected_response); - assert!(parsed["totalNodes"].is_number(), "Should return total nodes"); - assert!(parsed["averageRetention"].is_number(), "Should return average retention"); + assert!( + parsed["totalNodes"].is_number(), + "Should return total nodes" + ); + assert!( + parsed["averageRetention"].is_number(), + "Should return average retention" + ); } /// Test health_check returns health status. @@ -431,7 +452,10 @@ fn test_set_intention_basic() { let parsed = parse_response_text(&expected_response); assert_eq!(parsed["success"], true, "Should succeed"); - assert!(parsed["intentionId"].is_string(), "Should return intention ID"); + assert!( + parsed["intentionId"].is_string(), + "Should return intention ID" + ); assert_eq!(parsed["priority"], 3, "High priority should be 3"); } @@ -477,8 +501,14 @@ fn test_check_intentions_with_context() { }); let parsed = parse_response_text(&expected_response); - assert!(parsed["triggered"].is_array(), "Should return triggered intentions"); - assert!(parsed["pending"].is_array(), "Should return pending intentions"); + assert!( + parsed["triggered"].is_array(), + "Should return triggered intentions" + ); + assert!( + parsed["pending"].is_array(), + "Should return pending intentions" + ); } /// Test complete_intention marks as fulfilled. @@ -523,7 +553,10 @@ fn test_list_intentions_with_filter() { }); let parsed = parse_response_text(&expected_response); - assert!(parsed["intentions"].is_array(), "Should return intentions array"); + assert!( + parsed["intentions"].is_array(), + "Should return intentions array" + ); assert_eq!(parsed["status"], "active", "Should echo status filter"); } @@ -553,9 +586,18 @@ fn test_tool_schemas_are_valid_json_schema() { "required": ["content"] }); - assert_eq!(ingest_schema["type"], "object", "Schema must be object type"); - assert!(ingest_schema["properties"].is_object(), "Must have properties"); - assert!(ingest_schema["required"].is_array(), "Must specify required fields"); + assert_eq!( + ingest_schema["type"], "object", + "Schema must be object type" + ); + assert!( + ingest_schema["properties"].is_object(), + "Must have properties" + ); + assert!( + ingest_schema["required"].is_array(), + "Must specify required fields" + ); } /// Test all tools have required inputSchema fields. @@ -575,7 +617,10 @@ fn test_all_tools_have_schema() { ]; for (tool_name, required_fields) in tool_definitions { - assert!(!required_fields.is_empty(), - "Tool {} should have at least one required field", tool_name); + assert!( + !required_fields.is_empty(), + "Tool {} should have at least one required field", + tool_name + ); } } From b4511a7111f2a35e38130f73fb7519750c4f9c87 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Tue, 14 Apr 2026 18:03:56 -0500 Subject: [PATCH 17/49] fix(ci): unblock Intel Mac + Windows MSVC builds in v2.0.5 release workflow Two unrelated upstream issues were stopping two of our four release targets. Root-caused and fixed both so v2.0.5 ships on 100% of supported platforms. Windows MSVC (new regression in v2.0.5): `usearch 2.24.0` introduced a `memory_mapping_allocator_gt` template that references the POSIX `MAP_FAILED` macro from , which doesn't exist on MSVC. Confirmed upstream as unum-cloud/usearch#746 (open). The bump from 2.23.0 happened during the v2.0.5 Cargo.lock refresh. Pinned `usearch = "=2.23.0"` in crates/vestige-core/Cargo.toml with a comment linking the upstream issue. Unpin when the fix lands. Intel Mac (latent bug exposed by the ci workaround): Root cause was feature-propagation, not the release workflow. crates/vestige-mcp/Cargo.toml hardcoded `features = ["bundled-sqlite", "embeddings", "vector-search"]` on its vestige-core dep, which forcibly enabled vestige-core's embeddings feature regardless of whether vestige-mcp's own `embeddings` feature flag was set. With `--no-default-features` at the top level (the old Intel Mac ci workaround), vestige-mcp's feature flags turned off but vestige-core's embeddings stayed on through the hardcoded list. That pulled in fastembed -> ort-sys, but without any of the flags that select ort-sys' backend binaries, so the ort-sys build script failed with "does not provide prebuilt binaries for the target x86_64-apple-darwin with feature set (no features)". Fix: - Drop `embeddings` and `vector-search` from the hardcoded features list in crates/vestige-mcp/Cargo.toml. Leave only `bundled-sqlite` as an always-on base feature. The existing `embeddings = ["vestige-core/embeddings"]` / `vector-search = ["vestige-core/vector-search"]` flag declarations now actually gate those features as intended. - Bump the vestige-core dep version ref 2.0.4 -> 2.0.5 (was stale). - Drop `cargo_flags: "--no-default-features"` from the Intel Mac target in .github/workflows/release.yml. The original reason for that workaround was sidestepping the same ort-sys issue, but with the feature-propagation bug fixed, Intel Mac now builds with full default features the same way aarch64-darwin does on the same macos-14 runner. Verification: - `cargo tree -p vestige-mcp --no-default-features -i fastembed` -> "did not match any packages" (fastembed truly absent now) - `cargo tree -p vestige-mcp --no-default-features -i ort-sys` -> same - `cargo build --release -p vestige-mcp` -> clean, 1m 21s, usearch 2.23.0 Same v2.0.5 tag. Rust source code identical to 8178beb. Re-triggering the release workflow via workflow_dispatch will rebuild all four platforms and upload to the existing v2.0.5 release page. --- .github/workflows/release.yml | 7 ++++++- Cargo.lock | 4 ++-- crates/vestige-core/Cargo.toml | 6 +++++- crates/vestige-mcp/Cargo.toml | 8 ++++++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3dc7c73..b358394 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,10 +31,15 @@ jobs: os: windows-latest archive: zip cargo_flags: "" + # Intel Mac: drops the old --no-default-features workaround. That + # flag was added to sidestep ort-sys lacking Intel Mac prebuilts, + # but fixing the feature propagation in vestige-mcp (embeddings + # now fully flows through fastembed) means the download-binaries + # feature reaches ort-sys the same way it does on aarch64. - target: x86_64-apple-darwin os: macos-14 archive: tar.gz - cargo_flags: "--no-default-features" + cargo_flags: "" - target: aarch64-apple-darwin os: macos-latest archive: tar.gz diff --git a/Cargo.lock b/Cargo.lock index 410e4d6..c365449 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4456,9 +4456,9 @@ dependencies = [ [[package]] name = "usearch" -version = "2.24.0" +version = "2.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09657b7d3d88992d7475be6f345d3cb3b388d13c152dbd4742e0b955e3a2b632" +checksum = "0a03c05af8d678ec19f014c734ab667c20ea54128b4f9a1472cb470246a9b341" dependencies = [ "cxx", "cxx-build", diff --git a/crates/vestige-core/Cargo.toml b/crates/vestige-core/Cargo.toml index 212cde6..ecc1e3a 100644 --- a/crates/vestige-core/Cargo.toml +++ b/crates/vestige-core/Cargo.toml @@ -90,7 +90,11 @@ fastembed = { version = "5.11", default-features = false, features = ["hf-hub-na # ============================================================================ # OPTIONAL: Vector Search (USearch - HNSW, 20x faster than FAISS) # ============================================================================ -usearch = { version = "2", optional = true } +# Pinned to 2.23.0 — 2.24.0 introduced a Windows MSVC compile break because +# its memory_mapping_allocator_gt template references the POSIX MAP_FAILED +# macro from , which doesn't exist on MSVC. Tracked upstream in +# unum-cloud/usearch#746. Unpin when the upstream fix lands. +usearch = { version = "=2.23.0", optional = true } # LRU cache for query embeddings lru = "0.16" diff --git a/crates/vestige-mcp/Cargo.toml b/crates/vestige-mcp/Cargo.toml index a8851f8..37d9777 100644 --- a/crates/vestige-mcp/Cargo.toml +++ b/crates/vestige-mcp/Cargo.toml @@ -34,8 +34,12 @@ path = "src/bin/cli.rs" # VESTIGE CORE - The cognitive science engine # ============================================================================ # Includes: FSRS-6, spreading activation, synaptic tagging, hippocampal indexing, -# memory states, context memory, importance signals, dreams, and more -vestige-core = { version = "2.0.4", path = "../vestige-core", default-features = false, features = ["bundled-sqlite", "embeddings", "vector-search"] } +# memory states, context memory, importance signals, dreams, and more. +# +# Only `bundled-sqlite` is always on. `embeddings` and `vector-search` are +# toggled via vestige-mcp's own feature flags below so `--no-default-features` +# actually works (previously hardcoded here, which silently defeated the flag). +vestige-core = { version = "2.0.5", path = "../vestige-core", default-features = false, features = ["bundled-sqlite"] } # ============================================================================ # MCP Server Dependencies From e9b2aa6d4d7a83b18c1c0dde3b802ee453dfe8e0 Mon Sep 17 00:00:00 2001 From: Sam Valladares <143034159+samvallad33@users.noreply.github.com> Date: Thu, 16 Apr 2026 14:27:46 -0500 Subject: [PATCH 18/49] Clarify AI terminology in README Updated terminology --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f0aff79..d4169f3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # Vestige -### The cognitive engine that gives AI a brain. +### The cognitive engine that gives AI agents a brain. [![GitHub stars](https://img.shields.io/github/stars/samvallad33/vestige?style=social)](https://github.com/samvallad33/vestige) [![Release](https://img.shields.io/github/v/release/samvallad33/vestige)](https://github.com/samvallad33/vestige/releases/latest) @@ -10,7 +10,7 @@ [![License](https://img.shields.io/badge/license-AGPL--3.0-blue)](LICENSE) [![MCP Compatible](https://img.shields.io/badge/MCP-compatible-green)](https://modelcontextprotocol.io) -**Your AI forgets everything between sessions. Vestige fixes that.** +**Your Agent forgets everything between sessions. Vestige fixes that.** Built on 130 years of memory research — FSRS-6 spaced repetition, prediction error gating, synaptic tagging, spreading activation, memory dreaming — all running in a single Rust binary with a 3D neural visualization dashboard. 100% local. Zero cloud. From d58e851af58ed28128674380926986ae73d63148 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Sat, 18 Apr 2026 18:16:56 -0500 Subject: [PATCH 19/49] fix(dashboard): intentions page priority + trigger rendering IntentionItem.priority was typed as string but the API returns the numeric FSRS-style scale (1=low, 2=normal, 3=high, 4=critical), so the dashboard always rendered 'normal priority' regardless of the real value. trigger_value was also a plain string but the API actually returns trigger_data as a JSON-encoded payload (e.g. {"type":"time", "at":"..."}), so the UI surfaced raw JSON or empty strings for every non-manual trigger. Swap to numeric priority + PRIORITY_LABELS map and add a summarizeTrigger() helper that parses trigger_data and picks the most human-readable field (condition / topic / formatted at / in_minutes / codebase/filePattern) before truncating for display. Extends PR #26 (snake_case in_minutes / file_pattern on TriggerSpec) end-to-end to the UI layer. --- apps/dashboard/src/lib/types/index.ts | 8 +-- .../src/routes/(app)/intentions/+page.svelte | 56 ++++++++++++++++--- 2 files changed, 51 insertions(+), 13 deletions(-) diff --git a/apps/dashboard/src/lib/types/index.ts b/apps/dashboard/src/lib/types/index.ts index 0e2a6de..8115163 100644 --- a/apps/dashboard/src/lib/types/index.ts +++ b/apps/dashboard/src/lib/types/index.ts @@ -178,12 +178,12 @@ export interface IntentionItem { id: string; content: string; trigger_type: string; - trigger_value: string; + trigger_data: string; // JSON-encoded trigger payload (e.g. {"type":"time","at":"..."} ) status: string; - priority: string; + priority: number; // 1=low, 2=normal, 3=high, 4=critical created_at: string; - deadline?: string; - snoozed_until?: string; + deadline?: string | null; + snoozed_until?: string | null; } // Node type colors for visualization — bioluminescent palette diff --git a/apps/dashboard/src/routes/(app)/intentions/+page.svelte b/apps/dashboard/src/routes/(app)/intentions/+page.svelte index 16236ac..ca078fb 100644 --- a/apps/dashboard/src/routes/(app)/intentions/+page.svelte +++ b/apps/dashboard/src/routes/(app)/intentions/+page.svelte @@ -15,19 +15,59 @@ snoozed: 'text-dream-glow bg-dream/10 border-dream/30', }; - const PRIORITY_COLORS: Record = { - critical: 'text-decay', - high: 'text-amber-400', - normal: 'text-dim', - low: 'text-muted', + const PRIORITY_LABELS: Record = { + 4: 'critical', + 3: 'high', + 2: 'normal', + 1: 'low', + }; + + const PRIORITY_COLORS: Record = { + 4: 'text-decay', + 3: 'text-amber-400', + 2: 'text-dim', + 1: 'text-muted', }; const TRIGGER_ICONS: Record = { time: '⏰', context: '◎', event: '⚡', + manual: '◇', }; + function summarizeTrigger(intention: IntentionItem): string { + // The API returns trigger_data as a JSON-encoded string. Parse it, pick the + // most human-readable field, then truncate for display. + let result: string; + try { + const data = JSON.parse(intention.trigger_data || '{}') as Record; + if (typeof data.condition === 'string' && data.condition) { + result = data.condition; + } else if (typeof data.topic === 'string' && data.topic) { + result = data.topic; + } else if (typeof data.at === 'string' && data.at) { + try { + result = new Date(data.at).toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); + } catch { + result = data.at; + } + } else if (typeof data.in_minutes === 'number') { + result = `in ${data.in_minutes} min`; + } else if (typeof data.inMinutes === 'number') { + result = `in ${data.inMinutes} min`; + } else if (typeof data.codebase === 'string' && data.codebase) { + const fp = typeof data.filePattern === 'string' && data.filePattern ? `/${data.filePattern}` : ''; + result = `${data.codebase}${fp}`; + } else { + result = intention.trigger_type; + } + } catch { + result = intention.trigger_type; + } + return result.length > 40 ? result.slice(0, 37) + '...' : result; + } + onMount(async () => { await loadData(); }); @@ -116,13 +156,11 @@ - {intention.priority} priority + {PRIORITY_LABELS[intention.priority] || 'normal'} priority - {intention.trigger_type}: {intention.trigger_value.length > 40 - ? intention.trigger_value.slice(0, 37) + '...' - : intention.trigger_value} + {intention.trigger_type}: {summarizeTrigger(intention)} {#if intention.deadline} From cc0e70acc8128d0c5be27876424cd03afddb99d3 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Sat, 18 Apr 2026 18:17:53 -0500 Subject: [PATCH 20/49] feat(dashboard): wire 6 graph event handlers (suppress + core cognitive) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, six live WebSocket events fired against a silent 3D graph. v2.0.5 shipped the `suppress` tool but the graph did not react to MemorySuppressed, MemoryUnsuppressed, or Rac1CascadeSwept. Three more core events — Connected, ConsolidationStarted, ImportanceScored — have been silent on the graph since v2.0.0 despite appearing in the live feed, which made the dashboard feel broken during real cognitive work. Handlers added, all driven by the existing EffectManager: - MemorySuppressed: violet implosion + compounding pulse scaled by suppression_count (Anderson 2025 SIF visualised). - MemoryUnsuppressed: rainbow burst + green pulse to mark reversal within the 24h labile window. - Rac1CascadeSwept: violet wave across a random neighbour sample (event carries counts, not IDs, until v2.1). - Connected: gentle cyan ripple from the first node on WS handshake. - ConsolidationStarted: subtle amber pulses across a 20-node sample while FSRS-6 decay runs (colour matches feed entry). - ImportanceScored: magenta pulse on the scored node with intensity proportional to composite_score (novelty/arousal/reward/attention). --- apps/dashboard/src/lib/graph/events.ts | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/apps/dashboard/src/lib/graph/events.ts b/apps/dashboard/src/lib/graph/events.ts index a554709..b13ce22 100644 --- a/apps/dashboard/src/lib/graph/events.ts +++ b/apps/dashboard/src/lib/graph/events.ts @@ -327,5 +327,118 @@ export function mapEventToEffects( } break; } + + // v2.0.5 Active Forgetting — Anderson 2025 SIF + Davis Rac1 + // These events fire when the `suppress` MCP tool is called and when + // the background Rac1 cascade worker sweeps recently-suppressed seeds. + // Before these handlers landed, suppression fired silently in the graph. + + case 'MemorySuppressed': { + const data = event.data as { + id?: string; + suppression_count?: number; + }; + if (!data.id) break; + const pos = nodePositions.get(data.id); + if (pos) { + // Violet implosion: top-down inhibitory control collapsing into the node + effects.createImplosion(pos, new THREE.Color(0xa855f7)); + // Plus a slow violet pulse so the suppressed node is visually marked + // even after the implosion frames finish. Strength scales with + // compounding suppression_count (more hits = stronger pulse). + const count = Math.max(1, data.suppression_count ?? 1); + const strength = Math.min(0.4 + count * 0.15, 1.0); + effects.addPulse(data.id, strength, new THREE.Color(0xa855f7), 0.04); + } + break; + } + + case 'MemoryUnsuppressed': { + const data = event.data as { id?: string; remaining_count?: number }; + if (!data.id) break; + const pos = nodePositions.get(data.id); + if (pos && nodeMeshMap.has(data.id)) { + // Reversal within the 24h labile window — bring the memory back. + // Rainbow spawn burst celebrates the reversal, then a green pulse + // to mark the node as "active again" (paralleling MemoryPromoted). + effects.createRainbowBurst(pos, new THREE.Color(0x00ff88)); + effects.addPulse(data.id, 1.0, new THREE.Color(0x00ff88), 0.02); + } + break; + } + + case 'Rac1CascadeSwept': { + // Rac1 cascade runs as a background sweep. The event carries counts, + // not specific node IDs, so we visualize it as a subtle violet wave + // rippling through random sampled neighbors to indicate "decay is + // spreading through co-activated memories." Future v2.1 events may + // carry the actual affected IDs; this handler can be tightened then. + const data = event.data as { + seeds?: number; + neighbors_affected?: number; + }; + const affected = data.neighbors_affected ?? 0; + if (affected === 0) break; + const allIds = Array.from(nodeMeshMap.keys()); + const sampleSize = Math.min(affected, allIds.length, 12); + for (let i = 0; i < sampleSize; i++) { + const idx = Math.floor(Math.random() * allIds.length); + const targetId = allIds[idx]; + effects.addPulse(targetId, 0.5, new THREE.Color(0xa855f7), 0.035); + } + break; + } + + // v2.0.6: wire three previously-silent core events. Before this, the + // live feed showed Connected / ConsolidationStarted / ImportanceScored + // firing but the 3D graph stayed motionless — users perceived the + // dashboard as unresponsive during real cognitive work. + + case 'Connected': { + // WebSocket handshake just completed. A gentle ripple from the + // first node signals "link is live" without dominating the scene. + const firstId = nodeMeshMap.keys().next().value; + if (!firstId) break; + const pos = nodePositions.get(firstId); + if (pos) { + effects.createRippleWave(pos); + } + break; + } + + case 'ConsolidationStarted': { + // FSRS-6 consolidation cycle starting. Amber pulses across a + // random sample signal "retention scores are recomputing across + // the graph." Intentionally subtle — consolidation runs for + // seconds, so the visual shouldn't demand attention the whole + // time. Colour matches the ConsolidationStarted feed entry. + const allIds = Array.from(nodeMeshMap.keys()); + const sampleSize = Math.min(allIds.length, 20); + for (let i = 0; i < sampleSize; i++) { + const idx = Math.floor(Math.random() * allIds.length); + const targetId = allIds[idx]; + effects.addPulse(targetId, 0.45, new THREE.Color(0xffb800), 0.025); + } + break; + } + + case 'ImportanceScored': { + // A memory just had its 4-channel importance score recomputed + // (novelty + arousal + reward + attention). Magenta pulse on the + // scored node with strength proportional to composite score so + // users can visually rank importance across the graph. + const data = event.data as { + id?: string; + composite_score?: number; + }; + if (!data.id) break; + const pos = nodePositions.get(data.id); + if (pos && nodeMeshMap.has(data.id)) { + const score = Math.max(0, Math.min(1, data.composite_score ?? 0.5)); + const strength = 0.3 + score * 0.7; + effects.addPulse(data.id, strength, new THREE.Color(0xff3cac), 0.03); + } + break; + } } } From 5772cdcb19cfa07de4583c1e65f0098f2b4797ec Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Sat, 18 Apr 2026 18:19:02 -0500 Subject: [PATCH 21/49] feat(mcp): opt-in VESTIGE_SYSTEM_PROMPT_MODE=full composition mandate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MCP `instructions` field is injected into every connecting client's system prompt on Initialize — Claude Code, Cursor, Zed, Windsurf, and anyone else running Vestige. That reach demands a default that serves every user, not the project maintainer's personal workflow. Default ("minimal", 3 sentences) tells the client how to use Vestige and how to respond to explicit feedback signals. It is safe for every audience: competitive coders, hobbyists saving recipes, Rails devs saving bug fixes, enterprise deployments under system-prompt review. The full composition mandate — Composing / Never-composed / Recommendation shape + FSRS-trust blocking phrase + origin case study — is load-bearing for decision-adjacent work but misfires on trivial retrievals ("what's my favorite color"). Opt in on your own machine with `VESTIGE_SYSTEM_PROMPT_MODE=full`; four hundred strangers do not inherit one maintainer's trauma scar on every session. Extracted into build_instructions() so the branch is a single env-var check on Initialize, not a compile-time switch. main.rs --help output advertises the new variable alongside VESTIGE_DASHBOARD_ENABLED. --- crates/vestige-mcp/src/main.rs | 3 ++ crates/vestige-mcp/src/server.rs | 53 +++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/crates/vestige-mcp/src/main.rs b/crates/vestige-mcp/src/main.rs index 4ac6237..32681ed 100644 --- a/crates/vestige-mcp/src/main.rs +++ b/crates/vestige-mcp/src/main.rs @@ -91,6 +91,9 @@ fn parse_args() -> Config { println!(" VESTIGE_HTTP_PORT HTTP transport port (default: 3928)"); println!(" VESTIGE_DASHBOARD_ENABLED Enable dashboard (default: disabled)"); println!(" VESTIGE_DASHBOARD_PORT Dashboard port (default: 3927)"); + println!( + " VESTIGE_SYSTEM_PROMPT_MODE Inject the full composition mandate into every MCP session (minimal|full, default: minimal)" + ); println!(); println!("EXAMPLES:"); println!(" vestige-mcp"); diff --git a/crates/vestige-mcp/src/server.rs b/crates/vestige-mcp/src/server.rs index 4f3f1e3..c6d87b1 100644 --- a/crates/vestige-mcp/src/server.rs +++ b/crates/vestige-mcp/src/server.rs @@ -22,6 +22,50 @@ use crate::resources; use crate::tools; use vestige_core::Storage; +/// Build the MCP `instructions` string injected into every connecting client's +/// system prompt. +/// +/// Default ("minimal", 3 sentences) is safe for any user: competitive coders, +/// hobbyists saving recipes, Rails devs saving bug fixes, enterprise deployments. +/// It earns its per-session token cost by telling the client *how* to use +/// Vestige without imposing one maintainer's workflow on strangers. +/// +/// The "full" variant is the composition mandate that enforces the +/// Composing / Never-composed / Recommendation response shape, names the +/// AIMO3 36/50 case study as the origin, and includes the "Vestige is +/// blocking this:" refusal phrase. It is load-bearing for Sam's own +/// decision-adjacent work but would misfire on trivial retrievals for a +/// general audience, so it is opt-in via `VESTIGE_SYSTEM_PROMPT_MODE=full`. +/// +/// Anything other than `full` falls back to minimal. +fn build_instructions() -> String { + let mode = std::env::var("VESTIGE_SYSTEM_PROMPT_MODE").unwrap_or_default(); + if mode.eq_ignore_ascii_case("full") { + "Vestige is your long-term cognitive memory AND reasoning engine, not a RAG database. \ + Every retrieval MUST be composed into a recommendation, never summarized.\ + \n\nCOMPOSITION MANDATE: When you receive memories from search, deep_reference, \ + cross_reference, or explore_connections, your response MUST follow this shape. \ + (a) Composing: [memory IDs], followed by your composition logic (your chain-of-thought \ + about how the memories relate, NOT a restatement of their contents). \ + (b) Never-composed detected: list combinations of retrieved memories that share \ + tags/topics but have never been referenced together, or write 'None.' \ + (c) Recommendation: what the user should DO, as a concrete executable action. \ + If your draft begins 'Memory A says X. Memory B says Y.' STOP and rewrite.\ + \n\nBLOCKING PHRASE: If retrieved high-trust memories (retention > 0.7, reps > 0) \ + contradict what you were about to say, start your response with 'Vestige is blocking this:' \ + and surface the contradiction verbatim before proceeding. FSRS trust overrides fresh guesses.\ + \n\nFEEDBACK: If the user confirms a memory was helpful, call memory(action='promote'). \ + If they correct it, call memory(action='demote'). Do not ask permission, just act." + .to_string() + } else { + "Vestige is your long-term memory system. Compose retrievals into recommendations \ + rather than listing their contents when the user is making a decision. \ + On user feedback, call memory(action='promote') for helpful retrievals and \ + memory(action='demote') for wrong ones — do not ask permission, just act." + .to_string() + } +} + /// MCP Server implementation pub struct McpServer { storage: Arc, @@ -157,14 +201,7 @@ impl McpServer { }), prompts: None, }, - instructions: Some( - "Vestige is your long-term memory system. Use it to remember important information, \ - recall past knowledge, and maintain context across sessions. The system uses \ - FSRS-6 spaced repetition to naturally decay memories over time. \ - \n\nFeedback Protocol: If the user explicitly confirms a memory was helpful, use \ - memory(action='promote'). If they correct a hallucination or say a memory was wrong, use \ - memory(action='demote'). Do not ask for permission - just act on their feedback.".to_string() - ), + instructions: Some(build_instructions()), }; serde_json::to_value(result).map_err(|e| JsonRpcError::internal_error(&e.to_string())) From 6be374d115a3588daca452d323085988096183ef Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Sat, 18 Apr 2026 18:19:35 -0500 Subject: [PATCH 22/49] docs(readme): v2.0.6 "Composer" header + honesty on Intel Mac / Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three changes, all aimed at new-user experience: 1. v2.0.6 "Composer" section up top — explicitly names the three user- happiness wins: six live graph reactions (was one), intentions page priority + trigger rendering fix, and the opt-in `VESTIGE_SYSTEM_PROMPT_MODE=full` composition mandate (default stays minimal so nothing gets imposed on users' system prompts). 2. v2.0.5 "Intentional Amnesia" block strengthened — clarifies the distinction between passive Ebbinghaus decay, Anderson 1994 retrieval-induced forgetting, and v2.0.5's top-down active suppression (Anderson 2025 + Cervantes-Sandoval 2020). Adds a "Forgetting" row to the RAG-vs-Vestige comparison table. 3. Install section honesty on Intel Mac + Windows — the pre-built binary download links 404 on those targets because of upstream toolchain gaps (`ort-sys` lacks Intel Mac prebuilts in the 2.0.0-rc.11 release pinned by fastembed 5.13.2; `usearch 2.24.0` hit a Windows MSVC compile break tracked as usearch#746). Replaced the dead links with a `cargo build --release -p vestige-mcp` snippet that works today. --- README.md | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index d4169f3..5cd42e0 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,21 @@ Built on 130 years of memory research — FSRS-6 spaced repetition, prediction e --- +## What's New in v2.0.6 "Composer" + +v2.0.6 is a polish release that makes the existing cognitive stack finally *feel* alive in the dashboard and stays out of your way on the prompt side. + +- **Six live graph reactions, not one** — `MemorySuppressed`, `MemoryUnsuppressed`, `Rac1CascadeSwept`, `Connected`, `ConsolidationStarted`, and `ImportanceScored` now light the 3D graph in real time. v2.0.5 shipped `suppress` but the graph was silent when you called it; consolidation and importance scoring have been silent since v2.0.0. No longer. +- **Intentions page actually works** — fixes a long-standing bug where every intention rendered as "normal priority" (type/schema drift between backend and frontend) and context/time triggers surfaced as raw JSON. +- **Opt-in composition mandate** — the new MCP `instructions` string stays minimal by default. Opt in to the full Composing / Never-composed / Recommendation composition protocol with `VESTIGE_SYSTEM_PROMPT_MODE=full` when you want it, and nothing is imposed on your sessions when you don't. + ## What's New in v2.0.5 "Intentional Amnesia" -The first AI memory system that can actively forget. New **`suppress`** tool applies top-down inhibitory control over retrieval — each call compounds a penalty (up to 80%), a background Rac1 worker fades co-activated neighbors over 72h, and it's reversible within a 24h labile window. **Never deletes** — the memory is inhibited, not erased. +**The first shipped AI memory system with top-down inhibitory control over retrieval.** Other systems implement passive decay — memories fade if you don't touch them. Vestige v2.0.5 also implements *active* suppression: the new **`suppress`** tool compounds a retrieval penalty on every call (up to 80%), a background Rac1 worker fades co-activated neighbors over 72 hours, and the whole thing is reversible within a 24-hour labile window. **Never deletes.** The memory is inhibited, not erased. -Based on [Anderson et al. 2025](https://www.nature.com/articles/s41583-025-00929-y) (Suppression-Induced Forgetting) and [Cervantes-Sandoval et al. 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/) (Rac1 synaptic cascade). **24 tools · 30 cognitive modules · 1,284 tests.** +Ebbinghaus 1885 models what happens to memories you don't touch. Anderson 2025 models what happens when you actively want to stop thinking about one. Every other AI memory system implements the first. Vestige is the first to ship the second. + +Based on [Anderson et al. 2025](https://www.nature.com/articles/s41583-025-00929-y) (Suppression-Induced Forgetting, *Nat Rev Neurosci*) and [Cervantes-Sandoval et al. 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/) (Rac1 synaptic cascade). **24 tools · 30 cognitive modules · 1,284 tests.**
Earlier releases (v2.0 "Cognitive Leap" → v2.0.4 "Deep Reference") @@ -64,19 +74,19 @@ codex mcp add vestige -- /usr/local/bin/vestige-mcp
Other platforms & install methods -**macOS (Intel):** -```bash -curl -L https://github.com/samvallad33/vestige/releases/latest/download/vestige-mcp-x86_64-apple-darwin.tar.gz | tar -xz -sudo mv vestige-mcp vestige vestige-restore /usr/local/bin/ -``` - **Linux (x86_64):** ```bash curl -L https://github.com/samvallad33/vestige/releases/latest/download/vestige-mcp-x86_64-unknown-linux-gnu.tar.gz | tar -xz sudo mv vestige-mcp vestige vestige-restore /usr/local/bin/ ``` -**Windows:** Download from [Releases](https://github.com/samvallad33/vestige/releases/latest) +**macOS (Intel) and Windows:** Prebuilt binaries aren't currently shipped for these targets because of upstream toolchain gaps (`ort-sys` lacks Intel Mac prebuilts in the 2.0.0-rc.11 release that `fastembed 5.13.2` is pinned to; `usearch 2.24.0` hit a Windows MSVC compile break tracked as [usearch#746](https://github.com/unum-cloud/usearch/issues/746)). Both build fine from source in the meantime: + +```bash +git clone https://github.com/samvallad33/vestige && cd vestige +cargo build --release -p vestige-mcp +# Binary lands at target/release/vestige-mcp +``` **npm:** ```bash @@ -170,6 +180,7 @@ RAG is a dumb bucket. Vestige is an active organ. | **Storage** | Store everything | **Prediction Error Gating** — only stores what's surprising or new | | **Retrieval** | Nearest-neighbor | **7-stage pipeline** — HyDE expansion + reranking + spreading activation | | **Decay** | Nothing expires | **FSRS-6** — memories fade naturally, context stays lean | +| **Forgetting** *(v2.0.5)* | Delete only | **`suppress` tool** — compounding top-down inhibition, neighbor cascade, reversible 24h | | **Duplicates** | Manual dedup | **Self-healing** — auto-merges "likes dark mode" + "prefers dark themes" | | **Importance** | All equal | **4-channel scoring** — novelty, arousal, reward, attention | | **Sleep** | No consolidation | **Memory dreaming** — replays, connects, synthesizes insights | @@ -201,7 +212,7 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen **Autonomic Regulation** — Self-regulating memory health. Auto-promotes frequently accessed memories. Auto-GCs low-retention memories. Consolidation triggers on 6h staleness or 2h active use. -**Active Forgetting** *(v2.0.5)* — Top-down inhibitory control via the `suppress` tool, distinct from passive FSRS decay and from bottom-up retrieval-induced forgetting. Each call compounds (Suppression-Induced Forgetting), a background Rac1 cascade worker fades co-activated neighbors, and a 24-hour labile window allows reversal. The memory persists — it's **inhibited, not erased**. Based on [Anderson et al., 2025](https://www.nature.com/articles/s41583-025-00929-y) and [Cervantes-Sandoval et al., 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/). First AI memory system to implement this. +**Active Forgetting** *(v2.0.5)* — Top-down inhibitory control via the `suppress` tool. Other memory systems implement passive decay — the Ebbinghaus 1885 "use it or lose it" curve, sometimes with trust-weighted strength factors. Vestige v2.0.5 also implements *active* top-down suppression: each `suppress` call compounds (Suppression-Induced Forgetting, Anderson 2025), a background Rac1 cascade worker fades co-activated neighbors across the connection graph (Cervantes-Sandoval & Davis 2020), and a 24-hour labile window allows reversal (Nader reconsolidation semantics on a pragmatic axis). The memory persists — it's **inhibited, not erased**. Explicitly distinct from Anderson 1994 retrieval-induced forgetting (bottom-up, passive competition during retrieval), which is a separate, older primitive that several other memory systems implement. Based on [Anderson et al., 2025](https://www.nature.com/articles/s41583-025-00929-y) and [Cervantes-Sandoval et al., 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/). First shipped AI memory system with this primitive. [Full science documentation ->](docs/SCIENCE.md) @@ -304,7 +315,7 @@ At the start of every session: | **Transport** | MCP stdio (JSON-RPC 2.0) + WebSocket | | **Cognitive modules** | 30 stateful (17 neuroscience, 11 advanced, 2 search) | | **First run** | Downloads embedding model (~130MB), then fully offline | -| **Platforms** | macOS (ARM/Intel), Linux (x86_64), Windows | +| **Platforms** | macOS ARM + Linux x86_64 (prebuilt). macOS Intel + Windows build from source (upstream toolchain gaps, see install notes). | ### Optional Features From 6c24a0ca69d9bdabae57309c23659f53330fdc45 Mon Sep 17 00:00:00 2001 From: Sam Valladares Date: Sat, 18 Apr 2026 18:33:04 -0500 Subject: [PATCH 23/49] =?UTF-8?q?chore(release):=20v2.0.6=20"Composer"=20?= =?UTF-8?q?=E2=80=94=20rebuild=20+=20version=20bump=20+=20CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps vestige-core + vestige-mcp + @vestige/dashboard + vestige-mcp-server + @vestige/init from 2.0.5 → 2.0.6, regenerates the Cargo.lock, rebuilds the dashboard with the new events.ts handlers + intentions page fix baked in, and writes the v2.0.6 "Composer" entry to CHANGELOG.md. Release contents: - fix(dashboard): intentions page priority + trigger rendering (commit 9df63de) - feat(dashboard): wire 6 graph event handlers — suppress, unsuppress, Rac1 cascade, Connected, ConsolidationStarted, ImportanceScored (commit f085cfd) - feat(mcp): opt-in VESTIGE_SYSTEM_PROMPT_MODE=full composition mandate (commit 7d7a7c2) - docs(readme): v2.0.6 header + Intel Mac / Windows build-from-source honesty (commit ede0a02) Pre-push gates green: cargo test --workspace --release, cargo clippy --all-targets -D warnings, svelte-check (580 files 0 errors), vitest (171/171). No regressions of merged PRs #18/20/22/24/26/28/29/30/32/33. --- CHANGELOG.md | 39 +++++++++++ Cargo.lock | 4 +- .../build/_app/immutable/chunks/BAlzCWFX.js | 1 + .../_app/immutable/chunks/BAlzCWFX.js.br | Bin 0 -> 2613 bytes .../_app/immutable/chunks/BAlzCWFX.js.gz | Bin 0 -> 2955 bytes .../build/_app/immutable/chunks/D1EqE5Bq.js | 1 + .../_app/immutable/chunks/D1EqE5Bq.js.br | Bin 0 -> 7673 bytes .../_app/immutable/chunks/D1EqE5Bq.js.gz | Bin 0 -> 8414 bytes .../build/_app/immutable/chunks/DwA4GIGc.js | 1 - .../_app/immutable/chunks/DwA4GIGc.js.br | Bin 7669 -> 0 bytes .../_app/immutable/chunks/DwA4GIGc.js.gz | Bin 8413 -> 0 bytes .../build/_app/immutable/chunks/urMNLRPv.js | 1 - .../_app/immutable/chunks/urMNLRPv.js.br | Bin 2612 -> 0 bytes .../_app/immutable/chunks/urMNLRPv.js.gz | Bin 2954 -> 0 bytes .../{app.DzQ7RYYG.js => app.Bvvx1UVC.js} | 4 +- .../_app/immutable/entry/app.Bvvx1UVC.js.br | Bin 0 -> 3146 bytes .../_app/immutable/entry/app.Bvvx1UVC.js.gz | Bin 0 -> 3590 bytes .../_app/immutable/entry/app.DzQ7RYYG.js.br | Bin 3153 -> 0 bytes .../_app/immutable/entry/app.DzQ7RYYG.js.gz | Bin 3591 -> 0 bytes .../_app/immutable/entry/start.CM2cmm4m.js | 1 - .../_app/immutable/entry/start.CM2cmm4m.js.br | Bin 112 -> 0 bytes .../_app/immutable/entry/start.CM2cmm4m.js.gz | Bin 108 -> 0 bytes .../_app/immutable/entry/start.D1AvCvNH.js | 1 + .../_app/immutable/entry/start.D1AvCvNH.js.br | 2 + .../_app/immutable/entry/start.D1AvCvNH.js.gz | Bin 0 -> 108 bytes .../nodes/{0.CrGZHYMq.js => 0.CfGq9762.js} | 2 +- .../_app/immutable/nodes/0.CfGq9762.js.br | Bin 0 -> 3184 bytes .../_app/immutable/nodes/0.CfGq9762.js.gz | Bin 0 -> 3645 bytes .../_app/immutable/nodes/0.CrGZHYMq.js.br | Bin 3180 -> 0 bytes .../_app/immutable/nodes/0.CrGZHYMq.js.gz | Bin 3646 -> 0 bytes .../nodes/{1.DUm1yZ6r.js => 1.BD13-5Fq.js} | 2 +- .../_app/immutable/nodes/1.BD13-5Fq.js.br | Bin 0 -> 355 bytes .../_app/immutable/nodes/1.BD13-5Fq.js.gz | Bin 0 -> 397 bytes .../_app/immutable/nodes/1.DUm1yZ6r.js.br | Bin 353 -> 0 bytes .../_app/immutable/nodes/1.DUm1yZ6r.js.gz | Bin 397 -> 0 bytes .../nodes/{3.lMYbfdAF.js => 3.BjemrBET.js} | 2 +- .../_app/immutable/nodes/3.BjemrBET.js.br | 1 + .../_app/immutable/nodes/3.BjemrBET.js.gz | Bin 0 -> 215 bytes .../_app/immutable/nodes/3.lMYbfdAF.js.br | Bin 176 -> 0 bytes .../_app/immutable/nodes/3.lMYbfdAF.js.gz | Bin 215 -> 0 bytes .../_app/immutable/nodes/6.BEn_WCBk.js.br | Bin 119867 -> 0 bytes .../_app/immutable/nodes/6.BEn_WCBk.js.gz | Bin 144787 -> 0 bytes .../nodes/{6.BEn_WCBk.js => 6.FZZPojTg.js} | 66 +++++++++--------- .../_app/immutable/nodes/6.FZZPojTg.js.br | Bin 0 -> 120063 bytes .../_app/immutable/nodes/6.FZZPojTg.js.gz | Bin 0 -> 145135 bytes .../build/_app/immutable/nodes/7.404BTmXF.js | 1 - .../_app/immutable/nodes/7.404BTmXF.js.br | Bin 2196 -> 0 bytes .../_app/immutable/nodes/7.404BTmXF.js.gz | Bin 2501 -> 0 bytes .../build/_app/immutable/nodes/7.DgTyksQL.js | 1 + .../_app/immutable/nodes/7.DgTyksQL.js.br | Bin 0 -> 2403 bytes .../_app/immutable/nodes/7.DgTyksQL.js.gz | Bin 0 -> 2728 bytes apps/dashboard/build/_app/version.json | 2 +- apps/dashboard/build/_app/version.json.br | Bin 31 -> 29 bytes apps/dashboard/build/_app/version.json.gz | Bin 47 -> 47 bytes apps/dashboard/build/index.html | 14 ++-- apps/dashboard/build/index.html.br | Bin 608 -> 606 bytes apps/dashboard/build/index.html.gz | Bin 794 -> 793 bytes apps/dashboard/package.json | 2 +- crates/vestige-core/Cargo.toml | 2 +- crates/vestige-mcp/Cargo.toml | 2 +- packages/vestige-init/package.json | 2 +- packages/vestige-mcp-npm/package.json | 2 +- 62 files changed, 99 insertions(+), 57 deletions(-) create mode 100644 apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js.gz create mode 100644 apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js create mode 100644 apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.br create mode 100644 apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js delete mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js.br delete mode 100644 apps/dashboard/build/_app/immutable/chunks/urMNLRPv.js.gz rename apps/dashboard/build/_app/immutable/entry/{app.DzQ7RYYG.js => app.Bvvx1UVC.js} (92%) create mode 100644 apps/dashboard/build/_app/immutable/entry/app.Bvvx1UVC.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/app.Bvvx1UVC.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.DzQ7RYYG.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/app.DzQ7RYYG.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js.br delete mode 100644 apps/dashboard/build/_app/immutable/entry/start.CM2cmm4m.js.gz create mode 100644 apps/dashboard/build/_app/immutable/entry/start.D1AvCvNH.js create mode 100644 apps/dashboard/build/_app/immutable/entry/start.D1AvCvNH.js.br create mode 100644 apps/dashboard/build/_app/immutable/entry/start.D1AvCvNH.js.gz rename apps/dashboard/build/_app/immutable/nodes/{0.CrGZHYMq.js => 0.CfGq9762.js} (99%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CfGq9762.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CfGq9762.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CrGZHYMq.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/0.CrGZHYMq.js.gz rename apps/dashboard/build/_app/immutable/nodes/{1.DUm1yZ6r.js => 1.BD13-5Fq.js} (81%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.BD13-5Fq.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/1.BD13-5Fq.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.DUm1yZ6r.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/1.DUm1yZ6r.js.gz rename apps/dashboard/build/_app/immutable/nodes/{3.lMYbfdAF.js => 3.BjemrBET.js} (80%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.BjemrBET.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/3.BjemrBET.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.lMYbfdAF.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/3.lMYbfdAF.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.BEn_WCBk.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/6.BEn_WCBk.js.gz rename apps/dashboard/build/_app/immutable/nodes/{6.BEn_WCBk.js => 6.FZZPojTg.js} (81%) create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.FZZPojTg.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/6.FZZPojTg.js.gz delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br delete mode 100644 apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.br create mode 100644 apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.gz diff --git a/CHANGELOG.md b/CHANGELOG.md index 9be1e86..d961dc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,45 @@ All notable changes to Vestige will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.0.6] - 2026-04-18 — "Composer" + +Polish release aimed at new-user happiness. v2.0.5's cognitive stack was already shipping; v2.0.6 makes it *feel* alive in the dashboard and stays out of your way on the prompt side. + +### Added + +#### Dashboard visual feedback for six live events +- `MemorySuppressed` → violet implosion + compounding pulse whose intensity scales with `suppression_count` (Anderson 2025 SIF visualised). +- `MemoryUnsuppressed` → rainbow burst + green pulse when a memory is brought back within the 24h labile window. +- `Rac1CascadeSwept` → violet wave across a random neighbour sample while the background Rac1 worker fades co-activated memories. +- `Connected` → gentle cyan ripple on WebSocket handshake. +- `ConsolidationStarted` → subtle amber pulses across a 20-node sample during the FSRS-6 decay cycle (matches feed-entry colour). +- `ImportanceScored` → magenta pulse on the scored node with intensity proportional to composite score. + +Before v2.0.6 all six events fired against a silent graph. Users perceived the dashboard as broken or unresponsive during real cognitive work. + +#### `VESTIGE_SYSTEM_PROMPT_MODE` environment variable +- `minimal` (default) — 3-sentence MCP `instructions` string telling the client how to use Vestige and how to react to explicit feedback. Safe for every audience, every client, every use case. +- `full` — opt in to the composition mandate (Composing / Never-composed / Recommendation response shape + FSRS-trust blocking phrase). Useful for high-stakes decision workflows; misfires on trivial retrievals, which is why it is not the default. + +Advertised in `vestige-mcp --help` alongside `VESTIGE_DASHBOARD_ENABLED`. + +### Fixed + +#### Dashboard intentions page +- `IntentionItem.priority` was typed as `string` but the API returns the numeric FSRS-style scale (1=low, 2=normal, 3=high, 4=critical). Every intention rendered as "normal priority" regardless of its real value. Now uses a `PRIORITY_LABELS` map keyed by the numeric scale. +- `trigger_value` was typed as a plain string but the API returns `trigger_data` as a JSON-encoded payload (e.g. `{"type":"time","at":"..."}`). The UI surfaced raw JSON for every non-manual trigger. A new `summarizeTrigger()` helper parses `trigger_data` and picks the most human-readable field — `condition` / `topic` / formatted `at` / `in_minutes` / `codebase/filePattern` — before truncating for display. Closes the loop on PR #26's snake_case TriggerSpec fix at the UI layer. + +### Docs + +- `README.md` — new "What's New in v2.0.6" header up top; v2.0.5 block strengthened with explicit contrast against Ebbinghaus 1885 passive decay and Anderson 1994 retrieval-induced forgetting; new "Forgetting" row in the RAG-vs-Vestige comparison table. +- Intel-Mac and Windows install steps replaced with a working `cargo build --release -p vestige-mcp` snippet. The pre-built binaries for those targets are blocked on upstream toolchain gaps (`ort-sys` lacks Intel-Mac prebuilts in the 2.0.0-rc.11 release pinned by `fastembed 5.13.2`; `usearch 2.24.0` hit a Windows MSVC compile break tracked as [usearch#746](https://github.com/unum-cloud/usearch/issues/746)). + +### Safety + +No regressions of merged contributor PRs — v2.0.6 only touches regions that are non-overlapping with #20 (resource URI strip), #24 (codex integration docs), #26 (snake_case TriggerSpec), #28 (deep_reference query relevance), #29 (older glibc feature flags), #30 (`VESTIGE_DASHBOARD_ENABLED`), #32 (dream eviction), and #33 (keyword-first search). + +--- + ## [2.0.5] - 2026-04-14 — "Intentional Amnesia" Every AI memory system stores too much. Vestige now treats forgetting as a first-class, neuroscientifically-grounded primitive. This release adds **active forgetting** — top-down inhibitory control over memory retrieval, based on two 2025 papers that no other AI memory system has implemented. diff --git a/Cargo.lock b/Cargo.lock index c365449..c80a041 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4531,7 +4531,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vestige-core" -version = "2.0.5" +version = "2.0.6" dependencies = [ "chrono", "criterion", @@ -4566,7 +4566,7 @@ dependencies = [ [[package]] name = "vestige-mcp" -version = "2.0.5" +version = "2.0.6" dependencies = [ "anyhow", "axum", diff --git a/apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js b/apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js new file mode 100644 index 0000000..d0c8c48 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js @@ -0,0 +1 @@ +var x=t=>{throw TypeError(t)};var B=(t,e,n)=>e.has(t)||x("Cannot "+n);var a=(t,e,n)=>(B(t,e,"read from private field"),n?n.call(t):e.get(t)),c=(t,e,n)=>e.has(t)?x("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n);import{o as I}from"./DeTA_5mp.js";import{s as u,g as f,h as d}from"./nyjtQ1Ok.js";import{w as G}from"./DAj0p1rI.js";new URL("sveltekit-internal://");function ae(t,e){return t==="/"||e==="ignore"?t:e==="never"?t.endsWith("/")?t.slice(0,-1):t:e==="always"&&!t.endsWith("/")?t+"/":t}function oe(t){return t.split("%25").map(decodeURI).join("%25")}function ie(t){for(const e in t)t[e]=decodeURIComponent(t[e]);return t}function le({href:t}){return t.split("#")[0]}function W(...t){let e=5381;for(const n of t)if(typeof n=="string"){let r=n.length;for(;r;)e=e*33^n.charCodeAt(--r)}else if(ArrayBuffer.isView(n)){const r=new Uint8Array(n.buffer,n.byteOffset,n.byteLength);let s=r.length;for(;s;)e=e*33^r[--s]}else throw new TypeError("value must be a string or TypedArray");return(e>>>0).toString(36)}new TextEncoder;new TextDecoder;function X(t){const e=atob(t),n=new Uint8Array(e.length);for(let r=0;r((t instanceof Request?t.method:(e==null?void 0:e.method)||"GET")!=="GET"&&b.delete(U(t)),z(t,e));const b=new Map;function ce(t,e){const n=U(t,e),r=document.querySelector(n);if(r!=null&&r.textContent){r.remove();let{body:s,...l}=JSON.parse(r.textContent);const o=r.getAttribute("data-ttl");return o&&b.set(n,{body:s,init:l,ttl:1e3*Number(o)}),r.getAttribute("data-b64")!==null&&(s=X(s)),Promise.resolve(new Response(s,l))}return window.fetch(t,e)}function ue(t,e,n){if(b.size>0){const r=U(t,n),s=b.get(r);if(s){if(performance.now()o)}function s(o){n=!1,e.set(o)}function l(o){let i;return e.subscribe(h=>{(i===void 0||n&&h!==i)&&o(i=h)})}return{notify:r,set:s,subscribe:l}}const D={v:()=>{}};function Ae(){const{set:t,subscribe:e}=G(!1);let n;async function r(){clearTimeout(n);try{const s=await fetch(`${M}/_app/version.json`,{headers:{pragma:"no-cache","cache-control":"no-cache"}});if(!s.ok)return!1;const o=(await s.json()).version!==F;return o&&(t(!0),D.v(),clearTimeout(n)),o}catch{return!1}}return{subscribe:e,check:r}}function Q(t,e,n){return t.origin!==Y||!t.pathname.startsWith(e)?!0:n?t.pathname!==location.pathname:!1}function Re(t){}const H=new Set(["load","prerender","csr","ssr","trailingSlash","config"]);[...H];const Z=new Set([...H]);[...Z];let E,O,T;const ee=I.toString().includes("$$")||/function \w+\(\) \{\}/.test(I.toString());var _,w,m,p,v,y,k,A,P,R,V,S,j;ee?(E={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL("https://example.com")},O={current:null},T={current:!1}):(E=new(P=class{constructor(){c(this,_,u({}));c(this,w,u(null));c(this,m,u(null));c(this,p,u({}));c(this,v,u({id:null}));c(this,y,u({}));c(this,k,u(-1));c(this,A,u(new URL("https://example.com")))}get data(){return f(a(this,_))}set data(e){d(a(this,_),e)}get form(){return f(a(this,w))}set form(e){d(a(this,w),e)}get error(){return f(a(this,m))}set error(e){d(a(this,m),e)}get params(){return f(a(this,p))}set params(e){d(a(this,p),e)}get route(){return f(a(this,v))}set route(e){d(a(this,v),e)}get state(){return f(a(this,y))}set state(e){d(a(this,y),e)}get status(){return f(a(this,k))}set status(e){d(a(this,k),e)}get url(){return f(a(this,A))}set url(e){d(a(this,A),e)}},_=new WeakMap,w=new WeakMap,m=new WeakMap,p=new WeakMap,v=new WeakMap,y=new WeakMap,k=new WeakMap,A=new WeakMap,P),O=new(V=class{constructor(){c(this,R,u(null))}get current(){return f(a(this,R))}set current(e){d(a(this,R),e)}},R=new WeakMap,V),T=new(j=class{constructor(){c(this,S,u(!1))}get current(){return f(a(this,S))}set current(e){d(a(this,S),e)}},S=new WeakMap,j),D.v=()=>T.current=!0);function Ue(t){Object.assign(E,t)}export{be as H,_e as N,ge as P,he as S,ye as a,J as b,Ae as c,le as d,ie as e,pe as f,ve as g,ae as h,Q as i,N as j,oe as k,fe as l,ue as m,O as n,Y as o,E as p,ce as q,we as r,me as s,de as t,ke as u,Ue as v,Re as w}; diff --git a/apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js.br b/apps/dashboard/build/_app/immutable/chunks/BAlzCWFX.js.br new file mode 100644 index 0000000000000000000000000000000000000000..98f9b83fa19ba5c1dd36e4a9b348d0a6fc9e6de1 GIT binary patch literal 2613 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 z^tA{const n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(n)return a.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return a.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const s=r.split(/\[(.+?)\](?!\])/);return"/"+s.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ct(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ct(String.fromCharCode(...c.slice(2).split("-").map(_=>parseInt(_,16))));const h=ue.exec(c),[,u,w,f,d]=h;return a.push({name:f,matcher:d,optional:!!u,rest:!!w,chained:w?l===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ct(c)}).join("")}).join("")}/?$`),params:a}}function de(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function pe(t){return t.slice(1).split("/").filter(de)}function ge(t,a,e){const r={},n=t.slice(1),o=n.filter(i=>i!==void 0);let s=0;for(let i=0;ih).join("/"),s=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||e[c.matcher](l)){r[c.name]=l;const h=a[i+1],u=n[i+1];h&&!h.rest&&h.optional&&u&&c.chained&&(s=0),!h&&!u&&Object.keys(r).length===o.length&&(s=0);continue}if(c.optional&&c.chained){s++;continue}return}if(!s)return r}function ct(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function me({nodes:t,server_loads:a,dictionary:e,matchers:r}){const n=new Set(a);return Object.entries(e).map(([i,[c,l,h]])=>{const{pattern:u,params:w}=he(i),f={id:i,exec:d=>{const _=u.exec(d);if(_)return ge(_,w,r)},errors:[1,...h||[]].map(d=>t[d]),layouts:[0,...l||[]].map(s),leaf:o(c)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function o(i){const c=i<0;return c&&(i=~i),[c,t[i]]}function s(i){return i===void 0?i:[n.has(i),t[i]]}}function Ft(t,a=JSON.parse){try{return a(sessionStorage[t])}catch{}}function It(t,a,e=JSON.stringify){const r=e(a);try{sessionStorage[t]=r}catch{}}function _e(t){return t.filter(a=>a!=null)}function Et(t){return t instanceof wt||t instanceof yt?t.status:500}function we(t){return t instanceof yt?t.text:"Internal Error"}const ve=new Set(["icon","shortcut icon","apple-touch-icon"]),I=Ft(Kt)??{},M=Ft(qt)??{},P={url:Pt({}),page:Pt({}),navigating:ae(null),updated:ne()};function bt(t){I[t]=C()}function ye(t,a){let e=t+1;for(;I[e];)delete I[e],e+=1;for(e=a+1;M[e];)delete M[e],e+=1}function V(t,a=!1){return a?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Bt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}function Tt(){}let kt,ht,Q,U,dt,b;const Z=[],tt=[];let v=null;function pt(){var t;(t=v==null?void 0:v.fork)==null||t.then(a=>a==null?void 0:a.discard()),v=null}const G=new Map,Mt=new Set,Ee=new Set,F=new Set;let m={branch:[],error:null,url:null},Vt=!1,et=!1,Ot=!0,H=!1,K=!1,Ht=!1,St=!1,Yt,E,R,O;const at=new Set,Ct=new Map;async function Fe(t,a,e){var o,s,i,c,l;(o=globalThis.__sveltekit_k7ei3f)!=null&&o.data&&globalThis.__sveltekit_k7ei3f.data,document.URL!==location.href&&(location.href=location.href),b=t,await((i=(s=t.hooks).init)==null?void 0:i.call(s)),kt=me(t),U=document.documentElement,dt=a,ht=t.nodes[0],Q=t.nodes[1],ht(),Q(),E=(c=history.state)==null?void 0:c[N],R=(l=history.state)==null?void 0:l[B],E||(E=R=Date.now(),history.replaceState({...history.state,[N]:E,[B]:R},""));const r=I[E];function n(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}e?(n(),await Ce(dt,e)):(await D({type:"enter",url:mt(b.hash?Ne(new URL(location.href)):location.href),replace_state:!0}),n()),Oe()}function be(){Z.length=0,St=!1}function zt(t){tt.some(a=>a==null?void 0:a.snapshot)&&(M[t]=tt.map(a=>{var e;return(e=a==null?void 0:a.snapshot)==null?void 0:e.capture()}))}function Wt(t){var a;(a=M[t])==null||a.forEach((e,r)=>{var n,o;(o=(n=tt[r])==null?void 0:n.snapshot)==null||o.restore(e)})}function jt(){bt(E),It(Kt,I),zt(R),It(qt,M)}async function Gt(t,a,e,r){let n;a.invalidateAll&&pt(),await D({type:"goto",url:mt(t),keepfocus:a.keepFocus,noscroll:a.noScroll,replace_state:a.replaceState,state:a.state,redirect_count:e,nav_token:r,accept:()=>{a.invalidateAll&&(St=!0,n=[...Ct.keys()]),a.invalidate&&a.invalidate.forEach(Te)}}),a.invalidateAll&&J().then(J).then(()=>{Ct.forEach(({resource:o},s)=>{var i;n!=null&&n.includes(s)&&((i=o.refresh)==null||i.call(o))})})}async function ke(t){if(t.id!==(v==null?void 0:v.id)){pt();const a={};at.add(a),v={id:t.id,token:a,promise:Xt({...t,preload:a}).then(e=>(at.delete(a),e.type==="loaded"&&e.state.error&&pt(),e)),fork:null}}return v.promise}async function lt(t){var e;const a=(e=await ot(t,!1))==null?void 0:e.route;a&&await Promise.all([...a.layouts,a.leaf].filter(Boolean).map(r=>r[1]()))}async function Jt(t,a,e){var n;m=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(x,t.props.page),Yt=new b.root({target:a,props:{...t.props,stores:P,components:tt},hydrate:e,sync:!1}),await Promise.resolve(),Wt(R),e){const o={from:null,to:{params:m.params,route:{id:((n=m.route)==null?void 0:n.id)??null},url:new URL(location.href),scroll:I[E]??C()},willUnload:!1,type:"enter",complete:Promise.resolve()};F.forEach(s=>s(o))}et=!0}function nt({url:t,params:a,branch:e,status:r,error:n,route:o,form:s}){let i="never";if(L&&(t.pathname===L||t.pathname===L+"/"))i="always";else for(const f of e)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=se(t.pathname,i),t.search=t.search;const c={type:"loaded",state:{url:t,params:a,branch:e,error:n,route:o},props:{constructors:_e(e).map(f=>f.node.component),page:At(x)}};s!==void 0&&(c.props.form=s);let l={},h=!x,u=0;for(let f=0;fi(new URL(s))))return!0;return!1}function xt(t,a){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?a??null:null}function xe(t,a){if(!t)return new Set(a.searchParams.keys());const e=new Set([...t.searchParams.keys(),...a.searchParams.keys()]);for(const r of e){const n=t.searchParams.getAll(r),o=a.searchParams.getAll(r);n.every(s=>o.includes(s))&&o.every(s=>n.includes(s))&&e.delete(r)}return e}function Le({error:t,url:a,route:e,params:r}){return{type:"loaded",state:{error:t,url:a,route:e,params:r,branch:[]},props:{page:At(x),constructors:[]}}}async function Xt({id:t,invalidating:a,url:e,params:r,route:n,preload:o}){if((v==null?void 0:v.id)===t)return at.delete(v.token),v.promise;const{errors:s,layouts:i,leaf:c}=n,l=[...i,c];s.forEach(g=>g==null?void 0:g().catch(()=>{})),l.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));const h=m.url?t!==rt(m.url):!1,u=m.route?n.id!==m.route.id:!1,w=xe(m.url,e);let f=!1;const d=l.map(async(g,p)=>{var A;if(!g)return;const y=m.branch[p];return g[1]===(y==null?void 0:y.loader)&&!Re(f,u,h,w,(A=y.universal)==null?void 0:A.uses,r)?y:(f=!0,Rt({loader:g[1],url:e,params:r,route:n,parent:async()=>{var z;const T={};for(let j=0;j{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:xt(o)}),i={node:await Q(),loader:Q,universal:null,server:null,data:null};return nt({url:e,params:n,branch:[s,i],status:t,error:a,route:null})}catch(s){if(s instanceof vt)return Gt(new URL(s.location,location.href),{},0);throw s}}async function Ae(t){const a=t.href;if(G.has(a))return G.get(a);let e;try{const r=(async()=>{let n=await b.hooks.reroute({url:new URL(t),fetch:async(o,s)=>Se(o,s,t).promise})??t;if(typeof n=="string"){const o=new URL(t);b.hash?o.hash=n:o.pathname=n,n=o}return n})();G.set(a,r),e=await r}catch{G.delete(a);return}return e}async function ot(t,a){if(t&&!_t(t,L,b.hash)){const e=await Ae(t);if(!e)return;const r=Pe(e);for(const n of kt){const o=n.exec(r);if(o)return{id:rt(t),invalidating:a,route:n,params:oe(o),url:t}}}}function Pe(t){return ie(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function rt(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Qt({url:t,type:a,intent:e,delta:r,event:n,scroll:o}){let s=!1;const i=Ut(m,e,t,a,o??null);r!==void 0&&(i.navigation.delta=r),n!==void 0&&(i.navigation.event=n);const c={...i.navigation,cancel:()=>{s=!0,i.reject(new Error("navigation cancelled"))}};return H||Mt.forEach(l=>l(c)),s?null:i}async function D({type:t,url:a,popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s={},redirect_count:i=0,nav_token:c={},accept:l=Tt,block:h=Tt,event:u}){var j;const w=O;O=c;const f=await ot(a,!1),d=t==="enter"?Ut(m,f,a,t):Qt({url:a,type:t,delta:e==null?void 0:e.delta,intent:f,scroll:e==null?void 0:e.scroll,event:u});if(!d){h(),O===c&&(O=w);return}const _=E,g=R;l(),H=!0,et&&d.navigation.type!=="enter"&&P.navigating.set(ft.current=d.navigation);let p=f&&await Xt(f);if(!p){if(_t(a,L,b.hash))return await V(a,o);p=await Zt(a,{id:null},await Y(new yt(404,"Not Found",`Not found: ${a.pathname}`),{url:a,params:{},route:{id:null}}),404,o)}if(a=(f==null?void 0:f.url)||a,O!==c)return d.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await D({type:t,url:new URL(p.location,a),popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s,redirect_count:i+1,nav_token:c}),d.fulfil(void 0);return}p=await Lt({status:500,error:await Y(new Error("Redirect loop"),{url:a,params:{},route:{id:null}}),url:a,route:{id:null}})}else p.props.page.status>=400&&await P.updated.check()&&(await Bt(),await V(a,o));if(be(),bt(_),zt(g),p.props.page.url.pathname!==a.pathname&&(a.pathname=p.props.page.url.pathname),s=e?e.state:s,!e){const k=o?0:1,W={[N]:E+=k,[B]:R+=k,[Nt]:s};(o?history.replaceState:history.pushState).call(history,W,"",a),o||ye(E,R)}const y=f&&(v==null?void 0:v.id)===f.id?v.fork:null;v=null,p.props.page.state=s;let S;if(et){const k=(await Promise.all(Array.from(Ee,$=>$(d.navigation)))).filter($=>typeof $=="function");if(k.length>0){let $=function(){k.forEach(st=>{F.delete(st)})};k.push($),k.forEach(st=>{F.add(st)})}m=p.state,p.props.page&&(p.props.page.url=a);const W=y&&await y;W?S=W.commit():(Yt.$set(p.props),fe(p.props.page),S=(j=ee)==null?void 0:j()),Ht=!0}else await Jt(p,dt,!1);const{activeElement:A}=document;await S,await J(),await J();let T=null;if(Ot){const k=e?e.scroll:n?C():null;k?scrollTo(k.x,k.y):(T=a.hash&&document.getElementById(te(a)))?T.scrollIntoView():scrollTo(0,0)}const z=document.activeElement!==A&&document.activeElement!==document.body;!r&&!z&&$e(a,!T),Ot=!0,p.props.page&&Object.assign(x,p.props.page),H=!1,t==="popstate"&&Wt(R),d.fulfil(void 0),d.navigation.to&&(d.navigation.to.scroll=C()),F.forEach(k=>k(d.navigation)),P.navigating.set(ft.current=null)}async function Zt(t,a,e,r,n){return t.origin===Dt&&t.pathname===location.pathname&&!Vt?await Lt({status:r,error:e,url:t,route:a}):await V(t,n)}function Ie(){let t,a={element:void 0,href:void 0},e;U.addEventListener("mousemove",i=>{const c=i.target;clearTimeout(t),t=setTimeout(()=>{o(c,q.hover)},20)});function r(i){i.defaultPrevented||o(i.composedPath()[0],q.tap)}U.addEventListener("mousedown",r),U.addEventListener("touchstart",r,{passive:!0});const n=new IntersectionObserver(i=>{for(const c of i)c.isIntersecting&&(lt(new URL(c.target.href)),n.unobserve(c.target))},{threshold:0});async function o(i,c){const l=$t(i,U),h=l===a.element&&(l==null?void 0:l.href)===a.href&&c>=e;if(!l||h)return;const{url:u,external:w,download:f}=ut(l,L,b.hash);if(w||f)return;const d=X(l),_=u&&rt(m.url)===rt(u);if(!(d.reload||_))if(c<=d.preload_data){a={element:l,href:l.href},e=q.tap;const g=await ot(u,!1);if(!g)return;ke(g)}else c<=d.preload_code&&(a={element:l,href:l.href},e=c,lt(u))}function s(){n.disconnect();for(const i of U.querySelectorAll("a")){const{url:c,external:l,download:h}=ut(i,L,b.hash);if(l||h)continue;const u=X(i);u.reload||(u.preload_code===q.viewport&&n.observe(i),u.preload_code===q.eager&<(c))}}F.add(s),s()}function Y(t,a){if(t instanceof wt)return t.body;const e=Et(t),r=we(t);return b.hooks.handleError({error:t,event:a,status:e,message:r})??{message:r}}function Be(t,a={}){return t=new URL(mt(t)),t.origin!==Dt?Promise.reject(new Error("goto: invalid URL")):Gt(t,a,0)}function Te(t){if(typeof t=="function")Z.push(t);else{const{href:a}=new URL(t,location.href);Z.push(e=>e.href===a)}}function Oe(){var a;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let r=!1;if(jt(),!H){const n=Ut(m,void 0,null,"leave"),o={...n.navigation,cancel:()=>{r=!0,n.reject(new Error("navigation cancelled"))}};Mt.forEach(s=>s(o))}r?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&jt()}),(a=navigator.connection)!=null&&a.saveData||Ie(),U.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const r=$t(e.composedPath()[0],U);if(!r)return;const{url:n,external:o,target:s,download:i}=ut(r,L,b.hash);if(!n)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=X(r);if(!(r instanceof SVGAElement)&&n.protocol!==location.protocol&&!(n.protocol==="https:"||n.protocol==="http:")||i)return;const[h,u]=(b.hash?n.hash.replace(/^#/,""):n.href).split("#"),w=h===it(location);if(o||c.reload&&(!w||!u)){Qt({url:n,type:"link",event:e})?H=!0:e.preventDefault();return}if(u!==void 0&&w){const[,f]=m.url.href.split("#");if(f===u){if(e.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const d=r.ownerDocument.getElementById(decodeURIComponent(u));d&&(d.scrollIntoView(),d.focus())}return}if(K=!0,bt(E),t(n),!c.replace_state)return;K=!1}e.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await D({type:"link",url:n,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??n.href===location.href,event:e})}),U.addEventListener("submit",e=>{if(e.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if(((n==null?void 0:n.formTarget)||r.target)==="_blank"||((n==null?void 0:n.formMethod)||r.method)!=="get")return;const i=new URL((n==null?void 0:n.hasAttribute("formaction"))&&(n==null?void 0:n.formAction)||r.action);if(_t(i,L,!1))return;const c=e.target,l=X(c);if(l.reload)return;e.preventDefault(),e.stopPropagation();const h=new FormData(c,n);i.search=new URLSearchParams(h).toString(),D({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var r;if(!gt){if((r=e.state)!=null&&r[N]){const n=e.state[N];if(O={},n===E)return;const o=I[n],s=e.state[Nt]??{},i=new URL(e.state[re]??location.href),c=e.state[B],l=m.url?it(location)===it(m.url):!1;if(c===R&&(Ht||l)){s!==x.state&&(x.state=s),t(i),I[E]=C(),o&&scrollTo(o.x,o.y),E=n;return}const u=n-E;await D({type:"popstate",url:i,popped:{state:s,scroll:o,delta:u},accept:()=>{E=n,R=c},block:()=>{history.go(-u)},nav_token:O,event:e})}else if(!K){const n=new URL(location.href);t(n),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{K&&(K=!1,history.replaceState({...history.state,[N]:++E,[B]:R},"",location.href))});for(const e of document.querySelectorAll("link"))ve.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&P.navigating.set(ft.current=null)});function t(e){m.url=x.url=e,P.page.set(At(x)),P.page.notify()}}async function Ce(t,{status:a=200,error:e,node_ids:r,params:n,route:o,server_route:s,data:i,form:c}){Vt=!0;const l=new URL(location.href);let h;({params:n={},route:o={id:null}}=await ot(l,!1)||{}),h=kt.find(({id:f})=>f===o.id);let u,w=!0;try{const f=r.map(async(_,g)=>{const p=i[g];return p!=null&&p.uses&&(p.uses=je(p.uses)),Rt({loader:b.nodes[_],url:l,params:n,route:o,parent:async()=>{const y={};for(let S=0;S{const i=history.state;gt=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(i,"",t),a&&scrollTo(o,s),gt=!1})}else{const o=document.body,s=o.getAttribute("tabindex");o.tabIndex=-1,o.focus({preventScroll:!0,focusVisible:!1}),s!==null?o.setAttribute("tabindex",s):o.removeAttribute("tabindex")}const n=getSelection();if(n&&n.type!=="None"){const o=[];for(let s=0;s{if(n.rangeCount===o.length){for(let s=0;s{o=u,s=w});return i.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((l=t.route)==null?void 0:l.id)??null},url:t.url,scroll:C()},to:e&&{params:(a==null?void 0:a.params)??null,route:{id:((h=a==null?void 0:a.route)==null?void 0:h.id)??null},url:e,scroll:n},willUnload:!a,type:r,complete:i},fulfil:o,reject:s}}function At(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ne(t){const a=new URL(t);return a.hash=decodeURIComponent(t.hash),a}function te(t){let a;if(b.hash){const[,,e]=t.hash.split("#",3);a=e??""}else a=t.hash.slice(1);return decodeURIComponent(a)}export{Fe as a,Be as g,P as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.br b/apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.br new file mode 100644 index 0000000000000000000000000000000000000000..3ca51390fcbe57e35fd690ff31b9126ec10bd736 GIT binary patch literal 7673 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.gz b/apps/dashboard/build/_app/immutable/chunks/D1EqE5Bq.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..dc9e07f9f7f16e571aa2e133823205ee5229c6ef GIT binary patch literal 8414 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 n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(r);if(n)return a.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),"(?:/([^]*))?";const o=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(r);if(o)return a.push({name:o[1],matcher:o[2],optional:!0,rest:!1,chained:!0}),"(?:/([^/]+))?";if(!r)return;const s=r.split(/\[(.+?)\](?!\])/);return"/"+s.map((c,l)=>{if(l%2){if(c.startsWith("x+"))return ct(String.fromCharCode(parseInt(c.slice(2),16)));if(c.startsWith("u+"))return ct(String.fromCharCode(...c.slice(2).split("-").map(_=>parseInt(_,16))));const h=ue.exec(c),[,u,w,f,d]=h;return a.push({name:f,matcher:d,optional:!!u,rest:!!w,chained:w?l===1&&s[0]==="":!1}),w?"([^]*?)":u?"([^/]*)?":"([^/]+?)"}return ct(c)}).join("")}).join("")}/?$`),params:a}}function de(t){return t!==""&&!/^\([^)]+\)$/.test(t)}function pe(t){return t.slice(1).split("/").filter(de)}function ge(t,a,e){const r={},n=t.slice(1),o=n.filter(i=>i!==void 0);let s=0;for(let i=0;ih).join("/"),s=0),l===void 0)if(c.rest)l="";else continue;if(!c.matcher||e[c.matcher](l)){r[c.name]=l;const h=a[i+1],u=n[i+1];h&&!h.rest&&h.optional&&u&&c.chained&&(s=0),!h&&!u&&Object.keys(r).length===o.length&&(s=0);continue}if(c.optional&&c.chained){s++;continue}return}if(!s)return r}function ct(t){return t.normalize().replace(/[[\]]/g,"\\$&").replace(/%/g,"%25").replace(/\//g,"%2[Ff]").replace(/\?/g,"%3[Ff]").replace(/#/g,"%23").replace(/[.*+?^${}()|\\]/g,"\\$&")}function me({nodes:t,server_loads:a,dictionary:e,matchers:r}){const n=new Set(a);return Object.entries(e).map(([i,[c,l,h]])=>{const{pattern:u,params:w}=he(i),f={id:i,exec:d=>{const _=u.exec(d);if(_)return ge(_,w,r)},errors:[1,...h||[]].map(d=>t[d]),layouts:[0,...l||[]].map(s),leaf:o(c)};return f.errors.length=f.layouts.length=Math.max(f.errors.length,f.layouts.length),f});function o(i){const c=i<0;return c&&(i=~i),[c,t[i]]}function s(i){return i===void 0?i:[n.has(i),t[i]]}}function Ft(t,a=JSON.parse){try{return a(sessionStorage[t])}catch{}}function It(t,a,e=JSON.stringify){const r=e(a);try{sessionStorage[t]=r}catch{}}function _e(t){return t.filter(a=>a!=null)}function Et(t){return t instanceof wt||t instanceof yt?t.status:500}function we(t){return t instanceof yt?t.text:"Internal Error"}const ve=new Set(["icon","shortcut icon","apple-touch-icon"]),I=Ft(Kt)??{},M=Ft(qt)??{},P={url:Pt({}),page:Pt({}),navigating:ae(null),updated:ne()};function bt(t){I[t]=C()}function ye(t,a){let e=t+1;for(;I[e];)delete I[e],e+=1;for(e=a+1;M[e];)delete M[e],e+=1}function V(t,a=!1){return a?location.replace(t.href):location.href=t.href,new Promise(()=>{})}async function Bt(){if("serviceWorker"in navigator){const t=await navigator.serviceWorker.getRegistration(L||"/");t&&await t.update()}}function Tt(){}let kt,ht,Q,U,dt,b;const Z=[],tt=[];let v=null;function pt(){var t;(t=v==null?void 0:v.fork)==null||t.then(a=>a==null?void 0:a.discard()),v=null}const G=new Map,Mt=new Set,Ee=new Set,F=new Set;let m={branch:[],error:null,url:null},Vt=!1,et=!1,Ot=!0,H=!1,K=!1,Ht=!1,St=!1,Yt,E,R,O;const at=new Set,Ct=new Map;async function Fe(t,a,e){var o,s,i,c,l;(o=globalThis.__sveltekit_1ysfr3o)!=null&&o.data&&globalThis.__sveltekit_1ysfr3o.data,document.URL!==location.href&&(location.href=location.href),b=t,await((i=(s=t.hooks).init)==null?void 0:i.call(s)),kt=me(t),U=document.documentElement,dt=a,ht=t.nodes[0],Q=t.nodes[1],ht(),Q(),E=(c=history.state)==null?void 0:c[N],R=(l=history.state)==null?void 0:l[B],E||(E=R=Date.now(),history.replaceState({...history.state,[N]:E,[B]:R},""));const r=I[E];function n(){r&&(history.scrollRestoration="manual",scrollTo(r.x,r.y))}e?(n(),await Ce(dt,e)):(await D({type:"enter",url:mt(b.hash?Ne(new URL(location.href)):location.href),replace_state:!0}),n()),Oe()}function be(){Z.length=0,St=!1}function zt(t){tt.some(a=>a==null?void 0:a.snapshot)&&(M[t]=tt.map(a=>{var e;return(e=a==null?void 0:a.snapshot)==null?void 0:e.capture()}))}function Wt(t){var a;(a=M[t])==null||a.forEach((e,r)=>{var n,o;(o=(n=tt[r])==null?void 0:n.snapshot)==null||o.restore(e)})}function jt(){bt(E),It(Kt,I),zt(R),It(qt,M)}async function Gt(t,a,e,r){let n;a.invalidateAll&&pt(),await D({type:"goto",url:mt(t),keepfocus:a.keepFocus,noscroll:a.noScroll,replace_state:a.replaceState,state:a.state,redirect_count:e,nav_token:r,accept:()=>{a.invalidateAll&&(St=!0,n=[...Ct.keys()]),a.invalidate&&a.invalidate.forEach(Te)}}),a.invalidateAll&&J().then(J).then(()=>{Ct.forEach(({resource:o},s)=>{var i;n!=null&&n.includes(s)&&((i=o.refresh)==null||i.call(o))})})}async function ke(t){if(t.id!==(v==null?void 0:v.id)){pt();const a={};at.add(a),v={id:t.id,token:a,promise:Xt({...t,preload:a}).then(e=>(at.delete(a),e.type==="loaded"&&e.state.error&&pt(),e)),fork:null}}return v.promise}async function lt(t){var e;const a=(e=await ot(t,!1))==null?void 0:e.route;a&&await Promise.all([...a.layouts,a.leaf].filter(Boolean).map(r=>r[1]()))}async function Jt(t,a,e){var n;m=t.state;const r=document.querySelector("style[data-sveltekit]");if(r&&r.remove(),Object.assign(x,t.props.page),Yt=new b.root({target:a,props:{...t.props,stores:P,components:tt},hydrate:e,sync:!1}),await Promise.resolve(),Wt(R),e){const o={from:null,to:{params:m.params,route:{id:((n=m.route)==null?void 0:n.id)??null},url:new URL(location.href),scroll:I[E]??C()},willUnload:!1,type:"enter",complete:Promise.resolve()};F.forEach(s=>s(o))}et=!0}function nt({url:t,params:a,branch:e,status:r,error:n,route:o,form:s}){let i="never";if(L&&(t.pathname===L||t.pathname===L+"/"))i="always";else for(const f of e)(f==null?void 0:f.slash)!==void 0&&(i=f.slash);t.pathname=se(t.pathname,i),t.search=t.search;const c={type:"loaded",state:{url:t,params:a,branch:e,error:n,route:o},props:{constructors:_e(e).map(f=>f.node.component),page:At(x)}};s!==void 0&&(c.props.form=s);let l={},h=!x,u=0;for(let f=0;fi(new URL(s))))return!0;return!1}function xt(t,a){return(t==null?void 0:t.type)==="data"?t:(t==null?void 0:t.type)==="skip"?a??null:null}function xe(t,a){if(!t)return new Set(a.searchParams.keys());const e=new Set([...t.searchParams.keys(),...a.searchParams.keys()]);for(const r of e){const n=t.searchParams.getAll(r),o=a.searchParams.getAll(r);n.every(s=>o.includes(s))&&o.every(s=>n.includes(s))&&e.delete(r)}return e}function Le({error:t,url:a,route:e,params:r}){return{type:"loaded",state:{error:t,url:a,route:e,params:r,branch:[]},props:{page:At(x),constructors:[]}}}async function Xt({id:t,invalidating:a,url:e,params:r,route:n,preload:o}){if((v==null?void 0:v.id)===t)return at.delete(v.token),v.promise;const{errors:s,layouts:i,leaf:c}=n,l=[...i,c];s.forEach(g=>g==null?void 0:g().catch(()=>{})),l.forEach(g=>g==null?void 0:g[1]().catch(()=>{}));const h=m.url?t!==rt(m.url):!1,u=m.route?n.id!==m.route.id:!1,w=xe(m.url,e);let f=!1;const d=l.map(async(g,p)=>{var A;if(!g)return;const y=m.branch[p];return g[1]===(y==null?void 0:y.loader)&&!Re(f,u,h,w,(A=y.universal)==null?void 0:A.uses,r)?y:(f=!0,Rt({loader:g[1],url:e,params:r,route:n,parent:async()=>{var z;const T={};for(let j=0;j{});const _=[];for(let g=0;gPromise.resolve({}),server_data_node:xt(o)}),i={node:await Q(),loader:Q,universal:null,server:null,data:null};return nt({url:e,params:n,branch:[s,i],status:t,error:a,route:null})}catch(s){if(s instanceof vt)return Gt(new URL(s.location,location.href),{},0);throw s}}async function Ae(t){const a=t.href;if(G.has(a))return G.get(a);let e;try{const r=(async()=>{let n=await b.hooks.reroute({url:new URL(t),fetch:async(o,s)=>Se(o,s,t).promise})??t;if(typeof n=="string"){const o=new URL(t);b.hash?o.hash=n:o.pathname=n,n=o}return n})();G.set(a,r),e=await r}catch{G.delete(a);return}return e}async function ot(t,a){if(t&&!_t(t,L,b.hash)){const e=await Ae(t);if(!e)return;const r=Pe(e);for(const n of kt){const o=n.exec(r);if(o)return{id:rt(t),invalidating:a,route:n,params:oe(o),url:t}}}}function Pe(t){return ie(b.hash?t.hash.replace(/^#/,"").replace(/[?#].+/,""):t.pathname.slice(L.length))||"/"}function rt(t){return(b.hash?t.hash.replace(/^#/,""):t.pathname)+t.search}function Qt({url:t,type:a,intent:e,delta:r,event:n,scroll:o}){let s=!1;const i=Ut(m,e,t,a,o??null);r!==void 0&&(i.navigation.delta=r),n!==void 0&&(i.navigation.event=n);const c={...i.navigation,cancel:()=>{s=!0,i.reject(new Error("navigation cancelled"))}};return H||Mt.forEach(l=>l(c)),s?null:i}async function D({type:t,url:a,popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s={},redirect_count:i=0,nav_token:c={},accept:l=Tt,block:h=Tt,event:u}){var j;const w=O;O=c;const f=await ot(a,!1),d=t==="enter"?Ut(m,f,a,t):Qt({url:a,type:t,delta:e==null?void 0:e.delta,intent:f,scroll:e==null?void 0:e.scroll,event:u});if(!d){h(),O===c&&(O=w);return}const _=E,g=R;l(),H=!0,et&&d.navigation.type!=="enter"&&P.navigating.set(ft.current=d.navigation);let p=f&&await Xt(f);if(!p){if(_t(a,L,b.hash))return await V(a,o);p=await Zt(a,{id:null},await Y(new yt(404,"Not Found",`Not found: ${a.pathname}`),{url:a,params:{},route:{id:null}}),404,o)}if(a=(f==null?void 0:f.url)||a,O!==c)return d.reject(new Error("navigation aborted")),!1;if(p.type==="redirect"){if(i<20){await D({type:t,url:new URL(p.location,a),popped:e,keepfocus:r,noscroll:n,replace_state:o,state:s,redirect_count:i+1,nav_token:c}),d.fulfil(void 0);return}p=await Lt({status:500,error:await Y(new Error("Redirect loop"),{url:a,params:{},route:{id:null}}),url:a,route:{id:null}})}else p.props.page.status>=400&&await P.updated.check()&&(await Bt(),await V(a,o));if(be(),bt(_),zt(g),p.props.page.url.pathname!==a.pathname&&(a.pathname=p.props.page.url.pathname),s=e?e.state:s,!e){const k=o?0:1,W={[N]:E+=k,[B]:R+=k,[Nt]:s};(o?history.replaceState:history.pushState).call(history,W,"",a),o||ye(E,R)}const y=f&&(v==null?void 0:v.id)===f.id?v.fork:null;v=null,p.props.page.state=s;let S;if(et){const k=(await Promise.all(Array.from(Ee,$=>$(d.navigation)))).filter($=>typeof $=="function");if(k.length>0){let $=function(){k.forEach(st=>{F.delete(st)})};k.push($),k.forEach(st=>{F.add(st)})}m=p.state,p.props.page&&(p.props.page.url=a);const W=y&&await y;W?S=W.commit():(Yt.$set(p.props),fe(p.props.page),S=(j=ee)==null?void 0:j()),Ht=!0}else await Jt(p,dt,!1);const{activeElement:A}=document;await S,await J(),await J();let T=null;if(Ot){const k=e?e.scroll:n?C():null;k?scrollTo(k.x,k.y):(T=a.hash&&document.getElementById(te(a)))?T.scrollIntoView():scrollTo(0,0)}const z=document.activeElement!==A&&document.activeElement!==document.body;!r&&!z&&$e(a,!T),Ot=!0,p.props.page&&Object.assign(x,p.props.page),H=!1,t==="popstate"&&Wt(R),d.fulfil(void 0),d.navigation.to&&(d.navigation.to.scroll=C()),F.forEach(k=>k(d.navigation)),P.navigating.set(ft.current=null)}async function Zt(t,a,e,r,n){return t.origin===Dt&&t.pathname===location.pathname&&!Vt?await Lt({status:r,error:e,url:t,route:a}):await V(t,n)}function Ie(){let t,a={element:void 0,href:void 0},e;U.addEventListener("mousemove",i=>{const c=i.target;clearTimeout(t),t=setTimeout(()=>{o(c,q.hover)},20)});function r(i){i.defaultPrevented||o(i.composedPath()[0],q.tap)}U.addEventListener("mousedown",r),U.addEventListener("touchstart",r,{passive:!0});const n=new IntersectionObserver(i=>{for(const c of i)c.isIntersecting&&(lt(new URL(c.target.href)),n.unobserve(c.target))},{threshold:0});async function o(i,c){const l=$t(i,U),h=l===a.element&&(l==null?void 0:l.href)===a.href&&c>=e;if(!l||h)return;const{url:u,external:w,download:f}=ut(l,L,b.hash);if(w||f)return;const d=X(l),_=u&&rt(m.url)===rt(u);if(!(d.reload||_))if(c<=d.preload_data){a={element:l,href:l.href},e=q.tap;const g=await ot(u,!1);if(!g)return;ke(g)}else c<=d.preload_code&&(a={element:l,href:l.href},e=c,lt(u))}function s(){n.disconnect();for(const i of U.querySelectorAll("a")){const{url:c,external:l,download:h}=ut(i,L,b.hash);if(l||h)continue;const u=X(i);u.reload||(u.preload_code===q.viewport&&n.observe(i),u.preload_code===q.eager&<(c))}}F.add(s),s()}function Y(t,a){if(t instanceof wt)return t.body;const e=Et(t),r=we(t);return b.hooks.handleError({error:t,event:a,status:e,message:r})??{message:r}}function Be(t,a={}){return t=new URL(mt(t)),t.origin!==Dt?Promise.reject(new Error("goto: invalid URL")):Gt(t,a,0)}function Te(t){if(typeof t=="function")Z.push(t);else{const{href:a}=new URL(t,location.href);Z.push(e=>e.href===a)}}function Oe(){var a;history.scrollRestoration="manual",addEventListener("beforeunload",e=>{let r=!1;if(jt(),!H){const n=Ut(m,void 0,null,"leave"),o={...n.navigation,cancel:()=>{r=!0,n.reject(new Error("navigation cancelled"))}};Mt.forEach(s=>s(o))}r?(e.preventDefault(),e.returnValue=""):history.scrollRestoration="auto"}),addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&jt()}),(a=navigator.connection)!=null&&a.saveData||Ie(),U.addEventListener("click",async e=>{if(e.button||e.which!==1||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||e.defaultPrevented)return;const r=$t(e.composedPath()[0],U);if(!r)return;const{url:n,external:o,target:s,download:i}=ut(r,L,b.hash);if(!n)return;if(s==="_parent"||s==="_top"){if(window.parent!==window)return}else if(s&&s!=="_self")return;const c=X(r);if(!(r instanceof SVGAElement)&&n.protocol!==location.protocol&&!(n.protocol==="https:"||n.protocol==="http:")||i)return;const[h,u]=(b.hash?n.hash.replace(/^#/,""):n.href).split("#"),w=h===it(location);if(o||c.reload&&(!w||!u)){Qt({url:n,type:"link",event:e})?H=!0:e.preventDefault();return}if(u!==void 0&&w){const[,f]=m.url.href.split("#");if(f===u){if(e.preventDefault(),u===""||u==="top"&&r.ownerDocument.getElementById("top")===null)scrollTo({top:0});else{const d=r.ownerDocument.getElementById(decodeURIComponent(u));d&&(d.scrollIntoView(),d.focus())}return}if(K=!0,bt(E),t(n),!c.replace_state)return;K=!1}e.preventDefault(),await new Promise(f=>{requestAnimationFrame(()=>{setTimeout(f,0)}),setTimeout(f,100)}),await D({type:"link",url:n,keepfocus:c.keepfocus,noscroll:c.noscroll,replace_state:c.replace_state??n.href===location.href,event:e})}),U.addEventListener("submit",e=>{if(e.defaultPrevented)return;const r=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if(((n==null?void 0:n.formTarget)||r.target)==="_blank"||((n==null?void 0:n.formMethod)||r.method)!=="get")return;const i=new URL((n==null?void 0:n.hasAttribute("formaction"))&&(n==null?void 0:n.formAction)||r.action);if(_t(i,L,!1))return;const c=e.target,l=X(c);if(l.reload)return;e.preventDefault(),e.stopPropagation();const h=new FormData(c,n);i.search=new URLSearchParams(h).toString(),D({type:"form",url:i,keepfocus:l.keepfocus,noscroll:l.noscroll,replace_state:l.replace_state??i.href===location.href,event:e})}),addEventListener("popstate",async e=>{var r;if(!gt){if((r=e.state)!=null&&r[N]){const n=e.state[N];if(O={},n===E)return;const o=I[n],s=e.state[Nt]??{},i=new URL(e.state[re]??location.href),c=e.state[B],l=m.url?it(location)===it(m.url):!1;if(c===R&&(Ht||l)){s!==x.state&&(x.state=s),t(i),I[E]=C(),o&&scrollTo(o.x,o.y),E=n;return}const u=n-E;await D({type:"popstate",url:i,popped:{state:s,scroll:o,delta:u},accept:()=>{E=n,R=c},block:()=>{history.go(-u)},nav_token:O,event:e})}else if(!K){const n=new URL(location.href);t(n),b.hash&&location.reload()}}}),addEventListener("hashchange",()=>{K&&(K=!1,history.replaceState({...history.state,[N]:++E,[B]:R},"",location.href))});for(const e of document.querySelectorAll("link"))ve.has(e.rel)&&(e.href=e.href);addEventListener("pageshow",e=>{e.persisted&&P.navigating.set(ft.current=null)});function t(e){m.url=x.url=e,P.page.set(At(x)),P.page.notify()}}async function Ce(t,{status:a=200,error:e,node_ids:r,params:n,route:o,server_route:s,data:i,form:c}){Vt=!0;const l=new URL(location.href);let h;({params:n={},route:o={id:null}}=await ot(l,!1)||{}),h=kt.find(({id:f})=>f===o.id);let u,w=!0;try{const f=r.map(async(_,g)=>{const p=i[g];return p!=null&&p.uses&&(p.uses=je(p.uses)),Rt({loader:b.nodes[_],url:l,params:n,route:o,parent:async()=>{const y={};for(let S=0;S{const i=history.state;gt=!0,location.replace(new URL(`#${r}`,location.href)),history.replaceState(i,"",t),a&&scrollTo(o,s),gt=!1})}else{const o=document.body,s=o.getAttribute("tabindex");o.tabIndex=-1,o.focus({preventScroll:!0,focusVisible:!1}),s!==null?o.setAttribute("tabindex",s):o.removeAttribute("tabindex")}const n=getSelection();if(n&&n.type!=="None"){const o=[];for(let s=0;s{if(n.rangeCount===o.length){for(let s=0;s{o=u,s=w});return i.catch(()=>{}),{navigation:{from:{params:t.params,route:{id:((l=t.route)==null?void 0:l.id)??null},url:t.url,scroll:C()},to:e&&{params:(a==null?void 0:a.params)??null,route:{id:((h=a==null?void 0:a.route)==null?void 0:h.id)??null},url:e,scroll:n},willUnload:!a,type:r,complete:i},fulfil:o,reject:s}}function At(t){return{data:t.data,error:t.error,form:t.form,params:t.params,route:t.route,state:t.state,status:t.status,url:t.url}}function Ne(t){const a=new URL(t);return a.hash=decodeURIComponent(t.hash),a}function te(t){let a;if(b.hash){const[,,e]=t.hash.split("#",3);a=e??""}else a=t.hash.slice(1);return decodeURIComponent(a)}export{Fe as a,Be as g,P as s}; diff --git a/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br b/apps/dashboard/build/_app/immutable/chunks/DwA4GIGc.js.br deleted file mode 100644 index a1159bfbc54fb075489718e3b5aacdf911a217df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7669 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

V(H& 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

sJeMXNb>J*CMZ!cl78c(BjF7IRmofNH-;|y|cIV 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 in i?wc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var Wt=(i,t,e)=>Ac(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Rl,a as Cl}from"../chunks/DeTA_5mp.js";import{p as ur,a as dr,e as Dt,d as Ot,O as Rc,r as Rt,t as ln,g as j,u as ti,f as Pl,s as Ie,h as ie,c as Cc}from"../chunks/nyjtQ1Ok.js";import{s as _e,d as Dl,a as Je}from"../chunks/C4L78yoI.js";import{i as Ai}from"../chunks/B17metm1.js";import{e as Qr,i as ta}from"../chunks/BilMa3tw.js";import{a as He,f as je,c as Pc}from"../chunks/B0IenmM-.js";import{s as ze,r as Ll}from"../chunks/BBOOwRwQ.js";import{s as Dc}from"../chunks/BgOFZ9jq.js";import{s as Ul}from"../chunks/D2QmVWrb.js";import{b as Il}from"../chunks/BOVu8he9.js";import{b as Nl}from"../chunks/J2LZW-kP.js";import{s as Lc,a as Uc}from"../chunks/C3ZC25l2.js";import{b as Ic}from"../chunks/urMNLRPv.js";import{b as Nc}from"../chunks/DAhpUNCK.js";import{p as nr}from"../chunks/BPtVz5jm.js";import{N as Fl}from"../chunks/BNytumrp.js";import{a as qi}from"../chunks/BcuCGYSa.js";import{e as Fc}from"../chunks/B6fk3AxI.js";/** +var wc=Object.defineProperty;var Ac=(i,t,e)=>t in i?wc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var Wt=(i,t,e)=>Ac(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Rl,a as Cl}from"../chunks/DeTA_5mp.js";import{p as ur,a as dr,e as Dt,d as Ot,O as Rc,r as Rt,t as ln,g as j,u as ti,f as Pl,s as Ie,h as ie,c as Cc}from"../chunks/nyjtQ1Ok.js";import{s as _e,d as Dl,a as Je}from"../chunks/C4L78yoI.js";import{i as Ai}from"../chunks/B17metm1.js";import{e as Qr,i as ta}from"../chunks/BilMa3tw.js";import{a as ke,f as je,c as Pc}from"../chunks/B0IenmM-.js";import{s as ze,r as Ll}from"../chunks/BBOOwRwQ.js";import{s as Dc}from"../chunks/BgOFZ9jq.js";import{s as Ul}from"../chunks/D2QmVWrb.js";import{b as Il}from"../chunks/BOVu8he9.js";import{b as Nl}from"../chunks/J2LZW-kP.js";import{s as Lc,a as Uc}from"../chunks/C3ZC25l2.js";import{b as Ic}from"../chunks/BAlzCWFX.js";import{b as Nc}from"../chunks/DAhpUNCK.js";import{p as nr}from"../chunks/BPtVz5jm.js";import{N as Fl}from"../chunks/BNytumrp.js";import{a as qi}from"../chunks/BcuCGYSa.js";import{e as Fc}from"../chunks/B6fk3AxI.js";/** * @license * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT - */const Ya="172",Li={ROTATE:0,DOLLY:1,PAN:2},Ci={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},Oc=0,fo=1,Bc=2,Ol=1,zc=2,yn=3,zn=0,ke=1,hn=2,bn=0,Ui=1,Ne=2,po=3,mo=4,Hc=5,Kn=100,kc=101,Vc=102,Gc=103,Wc=104,Xc=200,Yc=201,qc=202,jc=203,ea=204,na=205,Zc=206,Kc=207,$c=208,Jc=209,Qc=210,th=211,eh=212,nh=213,ih=214,ia=0,sa=1,ra=2,Oi=3,aa=4,oa=5,la=6,ca=7,Bl=0,sh=1,rh=2,On=0,ah=1,oh=2,lh=3,zl=4,ch=5,hh=6,uh=7,Hl=300,Bi=301,zi=302,ha=303,ua=304,fr=306,da=1e3,Jn=1001,fa=1002,qe=1003,dh=1004,gs=1005,dn=1006,xr=1007,Qn=1008,An=1009,kl=1010,Vl=1011,ls=1012,qa=1013,ni=1014,fn=1015,Tn=1016,ja=1017,Za=1018,Hi=1020,Gl=35902,Wl=1021,Xl=1022,an=1023,Yl=1024,ql=1025,Ii=1026,ki=1027,Ka=1028,$a=1029,jl=1030,Ja=1031,Qa=1033,qs=33776,js=33777,Zs=33778,Ks=33779,pa=35840,ma=35841,ga=35842,_a=35843,va=36196,xa=37492,Ma=37496,Sa=37808,ya=37809,Ea=37810,ba=37811,Ta=37812,wa=37813,Aa=37814,Ra=37815,Ca=37816,Pa=37817,Da=37818,La=37819,Ua=37820,Ia=37821,$s=36492,Na=36494,Fa=36495,Zl=36283,Oa=36284,Ba=36285,za=36286,fh=3200,ph=3201,Kl=0,mh=1,Fn="",Qe="srgb",Vi="srgb-linear",ir="linear",re="srgb",li=7680,go=519,gh=512,_h=513,vh=514,$l=515,xh=516,Mh=517,Sh=518,yh=519,Ha=35044,_o="300 es",En=2e3,sr=2001;class si{addEventListener(t,e){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[t]===void 0&&(n[t]=[]),n[t].indexOf(e)===-1&&n[t].push(e)}hasEventListener(t,e){if(this._listeners===void 0)return!1;const n=this._listeners;return n[t]!==void 0&&n[t].indexOf(e)!==-1}removeEventListener(t,e){if(this._listeners===void 0)return;const s=this._listeners[t];if(s!==void 0){const r=s.indexOf(e);r!==-1&&s.splice(r,1)}}dispatchEvent(t){if(this._listeners===void 0)return;const n=this._listeners[t.type];if(n!==void 0){t.target=this;const s=n.slice(0);for(let r=0,a=s.length;r>8&255]+Re[i>>16&255]+Re[i>>24&255]+"-"+Re[t&255]+Re[t>>8&255]+"-"+Re[t>>16&15|64]+Re[t>>24&255]+"-"+Re[e&63|128]+Re[e>>8&255]+"-"+Re[e>>16&255]+Re[e>>24&255]+Re[n&255]+Re[n>>8&255]+Re[n>>16&255]+Re[n>>24&255]).toLowerCase()}function Yt(i,t,e){return Math.max(t,Math.min(e,i))}function Eh(i,t){return(i%t+t)%t}function Mr(i,t,e){return(1-e)*i+e*t}function un(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error("Invalid component type.")}}function ae(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error("Invalid component type.")}}const bh={DEG2RAD:Js};class vt{constructor(t=0,e=0){vt.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*s+t.x,this.y=r*s+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ht{constructor(t,e,n,s,r,a,o,l,c){Ht.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c)}set(t,e,n,s,r,a,o,l,c){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],d=n[7],p=n[2],f=n[5],g=n[8],v=s[0],m=s[3],u=s[6],T=s[1],b=s[4],y=s[7],L=s[2],R=s[5],A=s[8];return r[0]=a*v+o*T+l*L,r[3]=a*m+o*b+l*R,r[6]=a*u+o*y+l*A,r[1]=c*v+h*T+d*L,r[4]=c*m+h*b+d*R,r[7]=c*u+h*y+d*A,r[2]=p*v+f*T+g*L,r[5]=p*m+f*b+g*R,r[8]=p*u+f*y+g*A,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8];return e*a*h-e*o*c-n*r*h+n*o*l+s*r*c-s*a*l}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=h*a-o*c,p=o*l-h*r,f=c*r-a*l,g=e*d+n*p+s*f;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const v=1/g;return t[0]=d*v,t[1]=(s*c-h*n)*v,t[2]=(o*n-s*a)*v,t[3]=p*v,t[4]=(h*e-s*l)*v,t[5]=(s*r-o*e)*v,t[6]=f*v,t[7]=(n*l-c*e)*v,t[8]=(a*e-n*r)*v,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+t,-s*c,s*l,-s*(-c*a+l*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(Sr.makeScale(t,e)),this}rotate(t){return this.premultiply(Sr.makeRotation(-t)),this}translate(t,e){return this.premultiply(Sr.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}}const Sr=new Ht;function Jl(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function rr(i){return document.createElementNS("http://www.w3.org/1999/xhtml",i)}function Th(){const i=rr("canvas");return i.style.display="block",i}const vo={};function Ri(i){i in vo||(vo[i]=!0,console.warn(i))}function wh(i,t,e){return new Promise(function(n,s){function r(){switch(i.clientWaitSync(t,i.SYNC_FLUSH_COMMANDS_BIT,0)){case i.WAIT_FAILED:s();break;case i.TIMEOUT_EXPIRED:setTimeout(r,e);break;default:n()}}setTimeout(r,e)})}function Ah(i){const t=i.elements;t[2]=.5*t[2]+.5*t[3],t[6]=.5*t[6]+.5*t[7],t[10]=.5*t[10]+.5*t[11],t[14]=.5*t[14]+.5*t[15]}function Rh(i){const t=i.elements;t[11]===-1?(t[10]=-t[10]-1,t[14]=-t[14]):(t[10]=-t[10],t[14]=-t[14]+1)}const xo=new Ht().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Mo=new Ht().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ch(){const i={enabled:!0,workingColorSpace:Vi,spaces:{},convert:function(s,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===re&&(s.r=wn(s.r),s.g=wn(s.g),s.b=wn(s.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===re&&(s.r=Ni(s.r),s.g=Ni(s.g),s.b=Ni(s.b))),s},fromWorkingColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},toWorkingColorSpace:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===Fn?ir:this.spaces[s].transfer},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,a){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace}},t=[.64,.33,.3,.6,.15,.06],e=[.2126,.7152,.0722],n=[.3127,.329];return i.define({[Vi]:{primaries:t,whitePoint:n,transfer:ir,toXYZ:xo,fromXYZ:Mo,luminanceCoefficients:e,workingColorSpaceConfig:{unpackColorSpace:Qe},outputColorSpaceConfig:{drawingBufferColorSpace:Qe}},[Qe]:{primaries:t,whitePoint:n,transfer:re,toXYZ:xo,fromXYZ:Mo,luminanceCoefficients:e,outputColorSpaceConfig:{drawingBufferColorSpace:Qe}}}),i}const $t=Ch();function wn(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function Ni(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}let ci;class Ph{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>"u")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{ci===void 0&&(ci=rr("canvas")),ci.width=t.width,ci.height=t.height;const n=ci.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=ci}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap){const e=rr("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let a=0;a0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==Hl)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case da:t.x=t.x-Math.floor(t.x);break;case Jn:t.x=t.x<0?0:1;break;case fa:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case da:t.y=t.y-Math.floor(t.y);break;case Jn:t.y=t.y<0?0:1;break;case fa:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){t===!0&&this.pmremVersion++}}Te.DEFAULT_IMAGE=null;Te.DEFAULT_MAPPING=Hl;Te.DEFAULT_ANISOTROPY=1;class le{constructor(t=0,e=0,n=0,s=1){le.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*s+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*s+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*s+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*s+a[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r;const l=t.elements,c=l[0],h=l[4],d=l[8],p=l[1],f=l[5],g=l[9],v=l[2],m=l[6],u=l[10];if(Math.abs(h-p)<.01&&Math.abs(d-v)<.01&&Math.abs(g-m)<.01){if(Math.abs(h+p)<.1&&Math.abs(d+v)<.1&&Math.abs(g+m)<.1&&Math.abs(c+f+u-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;const b=(c+1)/2,y=(f+1)/2,L=(u+1)/2,R=(h+p)/4,A=(d+v)/4,U=(g+m)/4;return b>y&&b>L?b<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(b),s=R/n,r=A/n):y>L?y<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(y),n=R/s,r=U/s):L<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(L),n=A/r,s=U/r),this.set(n,s,r,e),this}let T=Math.sqrt((m-g)*(m-g)+(d-v)*(d-v)+(p-h)*(p-h));return Math.abs(T)<.001&&(T=1),this.x=(m-g)/T,this.y=(d-v)/T,this.z=(p-h)/T,this.w=Math.acos((c+f+u-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this.w=Yt(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this.w=Yt(this.w,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Uh extends si{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new le(0,0,t,e),this.scissorTest=!1,this.viewport=new le(0,0,t,e);const s={width:t,height:e,depth:1};n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:dn,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},n);const r=new Te(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace);r.flipY=!1,r.generateMipmaps=n.generateMipmaps,r.internalFormat=n.internalFormat,this.textures=[];const a=n.count;for(let o=0;o=0?1:-1,b=1-u*u;if(b>Number.EPSILON){const L=Math.sqrt(b),R=Math.atan2(L,u*T);m=Math.sin(m*R)/L,o=Math.sin(o*R)/L}const y=o*T;if(l=l*m+p*y,c=c*m+f*y,h=h*m+g*y,d=d*m+v*y,m===1-o){const L=1/Math.sqrt(l*l+c*c+h*h+d*d);l*=L,c*=L,h*=L,d*=L}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=d}static multiplyQuaternionsFlat(t,e,n,s,r,a){const o=n[s],l=n[s+1],c=n[s+2],h=n[s+3],d=r[a],p=r[a+1],f=r[a+2],g=r[a+3];return t[e]=o*g+h*d+l*f-c*p,t[e+1]=l*g+h*p+c*d-o*f,t[e+2]=c*g+h*f+o*p-l*d,t[e+3]=h*g-o*d-l*p-c*f,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const n=t._x,s=t._y,r=t._z,a=t._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(s/2),d=o(r/2),p=l(n/2),f=l(s/2),g=l(r/2);switch(a){case"XYZ":this._x=p*h*d+c*f*g,this._y=c*f*d-p*h*g,this._z=c*h*g+p*f*d,this._w=c*h*d-p*f*g;break;case"YXZ":this._x=p*h*d+c*f*g,this._y=c*f*d-p*h*g,this._z=c*h*g-p*f*d,this._w=c*h*d+p*f*g;break;case"ZXY":this._x=p*h*d-c*f*g,this._y=c*f*d+p*h*g,this._z=c*h*g+p*f*d,this._w=c*h*d-p*f*g;break;case"ZYX":this._x=p*h*d-c*f*g,this._y=c*f*d+p*h*g,this._z=c*h*g-p*f*d,this._w=c*h*d+p*f*g;break;case"YZX":this._x=p*h*d+c*f*g,this._y=c*f*d+p*h*g,this._z=c*h*g-p*f*d,this._w=c*h*d-p*f*g;break;case"XZY":this._x=p*h*d-c*f*g,this._y=c*f*d-p*h*g,this._z=c*h*g+p*f*d,this._w=c*h*d+p*f*g;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],s=e[4],r=e[8],a=e[1],o=e[5],l=e[9],c=e[2],h=e[6],d=e[10],p=n+o+d;if(p>0){const f=.5/Math.sqrt(p+1);this._w=.25/f,this._x=(h-l)*f,this._y=(r-c)*f,this._z=(a-s)*f}else if(n>o&&n>d){const f=2*Math.sqrt(1+n-o-d);this._w=(h-l)/f,this._x=.25*f,this._y=(s+a)/f,this._z=(r+c)/f}else if(o>d){const f=2*Math.sqrt(1+o-n-d);this._w=(r-c)/f,this._x=(s+a)/f,this._y=.25*f,this._z=(l+h)/f}else{const f=2*Math.sqrt(1+d-n-o);this._w=(a-s)/f,this._x=(r+c)/f,this._y=(l+h)/f,this._z=.25*f}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Yt(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(n===0)return this;const s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,a=t._w,o=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+a*o+s*c-r*l,this._y=s*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-s*o,this._w=a*h-n*o-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);const n=this._x,s=this._y,r=this._z,a=this._w;let o=a*t._w+n*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=s,this._z=r,this;const l=1-o*o;if(l<=Number.EPSILON){const f=1-e;return this._w=f*a+e*this._w,this._x=f*n+e*this._x,this._y=f*s+e*this._y,this._z=f*r+e*this._z,this.normalize(),this}const c=Math.sqrt(l),h=Math.atan2(c,o),d=Math.sin((1-e)*h)/c,p=Math.sin(e*h)/c;return this._w=a*d+this._w*p,this._x=n*d+this._x*p,this._y=s*d+this._y*p,this._z=r*d+this._z*p,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(t=0,e=0,n=0){P.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(So.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(So.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,s=this.z,r=t.x,a=t.y,o=t.z,l=t.w,c=2*(a*s-o*n),h=2*(o*e-r*s),d=2*(r*n-a*e);return this.x=e+l*c+a*d-o*h,this.y=n+l*h+o*c-r*d,this.z=s+l*d+r*h-a*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,s=t.y,r=t.z,a=e.x,o=e.y,l=e.z;return this.x=s*l-r*o,this.y=r*a-n*l,this.z=n*o-s*a,this}projectOnVector(t){const e=t.lengthSq();if(e===0)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Er.copy(this).projectOnVector(t),this.sub(Er)}reflect(t){return this.sub(Er.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=Math.random()*2-1,n=Math.sqrt(1-e*e);return this.x=n*Math.cos(t),this.y=e,this.z=n*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Er=new P,So=new ii;class ri{constructor(t=new P(1/0,1/0,1/0),e=new P(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,nn),nn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ji),vs.subVectors(this.max,ji),hi.subVectors(t.a,ji),ui.subVectors(t.b,ji),di.subVectors(t.c,ji),Rn.subVectors(ui,hi),Cn.subVectors(di,ui),Gn.subVectors(hi,di);let e=[0,-Rn.z,Rn.y,0,-Cn.z,Cn.y,0,-Gn.z,Gn.y,Rn.z,0,-Rn.x,Cn.z,0,-Cn.x,Gn.z,0,-Gn.x,-Rn.y,Rn.x,0,-Cn.y,Cn.x,0,-Gn.y,Gn.x,0];return!br(e,hi,ui,di,vs)||(e=[1,0,0,0,1,0,0,0,1],!br(e,hi,ui,di,vs))?!1:(xs.crossVectors(Rn,Cn),e=[xs.x,xs.y,xs.z],br(e,hi,ui,di,vs))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,nn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(nn).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(gn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),gn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),gn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),gn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),gn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),gn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),gn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),gn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(gn),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const gn=[new P,new P,new P,new P,new P,new P,new P,new P],nn=new P,_s=new ri,hi=new P,ui=new P,di=new P,Rn=new P,Cn=new P,Gn=new P,ji=new P,vs=new P,xs=new P,Wn=new P;function br(i,t,e,n,s){for(let r=0,a=i.length-3;r<=a;r+=3){Wn.fromArray(i,r);const o=s.x*Math.abs(Wn.x)+s.y*Math.abs(Wn.y)+s.z*Math.abs(Wn.z),l=t.dot(Wn),c=e.dot(Wn),h=n.dot(Wn);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Nh=new ri,Zi=new P,Tr=new P;class ai{constructor(t=new P,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;e!==void 0?n.copy(e):Nh.setFromPoints(t).getCenter(n);let s=0;for(let r=0,a=t.length;rthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Zi.subVectors(t,this.center);const e=Zi.lengthSq();if(e>this.radius*this.radius){const n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(Zi,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(Tr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Zi.copy(t.center).add(Tr)),this.expandByPoint(Zi.copy(t.center).sub(Tr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}}const _n=new P,wr=new P,Ms=new P,Pn=new P,Ar=new P,Ss=new P,Rr=new P;class hs{constructor(t=new P,e=new P(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_n)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_n.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_n.copy(this.origin).addScaledVector(this.direction,e),_n.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){wr.copy(t).add(e).multiplyScalar(.5),Ms.copy(e).sub(t).normalize(),Pn.copy(this.origin).sub(wr);const r=t.distanceTo(e)*.5,a=-this.direction.dot(Ms),o=Pn.dot(this.direction),l=-Pn.dot(Ms),c=Pn.lengthSq(),h=Math.abs(1-a*a);let d,p,f,g;if(h>0)if(d=a*l-o,p=a*o-l,g=r*h,d>=0)if(p>=-g)if(p<=g){const v=1/h;d*=v,p*=v,f=d*(d+a*p+2*o)+p*(a*d+p+2*l)+c}else p=r,d=Math.max(0,-(a*p+o)),f=-d*d+p*(p+2*l)+c;else p=-r,d=Math.max(0,-(a*p+o)),f=-d*d+p*(p+2*l)+c;else p<=-g?(d=Math.max(0,-(-a*r+o)),p=d>0?-r:Math.min(Math.max(-r,-l),r),f=-d*d+p*(p+2*l)+c):p<=g?(d=0,p=Math.min(Math.max(-r,-l),r),f=p*(p+2*l)+c):(d=Math.max(0,-(a*r+o)),p=d>0?r:Math.min(Math.max(-r,-l),r),f=-d*d+p*(p+2*l)+c);else p=a>0?-r:r,d=Math.max(0,-(a*p+o)),f=-d*d+p*(p+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,d),s&&s.copy(wr).addScaledVector(Ms,p),f}intersectSphere(t,e){_n.subVectors(t.center,this.origin);const n=_n.dot(this.direction),s=_n.dot(_n)-n*n,r=t.radius*t.radius;if(s>r)return null;const a=Math.sqrt(r-s),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,d=1/this.direction.z,p=this.origin;return c>=0?(n=(t.min.x-p.x)*c,s=(t.max.x-p.x)*c):(n=(t.max.x-p.x)*c,s=(t.min.x-p.x)*c),h>=0?(r=(t.min.y-p.y)*h,a=(t.max.y-p.y)*h):(r=(t.max.y-p.y)*h,a=(t.min.y-p.y)*h),n>a||r>s||((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-p.z)*d,l=(t.max.z-p.z)*d):(o=(t.max.z-p.z)*d,l=(t.min.z-p.z)*d),n>l||o>s)||((o>n||n!==n)&&(n=o),(l=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,_n)!==null}intersectTriangle(t,e,n,s,r){Ar.subVectors(e,t),Ss.subVectors(n,t),Rr.crossVectors(Ar,Ss);let a=this.direction.dot(Rr),o;if(a>0){if(s)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Pn.subVectors(this.origin,t);const l=o*this.direction.dot(Ss.crossVectors(Pn,Ss));if(l<0)return null;const c=o*this.direction.dot(Ar.cross(Pn));if(c<0||l+c>a)return null;const h=-o*Pn.dot(Rr);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ee{constructor(t,e,n,s,r,a,o,l,c,h,d,p,f,g,v,m){ee.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c,h,d,p,f,g,v,m)}set(t,e,n,s,r,a,o,l,c,h,d,p,f,g,v,m){const u=this.elements;return u[0]=t,u[4]=e,u[8]=n,u[12]=s,u[1]=r,u[5]=a,u[9]=o,u[13]=l,u[2]=c,u[6]=h,u[10]=d,u[14]=p,u[3]=f,u[7]=g,u[11]=v,u[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ee().fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,s=1/fi.setFromMatrixColumn(t,0).length(),r=1/fi.setFromMatrixColumn(t,1).length(),a=1/fi.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,s=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),d=Math.sin(r);if(t.order==="XYZ"){const p=a*h,f=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=-l*d,e[8]=c,e[1]=f+g*c,e[5]=p-v*c,e[9]=-o*l,e[2]=v-p*c,e[6]=g+f*c,e[10]=a*l}else if(t.order==="YXZ"){const p=l*h,f=l*d,g=c*h,v=c*d;e[0]=p+v*o,e[4]=g*o-f,e[8]=a*c,e[1]=a*d,e[5]=a*h,e[9]=-o,e[2]=f*o-g,e[6]=v+p*o,e[10]=a*l}else if(t.order==="ZXY"){const p=l*h,f=l*d,g=c*h,v=c*d;e[0]=p-v*o,e[4]=-a*d,e[8]=g+f*o,e[1]=f+g*o,e[5]=a*h,e[9]=v-p*o,e[2]=-a*c,e[6]=o,e[10]=a*l}else if(t.order==="ZYX"){const p=a*h,f=a*d,g=o*h,v=o*d;e[0]=l*h,e[4]=g*c-f,e[8]=p*c+v,e[1]=l*d,e[5]=v*c+p,e[9]=f*c-g,e[2]=-c,e[6]=o*l,e[10]=a*l}else if(t.order==="YZX"){const p=a*l,f=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=v-p*d,e[8]=g*d+f,e[1]=d,e[5]=a*h,e[9]=-o*h,e[2]=-c*h,e[6]=f*d+g,e[10]=p-v*d}else if(t.order==="XZY"){const p=a*l,f=a*c,g=o*l,v=o*c;e[0]=l*h,e[4]=-d,e[8]=c*h,e[1]=p*d+v,e[5]=a*h,e[9]=f*d-g,e[2]=g*d-f,e[6]=o*h,e[10]=v*d+p}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Fh,t,Oh)}lookAt(t,e,n){const s=this.elements;return We.subVectors(t,e),We.lengthSq()===0&&(We.z=1),We.normalize(),Dn.crossVectors(n,We),Dn.lengthSq()===0&&(Math.abs(n.z)===1?We.x+=1e-4:We.z+=1e-4,We.normalize(),Dn.crossVectors(n,We)),Dn.normalize(),ys.crossVectors(We,Dn),s[0]=Dn.x,s[4]=ys.x,s[8]=We.x,s[1]=Dn.y,s[5]=ys.y,s[9]=We.y,s[2]=Dn.z,s[6]=ys.z,s[10]=We.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],d=n[5],p=n[9],f=n[13],g=n[2],v=n[6],m=n[10],u=n[14],T=n[3],b=n[7],y=n[11],L=n[15],R=s[0],A=s[4],U=s[8],S=s[12],M=s[1],D=s[5],W=s[9],z=s[13],V=s[2],$=s[6],G=s[10],J=s[14],k=s[3],it=s[7],ut=s[11],yt=s[15];return r[0]=a*R+o*M+l*V+c*k,r[4]=a*A+o*D+l*$+c*it,r[8]=a*U+o*W+l*G+c*ut,r[12]=a*S+o*z+l*J+c*yt,r[1]=h*R+d*M+p*V+f*k,r[5]=h*A+d*D+p*$+f*it,r[9]=h*U+d*W+p*G+f*ut,r[13]=h*S+d*z+p*J+f*yt,r[2]=g*R+v*M+m*V+u*k,r[6]=g*A+v*D+m*$+u*it,r[10]=g*U+v*W+m*G+u*ut,r[14]=g*S+v*z+m*J+u*yt,r[3]=T*R+b*M+y*V+L*k,r[7]=T*A+b*D+y*$+L*it,r[11]=T*U+b*W+y*G+L*ut,r[15]=T*S+b*z+y*J+L*yt,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],a=t[1],o=t[5],l=t[9],c=t[13],h=t[2],d=t[6],p=t[10],f=t[14],g=t[3],v=t[7],m=t[11],u=t[15];return g*(+r*l*d-s*c*d-r*o*p+n*c*p+s*o*f-n*l*f)+v*(+e*l*f-e*c*p+r*a*p-s*a*f+s*c*h-r*l*h)+m*(+e*c*d-e*o*f-r*a*d+n*a*f+r*o*h-n*c*h)+u*(-s*o*h-e*l*d+e*o*p+s*a*d-n*a*p+n*l*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],d=t[9],p=t[10],f=t[11],g=t[12],v=t[13],m=t[14],u=t[15],T=d*m*c-v*p*c+v*l*f-o*m*f-d*l*u+o*p*u,b=g*p*c-h*m*c-g*l*f+a*m*f+h*l*u-a*p*u,y=h*v*c-g*d*c+g*o*f-a*v*f-h*o*u+a*d*u,L=g*d*l-h*v*l-g*o*p+a*v*p+h*o*m-a*d*m,R=e*T+n*b+s*y+r*L;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/R;return t[0]=T*A,t[1]=(v*p*r-d*m*r-v*s*f+n*m*f+d*s*u-n*p*u)*A,t[2]=(o*m*r-v*l*r+v*s*c-n*m*c-o*s*u+n*l*u)*A,t[3]=(d*l*r-o*p*r-d*s*c+n*p*c+o*s*f-n*l*f)*A,t[4]=b*A,t[5]=(h*m*r-g*p*r+g*s*f-e*m*f-h*s*u+e*p*u)*A,t[6]=(g*l*r-a*m*r-g*s*c+e*m*c+a*s*u-e*l*u)*A,t[7]=(a*p*r-h*l*r+h*s*c-e*p*c-a*s*f+e*l*f)*A,t[8]=y*A,t[9]=(g*d*r-h*v*r-g*n*f+e*v*f+h*n*u-e*d*u)*A,t[10]=(a*v*r-g*o*r+g*n*c-e*v*c-a*n*u+e*o*u)*A,t[11]=(h*o*r-a*d*r-h*n*c+e*d*c+a*n*f-e*o*f)*A,t[12]=L*A,t[13]=(h*v*s-g*d*s+g*n*p-e*v*p-h*n*m+e*d*m)*A,t[14]=(g*o*s-a*v*s-g*n*l+e*v*l+a*n*m-e*o*m)*A,t[15]=(a*d*s-h*o*s+h*n*l-e*d*l-a*n*p+e*o*p)*A,this}scale(t){const e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),s=Math.sin(e),r=1-n,a=t.x,o=t.y,l=t.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-s*l,c*l+s*o,0,c*o+s*l,h*o+n,h*l-s*a,0,c*l-s*o,h*l+s*a,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,a){return this.set(1,n,r,0,t,1,a,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){const s=this.elements,r=e._x,a=e._y,o=e._z,l=e._w,c=r+r,h=a+a,d=o+o,p=r*c,f=r*h,g=r*d,v=a*h,m=a*d,u=o*d,T=l*c,b=l*h,y=l*d,L=n.x,R=n.y,A=n.z;return s[0]=(1-(v+u))*L,s[1]=(f+y)*L,s[2]=(g-b)*L,s[3]=0,s[4]=(f-y)*R,s[5]=(1-(p+u))*R,s[6]=(m+T)*R,s[7]=0,s[8]=(g+b)*A,s[9]=(m-T)*A,s[10]=(1-(p+v))*A,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){const s=this.elements;let r=fi.set(s[0],s[1],s[2]).length();const a=fi.set(s[4],s[5],s[6]).length(),o=fi.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],sn.copy(this);const c=1/r,h=1/a,d=1/o;return sn.elements[0]*=c,sn.elements[1]*=c,sn.elements[2]*=c,sn.elements[4]*=h,sn.elements[5]*=h,sn.elements[6]*=h,sn.elements[8]*=d,sn.elements[9]*=d,sn.elements[10]*=d,e.setFromRotationMatrix(sn),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,s,r,a,o=En){const l=this.elements,c=2*r/(e-t),h=2*r/(n-s),d=(e+t)/(e-t),p=(n+s)/(n-s);let f,g;if(o===En)f=-(a+r)/(a-r),g=-2*a*r/(a-r);else if(o===sr)f=-a/(a-r),g=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return l[0]=c,l[4]=0,l[8]=d,l[12]=0,l[1]=0,l[5]=h,l[9]=p,l[13]=0,l[2]=0,l[6]=0,l[10]=f,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,a,o=En){const l=this.elements,c=1/(e-t),h=1/(n-s),d=1/(a-r),p=(e+t)*c,f=(n+s)*h;let g,v;if(o===En)g=(a+r)*d,v=-2*d;else if(o===sr)g=r*d,v=-1*d;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-p,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-f,l[2]=0,l[6]=0,l[10]=v,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const fi=new P,sn=new ee,Fh=new P(0,0,0),Oh=new P(1,1,1),Dn=new P,ys=new P,We=new P,yo=new ee,Eo=new ii;class pn{constructor(t=0,e=0,n=0,s=pn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const s=t.elements,r=s[0],a=s[4],o=s[8],l=s[1],c=s[5],h=s[9],d=s[2],p=s[6],f=s[10];switch(e){case"XYZ":this._y=Math.asin(Yt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,f),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(p,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Yt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,f),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-d,r),this._z=0);break;case"ZXY":this._x=Math.asin(Yt(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-d,f),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-Yt(d,-1,1)),Math.abs(d)<.9999999?(this._x=Math.atan2(p,f),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(Yt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-d,r)):(this._x=0,this._y=Math.atan2(o,f));break;case"XZY":this._z=Math.asin(-Yt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(p,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,f),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return yo.makeRotationFromQuaternion(t),this.setFromRotationMatrix(yo,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return Eo.setFromEuler(this),this.setFromQuaternion(Eo,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}pn.DEFAULT_ORDER="XYZ";class to{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let e=0;e1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(o=>({boxInitialized:o.boxInitialized,boxMin:o.box.min.toArray(),boxMax:o.box.max.toArray(),sphereInitialized:o.sphereInitialized,sphereRadius:o.sphere.radius,sphereCenter:o.sphere.center.toArray()})),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(t)),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),d.length>0&&(n.shapes=d),p.length>0&&(n.skeletons=p),f.length>0&&(n.animations=f),g.length>0&&(n.nodes=g)}return n.object=s,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){rn.subVectors(s,e),xn.subVectors(n,e),Pr.subVectors(t,e);const a=rn.dot(rn),o=rn.dot(xn),l=rn.dot(Pr),c=xn.dot(xn),h=xn.dot(Pr),d=a*c-o*o;if(d===0)return r.set(0,0,0),null;const p=1/d,f=(c*l-o*h)*p,g=(a*h-o*l)*p;return r.set(1-f-g,g,f)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,Mn)===null?!1:Mn.x>=0&&Mn.y>=0&&Mn.x+Mn.y<=1}static getInterpolation(t,e,n,s,r,a,o,l){return this.getBarycoord(t,e,n,s,Mn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mn.x),l.addScaledVector(a,Mn.y),l.addScaledVector(o,Mn.z),l)}static getInterpolatedAttribute(t,e,n,s,r,a){return Ir.setScalar(0),Nr.setScalar(0),Fr.setScalar(0),Ir.fromBufferAttribute(t,e),Nr.fromBufferAttribute(t,n),Fr.fromBufferAttribute(t,s),a.setScalar(0),a.addScaledVector(Ir,r.x),a.addScaledVector(Nr,r.y),a.addScaledVector(Fr,r.z),a}static isFrontFacing(t,e,n,s){return rn.subVectors(n,e),xn.subVectors(t,e),rn.cross(xn).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return rn.subVectors(this.c,this.b),xn.subVectors(this.a,this.b),rn.cross(xn).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return tn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return tn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,n,s,r){return tn.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return tn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return tn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,s=this.b,r=this.c;let a,o;gi.subVectors(s,n),_i.subVectors(r,n),Dr.subVectors(t,n);const l=gi.dot(Dr),c=_i.dot(Dr);if(l<=0&&c<=0)return e.copy(n);Lr.subVectors(t,s);const h=gi.dot(Lr),d=_i.dot(Lr);if(h>=0&&d<=h)return e.copy(s);const p=l*d-h*c;if(p<=0&&l>=0&&h<=0)return a=l/(l-h),e.copy(n).addScaledVector(gi,a);Ur.subVectors(t,r);const f=gi.dot(Ur),g=_i.dot(Ur);if(g>=0&&f<=g)return e.copy(r);const v=f*c-l*g;if(v<=0&&c>=0&&g<=0)return o=c/(c-g),e.copy(n).addScaledVector(_i,o);const m=h*g-f*d;if(m<=0&&d-h>=0&&f-g>=0)return Co.subVectors(r,s),o=(d-h)/(d-h+(f-g)),e.copy(s).addScaledVector(Co,o);const u=1/(m+v+p);return a=v*u,o=p*u,e.copy(n).addScaledVector(gi,a).addScaledVector(_i,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const ec={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ln={h:0,s:0,l:0},bs={h:0,s:0,l:0};function Or(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}class pt{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){const s=t;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Qe){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,$t.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=$t.workingColorSpace){return this.r=t,this.g=e,this.b=n,$t.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=$t.workingColorSpace){if(t=Eh(t,1),e=Yt(e,0,1),n=Yt(n,0,1),e===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+e):n+e-n*e,a=2*n-r;this.r=Or(a,r,t+1/3),this.g=Or(a,r,t),this.b=Or(a,r,t-1/3)}return $t.toWorkingColorSpace(this,s),this}setStyle(t,e=Qe){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const a=s[1],o=s[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const r=s[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(a===6)return this.setHex(parseInt(r,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Qe){const n=ec[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=Ni(t.r),this.g=Ni(t.g),this.b=Ni(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Qe){return $t.fromWorkingColorSpace(Ce.copy(this),t),Math.round(Yt(Ce.r*255,0,255))*65536+Math.round(Yt(Ce.g*255,0,255))*256+Math.round(Yt(Ce.b*255,0,255))}getHexString(t=Qe){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=$t.workingColorSpace){$t.fromWorkingColorSpace(Ce.copy(this),e);const n=Ce.r,s=Ce.g,r=Ce.b,a=Math.max(n,s,r),o=Math.min(n,s,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const d=a-o;switch(c=h<=.5?d/(a+o):d/(2-a-o),a){case n:l=(s-r)/d+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(const e in t){const n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";e&&(t={textures:{},images:{}});const n={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ui&&(n.blending=this.blending),this.side!==zn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==ea&&(n.blendSrc=this.blendSrc),this.blendDst!==na&&(n.blendDst=this.blendDst),this.blendEquation!==Kn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Oi&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==go&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==li&&(n.stencilFail=this.stencilFail),this.stencilZFail!==li&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==li&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(e){const r=s(t.textures),a=s(t.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(e!==null){const s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){t===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class cs extends Hn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new pt(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new pn,this.combine=Bl,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const ge=new P,Ts=new vt;class he{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=Ha,this.updateRanges=[],this.gpuType=fn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new ri);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n0&&(t.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};const e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const l in n){const c=n[l];t.data.attributes[l]=c.toJSON(t.data)}const s={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let d=0,p=c.length;d0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;n!==null&&this.setIndex(n.clone(e));const s=t.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(e))}const r=t.morphAttributes;for(const c in r){const h=[],d=r[c];for(let p=0,f=d.length;p0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;r(t.far-t.near)**2))&&(Po.copy(r).invert(),Xn.copy(t.ray).applyMatrix4(Po),!(n.boundingBox!==null&&Xn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,Xn)))}_computeIntersections(t,e,n){let s;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,d=r.attributes.normal,p=r.groups,f=r.drawRange;if(o!==null)if(Array.isArray(a))for(let g=0,v=p.length;ge.far?null:{distance:c,point:Ds.clone(),object:i}}function Ls(i,t,e,n,s,r,a,o,l,c){i.getVertexPosition(o,As),i.getVertexPosition(l,Rs),i.getVertexPosition(c,Cs);const h=Wh(i,t,e,n,As,Rs,Cs,Lo);if(h){const d=new P;tn.getBarycoord(Lo,As,Rs,Cs,d),s&&(h.uv=tn.getInterpolatedAttribute(s,o,l,c,d,new vt)),r&&(h.uv1=tn.getInterpolatedAttribute(r,o,l,c,d,new vt)),a&&(h.normal=tn.getInterpolatedAttribute(a,o,l,c,d,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const p={a:o,b:l,c,normal:new P,materialIndex:0};tn.getNormal(As,Rs,Cs,p.normal),h.face=p,h.barycoord=d}return h}class us extends pe{constructor(t=1,e=1,n=1,s=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:a};const o=this;s=Math.floor(s),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],d=[];let p=0,f=0;g("z","y","x",-1,-1,n,e,t,a,r,0),g("z","y","x",1,-1,n,e,-t,a,r,1),g("x","z","y",1,1,t,n,e,s,a,2),g("x","z","y",1,-1,t,n,-e,s,a,3),g("x","y","z",1,-1,t,e,n,s,r,4),g("x","y","z",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute("position",new Pe(c,3)),this.setAttribute("normal",new Pe(h,3)),this.setAttribute("uv",new Pe(d,2));function g(v,m,u,T,b,y,L,R,A,U,S){const M=y/A,D=L/U,W=y/2,z=L/2,V=R/2,$=A+1,G=U+1;let J=0,k=0;const it=new P;for(let ut=0;ut0?1:-1,h.push(it.x,it.y,it.z),d.push(Lt/A),d.push(1-ut/U),J+=1}}for(let ut=0;ut>8&255]+Re[i>>16&255]+Re[i>>24&255]+"-"+Re[t&255]+Re[t>>8&255]+"-"+Re[t>>16&15|64]+Re[t>>24&255]+"-"+Re[e&63|128]+Re[e>>8&255]+"-"+Re[e>>16&255]+Re[e>>24&255]+Re[n&255]+Re[n>>8&255]+Re[n>>16&255]+Re[n>>24&255]).toLowerCase()}function Yt(i,t,e){return Math.max(t,Math.min(e,i))}function Eh(i,t){return(i%t+t)%t}function Mr(i,t,e){return(1-e)*i+e*t}function un(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return i/4294967295;case Uint16Array:return i/65535;case Uint8Array:return i/255;case Int32Array:return Math.max(i/2147483647,-1);case Int16Array:return Math.max(i/32767,-1);case Int8Array:return Math.max(i/127,-1);default:throw new Error("Invalid component type.")}}function ae(i,t){switch(t.constructor){case Float32Array:return i;case Uint32Array:return Math.round(i*4294967295);case Uint16Array:return Math.round(i*65535);case Uint8Array:return Math.round(i*255);case Int32Array:return Math.round(i*2147483647);case Int16Array:return Math.round(i*32767);case Int8Array:return Math.round(i*127);default:throw new Error("Invalid component type.")}}const bh={DEG2RAD:Js};class vt{constructor(t=0,e=0){vt.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,n=this.y,s=t.elements;return this.x=s[0]*e+s[3]*n+s[6],this.y=s[1]*e+s[4]*n+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y;return e*e+n*n}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const n=Math.cos(e),s=Math.sin(e),r=this.x-t.x,a=this.y-t.y;return this.x=r*n-a*s+t.x,this.y=r*s+a*n+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class kt{constructor(t,e,n,s,r,a,o,l,c){kt.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c)}set(t,e,n,s,r,a,o,l,c){const h=this.elements;return h[0]=t,h[1]=s,h[2]=o,h[3]=e,h[4]=r,h[5]=l,h[6]=n,h[7]=a,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],this}extractBasis(t,e,n){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[3],l=n[6],c=n[1],h=n[4],f=n[7],p=n[2],u=n[5],g=n[8],_=s[0],m=s[3],d=s[6],T=s[1],E=s[4],y=s[7],L=s[2],R=s[5],A=s[8];return r[0]=a*_+o*T+l*L,r[3]=a*m+o*E+l*R,r[6]=a*d+o*y+l*A,r[1]=c*_+h*T+f*L,r[4]=c*m+h*E+f*R,r[7]=c*d+h*y+f*A,r[2]=p*_+u*T+g*L,r[5]=p*m+u*E+g*R,r[8]=p*d+u*y+g*A,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8];return e*a*h-e*o*c-n*r*h+n*o*l+s*r*c-s*a*l}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],f=h*a-o*c,p=o*l-h*r,u=c*r-a*l,g=e*f+n*p+s*u;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const _=1/g;return t[0]=f*_,t[1]=(s*c-h*n)*_,t[2]=(o*n-s*a)*_,t[3]=p*_,t[4]=(h*e-s*l)*_,t[5]=(s*r-o*e)*_,t[6]=u*_,t[7]=(n*l-c*e)*_,t[8]=(a*e-n*r)*_,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,n,s,r,a,o){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*a+c*o)+a+t,-s*c,s*l,-s*(-c*a+l*o)+o+e,0,0,1),this}scale(t,e){return this.premultiply(Sr.makeScale(t,e)),this}rotate(t){return this.premultiply(Sr.makeRotation(-t)),this}translate(t,e){return this.premultiply(Sr.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,n,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<9;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<9;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t}clone(){return new this.constructor().fromArray(this.elements)}}const Sr=new kt;function Jl(i){for(let t=i.length-1;t>=0;--t)if(i[t]>=65535)return!0;return!1}function rr(i){return document.createElementNS("http://www.w3.org/1999/xhtml",i)}function Th(){const i=rr("canvas");return i.style.display="block",i}const vo={};function Ri(i){i in vo||(vo[i]=!0,console.warn(i))}function wh(i,t,e){return new Promise(function(n,s){function r(){switch(i.clientWaitSync(t,i.SYNC_FLUSH_COMMANDS_BIT,0)){case i.WAIT_FAILED:s();break;case i.TIMEOUT_EXPIRED:setTimeout(r,e);break;default:n()}}setTimeout(r,e)})}function Ah(i){const t=i.elements;t[2]=.5*t[2]+.5*t[3],t[6]=.5*t[6]+.5*t[7],t[10]=.5*t[10]+.5*t[11],t[14]=.5*t[14]+.5*t[15]}function Rh(i){const t=i.elements;t[11]===-1?(t[10]=-t[10]-1,t[14]=-t[14]):(t[10]=-t[10],t[14]=-t[14]+1)}const xo=new kt().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Mo=new kt().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Ch(){const i={enabled:!0,workingColorSpace:Vi,spaces:{},convert:function(s,r,a){return this.enabled===!1||r===a||!r||!a||(this.spaces[r].transfer===re&&(s.r=wn(s.r),s.g=wn(s.g),s.b=wn(s.b)),this.spaces[r].primaries!==this.spaces[a].primaries&&(s.applyMatrix3(this.spaces[r].toXYZ),s.applyMatrix3(this.spaces[a].fromXYZ)),this.spaces[a].transfer===re&&(s.r=Ni(s.r),s.g=Ni(s.g),s.b=Ni(s.b))),s},fromWorkingColorSpace:function(s,r){return this.convert(s,this.workingColorSpace,r)},toWorkingColorSpace:function(s,r){return this.convert(s,r,this.workingColorSpace)},getPrimaries:function(s){return this.spaces[s].primaries},getTransfer:function(s){return s===Fn?ir:this.spaces[s].transfer},getLuminanceCoefficients:function(s,r=this.workingColorSpace){return s.fromArray(this.spaces[r].luminanceCoefficients)},define:function(s){Object.assign(this.spaces,s)},_getMatrix:function(s,r,a){return s.copy(this.spaces[r].toXYZ).multiply(this.spaces[a].fromXYZ)},_getDrawingBufferColorSpace:function(s){return this.spaces[s].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(s=this.workingColorSpace){return this.spaces[s].workingColorSpaceConfig.unpackColorSpace}},t=[.64,.33,.3,.6,.15,.06],e=[.2126,.7152,.0722],n=[.3127,.329];return i.define({[Vi]:{primaries:t,whitePoint:n,transfer:ir,toXYZ:xo,fromXYZ:Mo,luminanceCoefficients:e,workingColorSpaceConfig:{unpackColorSpace:Qe},outputColorSpaceConfig:{drawingBufferColorSpace:Qe}},[Qe]:{primaries:t,whitePoint:n,transfer:re,toXYZ:xo,fromXYZ:Mo,luminanceCoefficients:e,outputColorSpaceConfig:{drawingBufferColorSpace:Qe}}}),i}const $t=Ch();function wn(i){return i<.04045?i*.0773993808:Math.pow(i*.9478672986+.0521327014,2.4)}function Ni(i){return i<.0031308?i*12.92:1.055*Math.pow(i,.41666)-.055}let ci;class Ph{static getDataURL(t){if(/^data:/i.test(t.src)||typeof HTMLCanvasElement>"u")return t.src;let e;if(t instanceof HTMLCanvasElement)e=t;else{ci===void 0&&(ci=rr("canvas")),ci.width=t.width,ci.height=t.height;const n=ci.getContext("2d");t instanceof ImageData?n.putImageData(t,0,0):n.drawImage(t,0,0,t.width,t.height),e=ci}return e.width>2048||e.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",t),e.toDataURL("image/jpeg",.6)):e.toDataURL("image/png")}static sRGBToLinear(t){if(typeof HTMLImageElement<"u"&&t instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&t instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap){const e=rr("canvas");e.width=t.width,e.height=t.height;const n=e.getContext("2d");n.drawImage(t,0,0,t.width,t.height);const s=n.getImageData(0,0,t.width,t.height),r=s.data;for(let a=0;a0&&(n.userData=this.userData),e||(t.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==kl)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case da:t.x=t.x-Math.floor(t.x);break;case Jn:t.x=t.x<0?0:1;break;case fa:Math.abs(Math.floor(t.x)%2)===1?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x);break}if(t.y<0||t.y>1)switch(this.wrapT){case da:t.y=t.y-Math.floor(t.y);break;case Jn:t.y=t.y<0?0:1;break;case fa:Math.abs(Math.floor(t.y)%2)===1?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y);break}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){t===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){t===!0&&this.pmremVersion++}}Te.DEFAULT_IMAGE=null;Te.DEFAULT_MAPPING=kl;Te.DEFAULT_ANISOTROPY=1;class le{constructor(t=0,e=0,n=0,s=1){le.prototype.isVector4=!0,this.x=t,this.y=e,this.z=n,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,n,s){return this.x=t,this.y=e,this.z=n,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=t.w!==void 0?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=this.w,a=t.elements;return this.x=a[0]*e+a[4]*n+a[8]*s+a[12]*r,this.y=a[1]*e+a[5]*n+a[9]*s+a[13]*r,this.z=a[2]*e+a[6]*n+a[10]*s+a[14]*r,this.w=a[3]*e+a[7]*n+a[11]*s+a[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,n,s,r;const l=t.elements,c=l[0],h=l[4],f=l[8],p=l[1],u=l[5],g=l[9],_=l[2],m=l[6],d=l[10];if(Math.abs(h-p)<.01&&Math.abs(f-_)<.01&&Math.abs(g-m)<.01){if(Math.abs(h+p)<.1&&Math.abs(f+_)<.1&&Math.abs(g+m)<.1&&Math.abs(c+u+d-3)<.1)return this.set(1,0,0,0),this;e=Math.PI;const E=(c+1)/2,y=(u+1)/2,L=(d+1)/2,R=(h+p)/4,A=(f+_)/4,U=(g+m)/4;return E>y&&E>L?E<.01?(n=0,s=.707106781,r=.707106781):(n=Math.sqrt(E),s=R/n,r=A/n):y>L?y<.01?(n=.707106781,s=0,r=.707106781):(s=Math.sqrt(y),n=R/s,r=U/s):L<.01?(n=.707106781,s=.707106781,r=0):(r=Math.sqrt(L),n=A/r,s=U/r),this.set(n,s,r,e),this}let T=Math.sqrt((m-g)*(m-g)+(f-_)*(f-_)+(p-h)*(p-h));return Math.abs(T)<.001&&(T=1),this.x=(m-g)/T,this.y=(f-_)/T,this.z=(p-h)/T,this.w=Math.acos((c+u+d-1)/2),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this.w=e[15],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this.w=Math.min(this.w,t.w),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this.w=Math.max(this.w,t.w),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this.w=Yt(this.w,t.w,e.w),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this.w=Yt(this.w,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z+this.w*t.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this.w+=(t.w-this.w)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this.w=t.w+(e.w-t.w)*n,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z&&t.w===this.w}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this.w=t[e+3],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t[e+3]=this.w,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this.w=t.getW(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class Uh extends si{constructor(t=1,e=1,n={}){super(),this.isRenderTarget=!0,this.width=t,this.height=e,this.depth=1,this.scissor=new le(0,0,t,e),this.scissorTest=!1,this.viewport=new le(0,0,t,e);const s={width:t,height:e,depth:1};n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:dn,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1},n);const r=new Te(s,n.mapping,n.wrapS,n.wrapT,n.magFilter,n.minFilter,n.format,n.type,n.anisotropy,n.colorSpace);r.flipY=!1,r.generateMipmaps=n.generateMipmaps,r.internalFormat=n.internalFormat,this.textures=[];const a=n.count;for(let o=0;o=0?1:-1,E=1-d*d;if(E>Number.EPSILON){const L=Math.sqrt(E),R=Math.atan2(L,d*T);m=Math.sin(m*R)/L,o=Math.sin(o*R)/L}const y=o*T;if(l=l*m+p*y,c=c*m+u*y,h=h*m+g*y,f=f*m+_*y,m===1-o){const L=1/Math.sqrt(l*l+c*c+h*h+f*f);l*=L,c*=L,h*=L,f*=L}}t[e]=l,t[e+1]=c,t[e+2]=h,t[e+3]=f}static multiplyQuaternionsFlat(t,e,n,s,r,a){const o=n[s],l=n[s+1],c=n[s+2],h=n[s+3],f=r[a],p=r[a+1],u=r[a+2],g=r[a+3];return t[e]=o*g+h*f+l*u-c*p,t[e+1]=l*g+h*p+c*f-o*u,t[e+2]=c*g+h*u+o*p-l*f,t[e+3]=h*g-o*f-l*p-c*u,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,n,s){return this._x=t,this._y=e,this._z=n,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const n=t._x,s=t._y,r=t._z,a=t._order,o=Math.cos,l=Math.sin,c=o(n/2),h=o(s/2),f=o(r/2),p=l(n/2),u=l(s/2),g=l(r/2);switch(a){case"XYZ":this._x=p*h*f+c*u*g,this._y=c*u*f-p*h*g,this._z=c*h*g+p*u*f,this._w=c*h*f-p*u*g;break;case"YXZ":this._x=p*h*f+c*u*g,this._y=c*u*f-p*h*g,this._z=c*h*g-p*u*f,this._w=c*h*f+p*u*g;break;case"ZXY":this._x=p*h*f-c*u*g,this._y=c*u*f+p*h*g,this._z=c*h*g+p*u*f,this._w=c*h*f-p*u*g;break;case"ZYX":this._x=p*h*f-c*u*g,this._y=c*u*f+p*h*g,this._z=c*h*g-p*u*f,this._w=c*h*f+p*u*g;break;case"YZX":this._x=p*h*f+c*u*g,this._y=c*u*f+p*h*g,this._z=c*h*g-p*u*f,this._w=c*h*f-p*u*g;break;case"XZY":this._x=p*h*f-c*u*g,this._y=c*u*f-p*h*g,this._z=c*h*g+p*u*f,this._w=c*h*f+p*u*g;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return e===!0&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const n=e/2,s=Math.sin(n);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,n=e[0],s=e[4],r=e[8],a=e[1],o=e[5],l=e[9],c=e[2],h=e[6],f=e[10],p=n+o+f;if(p>0){const u=.5/Math.sqrt(p+1);this._w=.25/u,this._x=(h-l)*u,this._y=(r-c)*u,this._z=(a-s)*u}else if(n>o&&n>f){const u=2*Math.sqrt(1+n-o-f);this._w=(h-l)/u,this._x=.25*u,this._y=(s+a)/u,this._z=(r+c)/u}else if(o>f){const u=2*Math.sqrt(1+o-n-f);this._w=(r-c)/u,this._x=(s+a)/u,this._y=.25*u,this._z=(l+h)/u}else{const u=2*Math.sqrt(1+f-n-o);this._w=(a-s)/u,this._x=(r+c)/u,this._y=(l+h)/u,this._z=.25*u}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let n=t.dot(e)+1;return nMath.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=n):(this._x=0,this._y=-t.z,this._z=t.y,this._w=n)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=n),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(Yt(this.dot(t),-1,1)))}rotateTowards(t,e){const n=this.angleTo(t);if(n===0)return this;const s=Math.min(1,e/n);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return t===0?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const n=t._x,s=t._y,r=t._z,a=t._w,o=e._x,l=e._y,c=e._z,h=e._w;return this._x=n*h+a*o+s*c-r*l,this._y=s*h+a*l+r*o-n*c,this._z=r*h+a*c+n*l-s*o,this._w=a*h-n*o-s*l-r*c,this._onChangeCallback(),this}slerp(t,e){if(e===0)return this;if(e===1)return this.copy(t);const n=this._x,s=this._y,r=this._z,a=this._w;let o=a*t._w+n*t._x+s*t._y+r*t._z;if(o<0?(this._w=-t._w,this._x=-t._x,this._y=-t._y,this._z=-t._z,o=-o):this.copy(t),o>=1)return this._w=a,this._x=n,this._y=s,this._z=r,this;const l=1-o*o;if(l<=Number.EPSILON){const u=1-e;return this._w=u*a+e*this._w,this._x=u*n+e*this._x,this._y=u*s+e*this._y,this._z=u*r+e*this._z,this.normalize(),this}const c=Math.sqrt(l),h=Math.atan2(c,o),f=Math.sin((1-e)*h)/c,p=Math.sin(e*h)/c;return this._w=a*f+this._w*p,this._x=n*f+this._x*p,this._y=s*f+this._y*p,this._z=r*f+this._z*p,this._onChangeCallback(),this}slerpQuaternions(t,e,n){return this.copy(t).slerp(e,n)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),n=Math.random(),s=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(t=0,e=0,n=0){P.prototype.isVector3=!0,this.x=t,this.y=e,this.z=n}set(t,e,n){return n===void 0&&(n=this.z),this.x=t,this.y=e,this.z=n,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(So.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(So.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*n+r[6]*s,this.y=r[1]*e+r[4]*n+r[7]*s,this.z=r[2]*e+r[5]*n+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,n=this.y,s=this.z,r=t.elements,a=1/(r[3]*e+r[7]*n+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*n+r[8]*s+r[12])*a,this.y=(r[1]*e+r[5]*n+r[9]*s+r[13])*a,this.z=(r[2]*e+r[6]*n+r[10]*s+r[14])*a,this}applyQuaternion(t){const e=this.x,n=this.y,s=this.z,r=t.x,a=t.y,o=t.z,l=t.w,c=2*(a*s-o*n),h=2*(o*e-r*s),f=2*(r*n-a*e);return this.x=e+l*c+a*f-o*h,this.y=n+l*h+o*c-r*f,this.z=s+l*f+r*h-a*c,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,n=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*n+r[8]*s,this.y=r[1]*e+r[5]*n+r[9]*s,this.z=r[2]*e+r[6]*n+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=Yt(this.x,t.x,e.x),this.y=Yt(this.y,t.y,e.y),this.z=Yt(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=Yt(this.x,t,e),this.y=Yt(this.y,t,e),this.z=Yt(this.z,t,e),this}clampLength(t,e){const n=this.length();return this.divideScalar(n||1).multiplyScalar(Yt(n,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,n){return this.x=t.x+(e.x-t.x)*n,this.y=t.y+(e.y-t.y)*n,this.z=t.z+(e.z-t.z)*n,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const n=t.x,s=t.y,r=t.z,a=e.x,o=e.y,l=e.z;return this.x=s*l-r*o,this.y=r*a-n*l,this.z=n*o-s*a,this}projectOnVector(t){const e=t.lengthSq();if(e===0)return this.set(0,0,0);const n=t.dot(this)/e;return this.copy(t).multiplyScalar(n)}projectOnPlane(t){return Er.copy(this).projectOnVector(t),this.sub(Er)}reflect(t){return this.sub(Er.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(e===0)return Math.PI/2;const n=this.dot(t)/e;return Math.acos(Yt(n,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,n=this.y-t.y,s=this.z-t.z;return e*e+n*n+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,n){const s=Math.sin(e)*t;return this.x=s*Math.sin(n),this.y=Math.cos(e)*t,this.z=s*Math.cos(n),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,n){return this.x=t*Math.sin(e),this.y=n,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),n=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=n,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,e*4)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,e*3)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=Math.random()*2-1,n=Math.sqrt(1-e*e);return this.x=n*Math.cos(t),this.y=e,this.z=n*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Er=new P,So=new ii;class ri{constructor(t=new P(1/0,1/0,1/0),e=new P(-1/0,-1/0,-1/0)){this.isBox3=!0,this.min=t,this.max=e}set(t,e){return this.min.copy(t),this.max.copy(e),this}setFromArray(t){this.makeEmpty();for(let e=0,n=t.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,nn),nn.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,n;return t.normal.x>0?(e=t.normal.x*this.min.x,n=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,n=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,n+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,n+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,n+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,n+=t.normal.z*this.min.z),e<=-t.constant&&n>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(ji),vs.subVectors(this.max,ji),hi.subVectors(t.a,ji),ui.subVectors(t.b,ji),di.subVectors(t.c,ji),Rn.subVectors(ui,hi),Cn.subVectors(di,ui),Gn.subVectors(hi,di);let e=[0,-Rn.z,Rn.y,0,-Cn.z,Cn.y,0,-Gn.z,Gn.y,Rn.z,0,-Rn.x,Cn.z,0,-Cn.x,Gn.z,0,-Gn.x,-Rn.y,Rn.x,0,-Cn.y,Cn.x,0,-Gn.y,Gn.x,0];return!br(e,hi,ui,di,vs)||(e=[1,0,0,0,1,0,0,0,1],!br(e,hi,ui,di,vs))?!1:(xs.crossVectors(Rn,Cn),e=[xs.x,xs.y,xs.z],br(e,hi,ui,di,vs))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,nn).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=this.getSize(nn).length()*.5),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()?this:(gn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),gn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),gn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),gn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),gn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),gn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),gn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),gn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(gn),this)}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const gn=[new P,new P,new P,new P,new P,new P,new P,new P],nn=new P,_s=new ri,hi=new P,ui=new P,di=new P,Rn=new P,Cn=new P,Gn=new P,ji=new P,vs=new P,xs=new P,Wn=new P;function br(i,t,e,n,s){for(let r=0,a=i.length-3;r<=a;r+=3){Wn.fromArray(i,r);const o=s.x*Math.abs(Wn.x)+s.y*Math.abs(Wn.y)+s.z*Math.abs(Wn.z),l=t.dot(Wn),c=e.dot(Wn),h=n.dot(Wn);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>o)return!1}return!0}const Nh=new ri,Zi=new P,Tr=new P;class ai{constructor(t=new P,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const n=this.center;e!==void 0?n.copy(e):Nh.setFromPoints(t).getCenter(n);let s=0;for(let r=0,a=t.length;rthis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;Zi.subVectors(t,this.center);const e=Zi.lengthSq();if(e>this.radius*this.radius){const n=Math.sqrt(e),s=(n-this.radius)*.5;this.center.addScaledVector(Zi,s/n),this.radius+=s}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(this.center.equals(t.center)===!0?this.radius=Math.max(this.radius,t.radius):(Tr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(Zi.copy(t.center).add(Tr)),this.expandByPoint(Zi.copy(t.center).sub(Tr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return new this.constructor().copy(this)}}const _n=new P,wr=new P,Ms=new P,Pn=new P,Ar=new P,Ss=new P,Rr=new P;class hs{constructor(t=new P,e=new P(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,_n)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const n=e.dot(this.direction);return n<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=_n.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(_n.copy(this.origin).addScaledVector(this.direction,e),_n.distanceToSquared(t))}distanceSqToSegment(t,e,n,s){wr.copy(t).add(e).multiplyScalar(.5),Ms.copy(e).sub(t).normalize(),Pn.copy(this.origin).sub(wr);const r=t.distanceTo(e)*.5,a=-this.direction.dot(Ms),o=Pn.dot(this.direction),l=-Pn.dot(Ms),c=Pn.lengthSq(),h=Math.abs(1-a*a);let f,p,u,g;if(h>0)if(f=a*l-o,p=a*o-l,g=r*h,f>=0)if(p>=-g)if(p<=g){const _=1/h;f*=_,p*=_,u=f*(f+a*p+2*o)+p*(a*f+p+2*l)+c}else p=r,f=Math.max(0,-(a*p+o)),u=-f*f+p*(p+2*l)+c;else p=-r,f=Math.max(0,-(a*p+o)),u=-f*f+p*(p+2*l)+c;else p<=-g?(f=Math.max(0,-(-a*r+o)),p=f>0?-r:Math.min(Math.max(-r,-l),r),u=-f*f+p*(p+2*l)+c):p<=g?(f=0,p=Math.min(Math.max(-r,-l),r),u=p*(p+2*l)+c):(f=Math.max(0,-(a*r+o)),p=f>0?r:Math.min(Math.max(-r,-l),r),u=-f*f+p*(p+2*l)+c);else p=a>0?-r:r,f=Math.max(0,-(a*p+o)),u=-f*f+p*(p+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,f),s&&s.copy(wr).addScaledVector(Ms,p),u}intersectSphere(t,e){_n.subVectors(t.center,this.origin);const n=_n.dot(this.direction),s=_n.dot(_n)-n*n,r=t.radius*t.radius;if(s>r)return null;const a=Math.sqrt(r-s),o=n-a,l=n+a;return l<0?null:o<0?this.at(l,e):this.at(o,e)}intersectsSphere(t){return this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(e===0)return t.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(t.normal)+t.constant)/e;return n>=0?n:null}intersectPlane(t,e){const n=this.distanceToPlane(t);return n===null?null:this.at(n,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);return e===0||t.normal.dot(this.direction)*e<0}intersectBox(t,e){let n,s,r,a,o,l;const c=1/this.direction.x,h=1/this.direction.y,f=1/this.direction.z,p=this.origin;return c>=0?(n=(t.min.x-p.x)*c,s=(t.max.x-p.x)*c):(n=(t.max.x-p.x)*c,s=(t.min.x-p.x)*c),h>=0?(r=(t.min.y-p.y)*h,a=(t.max.y-p.y)*h):(r=(t.max.y-p.y)*h,a=(t.min.y-p.y)*h),n>a||r>s||((r>n||isNaN(n))&&(n=r),(a=0?(o=(t.min.z-p.z)*f,l=(t.max.z-p.z)*f):(o=(t.max.z-p.z)*f,l=(t.min.z-p.z)*f),n>l||o>s)||((o>n||n!==n)&&(n=o),(l=0?n:s,e)}intersectsBox(t){return this.intersectBox(t,_n)!==null}intersectTriangle(t,e,n,s,r){Ar.subVectors(e,t),Ss.subVectors(n,t),Rr.crossVectors(Ar,Ss);let a=this.direction.dot(Rr),o;if(a>0){if(s)return null;o=1}else if(a<0)o=-1,a=-a;else return null;Pn.subVectors(this.origin,t);const l=o*this.direction.dot(Ss.crossVectors(Pn,Ss));if(l<0)return null;const c=o*this.direction.dot(Ar.cross(Pn));if(c<0||l+c>a)return null;const h=-o*Pn.dot(Rr);return h<0?null:this.at(h/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ee{constructor(t,e,n,s,r,a,o,l,c,h,f,p,u,g,_,m){ee.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],t!==void 0&&this.set(t,e,n,s,r,a,o,l,c,h,f,p,u,g,_,m)}set(t,e,n,s,r,a,o,l,c,h,f,p,u,g,_,m){const d=this.elements;return d[0]=t,d[4]=e,d[8]=n,d[12]=s,d[1]=r,d[5]=a,d[9]=o,d[13]=l,d[2]=c,d[6]=h,d[10]=f,d[14]=p,d[3]=u,d[7]=g,d[11]=_,d[15]=m,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ee().fromArray(this.elements)}copy(t){const e=this.elements,n=t.elements;return e[0]=n[0],e[1]=n[1],e[2]=n[2],e[3]=n[3],e[4]=n[4],e[5]=n[5],e[6]=n[6],e[7]=n[7],e[8]=n[8],e[9]=n[9],e[10]=n[10],e[11]=n[11],e[12]=n[12],e[13]=n[13],e[14]=n[14],e[15]=n[15],this}copyPosition(t){const e=this.elements,n=t.elements;return e[12]=n[12],e[13]=n[13],e[14]=n[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,n){return t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(t,e,n){return this.set(t.x,e.x,n.x,0,t.y,e.y,n.y,0,t.z,e.z,n.z,0,0,0,0,1),this}extractRotation(t){const e=this.elements,n=t.elements,s=1/fi.setFromMatrixColumn(t,0).length(),r=1/fi.setFromMatrixColumn(t,1).length(),a=1/fi.setFromMatrixColumn(t,2).length();return e[0]=n[0]*s,e[1]=n[1]*s,e[2]=n[2]*s,e[3]=0,e[4]=n[4]*r,e[5]=n[5]*r,e[6]=n[6]*r,e[7]=0,e[8]=n[8]*a,e[9]=n[9]*a,e[10]=n[10]*a,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,n=t.x,s=t.y,r=t.z,a=Math.cos(n),o=Math.sin(n),l=Math.cos(s),c=Math.sin(s),h=Math.cos(r),f=Math.sin(r);if(t.order==="XYZ"){const p=a*h,u=a*f,g=o*h,_=o*f;e[0]=l*h,e[4]=-l*f,e[8]=c,e[1]=u+g*c,e[5]=p-_*c,e[9]=-o*l,e[2]=_-p*c,e[6]=g+u*c,e[10]=a*l}else if(t.order==="YXZ"){const p=l*h,u=l*f,g=c*h,_=c*f;e[0]=p+_*o,e[4]=g*o-u,e[8]=a*c,e[1]=a*f,e[5]=a*h,e[9]=-o,e[2]=u*o-g,e[6]=_+p*o,e[10]=a*l}else if(t.order==="ZXY"){const p=l*h,u=l*f,g=c*h,_=c*f;e[0]=p-_*o,e[4]=-a*f,e[8]=g+u*o,e[1]=u+g*o,e[5]=a*h,e[9]=_-p*o,e[2]=-a*c,e[6]=o,e[10]=a*l}else if(t.order==="ZYX"){const p=a*h,u=a*f,g=o*h,_=o*f;e[0]=l*h,e[4]=g*c-u,e[8]=p*c+_,e[1]=l*f,e[5]=_*c+p,e[9]=u*c-g,e[2]=-c,e[6]=o*l,e[10]=a*l}else if(t.order==="YZX"){const p=a*l,u=a*c,g=o*l,_=o*c;e[0]=l*h,e[4]=_-p*f,e[8]=g*f+u,e[1]=f,e[5]=a*h,e[9]=-o*h,e[2]=-c*h,e[6]=u*f+g,e[10]=p-_*f}else if(t.order==="XZY"){const p=a*l,u=a*c,g=o*l,_=o*c;e[0]=l*h,e[4]=-f,e[8]=c*h,e[1]=p*f+_,e[5]=a*h,e[9]=u*f-g,e[2]=g*f-u,e[6]=o*h,e[10]=_*f+p}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Fh,t,Oh)}lookAt(t,e,n){const s=this.elements;return We.subVectors(t,e),We.lengthSq()===0&&(We.z=1),We.normalize(),Dn.crossVectors(n,We),Dn.lengthSq()===0&&(Math.abs(n.z)===1?We.x+=1e-4:We.z+=1e-4,We.normalize(),Dn.crossVectors(n,We)),Dn.normalize(),ys.crossVectors(We,Dn),s[0]=Dn.x,s[4]=ys.x,s[8]=We.x,s[1]=Dn.y,s[5]=ys.y,s[9]=We.y,s[2]=Dn.z,s[6]=ys.z,s[10]=We.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const n=t.elements,s=e.elements,r=this.elements,a=n[0],o=n[4],l=n[8],c=n[12],h=n[1],f=n[5],p=n[9],u=n[13],g=n[2],_=n[6],m=n[10],d=n[14],T=n[3],E=n[7],y=n[11],L=n[15],R=s[0],A=s[4],U=s[8],S=s[12],M=s[1],D=s[5],W=s[9],z=s[13],V=s[2],$=s[6],G=s[10],J=s[14],H=s[3],it=s[7],dt=s[11],yt=s[15];return r[0]=a*R+o*M+l*V+c*H,r[4]=a*A+o*D+l*$+c*it,r[8]=a*U+o*W+l*G+c*dt,r[12]=a*S+o*z+l*J+c*yt,r[1]=h*R+f*M+p*V+u*H,r[5]=h*A+f*D+p*$+u*it,r[9]=h*U+f*W+p*G+u*dt,r[13]=h*S+f*z+p*J+u*yt,r[2]=g*R+_*M+m*V+d*H,r[6]=g*A+_*D+m*$+d*it,r[10]=g*U+_*W+m*G+d*dt,r[14]=g*S+_*z+m*J+d*yt,r[3]=T*R+E*M+y*V+L*H,r[7]=T*A+E*D+y*$+L*it,r[11]=T*U+E*W+y*G+L*dt,r[15]=T*S+E*z+y*J+L*yt,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],n=t[4],s=t[8],r=t[12],a=t[1],o=t[5],l=t[9],c=t[13],h=t[2],f=t[6],p=t[10],u=t[14],g=t[3],_=t[7],m=t[11],d=t[15];return g*(+r*l*f-s*c*f-r*o*p+n*c*p+s*o*u-n*l*u)+_*(+e*l*u-e*c*p+r*a*p-s*a*u+s*c*h-r*l*h)+m*(+e*c*f-e*o*u-r*a*f+n*a*u+r*o*h-n*c*h)+d*(-s*o*h-e*l*f+e*o*p+s*a*f-n*a*p+n*l*h)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,n){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=n),this}invert(){const t=this.elements,e=t[0],n=t[1],s=t[2],r=t[3],a=t[4],o=t[5],l=t[6],c=t[7],h=t[8],f=t[9],p=t[10],u=t[11],g=t[12],_=t[13],m=t[14],d=t[15],T=f*m*c-_*p*c+_*l*u-o*m*u-f*l*d+o*p*d,E=g*p*c-h*m*c-g*l*u+a*m*u+h*l*d-a*p*d,y=h*_*c-g*f*c+g*o*u-a*_*u-h*o*d+a*f*d,L=g*f*l-h*_*l-g*o*p+a*_*p+h*o*m-a*f*m,R=e*T+n*E+s*y+r*L;if(R===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/R;return t[0]=T*A,t[1]=(_*p*r-f*m*r-_*s*u+n*m*u+f*s*d-n*p*d)*A,t[2]=(o*m*r-_*l*r+_*s*c-n*m*c-o*s*d+n*l*d)*A,t[3]=(f*l*r-o*p*r-f*s*c+n*p*c+o*s*u-n*l*u)*A,t[4]=E*A,t[5]=(h*m*r-g*p*r+g*s*u-e*m*u-h*s*d+e*p*d)*A,t[6]=(g*l*r-a*m*r-g*s*c+e*m*c+a*s*d-e*l*d)*A,t[7]=(a*p*r-h*l*r+h*s*c-e*p*c-a*s*u+e*l*u)*A,t[8]=y*A,t[9]=(g*f*r-h*_*r-g*n*u+e*_*u+h*n*d-e*f*d)*A,t[10]=(a*_*r-g*o*r+g*n*c-e*_*c-a*n*d+e*o*d)*A,t[11]=(h*o*r-a*f*r-h*n*c+e*f*c+a*n*u-e*o*u)*A,t[12]=L*A,t[13]=(h*_*s-g*f*s+g*n*p-e*_*p-h*n*m+e*f*m)*A,t[14]=(g*o*s-a*_*s-g*n*l+e*_*l+a*n*m-e*o*m)*A,t[15]=(a*f*s-h*o*s+h*n*l-e*f*l-a*n*p+e*o*p)*A,this}scale(t){const e=this.elements,n=t.x,s=t.y,r=t.z;return e[0]*=n,e[4]*=s,e[8]*=r,e[1]*=n,e[5]*=s,e[9]*=r,e[2]*=n,e[6]*=s,e[10]*=r,e[3]*=n,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],n=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,n,s))}makeTranslation(t,e,n){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,n,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),n=Math.sin(t);return this.set(1,0,0,0,0,e,-n,0,0,n,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,0,n,0,0,1,0,0,-n,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),n=Math.sin(t);return this.set(e,-n,0,0,n,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const n=Math.cos(e),s=Math.sin(e),r=1-n,a=t.x,o=t.y,l=t.z,c=r*a,h=r*o;return this.set(c*a+n,c*o-s*l,c*l+s*o,0,c*o+s*l,h*o+n,h*l-s*a,0,c*l-s*o,h*l+s*a,r*l*l+n,0,0,0,0,1),this}makeScale(t,e,n){return this.set(t,0,0,0,0,e,0,0,0,0,n,0,0,0,0,1),this}makeShear(t,e,n,s,r,a){return this.set(1,n,r,0,t,1,a,0,e,s,1,0,0,0,0,1),this}compose(t,e,n){const s=this.elements,r=e._x,a=e._y,o=e._z,l=e._w,c=r+r,h=a+a,f=o+o,p=r*c,u=r*h,g=r*f,_=a*h,m=a*f,d=o*f,T=l*c,E=l*h,y=l*f,L=n.x,R=n.y,A=n.z;return s[0]=(1-(_+d))*L,s[1]=(u+y)*L,s[2]=(g-E)*L,s[3]=0,s[4]=(u-y)*R,s[5]=(1-(p+d))*R,s[6]=(m+T)*R,s[7]=0,s[8]=(g+E)*A,s[9]=(m-T)*A,s[10]=(1-(p+_))*A,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,n){const s=this.elements;let r=fi.set(s[0],s[1],s[2]).length();const a=fi.set(s[4],s[5],s[6]).length(),o=fi.set(s[8],s[9],s[10]).length();this.determinant()<0&&(r=-r),t.x=s[12],t.y=s[13],t.z=s[14],sn.copy(this);const c=1/r,h=1/a,f=1/o;return sn.elements[0]*=c,sn.elements[1]*=c,sn.elements[2]*=c,sn.elements[4]*=h,sn.elements[5]*=h,sn.elements[6]*=h,sn.elements[8]*=f,sn.elements[9]*=f,sn.elements[10]*=f,e.setFromRotationMatrix(sn),n.x=r,n.y=a,n.z=o,this}makePerspective(t,e,n,s,r,a,o=En){const l=this.elements,c=2*r/(e-t),h=2*r/(n-s),f=(e+t)/(e-t),p=(n+s)/(n-s);let u,g;if(o===En)u=-(a+r)/(a-r),g=-2*a*r/(a-r);else if(o===sr)u=-a/(a-r),g=-a*r/(a-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+o);return l[0]=c,l[4]=0,l[8]=f,l[12]=0,l[1]=0,l[5]=h,l[9]=p,l[13]=0,l[2]=0,l[6]=0,l[10]=u,l[14]=g,l[3]=0,l[7]=0,l[11]=-1,l[15]=0,this}makeOrthographic(t,e,n,s,r,a,o=En){const l=this.elements,c=1/(e-t),h=1/(n-s),f=1/(a-r),p=(e+t)*c,u=(n+s)*h;let g,_;if(o===En)g=(a+r)*f,_=-2*f;else if(o===sr)g=r*f,_=-1*f;else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+o);return l[0]=2*c,l[4]=0,l[8]=0,l[12]=-p,l[1]=0,l[5]=2*h,l[9]=0,l[13]=-u,l[2]=0,l[6]=0,l[10]=_,l[14]=-g,l[3]=0,l[7]=0,l[11]=0,l[15]=1,this}equals(t){const e=this.elements,n=t.elements;for(let s=0;s<16;s++)if(e[s]!==n[s])return!1;return!0}fromArray(t,e=0){for(let n=0;n<16;n++)this.elements[n]=t[n+e];return this}toArray(t=[],e=0){const n=this.elements;return t[e]=n[0],t[e+1]=n[1],t[e+2]=n[2],t[e+3]=n[3],t[e+4]=n[4],t[e+5]=n[5],t[e+6]=n[6],t[e+7]=n[7],t[e+8]=n[8],t[e+9]=n[9],t[e+10]=n[10],t[e+11]=n[11],t[e+12]=n[12],t[e+13]=n[13],t[e+14]=n[14],t[e+15]=n[15],t}}const fi=new P,sn=new ee,Fh=new P(0,0,0),Oh=new P(1,1,1),Dn=new P,ys=new P,We=new P,yo=new ee,Eo=new ii;class pn{constructor(t=0,e=0,n=0,s=pn.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=n,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,n,s=this._order){return this._x=t,this._y=e,this._z=n,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,n=!0){const s=t.elements,r=s[0],a=s[4],o=s[8],l=s[1],c=s[5],h=s[9],f=s[2],p=s[6],u=s[10];switch(e){case"XYZ":this._y=Math.asin(Yt(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-h,u),this._z=Math.atan2(-a,r)):(this._x=Math.atan2(p,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Yt(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(o,u),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-f,r),this._z=0);break;case"ZXY":this._x=Math.asin(Yt(p,-1,1)),Math.abs(p)<.9999999?(this._y=Math.atan2(-f,u),this._z=Math.atan2(-a,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-Yt(f,-1,1)),Math.abs(f)<.9999999?(this._x=Math.atan2(p,u),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-a,c));break;case"YZX":this._z=Math.asin(Yt(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-f,r)):(this._x=0,this._y=Math.atan2(o,u));break;case"XZY":this._z=Math.asin(-Yt(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(p,c),this._y=Math.atan2(o,r)):(this._x=Math.atan2(-h,u),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,n===!0&&this._onChangeCallback(),this}setFromQuaternion(t,e,n){return yo.makeRotationFromQuaternion(t),this.setFromRotationMatrix(yo,e,n)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return Eo.setFromEuler(this),this.setFromQuaternion(Eo,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],t[3]!==void 0&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}pn.DEFAULT_ORDER="XYZ";class to{constructor(){this.mask=1}set(t){this.mask=(1<>>0}enable(t){this.mask|=1<1){for(let e=0;e1){for(let n=0;n0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.visibility=this._visibility,s.active=this._active,s.bounds=this._bounds.map(o=>({boxInitialized:o.boxInitialized,boxMin:o.box.min.toArray(),boxMax:o.box.max.toArray(),sphereInitialized:o.sphereInitialized,sphereRadius:o.sphere.radius,sphereCenter:o.sphere.center.toArray()})),s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.geometryCount=this._geometryCount,s.matricesTexture=this._matricesTexture.toJSON(t),this._colorsTexture!==null&&(s.colorsTexture=this._colorsTexture.toJSON(t)),this.boundingSphere!==null&&(s.boundingSphere={center:s.boundingSphere.center.toArray(),radius:s.boundingSphere.radius}),this.boundingBox!==null&&(s.boundingBox={min:s.boundingBox.min.toArray(),max:s.boundingBox.max.toArray()}));function r(o,l){return o[l.uuid]===void 0&&(o[l.uuid]=l.toJSON(t)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const o=this.geometry.parameters;if(o!==void 0&&o.shapes!==void 0){const l=o.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){s.children=[];for(let o=0;o0){s.animations=[];for(let o=0;o0&&(n.geometries=o),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),f.length>0&&(n.shapes=f),p.length>0&&(n.skeletons=p),u.length>0&&(n.animations=u),g.length>0&&(n.nodes=g)}return n.object=s,n;function a(o){const l=[];for(const c in o){const h=o[c];delete h.metadata,l.push(h)}return l}}clone(t){return new this.constructor().copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),e===!0)for(let n=0;n0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,n,s,r){rn.subVectors(s,e),xn.subVectors(n,e),Pr.subVectors(t,e);const a=rn.dot(rn),o=rn.dot(xn),l=rn.dot(Pr),c=xn.dot(xn),h=xn.dot(Pr),f=a*c-o*o;if(f===0)return r.set(0,0,0),null;const p=1/f,u=(c*l-o*h)*p,g=(a*h-o*l)*p;return r.set(1-u-g,g,u)}static containsPoint(t,e,n,s){return this.getBarycoord(t,e,n,s,Mn)===null?!1:Mn.x>=0&&Mn.y>=0&&Mn.x+Mn.y<=1}static getInterpolation(t,e,n,s,r,a,o,l){return this.getBarycoord(t,e,n,s,Mn)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mn.x),l.addScaledVector(a,Mn.y),l.addScaledVector(o,Mn.z),l)}static getInterpolatedAttribute(t,e,n,s,r,a){return Ir.setScalar(0),Nr.setScalar(0),Fr.setScalar(0),Ir.fromBufferAttribute(t,e),Nr.fromBufferAttribute(t,n),Fr.fromBufferAttribute(t,s),a.setScalar(0),a.addScaledVector(Ir,r.x),a.addScaledVector(Nr,r.y),a.addScaledVector(Fr,r.z),a}static isFrontFacing(t,e,n,s){return rn.subVectors(n,e),xn.subVectors(t,e),rn.cross(xn).dot(s)<0}set(t,e,n){return this.a.copy(t),this.b.copy(e),this.c.copy(n),this}setFromPointsAndIndices(t,e,n,s){return this.a.copy(t[e]),this.b.copy(t[n]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,n,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,n),this.c.fromBufferAttribute(t,s),this}clone(){return new this.constructor().copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return rn.subVectors(this.c,this.b),xn.subVectors(this.a,this.b),rn.cross(xn).length()*.5}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return tn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return tn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,n,s,r){return tn.getInterpolation(t,this.a,this.b,this.c,e,n,s,r)}containsPoint(t){return tn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return tn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const n=this.a,s=this.b,r=this.c;let a,o;gi.subVectors(s,n),_i.subVectors(r,n),Dr.subVectors(t,n);const l=gi.dot(Dr),c=_i.dot(Dr);if(l<=0&&c<=0)return e.copy(n);Lr.subVectors(t,s);const h=gi.dot(Lr),f=_i.dot(Lr);if(h>=0&&f<=h)return e.copy(s);const p=l*f-h*c;if(p<=0&&l>=0&&h<=0)return a=l/(l-h),e.copy(n).addScaledVector(gi,a);Ur.subVectors(t,r);const u=gi.dot(Ur),g=_i.dot(Ur);if(g>=0&&u<=g)return e.copy(r);const _=u*c-l*g;if(_<=0&&c>=0&&g<=0)return o=c/(c-g),e.copy(n).addScaledVector(_i,o);const m=h*g-u*f;if(m<=0&&f-h>=0&&u-g>=0)return Co.subVectors(r,s),o=(f-h)/(f-h+(u-g)),e.copy(s).addScaledVector(Co,o);const d=1/(m+_+p);return a=_*d,o=p*d,e.copy(n).addScaledVector(gi,a).addScaledVector(_i,o)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const ec={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Ln={h:0,s:0,l:0},bs={h:0,s:0,l:0};function Or(i,t,e){return e<0&&(e+=1),e>1&&(e-=1),e<1/6?i+(t-i)*6*e:e<1/2?t:e<2/3?i+(t-i)*6*(2/3-e):i}class at{constructor(t,e,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,n)}set(t,e,n){if(e===void 0&&n===void 0){const s=t;s&&s.isColor?this.copy(s):typeof s=="number"?this.setHex(s):typeof s=="string"&&this.setStyle(s)}else this.setRGB(t,e,n);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=Qe){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(t&255)/255,$t.toWorkingColorSpace(this,e),this}setRGB(t,e,n,s=$t.workingColorSpace){return this.r=t,this.g=e,this.b=n,$t.toWorkingColorSpace(this,s),this}setHSL(t,e,n,s=$t.workingColorSpace){if(t=Eh(t,1),e=Yt(e,0,1),n=Yt(n,0,1),e===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+e):n+e-n*e,a=2*n-r;this.r=Or(a,r,t+1/3),this.g=Or(a,r,t),this.b=Or(a,r,t-1/3)}return $t.toWorkingColorSpace(this,s),this}setStyle(t,e=Qe){function n(r){r!==void 0&&parseFloat(r)<1&&console.warn("THREE.Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const a=s[1],o=s[2];switch(a){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(o))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:console.warn("THREE.Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const r=s[1],a=r.length;if(a===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,e);if(a===6)return this.setHex(parseInt(r,16),e);console.warn("THREE.Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=Qe){const n=ec[t.toLowerCase()];return n!==void 0?this.setHex(n,e):console.warn("THREE.Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=wn(t.r),this.g=wn(t.g),this.b=wn(t.b),this}copyLinearToSRGB(t){return this.r=Ni(t.r),this.g=Ni(t.g),this.b=Ni(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=Qe){return $t.fromWorkingColorSpace(Ce.copy(this),t),Math.round(Yt(Ce.r*255,0,255))*65536+Math.round(Yt(Ce.g*255,0,255))*256+Math.round(Yt(Ce.b*255,0,255))}getHexString(t=Qe){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=$t.workingColorSpace){$t.fromWorkingColorSpace(Ce.copy(this),e);const n=Ce.r,s=Ce.g,r=Ce.b,a=Math.max(n,s,r),o=Math.min(n,s,r);let l,c;const h=(o+a)/2;if(o===a)l=0,c=0;else{const f=a-o;switch(c=h<=.5?f/(a+o):f/(2-a-o),a){case n:l=(s-r)/f+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(t!==void 0)for(const e in t){const n=t[e];if(n===void 0){console.warn(`THREE.Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];if(s===void 0){console.warn(`THREE.Material: '${e}' is not a property of THREE.${this.type}.`);continue}s&&s.isColor?s.set(n):s&&s.isVector3&&n&&n.isVector3?s.copy(n):this[e]=n}}toJSON(t){const e=t===void 0||typeof t=="string";e&&(t={textures:{},images:{}});const n={metadata:{version:4.6,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(t).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(t).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(t).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(t).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(t).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(t).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(t).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(t).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(t).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==Ui&&(n.blending=this.blending),this.side!==zn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==ea&&(n.blendSrc=this.blendSrc),this.blendDst!==na&&(n.blendDst=this.blendDst),this.blendEquation!==Kn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Oi&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==go&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==li&&(n.stencilFail=this.stencilFail),this.stencilZFail!==li&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==li&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function s(r){const a=[];for(const o in r){const l=r[o];delete l.metadata,a.push(l)}return a}if(e){const r=s(t.textures),a=s(t.images);r.length>0&&(n.textures=r),a.length>0&&(n.images=a)}return n}clone(){return new this.constructor().copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let n=null;if(e!==null){const s=e.length;n=new Array(s);for(let r=0;r!==s;++r)n[r]=e[r].clone()}return this.clippingPlanes=n,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){t===!0&&this.version++}onBuild(){console.warn("Material: onBuild() has been removed.")}}class cs extends kn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new at(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new pn,this.combine=Bl,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const ge=new P,Ts=new vt;class he{constructor(t,e,n=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,this.name="",this.array=t,this.itemSize=e,this.count=t!==void 0?t.length/e:0,this.normalized=n,this.usage=ka,this.updateRanges=[],this.gpuType=fn,this.version=0}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,n){t*=this.itemSize,n*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&console.warn("THREE.BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new ri);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute){console.error("THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(t!==void 0){if(this.boundingBox.setFromBufferAttribute(t),e)for(let n=0,s=e.length;n0&&(t.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(t[c]=l[c]);return t}t.data={attributes:{}};const e=this.index;e!==null&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const n=this.attributes;for(const l in n){const c=n[l];t.data.attributes[l]=c.toJSON(t.data)}const s={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let f=0,p=c.length;f0&&(s[l]=h,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const a=this.groups;a.length>0&&(t.data.groups=JSON.parse(JSON.stringify(a)));const o=this.boundingSphere;return o!==null&&(t.data.boundingSphere={center:o.center.toArray(),radius:o.radius}),t}clone(){return new this.constructor().copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const n=t.index;n!==null&&this.setIndex(n.clone(e));const s=t.attributes;for(const c in s){const h=s[c];this.setAttribute(c,h.clone(e))}const r=t.morphAttributes;for(const c in r){const h=[],f=r[c];for(let p=0,u=f.length;p0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;r(t.far-t.near)**2))&&(Po.copy(r).invert(),Xn.copy(t.ray).applyMatrix4(Po),!(n.boundingBox!==null&&Xn.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(t,e,Xn)))}_computeIntersections(t,e,n){let s;const r=this.geometry,a=this.material,o=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,f=r.attributes.normal,p=r.groups,u=r.drawRange;if(o!==null)if(Array.isArray(a))for(let g=0,_=p.length;g<_;g++){const m=p[g],d=a[m.materialIndex],T=Math.max(m.start,u.start),E=Math.min(o.count,Math.min(m.start+m.count,u.start+u.count));for(let y=T,L=E;ye.far?null:{distance:c,point:Ds.clone(),object:i}}function Ls(i,t,e,n,s,r,a,o,l,c){i.getVertexPosition(o,As),i.getVertexPosition(l,Rs),i.getVertexPosition(c,Cs);const h=Wh(i,t,e,n,As,Rs,Cs,Lo);if(h){const f=new P;tn.getBarycoord(Lo,As,Rs,Cs,f),s&&(h.uv=tn.getInterpolatedAttribute(s,o,l,c,f,new vt)),r&&(h.uv1=tn.getInterpolatedAttribute(r,o,l,c,f,new vt)),a&&(h.normal=tn.getInterpolatedAttribute(a,o,l,c,f,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const p={a:o,b:l,c,normal:new P,materialIndex:0};tn.getNormal(As,Rs,Cs,p.normal),h.face=p,h.barycoord=f}return h}class us extends pe{constructor(t=1,e=1,n=1,s=1,r=1,a=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:n,widthSegments:s,heightSegments:r,depthSegments:a};const o=this;s=Math.floor(s),r=Math.floor(r),a=Math.floor(a);const l=[],c=[],h=[],f=[];let p=0,u=0;g("z","y","x",-1,-1,n,e,t,a,r,0),g("z","y","x",1,-1,n,e,-t,a,r,1),g("x","z","y",1,1,t,n,e,s,a,2),g("x","z","y",1,-1,t,n,-e,s,a,3),g("x","y","z",1,-1,t,e,n,s,r,4),g("x","y","z",-1,-1,t,e,-n,s,r,5),this.setIndex(l),this.setAttribute("position",new Pe(c,3)),this.setAttribute("normal",new Pe(h,3)),this.setAttribute("uv",new Pe(f,2));function g(_,m,d,T,E,y,L,R,A,U,S){const M=y/A,D=L/U,W=y/2,z=L/2,V=R/2,$=A+1,G=U+1;let J=0,H=0;const it=new P;for(let dt=0;dt0?1:-1,h.push(it.x,it.y,it.z),f.push(Lt/A),f.push(1-dt/U),J+=1}}for(let dt=0;dt0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class rc extends Ae{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ee,this.projectionMatrix=new ee,this.projectionMatrixInverse=new ee,this.coordinateSystem=En}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Un=new P,Uo=new vt,Io=new vt;class Ye extends rc{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=ka*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(Js*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return ka*2*Math.atan(Math.tan(Js*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,n){Un.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Un.x,Un.y).multiplyScalar(-t/Un.z),Un.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Un.x,Un.y).multiplyScalar(-t/Un.z)}getViewSize(t,e){return this.getViewBounds(t,Uo,Io),e.subVectors(Io,Uo)}setViewOffset(t,e,n,s,r,a){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(Js*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*s/l,e-=a.offsetY*n/c,s*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const xi=-90,Mi=1;class jh extends Ae{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Ye(xi,Mi,t,e);s.layers=this.layers,this.add(s);const r=new Ye(xi,Mi,t,e);r.layers=this.layers,this.add(r);const a=new Ye(xi,Mi,t,e);a.layers=this.layers,this.add(a);const o=new Ye(xi,Mi,t,e);o.layers=this.layers,this.add(o);const l=new Ye(xi,Mi,t,e);l.layers=this.layers,this.add(l);const c=new Ye(xi,Mi,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[n,s,r,a,o,l]=e;for(const c of e)this.remove(c);if(t===En)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===sr)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);for(const c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,d=t.getRenderTarget(),p=t.getActiveCubeFace(),f=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;const v=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,a),t.setRenderTarget(n,2,s),t.render(e,o),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=v,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(d,p,f),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}}class ac extends Te{constructor(t,e,n,s,r,a,o,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:Bi,super(t,e,n,s,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Zh extends on{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];this.texture=new ac(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:dn}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` +}`;class Fe extends kn{constructor(t){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=Yh,this.fragmentShader=qh,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,t!==void 0&&this.setValues(t)}copy(t){return super.copy(t),this.fragmentShader=t.fragmentShader,this.vertexShader=t.vertexShader,this.uniforms=Gi(t.uniforms),this.uniformsGroups=Xh(t.uniformsGroups),this.defines=Object.assign({},t.defines),this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.fog=t.fog,this.lights=t.lights,this.clipping=t.clipping,this.extensions=Object.assign({},t.extensions),this.glslVersion=t.glslVersion,this}toJSON(t){const e=super.toJSON(t);e.glslVersion=this.glslVersion,e.uniforms={};for(const s in this.uniforms){const a=this.uniforms[s].value;a&&a.isTexture?e.uniforms[s]={type:"t",value:a.toJSON(t).uuid}:a&&a.isColor?e.uniforms[s]={type:"c",value:a.getHex()}:a&&a.isVector2?e.uniforms[s]={type:"v2",value:a.toArray()}:a&&a.isVector3?e.uniforms[s]={type:"v3",value:a.toArray()}:a&&a.isVector4?e.uniforms[s]={type:"v4",value:a.toArray()}:a&&a.isMatrix3?e.uniforms[s]={type:"m3",value:a.toArray()}:a&&a.isMatrix4?e.uniforms[s]={type:"m4",value:a.toArray()}:e.uniforms[s]={value:a}}Object.keys(this.defines).length>0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const n={};for(const s in this.extensions)this.extensions[s]===!0&&(n[s]=!0);return Object.keys(n).length>0&&(e.extensions=n),e}}class rc extends Ae{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ee,this.projectionMatrix=new ee,this.projectionMatrixInverse=new ee,this.coordinateSystem=En}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Un=new P,Uo=new vt,Io=new vt;class Ye extends rc{constructor(t=50,e=1,n=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=n,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=t.view===null?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=Ha*2*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(Js*.5*this.fov);return .5*this.getFilmHeight()/t}getEffectiveFOV(){return Ha*2*Math.atan(Math.tan(Js*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,n){Un.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(Un.x,Un.y).multiplyScalar(-t/Un.z),Un.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Un.x,Un.y).multiplyScalar(-t/Un.z)}getViewSize(t,e){return this.getViewBounds(t,Uo,Io),e.subVectors(Io,Uo)}setViewOffset(t,e,n,s,r,a){this.aspect=t/e,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=n,this.view.offsetY=s,this.view.width=r,this.view.height=a,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(Js*.5*this.fov)/this.zoom,n=2*e,s=this.aspect*n,r=-.5*s;const a=this.view;if(this.view!==null&&this.view.enabled){const l=a.fullWidth,c=a.fullHeight;r+=a.offsetX*s/l,e-=a.offsetY*n/c,s*=a.width/l,n*=a.height/c}const o=this.filmOffset;o!==0&&(r+=t*o/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-n,t,this.far,this.coordinateSystem),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,this.view!==null&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const xi=-90,Mi=1;class jh extends Ae{constructor(t,e,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new Ye(xi,Mi,t,e);s.layers=this.layers,this.add(s);const r=new Ye(xi,Mi,t,e);r.layers=this.layers,this.add(r);const a=new Ye(xi,Mi,t,e);a.layers=this.layers,this.add(a);const o=new Ye(xi,Mi,t,e);o.layers=this.layers,this.add(o);const l=new Ye(xi,Mi,t,e);l.layers=this.layers,this.add(l);const c=new Ye(xi,Mi,t,e);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[n,s,r,a,o,l]=e;for(const c of e)this.remove(c);if(t===En)n.up.set(0,1,0),n.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),a.up.set(0,0,1),a.lookAt(0,-1,0),o.up.set(0,1,0),o.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(t===sr)n.up.set(0,-1,0),n.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),a.up.set(0,0,-1),a.lookAt(0,-1,0),o.up.set(0,-1,0),o.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);for(const c of e)this.add(c),c.updateMatrixWorld()}update(t,e){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,a,o,l,c,h]=this.children,f=t.getRenderTarget(),p=t.getActiveCubeFace(),u=t.getActiveMipmapLevel(),g=t.xr.enabled;t.xr.enabled=!1;const _=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,t.setRenderTarget(n,0,s),t.render(e,r),t.setRenderTarget(n,1,s),t.render(e,a),t.setRenderTarget(n,2,s),t.render(e,o),t.setRenderTarget(n,3,s),t.render(e,l),t.setRenderTarget(n,4,s),t.render(e,c),n.texture.generateMipmaps=_,t.setRenderTarget(n,5,s),t.render(e,h),t.setRenderTarget(f,p,u),t.xr.enabled=g,n.texture.needsPMREMUpdate=!0}}class ac extends Te{constructor(t,e,n,s,r,a,o,l,c,h){t=t!==void 0?t:[],e=e!==void 0?e:Bi,super(t,e,n,s,r,a,o,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class Zh extends on{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const n={width:t,height:t,depth:1},s=[n,n,n,n,n,n];this.texture=new ac(s,e.mapping,e.wrapS,e.wrapT,e.magFilter,e.minFilter,e.format,e.type,e.anisotropy,e.colorSpace),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=e.generateMipmaps!==void 0?e.generateMipmaps:!1,this.texture.minFilter=e.minFilter!==void 0?e.minFilter:dn}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -41,11 +41,11 @@ var wc=Object.defineProperty;var Ac=(i,t,e)=>t in i?wc(i,t,{enumerable:!0,config gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},s=new us(5,5,5),r=new Fe({name:"CubemapFromEquirect",uniforms:Gi(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:ke,blending:bn});r.uniforms.tEquirect.value=e;const a=new Se(s,r),o=e.minFilter;return e.minFilter===Qn&&(e.minFilter=dn),new jh(1,10,this).update(t,a),e.minFilter=o,a.geometry.dispose(),a.material.dispose(),this}clear(t,e,n,s){const r=t.getRenderTarget();for(let a=0;a<6;a++)t.setRenderTarget(this,a),t.clear(e,n,s);t.setRenderTarget(r)}}class pr{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new pt(t),this.density=e}clone(){return new pr(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class Kh extends Ae{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new pn,this.environmentIntensity=1,this.environmentRotation=new pn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),t.background!==null&&(this.background=t.background.clone()),t.environment!==null&&(this.environment=t.environment.clone()),t.fog!==null&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),t.overrideMaterial!==null&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return this.fog!==null&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class $h{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=t!==void 0?t.length/e:0,this.usage=Ha,this.updateRanges=[],this.version=0,this.uuid=Bn()}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:l,point:Ji.clone(),uv:tn.getInterpolation(Ji,Us,ts,Is,No,Hr,Fo,new vt),face:null,object:this})}copy(t,e){return super.copy(t,e),t.center!==void 0&&this.center.copy(t.center),this.material=t.material,this}}function Fs(i,t,e,n,s,r){bi.subVectors(i,e).addScalar(.5).multiply(n),s!==void 0?(Qi.x=r*bi.x-s*bi.y,Qi.y=s*bi.x+r*bi.y):Qi.copy(bi),i.copy(t),i.x+=Qi.x,i.y+=Qi.y,i.applyMatrix4(oc)}class Jh extends Te{constructor(t=null,e=1,n=1,s,r,a,o,l,c=qe,h=qe,d,p){super(null,a,o,l,c,h,s,r,d,p),this.isDataTexture=!0,this.image={data:t,width:e,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Oo extends he{constructor(t,e,n,s=1){super(t,e,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}const Ti=new ee,Bo=new ee,Os=[],zo=new ri,Qh=new ee,es=new Se,ns=new ai;class tu extends Se{constructor(t,e,n){super(t,e),this.isInstancedMesh=!0,this.instanceMatrix=new Oo(new Float32Array(n*16),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||nu.getNormalMatrix(t),s=this.coplanarPoint(kr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Yn=new ai,Bs=new P;class eo{constructor(t=new Nn,e=new Nn,n=new Nn,s=new Nn,r=new Nn,a=new Nn){this.planes=[t,e,n,s,r,a]}set(t,e,n,s,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=En){const n=this.planes,s=t.elements,r=s[0],a=s[1],o=s[2],l=s[3],c=s[4],h=s[5],d=s[6],p=s[7],f=s[8],g=s[9],v=s[10],m=s[11],u=s[12],T=s[13],b=s[14],y=s[15];if(n[0].setComponents(l-r,p-c,m-f,y-u).normalize(),n[1].setComponents(l+r,p+c,m+f,y+u).normalize(),n[2].setComponents(l+a,p+h,m+g,y+T).normalize(),n[3].setComponents(l-a,p-h,m-g,y-T).normalize(),n[4].setComponents(l-o,p-d,m-v,y-b).normalize(),e===En)n[5].setComponents(l+o,p+d,m+v,y+b).normalize();else if(e===sr)n[5].setComponents(o,d,v,b).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Yn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Yn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Yn)}intersectsSprite(t){return Yn.center.set(0,0,0),Yn.radius=.7071067811865476,Yn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Yn)}intersectsSphere(t){const e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)0?t.max.x:t.min.x,Bs.y=s.normal.y>0?t.max.y:t.min.y,Bs.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Bs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class lr extends Hn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new pt(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const cr=new P,hr=new P,Ho=new ee,is=new hs,zs=new ai,Vr=new P,ko=new P;class Va extends Ae{constructor(t=new pe,e=new lr){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[0];for(let s=1,r=e.count;s0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rn)return;Vr.applyMatrix4(i.matrixWorld);const l=t.ray.origin.distanceTo(Vr);if(!(lt.far))return{distance:l,point:ko.clone().applyMatrix4(i.matrixWorld),index:s,face:null,faceIndex:null,barycoord:null,object:i}}class ei extends Hn{constructor(t){super(),this.isPointsMaterial=!0,this.type="PointsMaterial",this.color=new pt(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const Vo=new ee,Ga=new hs,ks=new ai,Vs=new P;class Fi extends Ae{constructor(t=new pe,e=new ei){super(),this.isPoints=!0,this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){const n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,a=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),ks.copy(n.boundingSphere),ks.applyMatrix4(s),ks.radius+=r,t.ray.intersectsSphere(ks)===!1)return;Vo.copy(s).invert(),Ga.copy(t.ray).applyMatrix4(Vo);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=o*o,c=n.index,d=n.attributes.position;if(c!==null){const p=Math.max(0,a.start),f=Math.min(c.count,a.start+a.count);for(let g=p,v=f;g0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rs.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:t,face:null,faceIndex:null,barycoord:null,object:a})}}class Pi extends Ae{constructor(){super(),this.isGroup=!0,this.type="Group"}}class lc extends Te{constructor(t,e,n,s,r,a,o,l,c){super(t,e,n,s,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class cc extends Te{constructor(t,e,n,s,r,a,o,l,c,h=Ii){if(h!==Ii&&h!==ki)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");n===void 0&&h===Ii&&(n=ni),n===void 0&&h===ki&&(n=Hi),super(null,s,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=o!==void 0?o:qe,this.minFilter=l!==void 0?l:qe,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}}class ds extends pe{constructor(t=1,e=1,n=1,s=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};const r=t/2,a=e/2,o=Math.floor(n),l=Math.floor(s),c=o+1,h=l+1,d=t/o,p=e/l,f=[],g=[],v=[],m=[];for(let u=0;u0)&&f.push(b,y,R),(u!==n-1||l0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class $h{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=t!==void 0?t.length/e:0,this.usage=ka,this.updateRanges=[],this.version=0,this.uuid=Bn()}onUploadCallback(){}set needsUpdate(t){t===!0&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,n){t*=this.stride,n*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:l,point:Ji.clone(),uv:tn.getInterpolation(Ji,Us,ts,Is,No,kr,Fo,new vt),face:null,object:this})}copy(t,e){return super.copy(t,e),t.center!==void 0&&this.center.copy(t.center),this.material=t.material,this}}function Fs(i,t,e,n,s,r){bi.subVectors(i,e).addScalar(.5).multiply(n),s!==void 0?(Qi.x=r*bi.x-s*bi.y,Qi.y=s*bi.x+r*bi.y):Qi.copy(bi),i.copy(t),i.x+=Qi.x,i.y+=Qi.y,i.applyMatrix4(oc)}class Jh extends Te{constructor(t=null,e=1,n=1,s,r,a,o,l,c=qe,h=qe,f,p){super(null,a,o,l,c,h,s,r,f,p),this.isDataTexture=!0,this.image={data:t,width:e,height:n},this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1}}class Oo extends he{constructor(t,e,n,s=1){super(t,e,n),this.isInstancedBufferAttribute=!0,this.meshPerAttribute=s}copy(t){return super.copy(t),this.meshPerAttribute=t.meshPerAttribute,this}toJSON(){const t=super.toJSON();return t.meshPerAttribute=this.meshPerAttribute,t.isInstancedBufferAttribute=!0,t}}const Ti=new ee,Bo=new ee,Os=[],zo=new ri,Qh=new ee,es=new Se,ns=new ai;class tu extends Se{constructor(t,e,n){super(t,e),this.isInstancedMesh=!0,this.instanceMatrix=new Oo(new Float32Array(n*16),16),this.instanceColor=null,this.morphTexture=null,this.count=n,this.boundingBox=null,this.boundingSphere=null;for(let s=0;s1?null:e.copy(t.start).addScaledVector(n,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),n=this.distanceToPoint(t.end);return e<0&&n>0||n<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const n=e||nu.getNormalMatrix(t),s=this.coplanarPoint(Hr).applyMatrix4(t),r=this.normal.applyMatrix3(n).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return new this.constructor().copy(this)}}const Yn=new ai,Bs=new P;class eo{constructor(t=new Nn,e=new Nn,n=new Nn,s=new Nn,r=new Nn,a=new Nn){this.planes=[t,e,n,s,r,a]}set(t,e,n,s,r,a){const o=this.planes;return o[0].copy(t),o[1].copy(e),o[2].copy(n),o[3].copy(s),o[4].copy(r),o[5].copy(a),this}copy(t){const e=this.planes;for(let n=0;n<6;n++)e[n].copy(t.planes[n]);return this}setFromProjectionMatrix(t,e=En){const n=this.planes,s=t.elements,r=s[0],a=s[1],o=s[2],l=s[3],c=s[4],h=s[5],f=s[6],p=s[7],u=s[8],g=s[9],_=s[10],m=s[11],d=s[12],T=s[13],E=s[14],y=s[15];if(n[0].setComponents(l-r,p-c,m-u,y-d).normalize(),n[1].setComponents(l+r,p+c,m+u,y+d).normalize(),n[2].setComponents(l+a,p+h,m+g,y+T).normalize(),n[3].setComponents(l-a,p-h,m-g,y-T).normalize(),n[4].setComponents(l-o,p-f,m-_,y-E).normalize(),e===En)n[5].setComponents(l+o,p+f,m+_,y+E).normalize();else if(e===sr)n[5].setComponents(o,f,_,E).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);return this}intersectsObject(t){if(t.boundingSphere!==void 0)t.boundingSphere===null&&t.computeBoundingSphere(),Yn.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;e.boundingSphere===null&&e.computeBoundingSphere(),Yn.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(Yn)}intersectsSprite(t){return Yn.center.set(0,0,0),Yn.radius=.7071067811865476,Yn.applyMatrix4(t.matrixWorld),this.intersectsSphere(Yn)}intersectsSphere(t){const e=this.planes,n=t.center,s=-t.radius;for(let r=0;r<6;r++)if(e[r].distanceToPoint(n)0?t.max.x:t.min.x,Bs.y=s.normal.y>0?t.max.y:t.min.y,Bs.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Bs)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let n=0;n<6;n++)if(e[n].distanceToPoint(t)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class lr extends kn{constructor(t){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new at(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.linewidth=t.linewidth,this.linecap=t.linecap,this.linejoin=t.linejoin,this.fog=t.fog,this}}const cr=new P,hr=new P,ko=new ee,is=new hs,zs=new ai,Vr=new P,Ho=new P;class Va extends Ae{constructor(t=new pe,e=new lr){super(),this.isLine=!0,this.type="Line",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}computeLineDistances(){const t=this.geometry;if(t.index===null){const e=t.attributes.position,n=[0];for(let s=1,r=e.count;s0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rn)return;Vr.applyMatrix4(i.matrixWorld);const l=t.ray.origin.distanceTo(Vr);if(!(lt.far))return{distance:l,point:Ho.clone().applyMatrix4(i.matrixWorld),index:s,face:null,faceIndex:null,barycoord:null,object:i}}class ei extends kn{constructor(t){super(),this.isPointsMaterial=!0,this.type="PointsMaterial",this.color=new at(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.alphaMap=t.alphaMap,this.size=t.size,this.sizeAttenuation=t.sizeAttenuation,this.fog=t.fog,this}}const Vo=new ee,Ga=new hs,Hs=new ai,Vs=new P;class Fi extends Ae{constructor(t=new pe,e=new ei){super(),this.isPoints=!0,this.type="Points",this.geometry=t,this.material=e,this.updateMorphTargets()}copy(t,e){return super.copy(t,e),this.material=Array.isArray(t.material)?t.material.slice():t.material,this.geometry=t.geometry,this}raycast(t,e){const n=this.geometry,s=this.matrixWorld,r=t.params.Points.threshold,a=n.drawRange;if(n.boundingSphere===null&&n.computeBoundingSphere(),Hs.copy(n.boundingSphere),Hs.applyMatrix4(s),Hs.radius+=r,t.ray.intersectsSphere(Hs)===!1)return;Vo.copy(s).invert(),Ga.copy(t.ray).applyMatrix4(Vo);const o=r/((this.scale.x+this.scale.y+this.scale.z)/3),l=o*o,c=n.index,f=n.attributes.position;if(c!==null){const p=Math.max(0,a.start),u=Math.min(c.count,a.start+a.count);for(let g=p,_=u;g<_;g++){const m=c.getX(g);Vs.fromBufferAttribute(f,m),Go(Vs,m,l,s,t,e,this)}}else{const p=Math.max(0,a.start),u=Math.min(f.count,a.start+a.count);for(let g=p,_=u;g<_;g++)Vs.fromBufferAttribute(f,g),Go(Vs,g,l,s,t,e,this)}}updateMorphTargets(){const e=this.geometry.morphAttributes,n=Object.keys(e);if(n.length>0){const s=e[n[0]];if(s!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,a=s.length;rs.far)return;r.push({distance:c,distanceToRay:Math.sqrt(o),point:l,index:t,face:null,faceIndex:null,barycoord:null,object:a})}}class Pi extends Ae{constructor(){super(),this.isGroup=!0,this.type="Group"}}class lc extends Te{constructor(t,e,n,s,r,a,o,l,c){super(t,e,n,s,r,a,o,l,c),this.isCanvasTexture=!0,this.needsUpdate=!0}}class cc extends Te{constructor(t,e,n,s,r,a,o,l,c,h=Ii){if(h!==Ii&&h!==Hi)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");n===void 0&&h===Ii&&(n=ni),n===void 0&&h===Hi&&(n=ki),super(null,s,r,a,o,l,h,n,c),this.isDepthTexture=!0,this.image={width:t,height:e},this.magFilter=o!==void 0?o:qe,this.minFilter=l!==void 0?l:qe,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return this.compareFunction!==null&&(e.compareFunction=this.compareFunction),e}}class ds extends pe{constructor(t=1,e=1,n=1,s=1){super(),this.type="PlaneGeometry",this.parameters={width:t,height:e,widthSegments:n,heightSegments:s};const r=t/2,a=e/2,o=Math.floor(n),l=Math.floor(s),c=o+1,h=l+1,f=t/o,p=e/l,u=[],g=[],_=[],m=[];for(let d=0;d0)&&u.push(E,y,R),(d!==n-1||lf.start-g.start);let p=0;for(let f=1;fu.start-g.start);let p=0;for(let u=1;u #include #include -}`,kf=`#define TOON +}`,Hf=`#define TOON varying vec3 vViewPosition; #include #include @@ -3571,7 +3571,7 @@ void main() { #include #include #include -}`,Vt={alphahash_fragment:mu,alphahash_pars_fragment:gu,alphamap_fragment:_u,alphamap_pars_fragment:vu,alphatest_fragment:xu,alphatest_pars_fragment:Mu,aomap_fragment:Su,aomap_pars_fragment:yu,batching_pars_vertex:Eu,batching_vertex:bu,begin_vertex:Tu,beginnormal_vertex:wu,bsdfs:Au,iridescence_fragment:Ru,bumpmap_pars_fragment:Cu,clipping_planes_fragment:Pu,clipping_planes_pars_fragment:Du,clipping_planes_pars_vertex:Lu,clipping_planes_vertex:Uu,color_fragment:Iu,color_pars_fragment:Nu,color_pars_vertex:Fu,color_vertex:Ou,common:Bu,cube_uv_reflection_fragment:zu,defaultnormal_vertex:Hu,displacementmap_pars_vertex:ku,displacementmap_vertex:Vu,emissivemap_fragment:Gu,emissivemap_pars_fragment:Wu,colorspace_fragment:Xu,colorspace_pars_fragment:Yu,envmap_fragment:qu,envmap_common_pars_fragment:ju,envmap_pars_fragment:Zu,envmap_pars_vertex:Ku,envmap_physical_pars_fragment:od,envmap_vertex:$u,fog_vertex:Ju,fog_pars_vertex:Qu,fog_fragment:td,fog_pars_fragment:ed,gradientmap_pars_fragment:nd,lightmap_pars_fragment:id,lights_lambert_fragment:sd,lights_lambert_pars_fragment:rd,lights_pars_begin:ad,lights_toon_fragment:ld,lights_toon_pars_fragment:cd,lights_phong_fragment:hd,lights_phong_pars_fragment:ud,lights_physical_fragment:dd,lights_physical_pars_fragment:fd,lights_fragment_begin:pd,lights_fragment_maps:md,lights_fragment_end:gd,logdepthbuf_fragment:_d,logdepthbuf_pars_fragment:vd,logdepthbuf_pars_vertex:xd,logdepthbuf_vertex:Md,map_fragment:Sd,map_pars_fragment:yd,map_particle_fragment:Ed,map_particle_pars_fragment:bd,metalnessmap_fragment:Td,metalnessmap_pars_fragment:wd,morphinstance_vertex:Ad,morphcolor_vertex:Rd,morphnormal_vertex:Cd,morphtarget_pars_vertex:Pd,morphtarget_vertex:Dd,normal_fragment_begin:Ld,normal_fragment_maps:Ud,normal_pars_fragment:Id,normal_pars_vertex:Nd,normal_vertex:Fd,normalmap_pars_fragment:Od,clearcoat_normal_fragment_begin:Bd,clearcoat_normal_fragment_maps:zd,clearcoat_pars_fragment:Hd,iridescence_pars_fragment:kd,opaque_fragment:Vd,packing:Gd,premultiplied_alpha_fragment:Wd,project_vertex:Xd,dithering_fragment:Yd,dithering_pars_fragment:qd,roughnessmap_fragment:jd,roughnessmap_pars_fragment:Zd,shadowmap_pars_fragment:Kd,shadowmap_pars_vertex:$d,shadowmap_vertex:Jd,shadowmask_pars_fragment:Qd,skinbase_vertex:tf,skinning_pars_vertex:ef,skinning_vertex:nf,skinnormal_vertex:sf,specularmap_fragment:rf,specularmap_pars_fragment:af,tonemapping_fragment:of,tonemapping_pars_fragment:lf,transmission_fragment:cf,transmission_pars_fragment:hf,uv_pars_fragment:uf,uv_pars_vertex:df,uv_vertex:ff,worldpos_vertex:pf,background_vert:mf,background_frag:gf,backgroundCube_vert:_f,backgroundCube_frag:vf,cube_vert:xf,cube_frag:Mf,depth_vert:Sf,depth_frag:yf,distanceRGBA_vert:Ef,distanceRGBA_frag:bf,equirect_vert:Tf,equirect_frag:wf,linedashed_vert:Af,linedashed_frag:Rf,meshbasic_vert:Cf,meshbasic_frag:Pf,meshlambert_vert:Df,meshlambert_frag:Lf,meshmatcap_vert:Uf,meshmatcap_frag:If,meshnormal_vert:Nf,meshnormal_frag:Ff,meshphong_vert:Of,meshphong_frag:Bf,meshphysical_vert:zf,meshphysical_frag:Hf,meshtoon_vert:kf,meshtoon_frag:Vf,points_vert:Gf,points_frag:Wf,shadow_vert:Xf,shadow_frag:Yf,sprite_vert:qf,sprite_frag:jf},st={common:{diffuse:{value:new pt(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ht}},envmap:{envMap:{value:null},envMapRotation:{value:new Ht},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ht}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ht}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ht},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ht},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ht},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ht}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ht}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ht}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new pt(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new pt(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0},uvTransform:{value:new Ht}},sprite:{diffuse:{value:new pt(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ht},alphaMap:{value:null},alphaMapTransform:{value:new Ht},alphaTest:{value:0}}},cn={basic:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.fog]),vertexShader:Vt.meshbasic_vert,fragmentShader:Vt.meshbasic_frag},lambert:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshlambert_vert,fragmentShader:Vt.meshlambert_frag},phong:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new pt(0)},specular:{value:new pt(1118481)},shininess:{value:30}}]),vertexShader:Vt.meshphong_vert,fragmentShader:Vt.meshphong_frag},standard:{uniforms:Ue([st.common,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.roughnessmap,st.metalnessmap,st.fog,st.lights,{emissive:{value:new pt(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag},toon:{uniforms:Ue([st.common,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.gradientmap,st.fog,st.lights,{emissive:{value:new pt(0)}}]),vertexShader:Vt.meshtoon_vert,fragmentShader:Vt.meshtoon_frag},matcap:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,st.fog,{matcap:{value:null}}]),vertexShader:Vt.meshmatcap_vert,fragmentShader:Vt.meshmatcap_frag},points:{uniforms:Ue([st.points,st.fog]),vertexShader:Vt.points_vert,fragmentShader:Vt.points_frag},dashed:{uniforms:Ue([st.common,st.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Vt.linedashed_vert,fragmentShader:Vt.linedashed_frag},depth:{uniforms:Ue([st.common,st.displacementmap]),vertexShader:Vt.depth_vert,fragmentShader:Vt.depth_frag},normal:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,{opacity:{value:1}}]),vertexShader:Vt.meshnormal_vert,fragmentShader:Vt.meshnormal_frag},sprite:{uniforms:Ue([st.sprite,st.fog]),vertexShader:Vt.sprite_vert,fragmentShader:Vt.sprite_frag},background:{uniforms:{uvTransform:{value:new Ht},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Vt.background_vert,fragmentShader:Vt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ht}},vertexShader:Vt.backgroundCube_vert,fragmentShader:Vt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Vt.cube_vert,fragmentShader:Vt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Vt.equirect_vert,fragmentShader:Vt.equirect_frag},distanceRGBA:{uniforms:Ue([st.common,st.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Vt.distanceRGBA_vert,fragmentShader:Vt.distanceRGBA_frag},shadow:{uniforms:Ue([st.lights,st.fog,{color:{value:new pt(0)},opacity:{value:1}}]),vertexShader:Vt.shadow_vert,fragmentShader:Vt.shadow_frag}};cn.physical={uniforms:Ue([cn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ht},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ht},clearcoatNormalScale:{value:new vt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ht},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ht},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ht},sheen:{value:0},sheenColor:{value:new pt(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ht},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ht},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ht},transmissionSamplerSize:{value:new vt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ht},attenuationDistance:{value:0},attenuationColor:{value:new pt(0)},specularColor:{value:new pt(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ht},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ht},anisotropyVector:{value:new vt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ht}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag};const Gs={r:0,b:0,g:0},qn=new pn,Zf=new ee;function Kf(i,t,e,n,s,r,a){const o=new pt(0);let l=r===!0?0:1,c,h,d=null,p=0,f=null;function g(b){let y=b.isScene===!0?b.background:null;return y&&y.isTexture&&(y=(b.backgroundBlurriness>0?e:t).get(y)),y}function v(b){let y=!1;const L=g(b);L===null?u(o,l):L&&L.isColor&&(u(L,1),y=!0);const R=i.xr.getEnvironmentBlendMode();R==="additive"?n.buffers.color.setClear(0,0,0,1,a):R==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(i.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil))}function m(b,y){const L=g(y);L&&(L.isCubeTexture||L.mapping===fr)?(h===void 0&&(h=new Se(new us(1,1,1),new Fe({name:"BackgroundCubeMaterial",uniforms:Gi(cn.backgroundCube.uniforms),vertexShader:cn.backgroundCube.vertexShader,fragmentShader:cn.backgroundCube.fragmentShader,side:ke,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(R,A,U){this.matrixWorld.copyPosition(U.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),qn.copy(y.backgroundRotation),qn.x*=-1,qn.y*=-1,qn.z*=-1,L.isCubeTexture&&L.isRenderTargetTexture===!1&&(qn.y*=-1,qn.z*=-1),h.material.uniforms.envMap.value=L,h.material.uniforms.flipEnvMap.value=L.isCubeTexture&&L.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(Zf.makeRotationFromEuler(qn)),h.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,(d!==L||p!==L.version||f!==i.toneMapping)&&(h.material.needsUpdate=!0,d=L,p=L.version,f=i.toneMapping),h.layers.enableAll(),b.unshift(h,h.geometry,h.material,0,0,null)):L&&L.isTexture&&(c===void 0&&(c=new Se(new ds(2,2),new Fe({name:"BackgroundMaterial",uniforms:Gi(cn.background.uniforms),vertexShader:cn.background.vertexShader,fragmentShader:cn.background.fragmentShader,side:zn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=L,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,L.matrixAutoUpdate===!0&&L.updateMatrix(),c.material.uniforms.uvTransform.value.copy(L.matrix),(d!==L||p!==L.version||f!==i.toneMapping)&&(c.material.needsUpdate=!0,d=L,p=L.version,f=i.toneMapping),c.layers.enableAll(),b.unshift(c,c.geometry,c.material,0,0,null))}function u(b,y){b.getRGB(Gs,sc(i)),n.buffers.color.setClear(Gs.r,Gs.g,Gs.b,y,a)}function T(){h!==void 0&&(h.geometry.dispose(),h.material.dispose()),c!==void 0&&(c.geometry.dispose(),c.material.dispose())}return{getClearColor:function(){return o},setClearColor:function(b,y=1){o.set(b),l=y,u(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(b){l=b,u(o,l)},render:v,addToRenderList:m,dispose:T}}function $f(i,t){const e=i.getParameter(i.MAX_VERTEX_ATTRIBS),n={},s=p(null);let r=s,a=!1;function o(M,D,W,z,V){let $=!1;const G=d(z,W,D);r!==G&&(r=G,c(r.object)),$=f(M,z,W,V),$&&g(M,z,W,V),V!==null&&t.update(V,i.ELEMENT_ARRAY_BUFFER),($||a)&&(a=!1,y(M,D,W,z),V!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.get(V).buffer))}function l(){return i.createVertexArray()}function c(M){return i.bindVertexArray(M)}function h(M){return i.deleteVertexArray(M)}function d(M,D,W){const z=W.wireframe===!0;let V=n[M.id];V===void 0&&(V={},n[M.id]=V);let $=V[D.id];$===void 0&&($={},V[D.id]=$);let G=$[z];return G===void 0&&(G=p(l()),$[z]=G),G}function p(M){const D=[],W=[],z=[];for(let V=0;V=0){const ut=V[k];let yt=$[k];if(yt===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(yt=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(yt=M.instanceColor)),ut===void 0||ut.attribute!==yt||yt&&ut.data!==yt.data)return!0;G++}return r.attributesNum!==G||r.index!==z}function g(M,D,W,z){const V={},$=D.attributes;let G=0;const J=W.getAttributes();for(const k in J)if(J[k].location>=0){let ut=$[k];ut===void 0&&(k==="instanceMatrix"&&M.instanceMatrix&&(ut=M.instanceMatrix),k==="instanceColor"&&M.instanceColor&&(ut=M.instanceColor));const yt={};yt.attribute=ut,ut&&ut.data&&(yt.data=ut.data),V[k]=yt,G++}r.attributes=V,r.attributesNum=G,r.index=z}function v(){const M=r.newAttributes;for(let D=0,W=M.length;D=0){let it=V[J];if(it===void 0&&(J==="instanceMatrix"&&M.instanceMatrix&&(it=M.instanceMatrix),J==="instanceColor"&&M.instanceColor&&(it=M.instanceColor)),it!==void 0){const ut=it.normalized,yt=it.itemSize,Lt=t.get(it);if(Lt===void 0)continue;const qt=Lt.buffer,Y=Lt.type,nt=Lt.bytesPerElement,xt=Y===i.INT||Y===i.UNSIGNED_INT||it.gpuType===qa;if(it.isInterleavedBufferAttribute){const at=it.data,wt=at.stride,Ut=it.offset;if(at.isInstancedInterleavedBuffer){for(let Gt=0;Gt0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=e.precision!==void 0?e.precision:"highp";const h=l(c);h!==c&&(console.warn("THREE.WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const d=e.logarithmicDepthBuffer===!0,p=e.reverseDepthBuffer===!0&&t.has("EXT_clip_control"),f=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),g=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),v=i.getParameter(i.MAX_TEXTURE_SIZE),m=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),u=i.getParameter(i.MAX_VERTEX_ATTRIBS),T=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),b=i.getParameter(i.MAX_VARYING_VECTORS),y=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),L=g>0,R=i.getParameter(i.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:d,reverseDepthBuffer:p,maxTextures:f,maxVertexTextures:g,maxTextureSize:v,maxCubemapSize:m,maxAttributes:u,maxVertexUniforms:T,maxVaryings:b,maxFragmentUniforms:y,vertexTextures:L,maxSamples:R}}function tp(i){const t=this;let e=null,n=0,s=!1,r=!1;const a=new Nn,o=new Ht,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(d,p){const f=d.length!==0||p||n!==0||s;return s=p,n=d.length,f},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(d,p){e=h(d,p,0)},this.setState=function(d,p,f){const g=d.clippingPlanes,v=d.clipIntersection,m=d.clipShadows,u=i.get(d);if(!s||g===null||g.length===0||r&&!m)r?h(null):c();else{const T=r?0:n,b=T*4;let y=u.clippingState||null;l.value=y,y=h(g,p,b,f);for(let L=0;L!==b;++L)y[L]=e[L];u.clippingState=y,this.numIntersection=v?this.numPlanes:0,this.numPlanes+=T}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(d,p,f,g){const v=d!==null?d.length:0;let m=null;if(v!==0){if(m=l.value,g!==!0||m===null){const u=f+v*4,T=p.matrixWorldInverse;o.getNormalMatrix(T),(m===null||m.length0){const c=new Zh(l.height);return c.fromEquirectangularTexture(i,a),t.set(a,c),a.addEventListener("dispose",s),e(c.texture,a.mapping)}else return null}}return a}function s(a){const o=a.target;o.removeEventListener("dispose",s);const l=t.get(o);l!==void 0&&(t.delete(o),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}const Di=4,Qo=[.125,.215,.35,.446,.526,.582],$n=20,Xr=new uc,tl=new pt;let Yr=null,qr=0,jr=0,Zr=!1;const Zn=(1+Math.sqrt(5))/2,wi=1/Zn,el=[new P(-Zn,wi,0),new P(Zn,wi,0),new P(-wi,0,Zn),new P(wi,0,Zn),new P(0,Zn,-wi),new P(0,Zn,wi),new P(-1,1,-1),new P(1,1,-1),new P(-1,1,1),new P(1,1,1)];class nl{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){Yr=this._renderer.getRenderTarget(),qr=this._renderer.getActiveCubeFace(),jr=this._renderer.getActiveMipmapLevel(),Zr=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=rl(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=sl(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t2?b:0,b,b),h.setRenderTarget(s),v&&h.render(g,o),h.render(t,o)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=p,h.autoClear=d,t.background=m}_textureToCubeUV(t,e){const n=this._renderer,s=t.mapping===Bi||t.mapping===zi;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=rl()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=sl());const r=s?this._cubemapMaterial:this._equirectMaterial,a=new Se(this._lodPlanes[0],r),o=r.uniforms;o.envMap.value=t;const l=this._cubeSize;Ws(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(a,Xr)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;const s=this._lodPlanes.length;for(let r=1;r$n&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${$n}`);const u=[];let T=0;for(let A=0;A<$n;++A){const U=A/v,S=Math.exp(-U*U/2);u.push(S),A===0?T+=S:Ab-Di?s-b+Di:0),R=4*(this._cubeSize-y);Ws(e,L,R,3*y,2*y),l.setRenderTarget(e),l.render(d,Xr)}}function np(i){const t=[],e=[],n=[];let s=i;const r=i-Di+1+Qo.length;for(let a=0;ai-Di?l=Qo[a-i+Di-1]:a===0&&(l=0),n.push(l);const c=1/(o-2),h=-c,d=1+c,p=[h,h,d,h,d,d,h,h,d,d,h,d],f=6,g=6,v=3,m=2,u=1,T=new Float32Array(v*g*f),b=new Float32Array(m*g*f),y=new Float32Array(u*g*f);for(let R=0;R2?0:-1,S=[A,U,0,A+2/3,U,0,A+2/3,U+1,0,A,U,0,A+2/3,U+1,0,A,U+1,0];T.set(S,v*g*R),b.set(p,m*g*R);const M=[R,R,R,R,R,R];y.set(M,u*g*R)}const L=new pe;L.setAttribute("position",new he(T,v)),L.setAttribute("uv",new he(b,m)),L.setAttribute("faceIndex",new he(y,u)),t.push(L),s>Di&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function il(i,t,e){const n=new on(i,t,e);return n.texture.mapping=fr,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Ws(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function ip(i,t,e){const n=new Float32Array($n),s=new P(0,1,0);return new Fe({name:"SphericalGaussianBlur",defines:{n:$n,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:io(),fragmentShader:` +}`,Vt={alphahash_fragment:mu,alphahash_pars_fragment:gu,alphamap_fragment:_u,alphamap_pars_fragment:vu,alphatest_fragment:xu,alphatest_pars_fragment:Mu,aomap_fragment:Su,aomap_pars_fragment:yu,batching_pars_vertex:Eu,batching_vertex:bu,begin_vertex:Tu,beginnormal_vertex:wu,bsdfs:Au,iridescence_fragment:Ru,bumpmap_pars_fragment:Cu,clipping_planes_fragment:Pu,clipping_planes_pars_fragment:Du,clipping_planes_pars_vertex:Lu,clipping_planes_vertex:Uu,color_fragment:Iu,color_pars_fragment:Nu,color_pars_vertex:Fu,color_vertex:Ou,common:Bu,cube_uv_reflection_fragment:zu,defaultnormal_vertex:ku,displacementmap_pars_vertex:Hu,displacementmap_vertex:Vu,emissivemap_fragment:Gu,emissivemap_pars_fragment:Wu,colorspace_fragment:Xu,colorspace_pars_fragment:Yu,envmap_fragment:qu,envmap_common_pars_fragment:ju,envmap_pars_fragment:Zu,envmap_pars_vertex:Ku,envmap_physical_pars_fragment:od,envmap_vertex:$u,fog_vertex:Ju,fog_pars_vertex:Qu,fog_fragment:td,fog_pars_fragment:ed,gradientmap_pars_fragment:nd,lightmap_pars_fragment:id,lights_lambert_fragment:sd,lights_lambert_pars_fragment:rd,lights_pars_begin:ad,lights_toon_fragment:ld,lights_toon_pars_fragment:cd,lights_phong_fragment:hd,lights_phong_pars_fragment:ud,lights_physical_fragment:dd,lights_physical_pars_fragment:fd,lights_fragment_begin:pd,lights_fragment_maps:md,lights_fragment_end:gd,logdepthbuf_fragment:_d,logdepthbuf_pars_fragment:vd,logdepthbuf_pars_vertex:xd,logdepthbuf_vertex:Md,map_fragment:Sd,map_pars_fragment:yd,map_particle_fragment:Ed,map_particle_pars_fragment:bd,metalnessmap_fragment:Td,metalnessmap_pars_fragment:wd,morphinstance_vertex:Ad,morphcolor_vertex:Rd,morphnormal_vertex:Cd,morphtarget_pars_vertex:Pd,morphtarget_vertex:Dd,normal_fragment_begin:Ld,normal_fragment_maps:Ud,normal_pars_fragment:Id,normal_pars_vertex:Nd,normal_vertex:Fd,normalmap_pars_fragment:Od,clearcoat_normal_fragment_begin:Bd,clearcoat_normal_fragment_maps:zd,clearcoat_pars_fragment:kd,iridescence_pars_fragment:Hd,opaque_fragment:Vd,packing:Gd,premultiplied_alpha_fragment:Wd,project_vertex:Xd,dithering_fragment:Yd,dithering_pars_fragment:qd,roughnessmap_fragment:jd,roughnessmap_pars_fragment:Zd,shadowmap_pars_fragment:Kd,shadowmap_pars_vertex:$d,shadowmap_vertex:Jd,shadowmask_pars_fragment:Qd,skinbase_vertex:tf,skinning_pars_vertex:ef,skinning_vertex:nf,skinnormal_vertex:sf,specularmap_fragment:rf,specularmap_pars_fragment:af,tonemapping_fragment:of,tonemapping_pars_fragment:lf,transmission_fragment:cf,transmission_pars_fragment:hf,uv_pars_fragment:uf,uv_pars_vertex:df,uv_vertex:ff,worldpos_vertex:pf,background_vert:mf,background_frag:gf,backgroundCube_vert:_f,backgroundCube_frag:vf,cube_vert:xf,cube_frag:Mf,depth_vert:Sf,depth_frag:yf,distanceRGBA_vert:Ef,distanceRGBA_frag:bf,equirect_vert:Tf,equirect_frag:wf,linedashed_vert:Af,linedashed_frag:Rf,meshbasic_vert:Cf,meshbasic_frag:Pf,meshlambert_vert:Df,meshlambert_frag:Lf,meshmatcap_vert:Uf,meshmatcap_frag:If,meshnormal_vert:Nf,meshnormal_frag:Ff,meshphong_vert:Of,meshphong_frag:Bf,meshphysical_vert:zf,meshphysical_frag:kf,meshtoon_vert:Hf,meshtoon_frag:Vf,points_vert:Gf,points_frag:Wf,shadow_vert:Xf,shadow_frag:Yf,sprite_vert:qf,sprite_frag:jf},st={common:{diffuse:{value:new at(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new kt},alphaMap:{value:null},alphaMapTransform:{value:new kt},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new kt}},envmap:{envMap:{value:null},envMapRotation:{value:new kt},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new kt}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new kt}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new kt},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new kt},normalScale:{value:new vt(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new kt},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new kt}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new kt}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new kt}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new at(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new at(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new kt},alphaTest:{value:0},uvTransform:{value:new kt}},sprite:{diffuse:{value:new at(16777215)},opacity:{value:1},center:{value:new vt(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new kt},alphaMap:{value:null},alphaMapTransform:{value:new kt},alphaTest:{value:0}}},cn={basic:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.fog]),vertexShader:Vt.meshbasic_vert,fragmentShader:Vt.meshbasic_frag},lambert:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new at(0)}}]),vertexShader:Vt.meshlambert_vert,fragmentShader:Vt.meshlambert_frag},phong:{uniforms:Ue([st.common,st.specularmap,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.fog,st.lights,{emissive:{value:new at(0)},specular:{value:new at(1118481)},shininess:{value:30}}]),vertexShader:Vt.meshphong_vert,fragmentShader:Vt.meshphong_frag},standard:{uniforms:Ue([st.common,st.envmap,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.roughnessmap,st.metalnessmap,st.fog,st.lights,{emissive:{value:new at(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag},toon:{uniforms:Ue([st.common,st.aomap,st.lightmap,st.emissivemap,st.bumpmap,st.normalmap,st.displacementmap,st.gradientmap,st.fog,st.lights,{emissive:{value:new at(0)}}]),vertexShader:Vt.meshtoon_vert,fragmentShader:Vt.meshtoon_frag},matcap:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,st.fog,{matcap:{value:null}}]),vertexShader:Vt.meshmatcap_vert,fragmentShader:Vt.meshmatcap_frag},points:{uniforms:Ue([st.points,st.fog]),vertexShader:Vt.points_vert,fragmentShader:Vt.points_frag},dashed:{uniforms:Ue([st.common,st.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Vt.linedashed_vert,fragmentShader:Vt.linedashed_frag},depth:{uniforms:Ue([st.common,st.displacementmap]),vertexShader:Vt.depth_vert,fragmentShader:Vt.depth_frag},normal:{uniforms:Ue([st.common,st.bumpmap,st.normalmap,st.displacementmap,{opacity:{value:1}}]),vertexShader:Vt.meshnormal_vert,fragmentShader:Vt.meshnormal_frag},sprite:{uniforms:Ue([st.sprite,st.fog]),vertexShader:Vt.sprite_vert,fragmentShader:Vt.sprite_frag},background:{uniforms:{uvTransform:{value:new kt},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Vt.background_vert,fragmentShader:Vt.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new kt}},vertexShader:Vt.backgroundCube_vert,fragmentShader:Vt.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Vt.cube_vert,fragmentShader:Vt.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Vt.equirect_vert,fragmentShader:Vt.equirect_frag},distanceRGBA:{uniforms:Ue([st.common,st.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Vt.distanceRGBA_vert,fragmentShader:Vt.distanceRGBA_frag},shadow:{uniforms:Ue([st.lights,st.fog,{color:{value:new at(0)},opacity:{value:1}}]),vertexShader:Vt.shadow_vert,fragmentShader:Vt.shadow_frag}};cn.physical={uniforms:Ue([cn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new kt},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new kt},clearcoatNormalScale:{value:new vt(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new kt},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new kt},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new kt},sheen:{value:0},sheenColor:{value:new at(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new kt},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new kt},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new kt},transmissionSamplerSize:{value:new vt},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new kt},attenuationDistance:{value:0},attenuationColor:{value:new at(0)},specularColor:{value:new at(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new kt},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new kt},anisotropyVector:{value:new vt},anisotropyMap:{value:null},anisotropyMapTransform:{value:new kt}}]),vertexShader:Vt.meshphysical_vert,fragmentShader:Vt.meshphysical_frag};const Gs={r:0,b:0,g:0},qn=new pn,Zf=new ee;function Kf(i,t,e,n,s,r,a){const o=new at(0);let l=r===!0?0:1,c,h,f=null,p=0,u=null;function g(E){let y=E.isScene===!0?E.background:null;return y&&y.isTexture&&(y=(E.backgroundBlurriness>0?e:t).get(y)),y}function _(E){let y=!1;const L=g(E);L===null?d(o,l):L&&L.isColor&&(d(L,1),y=!0);const R=i.xr.getEnvironmentBlendMode();R==="additive"?n.buffers.color.setClear(0,0,0,1,a):R==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,a),(i.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),i.clear(i.autoClearColor,i.autoClearDepth,i.autoClearStencil))}function m(E,y){const L=g(y);L&&(L.isCubeTexture||L.mapping===fr)?(h===void 0&&(h=new Se(new us(1,1,1),new Fe({name:"BackgroundCubeMaterial",uniforms:Gi(cn.backgroundCube.uniforms),vertexShader:cn.backgroundCube.vertexShader,fragmentShader:cn.backgroundCube.fragmentShader,side:He,depthTest:!1,depthWrite:!1,fog:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(R,A,U){this.matrixWorld.copyPosition(U.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),s.update(h)),qn.copy(y.backgroundRotation),qn.x*=-1,qn.y*=-1,qn.z*=-1,L.isCubeTexture&&L.isRenderTargetTexture===!1&&(qn.y*=-1,qn.z*=-1),h.material.uniforms.envMap.value=L,h.material.uniforms.flipEnvMap.value=L.isCubeTexture&&L.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(Zf.makeRotationFromEuler(qn)),h.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,(f!==L||p!==L.version||u!==i.toneMapping)&&(h.material.needsUpdate=!0,f=L,p=L.version,u=i.toneMapping),h.layers.enableAll(),E.unshift(h,h.geometry,h.material,0,0,null)):L&&L.isTexture&&(c===void 0&&(c=new Se(new ds(2,2),new Fe({name:"BackgroundMaterial",uniforms:Gi(cn.background.uniforms),vertexShader:cn.background.vertexShader,fragmentShader:cn.background.fragmentShader,side:zn,depthTest:!1,depthWrite:!1,fog:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),s.update(c)),c.material.uniforms.t2D.value=L,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=$t.getTransfer(L.colorSpace)!==re,L.matrixAutoUpdate===!0&&L.updateMatrix(),c.material.uniforms.uvTransform.value.copy(L.matrix),(f!==L||p!==L.version||u!==i.toneMapping)&&(c.material.needsUpdate=!0,f=L,p=L.version,u=i.toneMapping),c.layers.enableAll(),E.unshift(c,c.geometry,c.material,0,0,null))}function d(E,y){E.getRGB(Gs,sc(i)),n.buffers.color.setClear(Gs.r,Gs.g,Gs.b,y,a)}function T(){h!==void 0&&(h.geometry.dispose(),h.material.dispose()),c!==void 0&&(c.geometry.dispose(),c.material.dispose())}return{getClearColor:function(){return o},setClearColor:function(E,y=1){o.set(E),l=y,d(o,l)},getClearAlpha:function(){return l},setClearAlpha:function(E){l=E,d(o,l)},render:_,addToRenderList:m,dispose:T}}function $f(i,t){const e=i.getParameter(i.MAX_VERTEX_ATTRIBS),n={},s=p(null);let r=s,a=!1;function o(M,D,W,z,V){let $=!1;const G=f(z,W,D);r!==G&&(r=G,c(r.object)),$=u(M,z,W,V),$&&g(M,z,W,V),V!==null&&t.update(V,i.ELEMENT_ARRAY_BUFFER),($||a)&&(a=!1,y(M,D,W,z),V!==null&&i.bindBuffer(i.ELEMENT_ARRAY_BUFFER,t.get(V).buffer))}function l(){return i.createVertexArray()}function c(M){return i.bindVertexArray(M)}function h(M){return i.deleteVertexArray(M)}function f(M,D,W){const z=W.wireframe===!0;let V=n[M.id];V===void 0&&(V={},n[M.id]=V);let $=V[D.id];$===void 0&&($={},V[D.id]=$);let G=$[z];return G===void 0&&(G=p(l()),$[z]=G),G}function p(M){const D=[],W=[],z=[];for(let V=0;V=0){const dt=V[H];let yt=$[H];if(yt===void 0&&(H==="instanceMatrix"&&M.instanceMatrix&&(yt=M.instanceMatrix),H==="instanceColor"&&M.instanceColor&&(yt=M.instanceColor)),dt===void 0||dt.attribute!==yt||yt&&dt.data!==yt.data)return!0;G++}return r.attributesNum!==G||r.index!==z}function g(M,D,W,z){const V={},$=D.attributes;let G=0;const J=W.getAttributes();for(const H in J)if(J[H].location>=0){let dt=$[H];dt===void 0&&(H==="instanceMatrix"&&M.instanceMatrix&&(dt=M.instanceMatrix),H==="instanceColor"&&M.instanceColor&&(dt=M.instanceColor));const yt={};yt.attribute=dt,dt&&dt.data&&(yt.data=dt.data),V[H]=yt,G++}r.attributes=V,r.attributesNum=G,r.index=z}function _(){const M=r.newAttributes;for(let D=0,W=M.length;D=0){let it=V[J];if(it===void 0&&(J==="instanceMatrix"&&M.instanceMatrix&&(it=M.instanceMatrix),J==="instanceColor"&&M.instanceColor&&(it=M.instanceColor)),it!==void 0){const dt=it.normalized,yt=it.itemSize,Lt=t.get(it);if(Lt===void 0)continue;const qt=Lt.buffer,Y=Lt.type,nt=Lt.bytesPerElement,xt=Y===i.INT||Y===i.UNSIGNED_INT||it.gpuType===qa;if(it.isInterleavedBufferAttribute){const ot=it.data,wt=ot.stride,Ut=it.offset;if(ot.isInstancedInterleavedBuffer){for(let Gt=0;Gt0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&i.getShaderPrecisionFormat(i.VERTEX_SHADER,i.MEDIUM_FLOAT).precision>0&&i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=e.precision!==void 0?e.precision:"highp";const h=l(c);h!==c&&(console.warn("THREE.WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const f=e.logarithmicDepthBuffer===!0,p=e.reverseDepthBuffer===!0&&t.has("EXT_clip_control"),u=i.getParameter(i.MAX_TEXTURE_IMAGE_UNITS),g=i.getParameter(i.MAX_VERTEX_TEXTURE_IMAGE_UNITS),_=i.getParameter(i.MAX_TEXTURE_SIZE),m=i.getParameter(i.MAX_CUBE_MAP_TEXTURE_SIZE),d=i.getParameter(i.MAX_VERTEX_ATTRIBS),T=i.getParameter(i.MAX_VERTEX_UNIFORM_VECTORS),E=i.getParameter(i.MAX_VARYING_VECTORS),y=i.getParameter(i.MAX_FRAGMENT_UNIFORM_VECTORS),L=g>0,R=i.getParameter(i.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:a,textureTypeReadable:o,precision:c,logarithmicDepthBuffer:f,reverseDepthBuffer:p,maxTextures:u,maxVertexTextures:g,maxTextureSize:_,maxCubemapSize:m,maxAttributes:d,maxVertexUniforms:T,maxVaryings:E,maxFragmentUniforms:y,vertexTextures:L,maxSamples:R}}function tp(i){const t=this;let e=null,n=0,s=!1,r=!1;const a=new Nn,o=new kt,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(f,p){const u=f.length!==0||p||n!==0||s;return s=p,n=f.length,u},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(f,p){e=h(f,p,0)},this.setState=function(f,p,u){const g=f.clippingPlanes,_=f.clipIntersection,m=f.clipShadows,d=i.get(f);if(!s||g===null||g.length===0||r&&!m)r?h(null):c();else{const T=r?0:n,E=T*4;let y=d.clippingState||null;l.value=y,y=h(g,p,E,u);for(let L=0;L!==E;++L)y[L]=e[L];d.clippingState=y,this.numIntersection=_?this.numPlanes:0,this.numPlanes+=T}};function c(){l.value!==e&&(l.value=e,l.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function h(f,p,u,g){const _=f!==null?f.length:0;let m=null;if(_!==0){if(m=l.value,g!==!0||m===null){const d=u+_*4,T=p.matrixWorldInverse;o.getNormalMatrix(T),(m===null||m.length0){const c=new Zh(l.height);return c.fromEquirectangularTexture(i,a),t.set(a,c),a.addEventListener("dispose",s),e(c.texture,a.mapping)}else return null}}return a}function s(a){const o=a.target;o.removeEventListener("dispose",s);const l=t.get(o);l!==void 0&&(t.delete(o),l.dispose())}function r(){t=new WeakMap}return{get:n,dispose:r}}const Di=4,Qo=[.125,.215,.35,.446,.526,.582],$n=20,Xr=new uc,tl=new at;let Yr=null,qr=0,jr=0,Zr=!1;const Zn=(1+Math.sqrt(5))/2,wi=1/Zn,el=[new P(-Zn,wi,0),new P(Zn,wi,0),new P(-wi,0,Zn),new P(wi,0,Zn),new P(0,Zn,-wi),new P(0,Zn,wi),new P(-1,1,-1),new P(1,1,-1),new P(-1,1,1),new P(1,1,1)];class nl{constructor(t){this._renderer=t,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(t,e=0,n=.1,s=100){Yr=this._renderer.getRenderTarget(),qr=this._renderer.getActiveCubeFace(),jr=this._renderer.getActiveMipmapLevel(),Zr=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(256);const r=this._allocateTargets();return r.depthBuffer=!0,this._sceneToCubeUV(t,n,s,r),e>0&&this._blur(r,0,0,e),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(t,e=null){return this._fromTexture(t,e)}fromCubemap(t,e=null){return this._fromTexture(t,e)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=rl(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=sl(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose()}_setSize(t){this._lodMax=Math.floor(Math.log2(t)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let t=0;t2?E:0,E,E),h.setRenderTarget(s),_&&h.render(g,o),h.render(t,o)}g.geometry.dispose(),g.material.dispose(),h.toneMapping=p,h.autoClear=f,t.background=m}_textureToCubeUV(t,e){const n=this._renderer,s=t.mapping===Bi||t.mapping===zi;s?(this._cubemapMaterial===null&&(this._cubemapMaterial=rl()),this._cubemapMaterial.uniforms.flipEnvMap.value=t.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=sl());const r=s?this._cubemapMaterial:this._equirectMaterial,a=new Se(this._lodPlanes[0],r),o=r.uniforms;o.envMap.value=t;const l=this._cubeSize;Ws(e,0,0,3*l,2*l),n.setRenderTarget(e),n.render(a,Xr)}_applyPMREM(t){const e=this._renderer,n=e.autoClear;e.autoClear=!1;const s=this._lodPlanes.length;for(let r=1;r$n&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to ${$n}`);const d=[];let T=0;for(let A=0;A<$n;++A){const U=A/_,S=Math.exp(-U*U/2);d.push(S),A===0?T+=S:AE-Di?s-E+Di:0),R=4*(this._cubeSize-y);Ws(e,L,R,3*y,2*y),l.setRenderTarget(e),l.render(f,Xr)}}function np(i){const t=[],e=[],n=[];let s=i;const r=i-Di+1+Qo.length;for(let a=0;ai-Di?l=Qo[a-i+Di-1]:a===0&&(l=0),n.push(l);const c=1/(o-2),h=-c,f=1+c,p=[h,h,f,h,f,f,h,h,f,f,h,f],u=6,g=6,_=3,m=2,d=1,T=new Float32Array(_*g*u),E=new Float32Array(m*g*u),y=new Float32Array(d*g*u);for(let R=0;R2?0:-1,S=[A,U,0,A+2/3,U,0,A+2/3,U+1,0,A,U,0,A+2/3,U+1,0,A,U+1,0];T.set(S,_*g*R),E.set(p,m*g*R);const M=[R,R,R,R,R,R];y.set(M,d*g*R)}const L=new pe;L.setAttribute("position",new he(T,_)),L.setAttribute("uv",new he(E,m)),L.setAttribute("faceIndex",new he(y,d)),t.push(L),s>Di&&s--}return{lodPlanes:t,sizeLods:e,sigmas:n}}function il(i,t,e){const n=new on(i,t,e);return n.texture.mapping=fr,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function Ws(i,t,e,n,s){i.viewport.set(t,e,n,s),i.scissor.set(t,e,n,s)}function ip(i,t,e){const n=new Float32Array($n),s=new P(0,1,0);return new Fe({name:"SphericalGaussianBlur",defines:{n:$n,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/e,CUBEUV_MAX_MIP:`${i}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:s}},vertexShader:io(),fragmentShader:` precision mediump float; precision mediump int; @@ -3721,9 +3721,9 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}function sp(i){let t=new WeakMap,e=null;function n(o){if(o&&o.isTexture){const l=o.mapping,c=l===ha||l===ua,h=l===Bi||l===zi;if(c||h){let d=t.get(o);const p=d!==void 0?d.texture.pmremVersion:0;if(o.isRenderTargetTexture&&o.pmremVersion!==p)return e===null&&(e=new nl(i)),d=c?e.fromEquirectangular(o,d):e.fromCubemap(o,d),d.texture.pmremVersion=o.pmremVersion,t.set(o,d),d.texture;if(d!==void 0)return d.texture;{const f=o.image;return c&&f&&f.height>0||h&&f&&s(f)?(e===null&&(e=new nl(i)),d=c?e.fromEquirectangular(o):e.fromCubemap(o),d.texture.pmremVersion=o.pmremVersion,t.set(o,d),o.addEventListener("dispose",r),d.texture):null}}}return o}function s(o){let l=0;const c=6;for(let h=0;ht.maxTextureSize&&(L=Math.ceil(y/t.maxTextureSize),y=t.maxTextureSize);const R=new Float32Array(y*L*4*d),A=new tc(R,y,L,d);A.type=fn,A.needsUpdate=!0;const U=b*4;for(let M=0;M0)return i;const s=t*e;let r=ol[s];if(r===void 0&&(r=new Float32Array(s),ol[s]=r),t!==0){n.toArray(r,0);for(let a=1,o=0;a!==t;++a)o+=e,i[a].toArray(r,o)}return r}function ye(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e0||h&&u&&s(u)?(e===null&&(e=new nl(i)),f=c?e.fromEquirectangular(o):e.fromCubemap(o),f.texture.pmremVersion=o.pmremVersion,t.set(o,f),o.addEventListener("dispose",r),f.texture):null}}}return o}function s(o){let l=0;const c=6;for(let h=0;ht.maxTextureSize&&(L=Math.ceil(y/t.maxTextureSize),y=t.maxTextureSize);const R=new Float32Array(y*L*4*f),A=new tc(R,y,L,f);A.type=fn,A.needsUpdate=!0;const U=E*4;for(let M=0;M0)return i;const s=t*e;let r=ol[s];if(r===void 0&&(r=new Float32Array(s),ol[s]=r),t!==0){n.toArray(r,0);for(let a=1,o=0;a!==t;++a)o+=e,i[a].toArray(r,o)}return r}function ye(i,t){if(i.length!==t.length)return!1;for(let e=0,n=i.length;e":" "} ${o}: ${e[a]}`)}return n.join(` -`)}const pl=new Ht;function sm(i){$t._getMatrix(pl,$t.workingColorSpace,i);const t=`mat3( ${pl.elements.map(e=>e.toFixed(4))} )`;switch($t.getTransfer(i)){case ir:return[t,"LinearTransferOETF"];case re:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",i),[t,"LinearTransferOETF"]}}function ml(i,t,e){const n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s==="")return"";const r=/ERROR: 0:(\d+)/.exec(s);if(r){const a=parseInt(r[1]);return e.toUpperCase()+` +`)}const pl=new kt;function sm(i){$t._getMatrix(pl,$t.workingColorSpace,i);const t=`mat3( ${pl.elements.map(e=>e.toFixed(4))} )`;switch($t.getTransfer(i)){case ir:return[t,"LinearTransferOETF"];case re:return[t,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",i),[t,"LinearTransferOETF"]}}function ml(i,t,e){const n=i.getShaderParameter(t,i.COMPILE_STATUS),s=i.getShaderInfoLog(t).trim();if(n&&s==="")return"";const r=/ERROR: 0:(\d+)/.exec(s);if(r){const a=parseInt(r[1]);return e.toUpperCase()+` `+s+` @@ -3751,28 +3751,28 @@ void main() { `;return i.precision==="highp"?t+=` #define HIGH_PRECISION`:i.precision==="mediump"?t+=` #define MEDIUM_PRECISION`:i.precision==="lowp"&&(t+=` -#define LOW_PRECISION`),t}function gm(i){let t="SHADOWMAP_TYPE_BASIC";return i.shadowMapType===Ol?t="SHADOWMAP_TYPE_PCF":i.shadowMapType===zc?t="SHADOWMAP_TYPE_PCF_SOFT":i.shadowMapType===yn&&(t="SHADOWMAP_TYPE_VSM"),t}function _m(i){let t="ENVMAP_TYPE_CUBE";if(i.envMap)switch(i.envMapMode){case Bi:case zi:t="ENVMAP_TYPE_CUBE";break;case fr:t="ENVMAP_TYPE_CUBE_UV";break}return t}function vm(i){let t="ENVMAP_MODE_REFLECTION";if(i.envMap)switch(i.envMapMode){case zi:t="ENVMAP_MODE_REFRACTION";break}return t}function xm(i){let t="ENVMAP_BLENDING_NONE";if(i.envMap)switch(i.combine){case Bl:t="ENVMAP_BLENDING_MULTIPLY";break;case sh:t="ENVMAP_BLENDING_MIX";break;case rh:t="ENVMAP_BLENDING_ADD";break}return t}function Mm(i){const t=i.envMapCubeUVHeight;if(t===null)return null;const e=Math.log2(t)-2,n=1/t;return{texelWidth:1/(3*Math.max(Math.pow(2,e),112)),texelHeight:n,maxMip:e}}function Sm(i,t,e,n){const s=i.getContext(),r=e.defines;let a=e.vertexShader,o=e.fragmentShader;const l=gm(e),c=_m(e),h=vm(e),d=xm(e),p=Mm(e),f=lm(e),g=cm(r),v=s.createProgram();let m,u,T=e.glslVersion?"#version "+e.glslVersion+` +#define LOW_PRECISION`),t}function gm(i){let t="SHADOWMAP_TYPE_BASIC";return i.shadowMapType===Ol?t="SHADOWMAP_TYPE_PCF":i.shadowMapType===zc?t="SHADOWMAP_TYPE_PCF_SOFT":i.shadowMapType===yn&&(t="SHADOWMAP_TYPE_VSM"),t}function _m(i){let t="ENVMAP_TYPE_CUBE";if(i.envMap)switch(i.envMapMode){case Bi:case zi:t="ENVMAP_TYPE_CUBE";break;case fr:t="ENVMAP_TYPE_CUBE_UV";break}return t}function vm(i){let t="ENVMAP_MODE_REFLECTION";if(i.envMap)switch(i.envMapMode){case zi:t="ENVMAP_MODE_REFRACTION";break}return t}function xm(i){let t="ENVMAP_BLENDING_NONE";if(i.envMap)switch(i.combine){case Bl:t="ENVMAP_BLENDING_MULTIPLY";break;case sh:t="ENVMAP_BLENDING_MIX";break;case rh:t="ENVMAP_BLENDING_ADD";break}return t}function Mm(i){const t=i.envMapCubeUVHeight;if(t===null)return null;const e=Math.log2(t)-2,n=1/t;return{texelWidth:1/(3*Math.max(Math.pow(2,e),112)),texelHeight:n,maxMip:e}}function Sm(i,t,e,n){const s=i.getContext(),r=e.defines;let a=e.vertexShader,o=e.fragmentShader;const l=gm(e),c=_m(e),h=vm(e),f=xm(e),p=Mm(e),u=lm(e),g=cm(r),_=s.createProgram();let m,d,T=e.glslVersion?"#version "+e.glslVersion+` `:"";e.isRawShaderMaterial?(m=["#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g].filter(as).join(` `),m.length>0&&(m+=` -`),u=["#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g].filter(as).join(` -`),u.length>0&&(u+=` +`),d=["#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g].filter(as).join(` +`),d.length>0&&(d+=` `)):(m=[xl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",e.batching?"#define USE_BATCHING":"",e.batchingColor?"#define USE_BATCHING_COLOR":"",e.instancing?"#define USE_INSTANCING":"",e.instancingColor?"#define USE_INSTANCING_COLOR":"",e.instancingMorph?"#define USE_INSTANCING_MORPH":"",e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.map?"#define USE_MAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+h:"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.displacementMap?"#define USE_DISPLACEMENTMAP":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.mapUv?"#define MAP_UV "+e.mapUv:"",e.alphaMapUv?"#define ALPHAMAP_UV "+e.alphaMapUv:"",e.lightMapUv?"#define LIGHTMAP_UV "+e.lightMapUv:"",e.aoMapUv?"#define AOMAP_UV "+e.aoMapUv:"",e.emissiveMapUv?"#define EMISSIVEMAP_UV "+e.emissiveMapUv:"",e.bumpMapUv?"#define BUMPMAP_UV "+e.bumpMapUv:"",e.normalMapUv?"#define NORMALMAP_UV "+e.normalMapUv:"",e.displacementMapUv?"#define DISPLACEMENTMAP_UV "+e.displacementMapUv:"",e.metalnessMapUv?"#define METALNESSMAP_UV "+e.metalnessMapUv:"",e.roughnessMapUv?"#define ROUGHNESSMAP_UV "+e.roughnessMapUv:"",e.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+e.anisotropyMapUv:"",e.clearcoatMapUv?"#define CLEARCOATMAP_UV "+e.clearcoatMapUv:"",e.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+e.clearcoatNormalMapUv:"",e.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+e.clearcoatRoughnessMapUv:"",e.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+e.iridescenceMapUv:"",e.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+e.iridescenceThicknessMapUv:"",e.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+e.sheenColorMapUv:"",e.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+e.sheenRoughnessMapUv:"",e.specularMapUv?"#define SPECULARMAP_UV "+e.specularMapUv:"",e.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+e.specularColorMapUv:"",e.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+e.specularIntensityMapUv:"",e.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+e.transmissionMapUv:"",e.thicknessMapUv?"#define THICKNESSMAP_UV "+e.thicknessMapUv:"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.flatShading?"#define FLAT_SHADED":"",e.skinning?"#define USE_SKINNING":"",e.morphTargets?"#define USE_MORPHTARGETS":"",e.morphNormals&&e.flatShading===!1?"#define USE_MORPHNORMALS":"",e.morphColors?"#define USE_MORPHCOLORS":"",e.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+e.morphTextureStride:"",e.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+e.morphTargetsCount:"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.sizeAttenuation?"#define USE_SIZEATTENUATION":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` `].filter(as).join(` -`),u=[xl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",e.map?"#define USE_MAP":"",e.matcap?"#define USE_MATCAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+c:"",e.envMap?"#define "+h:"",e.envMap?"#define "+d:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoat?"#define USE_CLEARCOAT":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.dispersion?"#define USE_DISPERSION":"",e.iridescence?"#define USE_IRIDESCENCE":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaTest?"#define USE_ALPHATEST":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.sheen?"#define USE_SHEEN":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors||e.instancingColor||e.batchingColor?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",e.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",e.toneMapping!==On?"#define TONE_MAPPING":"",e.toneMapping!==On?Vt.tonemapping_pars_fragment:"",e.toneMapping!==On?am("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.opaque?"#define OPAQUE":"",Vt.colorspace_pars_fragment,rm("linearToOutputTexel",e.outputColorSpace),om(),e.useDepthPacking?"#define DEPTH_PACKING "+e.depthPacking:"",` +`),d=[xl(e),"#define SHADER_TYPE "+e.shaderType,"#define SHADER_NAME "+e.shaderName,g,e.useFog&&e.fog?"#define USE_FOG":"",e.useFog&&e.fogExp2?"#define FOG_EXP2":"",e.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",e.map?"#define USE_MAP":"",e.matcap?"#define USE_MATCAP":"",e.envMap?"#define USE_ENVMAP":"",e.envMap?"#define "+c:"",e.envMap?"#define "+h:"",e.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",e.lightMap?"#define USE_LIGHTMAP":"",e.aoMap?"#define USE_AOMAP":"",e.bumpMap?"#define USE_BUMPMAP":"",e.normalMap?"#define USE_NORMALMAP":"",e.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",e.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",e.emissiveMap?"#define USE_EMISSIVEMAP":"",e.anisotropy?"#define USE_ANISOTROPY":"",e.anisotropyMap?"#define USE_ANISOTROPYMAP":"",e.clearcoat?"#define USE_CLEARCOAT":"",e.clearcoatMap?"#define USE_CLEARCOATMAP":"",e.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",e.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",e.dispersion?"#define USE_DISPERSION":"",e.iridescence?"#define USE_IRIDESCENCE":"",e.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",e.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",e.specularMap?"#define USE_SPECULARMAP":"",e.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",e.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",e.roughnessMap?"#define USE_ROUGHNESSMAP":"",e.metalnessMap?"#define USE_METALNESSMAP":"",e.alphaMap?"#define USE_ALPHAMAP":"",e.alphaTest?"#define USE_ALPHATEST":"",e.alphaHash?"#define USE_ALPHAHASH":"",e.sheen?"#define USE_SHEEN":"",e.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",e.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",e.transmission?"#define USE_TRANSMISSION":"",e.transmissionMap?"#define USE_TRANSMISSIONMAP":"",e.thicknessMap?"#define USE_THICKNESSMAP":"",e.vertexTangents&&e.flatShading===!1?"#define USE_TANGENT":"",e.vertexColors||e.instancingColor||e.batchingColor?"#define USE_COLOR":"",e.vertexAlphas?"#define USE_COLOR_ALPHA":"",e.vertexUv1s?"#define USE_UV1":"",e.vertexUv2s?"#define USE_UV2":"",e.vertexUv3s?"#define USE_UV3":"",e.pointsUvs?"#define USE_POINTS_UV":"",e.gradientMap?"#define USE_GRADIENTMAP":"",e.flatShading?"#define FLAT_SHADED":"",e.doubleSided?"#define DOUBLE_SIDED":"",e.flipSided?"#define FLIP_SIDED":"",e.shadowMapEnabled?"#define USE_SHADOWMAP":"",e.shadowMapEnabled?"#define "+l:"",e.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",e.numLightProbes>0?"#define USE_LIGHT_PROBES":"",e.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",e.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",e.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",e.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",e.toneMapping!==On?"#define TONE_MAPPING":"",e.toneMapping!==On?Vt.tonemapping_pars_fragment:"",e.toneMapping!==On?am("toneMapping",e.toneMapping):"",e.dithering?"#define DITHERING":"",e.opaque?"#define OPAQUE":"",Vt.colorspace_pars_fragment,rm("linearToOutputTexel",e.outputColorSpace),om(),e.useDepthPacking?"#define DEPTH_PACKING "+e.depthPacking:"",` `].filter(as).join(` `)),a=Xa(a),a=gl(a,e),a=_l(a,e),o=Xa(o),o=gl(o,e),o=_l(o,e),a=vl(a),o=vl(o),e.isRawShaderMaterial!==!0&&(T=`#version 300 es -`,m=[f,"#define attribute in","#define varying out","#define texture2D texture"].join(` +`,m=[u,"#define attribute in","#define varying out","#define texture2D texture"].join(` `)+` -`+m,u=["#define varying in",e.glslVersion===_o?"":"layout(location = 0) out highp vec4 pc_fragColor;",e.glslVersion===_o?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` +`+m,d=["#define varying in",e.glslVersion===_o?"":"layout(location = 0) out highp vec4 pc_fragColor;",e.glslVersion===_o?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` `)+` -`+u);const b=T+m+a,y=T+u+o,L=fl(s,s.VERTEX_SHADER,b),R=fl(s,s.FRAGMENT_SHADER,y);s.attachShader(v,L),s.attachShader(v,R),e.index0AttributeName!==void 0?s.bindAttribLocation(v,0,e.index0AttributeName):e.morphTargets===!0&&s.bindAttribLocation(v,0,"position"),s.linkProgram(v);function A(D){if(i.debug.checkShaderErrors){const W=s.getProgramInfoLog(v).trim(),z=s.getShaderInfoLog(L).trim(),V=s.getShaderInfoLog(R).trim();let $=!0,G=!0;if(s.getProgramParameter(v,s.LINK_STATUS)===!1)if($=!1,typeof i.debug.onShaderError=="function")i.debug.onShaderError(s,v,L,R);else{const J=ml(s,L,"vertex"),k=ml(s,R,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(v,s.VALIDATE_STATUS)+` +`+d);const E=T+m+a,y=T+d+o,L=fl(s,s.VERTEX_SHADER,E),R=fl(s,s.FRAGMENT_SHADER,y);s.attachShader(_,L),s.attachShader(_,R),e.index0AttributeName!==void 0?s.bindAttribLocation(_,0,e.index0AttributeName):e.morphTargets===!0&&s.bindAttribLocation(_,0,"position"),s.linkProgram(_);function A(D){if(i.debug.checkShaderErrors){const W=s.getProgramInfoLog(_).trim(),z=s.getShaderInfoLog(L).trim(),V=s.getShaderInfoLog(R).trim();let $=!0,G=!0;if(s.getProgramParameter(_,s.LINK_STATUS)===!1)if($=!1,typeof i.debug.onShaderError=="function")i.debug.onShaderError(s,_,L,R);else{const J=ml(s,L,"vertex"),H=ml(s,R,"fragment");console.error("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(_,s.VALIDATE_STATUS)+` Material Name: `+D.name+` Material Type: `+D.type+` Program Info Log: `+W+` `+J+` -`+k)}else W!==""?console.warn("THREE.WebGLProgram: Program Info Log:",W):(z===""||V==="")&&(G=!1);G&&(D.diagnostics={runnable:$,programLog:W,vertexShader:{log:z,prefix:m},fragmentShader:{log:V,prefix:u}})}s.deleteShader(L),s.deleteShader(R),U=new tr(s,v),S=hm(s,v)}let U;this.getUniforms=function(){return U===void 0&&A(this),U};let S;this.getAttributes=function(){return S===void 0&&A(this),S};let M=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return M===!1&&(M=s.getProgramParameter(v,em)),M},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(v),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=nm++,this.cacheKey=t,this.usedTimes=1,this.program=v,this.vertexShader=L,this.fragmentShader=R,this}let ym=0;class Em{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(t);return a.has(s)===!1&&(a.add(s),s.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;let n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){const e=this.shaderCache;let n=e.get(t);return n===void 0&&(n=new bm(t),e.set(t,n)),n}}class bm{constructor(t){this.id=ym++,this.code=t,this.usedTimes=0}}function Tm(i,t,e,n,s,r,a){const o=new to,l=new Em,c=new Set,h=[],d=s.logarithmicDepthBuffer,p=s.vertexTextures;let f=s.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function v(S){return c.add(S),S===0?"uv":`uv${S}`}function m(S,M,D,W,z){const V=W.fog,$=z.geometry,G=S.isMeshStandardMaterial?W.environment:null,J=(S.isMeshStandardMaterial?e:t).get(S.envMap||G),k=J&&J.mapping===fr?J.image.height:null,it=g[S.type];S.precision!==null&&(f=s.getMaxPrecision(S.precision),f!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",f,"instead."));const ut=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,yt=ut!==void 0?ut.length:0;let Lt=0;$.morphAttributes.position!==void 0&&(Lt=1),$.morphAttributes.normal!==void 0&&(Lt=2),$.morphAttributes.color!==void 0&&(Lt=3);let qt,Y,nt,xt;if(it){const Jt=cn[it];qt=Jt.vertexShader,Y=Jt.fragmentShader}else qt=S.vertexShader,Y=S.fragmentShader,l.update(S),nt=l.getVertexShaderID(S),xt=l.getFragmentShaderID(S);const at=i.getRenderTarget(),wt=i.state.buffers.depth.getReversed(),Ut=z.isInstancedMesh===!0,Gt=z.isBatchedMesh===!0,ce=!!S.map,rt=!!S.matcap,Ct=!!J,w=!!S.aoMap,ve=!!S.lightMap,Bt=!!S.bumpMap,kt=!!S.normalMap,Mt=!!S.displacementMap,ne=!!S.emissiveMap,Et=!!S.metalnessMap,E=!!S.roughnessMap,_=S.anisotropy>0,F=S.clearcoat>0,Z=S.dispersion>0,K=S.iridescence>0,X=S.sheen>0,St=S.transmission>0,ot=_&&!!S.anisotropyMap,dt=F&&!!S.clearcoatMap,jt=F&&!!S.clearcoatNormalMap,tt=F&&!!S.clearcoatRoughnessMap,mt=K&&!!S.iridescenceMap,bt=K&&!!S.iridescenceThicknessMap,Pt=X&&!!S.sheenColorMap,ft=X&&!!S.sheenRoughnessMap,Xt=!!S.specularMap,zt=!!S.specularColorMap,se=!!S.specularIntensityMap,C=St&&!!S.transmissionMap,et=St&&!!S.thicknessMap,H=!!S.gradientMap,q=!!S.alphaMap,lt=S.alphaTest>0,ct=!!S.alphaHash,Nt=!!S.extensions;let ue=On;S.toneMapped&&(at===null||at.isXRRenderTarget===!0)&&(ue=i.toneMapping);const xe={shaderID:it,shaderType:S.type,shaderName:S.name,vertexShader:qt,fragmentShader:Y,defines:S.defines,customVertexShaderID:nt,customFragmentShaderID:xt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:f,batching:Gt,batchingColor:Gt&&z._colorsTexture!==null,instancing:Ut,instancingColor:Ut&&z.instanceColor!==null,instancingMorph:Ut&&z.morphTexture!==null,supportsVertexTextures:p,outputColorSpace:at===null?i.outputColorSpace:at.isXRRenderTarget===!0?at.texture.colorSpace:Vi,alphaToCoverage:!!S.alphaToCoverage,map:ce,matcap:rt,envMap:Ct,envMapMode:Ct&&J.mapping,envMapCubeUVHeight:k,aoMap:w,lightMap:ve,bumpMap:Bt,normalMap:kt,displacementMap:p&&Mt,emissiveMap:ne,normalMapObjectSpace:kt&&S.normalMapType===mh,normalMapTangentSpace:kt&&S.normalMapType===Kl,metalnessMap:Et,roughnessMap:E,anisotropy:_,anisotropyMap:ot,clearcoat:F,clearcoatMap:dt,clearcoatNormalMap:jt,clearcoatRoughnessMap:tt,dispersion:Z,iridescence:K,iridescenceMap:mt,iridescenceThicknessMap:bt,sheen:X,sheenColorMap:Pt,sheenRoughnessMap:ft,specularMap:Xt,specularColorMap:zt,specularIntensityMap:se,transmission:St,transmissionMap:C,thicknessMap:et,gradientMap:H,opaque:S.transparent===!1&&S.blending===Ui&&S.alphaToCoverage===!1,alphaMap:q,alphaTest:lt,alphaHash:ct,combine:S.combine,mapUv:ce&&v(S.map.channel),aoMapUv:w&&v(S.aoMap.channel),lightMapUv:ve&&v(S.lightMap.channel),bumpMapUv:Bt&&v(S.bumpMap.channel),normalMapUv:kt&&v(S.normalMap.channel),displacementMapUv:Mt&&v(S.displacementMap.channel),emissiveMapUv:ne&&v(S.emissiveMap.channel),metalnessMapUv:Et&&v(S.metalnessMap.channel),roughnessMapUv:E&&v(S.roughnessMap.channel),anisotropyMapUv:ot&&v(S.anisotropyMap.channel),clearcoatMapUv:dt&&v(S.clearcoatMap.channel),clearcoatNormalMapUv:jt&&v(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:tt&&v(S.clearcoatRoughnessMap.channel),iridescenceMapUv:mt&&v(S.iridescenceMap.channel),iridescenceThicknessMapUv:bt&&v(S.iridescenceThicknessMap.channel),sheenColorMapUv:Pt&&v(S.sheenColorMap.channel),sheenRoughnessMapUv:ft&&v(S.sheenRoughnessMap.channel),specularMapUv:Xt&&v(S.specularMap.channel),specularColorMapUv:zt&&v(S.specularColorMap.channel),specularIntensityMapUv:se&&v(S.specularIntensityMap.channel),transmissionMapUv:C&&v(S.transmissionMap.channel),thicknessMapUv:et&&v(S.thicknessMap.channel),alphaMapUv:q&&v(S.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(kt||_),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:z.isPoints===!0&&!!$.attributes.uv&&(ce||q),fog:!!V,useFog:S.fog===!0,fogExp2:!!V&&V.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:d,reverseDepthBuffer:wt,skinning:z.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:yt,morphTextureStride:Lt,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&D.length>0,shadowMapType:i.shadowMap.type,toneMapping:ue,decodeVideoTexture:ce&&S.map.isVideoTexture===!0&&$t.getTransfer(S.map.colorSpace)===re,decodeVideoTextureEmissive:ne&&S.emissiveMap.isVideoTexture===!0&&$t.getTransfer(S.emissiveMap.colorSpace)===re,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===hn,flipSided:S.side===ke,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Nt&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Nt&&S.extensions.multiDraw===!0||Gt)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return xe.vertexUv1s=c.has(1),xe.vertexUv2s=c.has(2),xe.vertexUv3s=c.has(3),c.clear(),xe}function u(S){const M=[];if(S.shaderID?M.push(S.shaderID):(M.push(S.customVertexShaderID),M.push(S.customFragmentShaderID)),S.defines!==void 0)for(const D in S.defines)M.push(D),M.push(S.defines[D]);return S.isRawShaderMaterial===!1&&(T(M,S),b(M,S),M.push(i.outputColorSpace)),M.push(S.customProgramCacheKey),M.join()}function T(S,M){S.push(M.precision),S.push(M.outputColorSpace),S.push(M.envMapMode),S.push(M.envMapCubeUVHeight),S.push(M.mapUv),S.push(M.alphaMapUv),S.push(M.lightMapUv),S.push(M.aoMapUv),S.push(M.bumpMapUv),S.push(M.normalMapUv),S.push(M.displacementMapUv),S.push(M.emissiveMapUv),S.push(M.metalnessMapUv),S.push(M.roughnessMapUv),S.push(M.anisotropyMapUv),S.push(M.clearcoatMapUv),S.push(M.clearcoatNormalMapUv),S.push(M.clearcoatRoughnessMapUv),S.push(M.iridescenceMapUv),S.push(M.iridescenceThicknessMapUv),S.push(M.sheenColorMapUv),S.push(M.sheenRoughnessMapUv),S.push(M.specularMapUv),S.push(M.specularColorMapUv),S.push(M.specularIntensityMapUv),S.push(M.transmissionMapUv),S.push(M.thicknessMapUv),S.push(M.combine),S.push(M.fogExp2),S.push(M.sizeAttenuation),S.push(M.morphTargetsCount),S.push(M.morphAttributeCount),S.push(M.numDirLights),S.push(M.numPointLights),S.push(M.numSpotLights),S.push(M.numSpotLightMaps),S.push(M.numHemiLights),S.push(M.numRectAreaLights),S.push(M.numDirLightShadows),S.push(M.numPointLightShadows),S.push(M.numSpotLightShadows),S.push(M.numSpotLightShadowsWithMaps),S.push(M.numLightProbes),S.push(M.shadowMapType),S.push(M.toneMapping),S.push(M.numClippingPlanes),S.push(M.numClipIntersection),S.push(M.depthPacking)}function b(S,M){o.disableAll(),M.supportsVertexTextures&&o.enable(0),M.instancing&&o.enable(1),M.instancingColor&&o.enable(2),M.instancingMorph&&o.enable(3),M.matcap&&o.enable(4),M.envMap&&o.enable(5),M.normalMapObjectSpace&&o.enable(6),M.normalMapTangentSpace&&o.enable(7),M.clearcoat&&o.enable(8),M.iridescence&&o.enable(9),M.alphaTest&&o.enable(10),M.vertexColors&&o.enable(11),M.vertexAlphas&&o.enable(12),M.vertexUv1s&&o.enable(13),M.vertexUv2s&&o.enable(14),M.vertexUv3s&&o.enable(15),M.vertexTangents&&o.enable(16),M.anisotropy&&o.enable(17),M.alphaHash&&o.enable(18),M.batching&&o.enable(19),M.dispersion&&o.enable(20),M.batchingColor&&o.enable(21),S.push(o.mask),o.disableAll(),M.fog&&o.enable(0),M.useFog&&o.enable(1),M.flatShading&&o.enable(2),M.logarithmicDepthBuffer&&o.enable(3),M.reverseDepthBuffer&&o.enable(4),M.skinning&&o.enable(5),M.morphTargets&&o.enable(6),M.morphNormals&&o.enable(7),M.morphColors&&o.enable(8),M.premultipliedAlpha&&o.enable(9),M.shadowMapEnabled&&o.enable(10),M.doubleSided&&o.enable(11),M.flipSided&&o.enable(12),M.useDepthPacking&&o.enable(13),M.dithering&&o.enable(14),M.transmission&&o.enable(15),M.sheen&&o.enable(16),M.opaque&&o.enable(17),M.pointsUvs&&o.enable(18),M.decodeVideoTexture&&o.enable(19),M.decodeVideoTextureEmissive&&o.enable(20),M.alphaToCoverage&&o.enable(21),S.push(o.mask)}function y(S){const M=g[S.type];let D;if(M){const W=cn[M];D=ar.clone(W.uniforms)}else D=S.uniforms;return D}function L(S,M){let D;for(let W=0,z=h.length;W0?n.push(u):f.transparent===!0?s.push(u):e.push(u)}function l(d,p,f,g,v,m){const u=a(d,p,f,g,v,m);f.transmission>0?n.unshift(u):f.transparent===!0?s.unshift(u):e.unshift(u)}function c(d,p){e.length>1&&e.sort(d||Am),n.length>1&&n.sort(p||Ml),s.length>1&&s.sort(p||Ml)}function h(){for(let d=t,p=i.length;d=r.length?(a=new Sl,r.push(a)):a=r[s],a}function e(){i=new WeakMap}return{get:t,dispose:e}}function Cm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={direction:new P,color:new pt};break;case"SpotLight":e={position:new P,direction:new P,color:new pt,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":e={position:new P,color:new pt,distance:0,decay:0};break;case"HemisphereLight":e={direction:new P,skyColor:new pt,groundColor:new pt};break;case"RectAreaLight":e={color:new pt,position:new P,halfWidth:new P,halfHeight:new P};break}return i[t.id]=e,e}}}function Pm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"SpotLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}let Dm=0;function Lm(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function Um(i){const t=new Cm,e=Pm(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const s=new P,r=new ee,a=new ee;function o(c){let h=0,d=0,p=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let f=0,g=0,v=0,m=0,u=0,T=0,b=0,y=0,L=0,R=0,A=0;c.sort(Lm);for(let S=0,M=c.length;S0&&(i.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=st.LTC_FLOAT_1,n.rectAreaLTC2=st.LTC_FLOAT_2):(n.rectAreaLTC1=st.LTC_HALF_1,n.rectAreaLTC2=st.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=d,n.ambient[2]=p;const U=n.hash;(U.directionalLength!==f||U.pointLength!==g||U.spotLength!==v||U.rectAreaLength!==m||U.hemiLength!==u||U.numDirectionalShadows!==T||U.numPointShadows!==b||U.numSpotShadows!==y||U.numSpotMaps!==L||U.numLightProbes!==A)&&(n.directional.length=f,n.spot.length=v,n.rectArea.length=m,n.point.length=g,n.hemi.length=u,n.directionalShadow.length=T,n.directionalShadowMap.length=T,n.pointShadow.length=b,n.pointShadowMap.length=b,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=T,n.pointShadowMatrix.length=b,n.spotLightMatrix.length=y+L-R,n.spotLightMap.length=L,n.numSpotLightShadowsWithMaps=R,n.numLightProbes=A,U.directionalLength=f,U.pointLength=g,U.spotLength=v,U.rectAreaLength=m,U.hemiLength=u,U.numDirectionalShadows=T,U.numPointShadows=b,U.numSpotShadows=y,U.numSpotMaps=L,U.numLightProbes=A,n.version=Dm++)}function l(c,h){let d=0,p=0,f=0,g=0,v=0;const m=h.matrixWorldInverse;for(let u=0,T=c.length;u=a.length?(o=new yl(i),a.push(o)):o=a[r],o}function n(){t=new WeakMap}return{get:e,dispose:n}}const Nm=`void main() { +`+H)}else W!==""?console.warn("THREE.WebGLProgram: Program Info Log:",W):(z===""||V==="")&&(G=!1);G&&(D.diagnostics={runnable:$,programLog:W,vertexShader:{log:z,prefix:m},fragmentShader:{log:V,prefix:d}})}s.deleteShader(L),s.deleteShader(R),U=new tr(s,_),S=hm(s,_)}let U;this.getUniforms=function(){return U===void 0&&A(this),U};let S;this.getAttributes=function(){return S===void 0&&A(this),S};let M=e.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return M===!1&&(M=s.getProgramParameter(_,em)),M},this.destroy=function(){n.releaseStatesOfProgram(this),s.deleteProgram(_),this.program=void 0},this.type=e.shaderType,this.name=e.shaderName,this.id=nm++,this.cacheKey=t,this.usedTimes=1,this.program=_,this.vertexShader=L,this.fragmentShader=R,this}let ym=0;class Em{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(t){const e=t.vertexShader,n=t.fragmentShader,s=this._getShaderStage(e),r=this._getShaderStage(n),a=this._getShaderCacheForMaterial(t);return a.has(s)===!1&&(a.add(s),s.usedTimes++),a.has(r)===!1&&(a.add(r),r.usedTimes++),this}remove(t){const e=this.materialCache.get(t);for(const n of e)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(t),this}getVertexShaderID(t){return this._getShaderStage(t.vertexShader).id}getFragmentShaderID(t){return this._getShaderStage(t.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(t){const e=this.materialCache;let n=e.get(t);return n===void 0&&(n=new Set,e.set(t,n)),n}_getShaderStage(t){const e=this.shaderCache;let n=e.get(t);return n===void 0&&(n=new bm(t),e.set(t,n)),n}}class bm{constructor(t){this.id=ym++,this.code=t,this.usedTimes=0}}function Tm(i,t,e,n,s,r,a){const o=new to,l=new Em,c=new Set,h=[],f=s.logarithmicDepthBuffer,p=s.vertexTextures;let u=s.precision;const g={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function _(S){return c.add(S),S===0?"uv":`uv${S}`}function m(S,M,D,W,z){const V=W.fog,$=z.geometry,G=S.isMeshStandardMaterial?W.environment:null,J=(S.isMeshStandardMaterial?e:t).get(S.envMap||G),H=J&&J.mapping===fr?J.image.height:null,it=g[S.type];S.precision!==null&&(u=s.getMaxPrecision(S.precision),u!==S.precision&&console.warn("THREE.WebGLProgram.getParameters:",S.precision,"not supported, using",u,"instead."));const dt=$.morphAttributes.position||$.morphAttributes.normal||$.morphAttributes.color,yt=dt!==void 0?dt.length:0;let Lt=0;$.morphAttributes.position!==void 0&&(Lt=1),$.morphAttributes.normal!==void 0&&(Lt=2),$.morphAttributes.color!==void 0&&(Lt=3);let qt,Y,nt,xt;if(it){const Jt=cn[it];qt=Jt.vertexShader,Y=Jt.fragmentShader}else qt=S.vertexShader,Y=S.fragmentShader,l.update(S),nt=l.getVertexShaderID(S),xt=l.getFragmentShaderID(S);const ot=i.getRenderTarget(),wt=i.state.buffers.depth.getReversed(),Ut=z.isInstancedMesh===!0,Gt=z.isBatchedMesh===!0,ce=!!S.map,rt=!!S.matcap,Ct=!!J,w=!!S.aoMap,ve=!!S.lightMap,Bt=!!S.bumpMap,Ht=!!S.normalMap,Mt=!!S.displacementMap,ne=!!S.emissiveMap,Et=!!S.metalnessMap,b=!!S.roughnessMap,v=S.anisotropy>0,F=S.clearcoat>0,Z=S.dispersion>0,K=S.iridescence>0,X=S.sheen>0,St=S.transmission>0,lt=v&&!!S.anisotropyMap,ft=F&&!!S.clearcoatMap,jt=F&&!!S.clearcoatNormalMap,tt=F&&!!S.clearcoatRoughnessMap,mt=K&&!!S.iridescenceMap,bt=K&&!!S.iridescenceThicknessMap,Pt=X&&!!S.sheenColorMap,pt=X&&!!S.sheenRoughnessMap,Xt=!!S.specularMap,zt=!!S.specularColorMap,se=!!S.specularIntensityMap,C=St&&!!S.transmissionMap,et=St&&!!S.thicknessMap,k=!!S.gradientMap,q=!!S.alphaMap,ct=S.alphaTest>0,ht=!!S.alphaHash,Nt=!!S.extensions;let ue=On;S.toneMapped&&(ot===null||ot.isXRRenderTarget===!0)&&(ue=i.toneMapping);const xe={shaderID:it,shaderType:S.type,shaderName:S.name,vertexShader:qt,fragmentShader:Y,defines:S.defines,customVertexShaderID:nt,customFragmentShaderID:xt,isRawShaderMaterial:S.isRawShaderMaterial===!0,glslVersion:S.glslVersion,precision:u,batching:Gt,batchingColor:Gt&&z._colorsTexture!==null,instancing:Ut,instancingColor:Ut&&z.instanceColor!==null,instancingMorph:Ut&&z.morphTexture!==null,supportsVertexTextures:p,outputColorSpace:ot===null?i.outputColorSpace:ot.isXRRenderTarget===!0?ot.texture.colorSpace:Vi,alphaToCoverage:!!S.alphaToCoverage,map:ce,matcap:rt,envMap:Ct,envMapMode:Ct&&J.mapping,envMapCubeUVHeight:H,aoMap:w,lightMap:ve,bumpMap:Bt,normalMap:Ht,displacementMap:p&&Mt,emissiveMap:ne,normalMapObjectSpace:Ht&&S.normalMapType===mh,normalMapTangentSpace:Ht&&S.normalMapType===Kl,metalnessMap:Et,roughnessMap:b,anisotropy:v,anisotropyMap:lt,clearcoat:F,clearcoatMap:ft,clearcoatNormalMap:jt,clearcoatRoughnessMap:tt,dispersion:Z,iridescence:K,iridescenceMap:mt,iridescenceThicknessMap:bt,sheen:X,sheenColorMap:Pt,sheenRoughnessMap:pt,specularMap:Xt,specularColorMap:zt,specularIntensityMap:se,transmission:St,transmissionMap:C,thicknessMap:et,gradientMap:k,opaque:S.transparent===!1&&S.blending===Ui&&S.alphaToCoverage===!1,alphaMap:q,alphaTest:ct,alphaHash:ht,combine:S.combine,mapUv:ce&&_(S.map.channel),aoMapUv:w&&_(S.aoMap.channel),lightMapUv:ve&&_(S.lightMap.channel),bumpMapUv:Bt&&_(S.bumpMap.channel),normalMapUv:Ht&&_(S.normalMap.channel),displacementMapUv:Mt&&_(S.displacementMap.channel),emissiveMapUv:ne&&_(S.emissiveMap.channel),metalnessMapUv:Et&&_(S.metalnessMap.channel),roughnessMapUv:b&&_(S.roughnessMap.channel),anisotropyMapUv:lt&&_(S.anisotropyMap.channel),clearcoatMapUv:ft&&_(S.clearcoatMap.channel),clearcoatNormalMapUv:jt&&_(S.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:tt&&_(S.clearcoatRoughnessMap.channel),iridescenceMapUv:mt&&_(S.iridescenceMap.channel),iridescenceThicknessMapUv:bt&&_(S.iridescenceThicknessMap.channel),sheenColorMapUv:Pt&&_(S.sheenColorMap.channel),sheenRoughnessMapUv:pt&&_(S.sheenRoughnessMap.channel),specularMapUv:Xt&&_(S.specularMap.channel),specularColorMapUv:zt&&_(S.specularColorMap.channel),specularIntensityMapUv:se&&_(S.specularIntensityMap.channel),transmissionMapUv:C&&_(S.transmissionMap.channel),thicknessMapUv:et&&_(S.thicknessMap.channel),alphaMapUv:q&&_(S.alphaMap.channel),vertexTangents:!!$.attributes.tangent&&(Ht||v),vertexColors:S.vertexColors,vertexAlphas:S.vertexColors===!0&&!!$.attributes.color&&$.attributes.color.itemSize===4,pointsUvs:z.isPoints===!0&&!!$.attributes.uv&&(ce||q),fog:!!V,useFog:S.fog===!0,fogExp2:!!V&&V.isFogExp2,flatShading:S.flatShading===!0,sizeAttenuation:S.sizeAttenuation===!0,logarithmicDepthBuffer:f,reverseDepthBuffer:wt,skinning:z.isSkinnedMesh===!0,morphTargets:$.morphAttributes.position!==void 0,morphNormals:$.morphAttributes.normal!==void 0,morphColors:$.morphAttributes.color!==void 0,morphTargetsCount:yt,morphTextureStride:Lt,numDirLights:M.directional.length,numPointLights:M.point.length,numSpotLights:M.spot.length,numSpotLightMaps:M.spotLightMap.length,numRectAreaLights:M.rectArea.length,numHemiLights:M.hemi.length,numDirLightShadows:M.directionalShadowMap.length,numPointLightShadows:M.pointShadowMap.length,numSpotLightShadows:M.spotShadowMap.length,numSpotLightShadowsWithMaps:M.numSpotLightShadowsWithMaps,numLightProbes:M.numLightProbes,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,dithering:S.dithering,shadowMapEnabled:i.shadowMap.enabled&&D.length>0,shadowMapType:i.shadowMap.type,toneMapping:ue,decodeVideoTexture:ce&&S.map.isVideoTexture===!0&&$t.getTransfer(S.map.colorSpace)===re,decodeVideoTextureEmissive:ne&&S.emissiveMap.isVideoTexture===!0&&$t.getTransfer(S.emissiveMap.colorSpace)===re,premultipliedAlpha:S.premultipliedAlpha,doubleSided:S.side===hn,flipSided:S.side===He,useDepthPacking:S.depthPacking>=0,depthPacking:S.depthPacking||0,index0AttributeName:S.index0AttributeName,extensionClipCullDistance:Nt&&S.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Nt&&S.extensions.multiDraw===!0||Gt)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:S.customProgramCacheKey()};return xe.vertexUv1s=c.has(1),xe.vertexUv2s=c.has(2),xe.vertexUv3s=c.has(3),c.clear(),xe}function d(S){const M=[];if(S.shaderID?M.push(S.shaderID):(M.push(S.customVertexShaderID),M.push(S.customFragmentShaderID)),S.defines!==void 0)for(const D in S.defines)M.push(D),M.push(S.defines[D]);return S.isRawShaderMaterial===!1&&(T(M,S),E(M,S),M.push(i.outputColorSpace)),M.push(S.customProgramCacheKey),M.join()}function T(S,M){S.push(M.precision),S.push(M.outputColorSpace),S.push(M.envMapMode),S.push(M.envMapCubeUVHeight),S.push(M.mapUv),S.push(M.alphaMapUv),S.push(M.lightMapUv),S.push(M.aoMapUv),S.push(M.bumpMapUv),S.push(M.normalMapUv),S.push(M.displacementMapUv),S.push(M.emissiveMapUv),S.push(M.metalnessMapUv),S.push(M.roughnessMapUv),S.push(M.anisotropyMapUv),S.push(M.clearcoatMapUv),S.push(M.clearcoatNormalMapUv),S.push(M.clearcoatRoughnessMapUv),S.push(M.iridescenceMapUv),S.push(M.iridescenceThicknessMapUv),S.push(M.sheenColorMapUv),S.push(M.sheenRoughnessMapUv),S.push(M.specularMapUv),S.push(M.specularColorMapUv),S.push(M.specularIntensityMapUv),S.push(M.transmissionMapUv),S.push(M.thicknessMapUv),S.push(M.combine),S.push(M.fogExp2),S.push(M.sizeAttenuation),S.push(M.morphTargetsCount),S.push(M.morphAttributeCount),S.push(M.numDirLights),S.push(M.numPointLights),S.push(M.numSpotLights),S.push(M.numSpotLightMaps),S.push(M.numHemiLights),S.push(M.numRectAreaLights),S.push(M.numDirLightShadows),S.push(M.numPointLightShadows),S.push(M.numSpotLightShadows),S.push(M.numSpotLightShadowsWithMaps),S.push(M.numLightProbes),S.push(M.shadowMapType),S.push(M.toneMapping),S.push(M.numClippingPlanes),S.push(M.numClipIntersection),S.push(M.depthPacking)}function E(S,M){o.disableAll(),M.supportsVertexTextures&&o.enable(0),M.instancing&&o.enable(1),M.instancingColor&&o.enable(2),M.instancingMorph&&o.enable(3),M.matcap&&o.enable(4),M.envMap&&o.enable(5),M.normalMapObjectSpace&&o.enable(6),M.normalMapTangentSpace&&o.enable(7),M.clearcoat&&o.enable(8),M.iridescence&&o.enable(9),M.alphaTest&&o.enable(10),M.vertexColors&&o.enable(11),M.vertexAlphas&&o.enable(12),M.vertexUv1s&&o.enable(13),M.vertexUv2s&&o.enable(14),M.vertexUv3s&&o.enable(15),M.vertexTangents&&o.enable(16),M.anisotropy&&o.enable(17),M.alphaHash&&o.enable(18),M.batching&&o.enable(19),M.dispersion&&o.enable(20),M.batchingColor&&o.enable(21),S.push(o.mask),o.disableAll(),M.fog&&o.enable(0),M.useFog&&o.enable(1),M.flatShading&&o.enable(2),M.logarithmicDepthBuffer&&o.enable(3),M.reverseDepthBuffer&&o.enable(4),M.skinning&&o.enable(5),M.morphTargets&&o.enable(6),M.morphNormals&&o.enable(7),M.morphColors&&o.enable(8),M.premultipliedAlpha&&o.enable(9),M.shadowMapEnabled&&o.enable(10),M.doubleSided&&o.enable(11),M.flipSided&&o.enable(12),M.useDepthPacking&&o.enable(13),M.dithering&&o.enable(14),M.transmission&&o.enable(15),M.sheen&&o.enable(16),M.opaque&&o.enable(17),M.pointsUvs&&o.enable(18),M.decodeVideoTexture&&o.enable(19),M.decodeVideoTextureEmissive&&o.enable(20),M.alphaToCoverage&&o.enable(21),S.push(o.mask)}function y(S){const M=g[S.type];let D;if(M){const W=cn[M];D=ar.clone(W.uniforms)}else D=S.uniforms;return D}function L(S,M){let D;for(let W=0,z=h.length;W0?n.push(d):u.transparent===!0?s.push(d):e.push(d)}function l(f,p,u,g,_,m){const d=a(f,p,u,g,_,m);u.transmission>0?n.unshift(d):u.transparent===!0?s.unshift(d):e.unshift(d)}function c(f,p){e.length>1&&e.sort(f||Am),n.length>1&&n.sort(p||Ml),s.length>1&&s.sort(p||Ml)}function h(){for(let f=t,p=i.length;f=r.length?(a=new Sl,r.push(a)):a=r[s],a}function e(){i=new WeakMap}return{get:t,dispose:e}}function Cm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={direction:new P,color:new at};break;case"SpotLight":e={position:new P,direction:new P,color:new at,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":e={position:new P,color:new at,distance:0,decay:0};break;case"HemisphereLight":e={direction:new P,skyColor:new at,groundColor:new at};break;case"RectAreaLight":e={color:new at,position:new P,halfWidth:new P,halfHeight:new P};break}return i[t.id]=e,e}}}function Pm(){const i={};return{get:function(t){if(i[t.id]!==void 0)return i[t.id];let e;switch(t.type){case"DirectionalLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"SpotLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt};break;case"PointLight":e={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new vt,shadowCameraNear:1,shadowCameraFar:1e3};break}return i[t.id]=e,e}}}let Dm=0;function Lm(i,t){return(t.castShadow?2:0)-(i.castShadow?2:0)+(t.map?1:0)-(i.map?1:0)}function Um(i){const t=new Cm,e=Pm(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const s=new P,r=new ee,a=new ee;function o(c){let h=0,f=0,p=0;for(let S=0;S<9;S++)n.probe[S].set(0,0,0);let u=0,g=0,_=0,m=0,d=0,T=0,E=0,y=0,L=0,R=0,A=0;c.sort(Lm);for(let S=0,M=c.length;S0&&(i.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=st.LTC_FLOAT_1,n.rectAreaLTC2=st.LTC_FLOAT_2):(n.rectAreaLTC1=st.LTC_HALF_1,n.rectAreaLTC2=st.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=f,n.ambient[2]=p;const U=n.hash;(U.directionalLength!==u||U.pointLength!==g||U.spotLength!==_||U.rectAreaLength!==m||U.hemiLength!==d||U.numDirectionalShadows!==T||U.numPointShadows!==E||U.numSpotShadows!==y||U.numSpotMaps!==L||U.numLightProbes!==A)&&(n.directional.length=u,n.spot.length=_,n.rectArea.length=m,n.point.length=g,n.hemi.length=d,n.directionalShadow.length=T,n.directionalShadowMap.length=T,n.pointShadow.length=E,n.pointShadowMap.length=E,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=T,n.pointShadowMatrix.length=E,n.spotLightMatrix.length=y+L-R,n.spotLightMap.length=L,n.numSpotLightShadowsWithMaps=R,n.numLightProbes=A,U.directionalLength=u,U.pointLength=g,U.spotLength=_,U.rectAreaLength=m,U.hemiLength=d,U.numDirectionalShadows=T,U.numPointShadows=E,U.numSpotShadows=y,U.numSpotMaps=L,U.numLightProbes=A,n.version=Dm++)}function l(c,h){let f=0,p=0,u=0,g=0,_=0;const m=h.matrixWorldInverse;for(let d=0,T=c.length;d=a.length?(o=new yl(i),a.push(o)):o=a[r],o}function n(){t=new WeakMap}return{get:e,dispose:n}}const Nm=`void main() { gl_Position = vec4( position, 1.0 ); }`,Fm=`uniform sampler2D shadow_pass; uniform vec2 resolution; @@ -3800,7 +3800,7 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function Om(i,t,e){let n=new eo;const s=new vt,r=new vt,a=new le,o=new su({depthPacking:ph}),l=new ru,c={},h=e.maxTextureSize,d={[zn]:ke,[ke]:zn,[hn]:hn},p=new Fe({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:Nm,fragmentShader:Fm}),f=p.clone();f.defines.HORIZONTAL_PASS=1;const g=new pe;g.setAttribute("position",new he(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const v=new Se(g,p),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Ol;let u=this.type;this.render=function(R,A,U){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||R.length===0)return;const S=i.getRenderTarget(),M=i.getActiveCubeFace(),D=i.getActiveMipmapLevel(),W=i.state;W.setBlending(bn),W.buffers.color.setClear(1,1,1,1),W.buffers.depth.setTest(!0),W.setScissorTest(!1);const z=u!==yn&&this.type===yn,V=u===yn&&this.type!==yn;for(let $=0,G=R.length;$h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/it.x),s.x=r.x*it.x,k.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/it.y),s.y=r.y*it.y,k.mapSize.y=r.y)),k.map===null||z===!0||V===!0){const yt=this.type!==yn?{minFilter:qe,magFilter:qe}:{};k.map!==null&&k.map.dispose(),k.map=new on(s.x,s.y,yt),k.map.texture.name=J.name+".shadowMap",k.camera.updateProjectionMatrix()}i.setRenderTarget(k.map),i.clear();const ut=k.getViewportCount();for(let yt=0;yt0||A.map&&A.alphaTest>0){const W=M.uuid,z=A.uuid;let V=c[W];V===void 0&&(V={},c[W]=V);let $=V[z];$===void 0&&($=M.clone(),V[z]=$,A.addEventListener("dispose",L)),M=$}if(M.visible=A.visible,M.wireframe=A.wireframe,S===yn?M.side=A.shadowSide!==null?A.shadowSide:A.side:M.side=A.shadowSide!==null?A.shadowSide:d[A.side],M.alphaMap=A.alphaMap,M.alphaTest=A.alphaTest,M.map=A.map,M.clipShadows=A.clipShadows,M.clippingPlanes=A.clippingPlanes,M.clipIntersection=A.clipIntersection,M.displacementMap=A.displacementMap,M.displacementScale=A.displacementScale,M.displacementBias=A.displacementBias,M.wireframeLinewidth=A.wireframeLinewidth,M.linewidth=A.linewidth,U.isPointLight===!0&&M.isMeshDistanceMaterial===!0){const W=i.properties.get(M);W.light=U}return M}function y(R,A,U,S,M){if(R.visible===!1)return;if(R.layers.test(A.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&M===yn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(U.matrixWorldInverse,R.matrixWorld);const z=t.update(R),V=R.material;if(Array.isArray(V)){const $=z.groups;for(let G=0,J=$.length;G=1):k.indexOf("OpenGL ES")!==-1&&(J=parseFloat(/^OpenGL ES (\d)/.exec(k)[1]),G=J>=2);let it=null,ut={};const yt=i.getParameter(i.SCISSOR_BOX),Lt=i.getParameter(i.VIEWPORT),qt=new le().fromArray(yt),Y=new le().fromArray(Lt);function nt(C,et,H,q){const lt=new Uint8Array(4),ct=i.createTexture();i.bindTexture(C,ct),i.texParameteri(C,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(C,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Nt=0;Nt"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new vt,h=new WeakMap;let d;const p=new WeakMap;let f=!1;try{f=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function g(E,_){return f?new OffscreenCanvas(E,_):rr("canvas")}function v(E,_,F){let Z=1;const K=Et(E);if((K.width>F||K.height>F)&&(Z=F/Math.max(K.width,K.height)),Z<1)if(typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&E instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&E instanceof ImageBitmap||typeof VideoFrame<"u"&&E instanceof VideoFrame){const X=Math.floor(Z*K.width),St=Math.floor(Z*K.height);d===void 0&&(d=g(X,St));const ot=_?g(X,St):d;return ot.width=X,ot.height=St,ot.getContext("2d").drawImage(E,0,0,X,St),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+K.width+"x"+K.height+") to ("+X+"x"+St+")."),ot}else return"data"in E&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+K.width+"x"+K.height+")."),E;return E}function m(E){return E.generateMipmaps}function u(E){i.generateMipmap(E)}function T(E){return E.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:E.isWebGL3DRenderTarget?i.TEXTURE_3D:E.isWebGLArrayRenderTarget||E.isCompressedArrayTexture?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D}function b(E,_,F,Z,K=!1){if(E!==null){if(i[E]!==void 0)return i[E];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+E+"'")}let X=_;if(_===i.RED&&(F===i.FLOAT&&(X=i.R32F),F===i.HALF_FLOAT&&(X=i.R16F),F===i.UNSIGNED_BYTE&&(X=i.R8)),_===i.RED_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.R8UI),F===i.UNSIGNED_SHORT&&(X=i.R16UI),F===i.UNSIGNED_INT&&(X=i.R32UI),F===i.BYTE&&(X=i.R8I),F===i.SHORT&&(X=i.R16I),F===i.INT&&(X=i.R32I)),_===i.RG&&(F===i.FLOAT&&(X=i.RG32F),F===i.HALF_FLOAT&&(X=i.RG16F),F===i.UNSIGNED_BYTE&&(X=i.RG8)),_===i.RG_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RG8UI),F===i.UNSIGNED_SHORT&&(X=i.RG16UI),F===i.UNSIGNED_INT&&(X=i.RG32UI),F===i.BYTE&&(X=i.RG8I),F===i.SHORT&&(X=i.RG16I),F===i.INT&&(X=i.RG32I)),_===i.RGB_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGB8UI),F===i.UNSIGNED_SHORT&&(X=i.RGB16UI),F===i.UNSIGNED_INT&&(X=i.RGB32UI),F===i.BYTE&&(X=i.RGB8I),F===i.SHORT&&(X=i.RGB16I),F===i.INT&&(X=i.RGB32I)),_===i.RGBA_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGBA8UI),F===i.UNSIGNED_SHORT&&(X=i.RGBA16UI),F===i.UNSIGNED_INT&&(X=i.RGBA32UI),F===i.BYTE&&(X=i.RGBA8I),F===i.SHORT&&(X=i.RGBA16I),F===i.INT&&(X=i.RGBA32I)),_===i.RGB&&F===i.UNSIGNED_INT_5_9_9_9_REV&&(X=i.RGB9_E5),_===i.RGBA){const St=K?ir:$t.getTransfer(Z);F===i.FLOAT&&(X=i.RGBA32F),F===i.HALF_FLOAT&&(X=i.RGBA16F),F===i.UNSIGNED_BYTE&&(X=St===re?i.SRGB8_ALPHA8:i.RGBA8),F===i.UNSIGNED_SHORT_4_4_4_4&&(X=i.RGBA4),F===i.UNSIGNED_SHORT_5_5_5_1&&(X=i.RGB5_A1)}return(X===i.R16F||X===i.R32F||X===i.RG16F||X===i.RG32F||X===i.RGBA16F||X===i.RGBA32F)&&t.get("EXT_color_buffer_float"),X}function y(E,_){let F;return E?_===null||_===ni||_===Hi?F=i.DEPTH24_STENCIL8:_===fn?F=i.DEPTH32F_STENCIL8:_===ls&&(F=i.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):_===null||_===ni||_===Hi?F=i.DEPTH_COMPONENT24:_===fn?F=i.DEPTH_COMPONENT32F:_===ls&&(F=i.DEPTH_COMPONENT16),F}function L(E,_){return m(E)===!0||E.isFramebufferTexture&&E.minFilter!==qe&&E.minFilter!==dn?Math.log2(Math.max(_.width,_.height))+1:E.mipmaps!==void 0&&E.mipmaps.length>0?E.mipmaps.length:E.isCompressedTexture&&Array.isArray(E.image)?_.mipmaps.length:1}function R(E){const _=E.target;_.removeEventListener("dispose",R),U(_),_.isVideoTexture&&h.delete(_)}function A(E){const _=E.target;_.removeEventListener("dispose",A),M(_)}function U(E){const _=n.get(E);if(_.__webglInit===void 0)return;const F=E.source,Z=p.get(F);if(Z){const K=Z[_.__cacheKey];K.usedTimes--,K.usedTimes===0&&S(E),Object.keys(Z).length===0&&p.delete(F)}n.remove(E)}function S(E){const _=n.get(E);i.deleteTexture(_.__webglTexture);const F=E.source,Z=p.get(F);delete Z[_.__cacheKey],a.memory.textures--}function M(E){const _=n.get(E);if(E.depthTexture&&(E.depthTexture.dispose(),n.remove(E.depthTexture)),E.isWebGLCubeRenderTarget)for(let Z=0;Z<6;Z++){if(Array.isArray(_.__webglFramebuffer[Z]))for(let K=0;K<_.__webglFramebuffer[Z].length;K++)i.deleteFramebuffer(_.__webglFramebuffer[Z][K]);else i.deleteFramebuffer(_.__webglFramebuffer[Z]);_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer[Z])}else{if(Array.isArray(_.__webglFramebuffer))for(let Z=0;Z<_.__webglFramebuffer.length;Z++)i.deleteFramebuffer(_.__webglFramebuffer[Z]);else i.deleteFramebuffer(_.__webglFramebuffer);if(_.__webglDepthbuffer&&i.deleteRenderbuffer(_.__webglDepthbuffer),_.__webglMultisampledFramebuffer&&i.deleteFramebuffer(_.__webglMultisampledFramebuffer),_.__webglColorRenderbuffer)for(let Z=0;Z<_.__webglColorRenderbuffer.length;Z++)_.__webglColorRenderbuffer[Z]&&i.deleteRenderbuffer(_.__webglColorRenderbuffer[Z]);_.__webglDepthRenderbuffer&&i.deleteRenderbuffer(_.__webglDepthRenderbuffer)}const F=E.textures;for(let Z=0,K=F.length;Z=s.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+E+" texture units while this GPU supports only "+s.maxTextures),D+=1,E}function V(E){const _=[];return _.push(E.wrapS),_.push(E.wrapT),_.push(E.wrapR||0),_.push(E.magFilter),_.push(E.minFilter),_.push(E.anisotropy),_.push(E.internalFormat),_.push(E.format),_.push(E.type),_.push(E.generateMipmaps),_.push(E.premultiplyAlpha),_.push(E.flipY),_.push(E.unpackAlignment),_.push(E.colorSpace),_.join()}function $(E,_){const F=n.get(E);if(E.isVideoTexture&&Mt(E),E.isRenderTargetTexture===!1&&E.version>0&&F.__version!==E.version){const Z=E.image;if(Z===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(Z.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Y(F,E,_);return}}e.bindTexture(i.TEXTURE_2D,F.__webglTexture,i.TEXTURE0+_)}function G(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_2D_ARRAY,F.__webglTexture,i.TEXTURE0+_)}function J(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){Y(F,E,_);return}e.bindTexture(i.TEXTURE_3D,F.__webglTexture,i.TEXTURE0+_)}function k(E,_){const F=n.get(E);if(E.version>0&&F.__version!==E.version){nt(F,E,_);return}e.bindTexture(i.TEXTURE_CUBE_MAP,F.__webglTexture,i.TEXTURE0+_)}const it={[da]:i.REPEAT,[Jn]:i.CLAMP_TO_EDGE,[fa]:i.MIRRORED_REPEAT},ut={[qe]:i.NEAREST,[dh]:i.NEAREST_MIPMAP_NEAREST,[gs]:i.NEAREST_MIPMAP_LINEAR,[dn]:i.LINEAR,[xr]:i.LINEAR_MIPMAP_NEAREST,[Qn]:i.LINEAR_MIPMAP_LINEAR},yt={[gh]:i.NEVER,[yh]:i.ALWAYS,[_h]:i.LESS,[$l]:i.LEQUAL,[vh]:i.EQUAL,[Sh]:i.GEQUAL,[xh]:i.GREATER,[Mh]:i.NOTEQUAL};function Lt(E,_){if(_.type===fn&&t.has("OES_texture_float_linear")===!1&&(_.magFilter===dn||_.magFilter===xr||_.magFilter===gs||_.magFilter===Qn||_.minFilter===dn||_.minFilter===xr||_.minFilter===gs||_.minFilter===Qn)&&console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),i.texParameteri(E,i.TEXTURE_WRAP_S,it[_.wrapS]),i.texParameteri(E,i.TEXTURE_WRAP_T,it[_.wrapT]),(E===i.TEXTURE_3D||E===i.TEXTURE_2D_ARRAY)&&i.texParameteri(E,i.TEXTURE_WRAP_R,it[_.wrapR]),i.texParameteri(E,i.TEXTURE_MAG_FILTER,ut[_.magFilter]),i.texParameteri(E,i.TEXTURE_MIN_FILTER,ut[_.minFilter]),_.compareFunction&&(i.texParameteri(E,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(E,i.TEXTURE_COMPARE_FUNC,yt[_.compareFunction])),t.has("EXT_texture_filter_anisotropic")===!0){if(_.magFilter===qe||_.minFilter!==gs&&_.minFilter!==Qn||_.type===fn&&t.has("OES_texture_float_linear")===!1)return;if(_.anisotropy>1||n.get(_).__currentAnisotropy){const F=t.get("EXT_texture_filter_anisotropic");i.texParameterf(E,F.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(_.anisotropy,s.getMaxAnisotropy())),n.get(_).__currentAnisotropy=_.anisotropy}}}function qt(E,_){let F=!1;E.__webglInit===void 0&&(E.__webglInit=!0,_.addEventListener("dispose",R));const Z=_.source;let K=p.get(Z);K===void 0&&(K={},p.set(Z,K));const X=V(_);if(X!==E.__cacheKey){K[X]===void 0&&(K[X]={texture:i.createTexture(),usedTimes:0},a.memory.textures++,F=!0),K[X].usedTimes++;const St=K[E.__cacheKey];St!==void 0&&(K[E.__cacheKey].usedTimes--,St.usedTimes===0&&S(_)),E.__cacheKey=X,E.__webglTexture=K[X].texture}return F}function Y(E,_,F){let Z=i.TEXTURE_2D;(_.isDataArrayTexture||_.isCompressedArrayTexture)&&(Z=i.TEXTURE_2D_ARRAY),_.isData3DTexture&&(Z=i.TEXTURE_3D);const K=qt(E,_),X=_.source;e.bindTexture(Z,E.__webglTexture,i.TEXTURE0+F);const St=n.get(X);if(X.version!==St.__version||K===!0){e.activeTexture(i.TEXTURE0+F);const ot=$t.getPrimaries($t.workingColorSpace),dt=_.colorSpace===Fn?null:$t.getPrimaries(_.colorSpace),jt=_.colorSpace===Fn||ot===dt?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,_.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,_.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,_.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,jt);let tt=v(_.image,!1,s.maxTextureSize);tt=ne(_,tt);const mt=r.convert(_.format,_.colorSpace),bt=r.convert(_.type);let Pt=b(_.internalFormat,mt,bt,_.colorSpace,_.isVideoTexture);Lt(Z,_);let ft;const Xt=_.mipmaps,zt=_.isVideoTexture!==!0,se=St.__version===void 0||K===!0,C=X.dataReady,et=L(_,tt);if(_.isDepthTexture)Pt=y(_.format===ki,_.type),se&&(zt?e.texStorage2D(i.TEXTURE_2D,1,Pt,tt.width,tt.height):e.texImage2D(i.TEXTURE_2D,0,Pt,tt.width,tt.height,0,mt,bt,null));else if(_.isDataTexture)if(Xt.length>0){zt&&se&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let H=0,q=Xt.length;H0){const lt=Jo(ft.width,ft.height,_.format,_.type);for(const ct of _.layerUpdates){const Nt=ft.data.subarray(ct*lt/ft.data.BYTES_PER_ELEMENT,(ct+1)*lt/ft.data.BYTES_PER_ELEMENT);e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,ct,ft.width,ft.height,1,mt,Nt)}_.clearLayerUpdates()}else e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,ft.data)}else e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,ft.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else zt?C&&e.texSubImage3D(i.TEXTURE_2D_ARRAY,H,0,0,0,ft.width,ft.height,tt.depth,mt,bt,ft.data):e.texImage3D(i.TEXTURE_2D_ARRAY,H,Pt,ft.width,ft.height,tt.depth,0,mt,bt,ft.data)}else{zt&&se&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let H=0,q=Xt.length;H0){const H=Jo(tt.width,tt.height,_.format,_.type);for(const q of _.layerUpdates){const lt=tt.data.subarray(q*H/tt.data.BYTES_PER_ELEMENT,(q+1)*H/tt.data.BYTES_PER_ELEMENT);e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,q,tt.width,tt.height,1,mt,bt,lt)}_.clearLayerUpdates()}else e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)}else e.texImage3D(i.TEXTURE_2D_ARRAY,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isData3DTexture)zt?(se&&e.texStorage3D(i.TEXTURE_3D,et,Pt,tt.width,tt.height,tt.depth),C&&e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)):e.texImage3D(i.TEXTURE_3D,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(_.isFramebufferTexture){if(se)if(zt)e.texStorage2D(i.TEXTURE_2D,et,Pt,tt.width,tt.height);else{let H=tt.width,q=tt.height;for(let lt=0;lt>=1,q>>=1}}else if(Xt.length>0){if(zt&&se){const H=Et(Xt[0]);e.texStorage2D(i.TEXTURE_2D,et,Pt,H.width,H.height)}for(let H=0,q=Xt.length;H0&&et++;const q=Et(mt[0]);e.texStorage2D(i.TEXTURE_CUBE_MAP,et,Xt,q.width,q.height)}for(let q=0;q<6;q++)if(tt){zt?C&&e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,0,0,mt[q].width,mt[q].height,Pt,ft,mt[q].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,Xt,mt[q].width,mt[q].height,0,Pt,ft,mt[q].data);for(let lt=0;lt>X),bt=Math.max(1,_.height>>X);K===i.TEXTURE_3D||K===i.TEXTURE_2D_ARRAY?e.texImage3D(K,X,dt,mt,bt,_.depth,0,St,ot,null):e.texImage2D(K,X,dt,mt,bt,0,St,ot,null)}e.bindFramebuffer(i.FRAMEBUFFER,E),kt(_)?o.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,Z,K,tt.__webglTexture,0,Bt(_)):(K===i.TEXTURE_2D||K>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&K<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,Z,K,tt.__webglTexture,X),e.bindFramebuffer(i.FRAMEBUFFER,null)}function at(E,_,F){if(i.bindRenderbuffer(i.RENDERBUFFER,E),_.depthBuffer){const Z=_.depthTexture,K=Z&&Z.isDepthTexture?Z.type:null,X=y(_.stencilBuffer,K),St=_.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,ot=Bt(_);kt(_)?o.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,ot,X,_.width,_.height):F?i.renderbufferStorageMultisample(i.RENDERBUFFER,ot,X,_.width,_.height):i.renderbufferStorage(i.RENDERBUFFER,X,_.width,_.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,St,i.RENDERBUFFER,E)}else{const Z=_.textures;for(let K=0;K{delete _.__boundDepthTexture,delete _.__depthDisposeCallback,Z.removeEventListener("dispose",K)};Z.addEventListener("dispose",K),_.__depthDisposeCallback=K}_.__boundDepthTexture=Z}if(E.depthTexture&&!_.__autoAllocateDepthBuffer){if(F)throw new Error("target.depthTexture not supported in Cube render targets");wt(_.__webglFramebuffer,E)}else if(F){_.__webglDepthbuffer=[];for(let Z=0;Z<6;Z++)if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer[Z]),_.__webglDepthbuffer[Z]===void 0)_.__webglDepthbuffer[Z]=i.createRenderbuffer(),at(_.__webglDepthbuffer[Z],E,!1);else{const K=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,X=_.__webglDepthbuffer[Z];i.bindRenderbuffer(i.RENDERBUFFER,X),i.framebufferRenderbuffer(i.FRAMEBUFFER,K,i.RENDERBUFFER,X)}}else if(e.bindFramebuffer(i.FRAMEBUFFER,_.__webglFramebuffer),_.__webglDepthbuffer===void 0)_.__webglDepthbuffer=i.createRenderbuffer(),at(_.__webglDepthbuffer,E,!1);else{const Z=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,K=_.__webglDepthbuffer;i.bindRenderbuffer(i.RENDERBUFFER,K),i.framebufferRenderbuffer(i.FRAMEBUFFER,Z,i.RENDERBUFFER,K)}e.bindFramebuffer(i.FRAMEBUFFER,null)}function Gt(E,_,F){const Z=n.get(E);_!==void 0&&xt(Z.__webglFramebuffer,E,E.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),F!==void 0&&Ut(E)}function ce(E){const _=E.texture,F=n.get(E),Z=n.get(_);E.addEventListener("dispose",A);const K=E.textures,X=E.isWebGLCubeRenderTarget===!0,St=K.length>1;if(St||(Z.__webglTexture===void 0&&(Z.__webglTexture=i.createTexture()),Z.__version=_.version,a.memory.textures++),X){F.__webglFramebuffer=[];for(let ot=0;ot<6;ot++)if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer[ot]=[];for(let dt=0;dt<_.mipmaps.length;dt++)F.__webglFramebuffer[ot][dt]=i.createFramebuffer()}else F.__webglFramebuffer[ot]=i.createFramebuffer()}else{if(_.mipmaps&&_.mipmaps.length>0){F.__webglFramebuffer=[];for(let ot=0;ot<_.mipmaps.length;ot++)F.__webglFramebuffer[ot]=i.createFramebuffer()}else F.__webglFramebuffer=i.createFramebuffer();if(St)for(let ot=0,dt=K.length;ot0&&kt(E)===!1){F.__webglMultisampledFramebuffer=i.createFramebuffer(),F.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,F.__webglMultisampledFramebuffer);for(let ot=0;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[ot][dt],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,dt);else xt(F.__webglFramebuffer[ot],E,_,i.COLOR_ATTACHMENT0,i.TEXTURE_CUBE_MAP_POSITIVE_X+ot,0);m(_)&&u(i.TEXTURE_CUBE_MAP),e.unbindTexture()}else if(St){for(let ot=0,dt=K.length;ot0)for(let dt=0;dt<_.mipmaps.length;dt++)xt(F.__webglFramebuffer[dt],E,_,i.COLOR_ATTACHMENT0,ot,dt);else xt(F.__webglFramebuffer,E,_,i.COLOR_ATTACHMENT0,ot,0);m(_)&&u(ot),e.unbindTexture()}E.depthBuffer&&Ut(E)}function rt(E){const _=E.textures;for(let F=0,Z=_.length;F0){if(kt(E)===!1){const _=E.textures,F=E.width,Z=E.height;let K=i.COLOR_BUFFER_BIT;const X=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,St=n.get(E),ot=_.length>1;if(ot)for(let dt=0;dt<_.length;dt++)e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,null),e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,null,0);e.bindFramebuffer(i.READ_FRAMEBUFFER,St.__webglMultisampledFramebuffer),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglFramebuffer);for(let dt=0;dt<_.length;dt++){if(E.resolveDepthBuffer&&(E.depthBuffer&&(K|=i.DEPTH_BUFFER_BIT),E.stencilBuffer&&E.resolveStencilBuffer&&(K|=i.STENCIL_BUFFER_BIT)),ot){i.framebufferRenderbuffer(i.READ_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const jt=n.get(_[dt]).__webglTexture;i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,jt,0)}i.blitFramebuffer(0,0,F,Z,0,0,F,Z,K,i.NEAREST),l===!0&&(Ct.length=0,w.length=0,Ct.push(i.COLOR_ATTACHMENT0+dt),E.depthBuffer&&E.resolveDepthBuffer===!1&&(Ct.push(X),w.push(X),i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,w)),i.invalidateFramebuffer(i.READ_FRAMEBUFFER,Ct))}if(e.bindFramebuffer(i.READ_FRAMEBUFFER,null),e.bindFramebuffer(i.DRAW_FRAMEBUFFER,null),ot)for(let dt=0;dt<_.length;dt++){e.bindFramebuffer(i.FRAMEBUFFER,St.__webglMultisampledFramebuffer),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.RENDERBUFFER,St.__webglColorRenderbuffer[dt]);const jt=n.get(_[dt]).__webglTexture;e.bindFramebuffer(i.FRAMEBUFFER,St.__webglFramebuffer),i.framebufferTexture2D(i.DRAW_FRAMEBUFFER,i.COLOR_ATTACHMENT0+dt,i.TEXTURE_2D,jt,0)}e.bindFramebuffer(i.DRAW_FRAMEBUFFER,St.__webglMultisampledFramebuffer)}else if(E.depthBuffer&&E.resolveDepthBuffer===!1&&l){const _=E.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT;i.invalidateFramebuffer(i.DRAW_FRAMEBUFFER,[_])}}}function Bt(E){return Math.min(s.maxSamples,E.samples)}function kt(E){const _=n.get(E);return E.samples>0&&t.has("WEBGL_multisampled_render_to_texture")===!0&&_.__useRenderToTexture!==!1}function Mt(E){const _=a.render.frame;h.get(E)!==_&&(h.set(E,_),E.update())}function ne(E,_){const F=E.colorSpace,Z=E.format,K=E.type;return E.isCompressedTexture===!0||E.isVideoTexture===!0||F!==Vi&&F!==Fn&&($t.getTransfer(F)===re?(Z!==an||K!==An)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",F)),_}function Et(E){return typeof HTMLImageElement<"u"&&E instanceof HTMLImageElement?(c.width=E.naturalWidth||E.width,c.height=E.naturalHeight||E.height):typeof VideoFrame<"u"&&E instanceof VideoFrame?(c.width=E.displayWidth,c.height=E.displayHeight):(c.width=E.width,c.height=E.height),c}this.allocateTextureUnit=z,this.resetTextureUnits=W,this.setTexture2D=$,this.setTexture2DArray=G,this.setTexture3D=J,this.setTextureCube=k,this.rebindTextures=Gt,this.setupRenderTarget=ce,this.updateRenderTargetMipmap=rt,this.updateMultisampleRenderTarget=ve,this.setupDepthRenderbuffer=Ut,this.setupFrameBufferTexture=xt,this.useMultisampledRTT=kt}function km(i,t){function e(n,s=Fn){let r;const a=$t.getTransfer(s);if(n===An)return i.UNSIGNED_BYTE;if(n===ja)return i.UNSIGNED_SHORT_4_4_4_4;if(n===Za)return i.UNSIGNED_SHORT_5_5_5_1;if(n===Gl)return i.UNSIGNED_INT_5_9_9_9_REV;if(n===kl)return i.BYTE;if(n===Vl)return i.SHORT;if(n===ls)return i.UNSIGNED_SHORT;if(n===qa)return i.INT;if(n===ni)return i.UNSIGNED_INT;if(n===fn)return i.FLOAT;if(n===Tn)return i.HALF_FLOAT;if(n===Wl)return i.ALPHA;if(n===Xl)return i.RGB;if(n===an)return i.RGBA;if(n===Yl)return i.LUMINANCE;if(n===ql)return i.LUMINANCE_ALPHA;if(n===Ii)return i.DEPTH_COMPONENT;if(n===ki)return i.DEPTH_STENCIL;if(n===Ka)return i.RED;if(n===$a)return i.RED_INTEGER;if(n===jl)return i.RG;if(n===Ja)return i.RG_INTEGER;if(n===Qa)return i.RGBA_INTEGER;if(n===qs||n===js||n===Zs||n===Ks)if(a===re)if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===qs)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===js)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Zs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Ks)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=t.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===qs)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===js)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Zs)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Ks)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===pa||n===ma||n===ga||n===_a)if(r=t.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===pa)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===ma)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===ga)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===_a)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===va||n===xa||n===Ma)if(r=t.get("WEBGL_compressed_texture_etc"),r!==null){if(n===va||n===xa)return a===re?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Ma)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===Sa||n===ya||n===Ea||n===ba||n===Ta||n===wa||n===Aa||n===Ra||n===Ca||n===Pa||n===Da||n===La||n===Ua||n===Ia)if(r=t.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Sa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===ya)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Ea)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===ba)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ta)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===wa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Aa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Ra)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Ca)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Pa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Da)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===La)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Ua)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Ia)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===$s||n===Na||n===Fa)if(r=t.get("EXT_texture_compression_bptc"),r!==null){if(n===$s)return a===re?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Na)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Fa)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Zl||n===Oa||n===Ba||n===za)if(r=t.get("EXT_texture_compression_rgtc"),r!==null){if(n===$s)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Oa)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Ba)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===za)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===Hi?i.UNSIGNED_INT_24_8:i[n]!==void 0?i[n]:null}return{convert:e}}const Vm={type:"move"};class $r{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new Pi,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new Pi,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new Pi,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!=="visible-blurred"){if(c&&t.hand){a=!0;for(const v of t.hand.values()){const m=e.getJointPose(v,n),u=this._getHandJoint(c,v);m!==null&&(u.matrix.fromArray(m.transform.matrix),u.matrix.decompose(u.position,u.rotation,u.scale),u.matrixWorldNeedsUpdate=!0,u.jointRadius=m.radius),u.visible=m!==null}const h=c.joints["index-finger-tip"],d=c.joints["thumb-tip"],p=h.position.distanceTo(d.position),f=.02,g=.005;c.inputState.pinching&&p>f+g?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&p<=f-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Vm)))}return o!==null&&(o.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){const n=new Pi;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}const Gm=` +}`;function Om(i,t,e){let n=new eo;const s=new vt,r=new vt,a=new le,o=new su({depthPacking:ph}),l=new ru,c={},h=e.maxTextureSize,f={[zn]:He,[He]:zn,[hn]:hn},p=new Fe({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new vt},radius:{value:4}},vertexShader:Nm,fragmentShader:Fm}),u=p.clone();u.defines.HORIZONTAL_PASS=1;const g=new pe;g.setAttribute("position",new he(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const _=new Se(g,p),m=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=Ol;let d=this.type;this.render=function(R,A,U){if(m.enabled===!1||m.autoUpdate===!1&&m.needsUpdate===!1||R.length===0)return;const S=i.getRenderTarget(),M=i.getActiveCubeFace(),D=i.getActiveMipmapLevel(),W=i.state;W.setBlending(bn),W.buffers.color.setClear(1,1,1,1),W.buffers.depth.setTest(!0),W.setScissorTest(!1);const z=d!==yn&&this.type===yn,V=d===yn&&this.type!==yn;for(let $=0,G=R.length;$h||s.y>h)&&(s.x>h&&(r.x=Math.floor(h/it.x),s.x=r.x*it.x,H.mapSize.x=r.x),s.y>h&&(r.y=Math.floor(h/it.y),s.y=r.y*it.y,H.mapSize.y=r.y)),H.map===null||z===!0||V===!0){const yt=this.type!==yn?{minFilter:qe,magFilter:qe}:{};H.map!==null&&H.map.dispose(),H.map=new on(s.x,s.y,yt),H.map.texture.name=J.name+".shadowMap",H.camera.updateProjectionMatrix()}i.setRenderTarget(H.map),i.clear();const dt=H.getViewportCount();for(let yt=0;yt0||A.map&&A.alphaTest>0){const W=M.uuid,z=A.uuid;let V=c[W];V===void 0&&(V={},c[W]=V);let $=V[z];$===void 0&&($=M.clone(),V[z]=$,A.addEventListener("dispose",L)),M=$}if(M.visible=A.visible,M.wireframe=A.wireframe,S===yn?M.side=A.shadowSide!==null?A.shadowSide:A.side:M.side=A.shadowSide!==null?A.shadowSide:f[A.side],M.alphaMap=A.alphaMap,M.alphaTest=A.alphaTest,M.map=A.map,M.clipShadows=A.clipShadows,M.clippingPlanes=A.clippingPlanes,M.clipIntersection=A.clipIntersection,M.displacementMap=A.displacementMap,M.displacementScale=A.displacementScale,M.displacementBias=A.displacementBias,M.wireframeLinewidth=A.wireframeLinewidth,M.linewidth=A.linewidth,U.isPointLight===!0&&M.isMeshDistanceMaterial===!0){const W=i.properties.get(M);W.light=U}return M}function y(R,A,U,S,M){if(R.visible===!1)return;if(R.layers.test(A.layers)&&(R.isMesh||R.isLine||R.isPoints)&&(R.castShadow||R.receiveShadow&&M===yn)&&(!R.frustumCulled||n.intersectsObject(R))){R.modelViewMatrix.multiplyMatrices(U.matrixWorldInverse,R.matrixWorld);const z=t.update(R),V=R.material;if(Array.isArray(V)){const $=z.groups;for(let G=0,J=$.length;G=1):H.indexOf("OpenGL ES")!==-1&&(J=parseFloat(/^OpenGL ES (\d)/.exec(H)[1]),G=J>=2);let it=null,dt={};const yt=i.getParameter(i.SCISSOR_BOX),Lt=i.getParameter(i.VIEWPORT),qt=new le().fromArray(yt),Y=new le().fromArray(Lt);function nt(C,et,k,q){const ct=new Uint8Array(4),ht=i.createTexture();i.bindTexture(C,ht),i.texParameteri(C,i.TEXTURE_MIN_FILTER,i.NEAREST),i.texParameteri(C,i.TEXTURE_MAG_FILTER,i.NEAREST);for(let Nt=0;Nt"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new vt,h=new WeakMap;let f;const p=new WeakMap;let u=!1;try{u=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function g(b,v){return u?new OffscreenCanvas(b,v):rr("canvas")}function _(b,v,F){let Z=1;const K=Et(b);if((K.width>F||K.height>F)&&(Z=F/Math.max(K.width,K.height)),Z<1)if(typeof HTMLImageElement<"u"&&b instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&b instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&b instanceof ImageBitmap||typeof VideoFrame<"u"&&b instanceof VideoFrame){const X=Math.floor(Z*K.width),St=Math.floor(Z*K.height);f===void 0&&(f=g(X,St));const lt=v?g(X,St):f;return lt.width=X,lt.height=St,lt.getContext("2d").drawImage(b,0,0,X,St),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+K.width+"x"+K.height+") to ("+X+"x"+St+")."),lt}else return"data"in b&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+K.width+"x"+K.height+")."),b;return b}function m(b){return b.generateMipmaps}function d(b){i.generateMipmap(b)}function T(b){return b.isWebGLCubeRenderTarget?i.TEXTURE_CUBE_MAP:b.isWebGL3DRenderTarget?i.TEXTURE_3D:b.isWebGLArrayRenderTarget||b.isCompressedArrayTexture?i.TEXTURE_2D_ARRAY:i.TEXTURE_2D}function E(b,v,F,Z,K=!1){if(b!==null){if(i[b]!==void 0)return i[b];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+b+"'")}let X=v;if(v===i.RED&&(F===i.FLOAT&&(X=i.R32F),F===i.HALF_FLOAT&&(X=i.R16F),F===i.UNSIGNED_BYTE&&(X=i.R8)),v===i.RED_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.R8UI),F===i.UNSIGNED_SHORT&&(X=i.R16UI),F===i.UNSIGNED_INT&&(X=i.R32UI),F===i.BYTE&&(X=i.R8I),F===i.SHORT&&(X=i.R16I),F===i.INT&&(X=i.R32I)),v===i.RG&&(F===i.FLOAT&&(X=i.RG32F),F===i.HALF_FLOAT&&(X=i.RG16F),F===i.UNSIGNED_BYTE&&(X=i.RG8)),v===i.RG_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RG8UI),F===i.UNSIGNED_SHORT&&(X=i.RG16UI),F===i.UNSIGNED_INT&&(X=i.RG32UI),F===i.BYTE&&(X=i.RG8I),F===i.SHORT&&(X=i.RG16I),F===i.INT&&(X=i.RG32I)),v===i.RGB_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGB8UI),F===i.UNSIGNED_SHORT&&(X=i.RGB16UI),F===i.UNSIGNED_INT&&(X=i.RGB32UI),F===i.BYTE&&(X=i.RGB8I),F===i.SHORT&&(X=i.RGB16I),F===i.INT&&(X=i.RGB32I)),v===i.RGBA_INTEGER&&(F===i.UNSIGNED_BYTE&&(X=i.RGBA8UI),F===i.UNSIGNED_SHORT&&(X=i.RGBA16UI),F===i.UNSIGNED_INT&&(X=i.RGBA32UI),F===i.BYTE&&(X=i.RGBA8I),F===i.SHORT&&(X=i.RGBA16I),F===i.INT&&(X=i.RGBA32I)),v===i.RGB&&F===i.UNSIGNED_INT_5_9_9_9_REV&&(X=i.RGB9_E5),v===i.RGBA){const St=K?ir:$t.getTransfer(Z);F===i.FLOAT&&(X=i.RGBA32F),F===i.HALF_FLOAT&&(X=i.RGBA16F),F===i.UNSIGNED_BYTE&&(X=St===re?i.SRGB8_ALPHA8:i.RGBA8),F===i.UNSIGNED_SHORT_4_4_4_4&&(X=i.RGBA4),F===i.UNSIGNED_SHORT_5_5_5_1&&(X=i.RGB5_A1)}return(X===i.R16F||X===i.R32F||X===i.RG16F||X===i.RG32F||X===i.RGBA16F||X===i.RGBA32F)&&t.get("EXT_color_buffer_float"),X}function y(b,v){let F;return b?v===null||v===ni||v===ki?F=i.DEPTH24_STENCIL8:v===fn?F=i.DEPTH32F_STENCIL8:v===ls&&(F=i.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):v===null||v===ni||v===ki?F=i.DEPTH_COMPONENT24:v===fn?F=i.DEPTH_COMPONENT32F:v===ls&&(F=i.DEPTH_COMPONENT16),F}function L(b,v){return m(b)===!0||b.isFramebufferTexture&&b.minFilter!==qe&&b.minFilter!==dn?Math.log2(Math.max(v.width,v.height))+1:b.mipmaps!==void 0&&b.mipmaps.length>0?b.mipmaps.length:b.isCompressedTexture&&Array.isArray(b.image)?v.mipmaps.length:1}function R(b){const v=b.target;v.removeEventListener("dispose",R),U(v),v.isVideoTexture&&h.delete(v)}function A(b){const v=b.target;v.removeEventListener("dispose",A),M(v)}function U(b){const v=n.get(b);if(v.__webglInit===void 0)return;const F=b.source,Z=p.get(F);if(Z){const K=Z[v.__cacheKey];K.usedTimes--,K.usedTimes===0&&S(b),Object.keys(Z).length===0&&p.delete(F)}n.remove(b)}function S(b){const v=n.get(b);i.deleteTexture(v.__webglTexture);const F=b.source,Z=p.get(F);delete Z[v.__cacheKey],a.memory.textures--}function M(b){const v=n.get(b);if(b.depthTexture&&(b.depthTexture.dispose(),n.remove(b.depthTexture)),b.isWebGLCubeRenderTarget)for(let Z=0;Z<6;Z++){if(Array.isArray(v.__webglFramebuffer[Z]))for(let K=0;K=s.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+b+" texture units while this GPU supports only "+s.maxTextures),D+=1,b}function V(b){const v=[];return v.push(b.wrapS),v.push(b.wrapT),v.push(b.wrapR||0),v.push(b.magFilter),v.push(b.minFilter),v.push(b.anisotropy),v.push(b.internalFormat),v.push(b.format),v.push(b.type),v.push(b.generateMipmaps),v.push(b.premultiplyAlpha),v.push(b.flipY),v.push(b.unpackAlignment),v.push(b.colorSpace),v.join()}function $(b,v){const F=n.get(b);if(b.isVideoTexture&&Mt(b),b.isRenderTargetTexture===!1&&b.version>0&&F.__version!==b.version){const Z=b.image;if(Z===null)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else if(Z.complete===!1)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{Y(F,b,v);return}}e.bindTexture(i.TEXTURE_2D,F.__webglTexture,i.TEXTURE0+v)}function G(b,v){const F=n.get(b);if(b.version>0&&F.__version!==b.version){Y(F,b,v);return}e.bindTexture(i.TEXTURE_2D_ARRAY,F.__webglTexture,i.TEXTURE0+v)}function J(b,v){const F=n.get(b);if(b.version>0&&F.__version!==b.version){Y(F,b,v);return}e.bindTexture(i.TEXTURE_3D,F.__webglTexture,i.TEXTURE0+v)}function H(b,v){const F=n.get(b);if(b.version>0&&F.__version!==b.version){nt(F,b,v);return}e.bindTexture(i.TEXTURE_CUBE_MAP,F.__webglTexture,i.TEXTURE0+v)}const it={[da]:i.REPEAT,[Jn]:i.CLAMP_TO_EDGE,[fa]:i.MIRRORED_REPEAT},dt={[qe]:i.NEAREST,[dh]:i.NEAREST_MIPMAP_NEAREST,[gs]:i.NEAREST_MIPMAP_LINEAR,[dn]:i.LINEAR,[xr]:i.LINEAR_MIPMAP_NEAREST,[Qn]:i.LINEAR_MIPMAP_LINEAR},yt={[gh]:i.NEVER,[yh]:i.ALWAYS,[_h]:i.LESS,[$l]:i.LEQUAL,[vh]:i.EQUAL,[Sh]:i.GEQUAL,[xh]:i.GREATER,[Mh]:i.NOTEQUAL};function Lt(b,v){if(v.type===fn&&t.has("OES_texture_float_linear")===!1&&(v.magFilter===dn||v.magFilter===xr||v.magFilter===gs||v.magFilter===Qn||v.minFilter===dn||v.minFilter===xr||v.minFilter===gs||v.minFilter===Qn)&&console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),i.texParameteri(b,i.TEXTURE_WRAP_S,it[v.wrapS]),i.texParameteri(b,i.TEXTURE_WRAP_T,it[v.wrapT]),(b===i.TEXTURE_3D||b===i.TEXTURE_2D_ARRAY)&&i.texParameteri(b,i.TEXTURE_WRAP_R,it[v.wrapR]),i.texParameteri(b,i.TEXTURE_MAG_FILTER,dt[v.magFilter]),i.texParameteri(b,i.TEXTURE_MIN_FILTER,dt[v.minFilter]),v.compareFunction&&(i.texParameteri(b,i.TEXTURE_COMPARE_MODE,i.COMPARE_REF_TO_TEXTURE),i.texParameteri(b,i.TEXTURE_COMPARE_FUNC,yt[v.compareFunction])),t.has("EXT_texture_filter_anisotropic")===!0){if(v.magFilter===qe||v.minFilter!==gs&&v.minFilter!==Qn||v.type===fn&&t.has("OES_texture_float_linear")===!1)return;if(v.anisotropy>1||n.get(v).__currentAnisotropy){const F=t.get("EXT_texture_filter_anisotropic");i.texParameterf(b,F.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(v.anisotropy,s.getMaxAnisotropy())),n.get(v).__currentAnisotropy=v.anisotropy}}}function qt(b,v){let F=!1;b.__webglInit===void 0&&(b.__webglInit=!0,v.addEventListener("dispose",R));const Z=v.source;let K=p.get(Z);K===void 0&&(K={},p.set(Z,K));const X=V(v);if(X!==b.__cacheKey){K[X]===void 0&&(K[X]={texture:i.createTexture(),usedTimes:0},a.memory.textures++,F=!0),K[X].usedTimes++;const St=K[b.__cacheKey];St!==void 0&&(K[b.__cacheKey].usedTimes--,St.usedTimes===0&&S(v)),b.__cacheKey=X,b.__webglTexture=K[X].texture}return F}function Y(b,v,F){let Z=i.TEXTURE_2D;(v.isDataArrayTexture||v.isCompressedArrayTexture)&&(Z=i.TEXTURE_2D_ARRAY),v.isData3DTexture&&(Z=i.TEXTURE_3D);const K=qt(b,v),X=v.source;e.bindTexture(Z,b.__webglTexture,i.TEXTURE0+F);const St=n.get(X);if(X.version!==St.__version||K===!0){e.activeTexture(i.TEXTURE0+F);const lt=$t.getPrimaries($t.workingColorSpace),ft=v.colorSpace===Fn?null:$t.getPrimaries(v.colorSpace),jt=v.colorSpace===Fn||lt===ft?i.NONE:i.BROWSER_DEFAULT_WEBGL;i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,v.flipY),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,v.premultiplyAlpha),i.pixelStorei(i.UNPACK_ALIGNMENT,v.unpackAlignment),i.pixelStorei(i.UNPACK_COLORSPACE_CONVERSION_WEBGL,jt);let tt=_(v.image,!1,s.maxTextureSize);tt=ne(v,tt);const mt=r.convert(v.format,v.colorSpace),bt=r.convert(v.type);let Pt=E(v.internalFormat,mt,bt,v.colorSpace,v.isVideoTexture);Lt(Z,v);let pt;const Xt=v.mipmaps,zt=v.isVideoTexture!==!0,se=St.__version===void 0||K===!0,C=X.dataReady,et=L(v,tt);if(v.isDepthTexture)Pt=y(v.format===Hi,v.type),se&&(zt?e.texStorage2D(i.TEXTURE_2D,1,Pt,tt.width,tt.height):e.texImage2D(i.TEXTURE_2D,0,Pt,tt.width,tt.height,0,mt,bt,null));else if(v.isDataTexture)if(Xt.length>0){zt&&se&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let k=0,q=Xt.length;k0){const ct=Jo(pt.width,pt.height,v.format,v.type);for(const ht of v.layerUpdates){const Nt=pt.data.subarray(ht*ct/pt.data.BYTES_PER_ELEMENT,(ht+1)*ct/pt.data.BYTES_PER_ELEMENT);e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,k,0,0,ht,pt.width,pt.height,1,mt,Nt)}v.clearLayerUpdates()}else e.compressedTexSubImage3D(i.TEXTURE_2D_ARRAY,k,0,0,0,pt.width,pt.height,tt.depth,mt,pt.data)}else e.compressedTexImage3D(i.TEXTURE_2D_ARRAY,k,Pt,pt.width,pt.height,tt.depth,0,pt.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else zt?C&&e.texSubImage3D(i.TEXTURE_2D_ARRAY,k,0,0,0,pt.width,pt.height,tt.depth,mt,bt,pt.data):e.texImage3D(i.TEXTURE_2D_ARRAY,k,Pt,pt.width,pt.height,tt.depth,0,mt,bt,pt.data)}else{zt&&se&&e.texStorage2D(i.TEXTURE_2D,et,Pt,Xt[0].width,Xt[0].height);for(let k=0,q=Xt.length;k0){const k=Jo(tt.width,tt.height,v.format,v.type);for(const q of v.layerUpdates){const ct=tt.data.subarray(q*k/tt.data.BYTES_PER_ELEMENT,(q+1)*k/tt.data.BYTES_PER_ELEMENT);e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,q,tt.width,tt.height,1,mt,bt,ct)}v.clearLayerUpdates()}else e.texSubImage3D(i.TEXTURE_2D_ARRAY,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)}else e.texImage3D(i.TEXTURE_2D_ARRAY,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(v.isData3DTexture)zt?(se&&e.texStorage3D(i.TEXTURE_3D,et,Pt,tt.width,tt.height,tt.depth),C&&e.texSubImage3D(i.TEXTURE_3D,0,0,0,0,tt.width,tt.height,tt.depth,mt,bt,tt.data)):e.texImage3D(i.TEXTURE_3D,0,Pt,tt.width,tt.height,tt.depth,0,mt,bt,tt.data);else if(v.isFramebufferTexture){if(se)if(zt)e.texStorage2D(i.TEXTURE_2D,et,Pt,tt.width,tt.height);else{let k=tt.width,q=tt.height;for(let ct=0;ct>=1,q>>=1}}else if(Xt.length>0){if(zt&&se){const k=Et(Xt[0]);e.texStorage2D(i.TEXTURE_2D,et,Pt,k.width,k.height)}for(let k=0,q=Xt.length;k0&&et++;const q=Et(mt[0]);e.texStorage2D(i.TEXTURE_CUBE_MAP,et,Xt,q.width,q.height)}for(let q=0;q<6;q++)if(tt){zt?C&&e.texSubImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,0,0,mt[q].width,mt[q].height,Pt,pt,mt[q].data):e.texImage2D(i.TEXTURE_CUBE_MAP_POSITIVE_X+q,0,Xt,mt[q].width,mt[q].height,0,Pt,pt,mt[q].data);for(let ct=0;ct>X),bt=Math.max(1,v.height>>X);K===i.TEXTURE_3D||K===i.TEXTURE_2D_ARRAY?e.texImage3D(K,X,ft,mt,bt,v.depth,0,St,lt,null):e.texImage2D(K,X,ft,mt,bt,0,St,lt,null)}e.bindFramebuffer(i.FRAMEBUFFER,b),Ht(v)?o.framebufferTexture2DMultisampleEXT(i.FRAMEBUFFER,Z,K,tt.__webglTexture,0,Bt(v)):(K===i.TEXTURE_2D||K>=i.TEXTURE_CUBE_MAP_POSITIVE_X&&K<=i.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&i.framebufferTexture2D(i.FRAMEBUFFER,Z,K,tt.__webglTexture,X),e.bindFramebuffer(i.FRAMEBUFFER,null)}function ot(b,v,F){if(i.bindRenderbuffer(i.RENDERBUFFER,b),v.depthBuffer){const Z=v.depthTexture,K=Z&&Z.isDepthTexture?Z.type:null,X=y(v.stencilBuffer,K),St=v.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,lt=Bt(v);Ht(v)?o.renderbufferStorageMultisampleEXT(i.RENDERBUFFER,lt,X,v.width,v.height):F?i.renderbufferStorageMultisample(i.RENDERBUFFER,lt,X,v.width,v.height):i.renderbufferStorage(i.RENDERBUFFER,X,v.width,v.height),i.framebufferRenderbuffer(i.FRAMEBUFFER,St,i.RENDERBUFFER,b)}else{const Z=v.textures;for(let K=0;K{delete v.__boundDepthTexture,delete v.__depthDisposeCallback,Z.removeEventListener("dispose",K)};Z.addEventListener("dispose",K),v.__depthDisposeCallback=K}v.__boundDepthTexture=Z}if(b.depthTexture&&!v.__autoAllocateDepthBuffer){if(F)throw new Error("target.depthTexture not supported in Cube render targets");wt(v.__webglFramebuffer,b)}else if(F){v.__webglDepthbuffer=[];for(let Z=0;Z<6;Z++)if(e.bindFramebuffer(i.FRAMEBUFFER,v.__webglFramebuffer[Z]),v.__webglDepthbuffer[Z]===void 0)v.__webglDepthbuffer[Z]=i.createRenderbuffer(),ot(v.__webglDepthbuffer[Z],b,!1);else{const K=b.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,X=v.__webglDepthbuffer[Z];i.bindRenderbuffer(i.RENDERBUFFER,X),i.framebufferRenderbuffer(i.FRAMEBUFFER,K,i.RENDERBUFFER,X)}}else if(e.bindFramebuffer(i.FRAMEBUFFER,v.__webglFramebuffer),v.__webglDepthbuffer===void 0)v.__webglDepthbuffer=i.createRenderbuffer(),ot(v.__webglDepthbuffer,b,!1);else{const Z=b.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,K=v.__webglDepthbuffer;i.bindRenderbuffer(i.RENDERBUFFER,K),i.framebufferRenderbuffer(i.FRAMEBUFFER,Z,i.RENDERBUFFER,K)}e.bindFramebuffer(i.FRAMEBUFFER,null)}function Gt(b,v,F){const Z=n.get(b);v!==void 0&&xt(Z.__webglFramebuffer,b,b.texture,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,0),F!==void 0&&Ut(b)}function ce(b){const v=b.texture,F=n.get(b),Z=n.get(v);b.addEventListener("dispose",A);const K=b.textures,X=b.isWebGLCubeRenderTarget===!0,St=K.length>1;if(St||(Z.__webglTexture===void 0&&(Z.__webglTexture=i.createTexture()),Z.__version=v.version,a.memory.textures++),X){F.__webglFramebuffer=[];for(let lt=0;lt<6;lt++)if(v.mipmaps&&v.mipmaps.length>0){F.__webglFramebuffer[lt]=[];for(let ft=0;ft0){F.__webglFramebuffer=[];for(let lt=0;lt0&&Ht(b)===!1){F.__webglMultisampledFramebuffer=i.createFramebuffer(),F.__webglColorRenderbuffer=[],e.bindFramebuffer(i.FRAMEBUFFER,F.__webglMultisampledFramebuffer);for(let lt=0;lt0)for(let ft=0;ft0)for(let ft=0;ft0){if(Ht(b)===!1){const v=b.textures,F=b.width,Z=b.height;let K=i.COLOR_BUFFER_BIT;const X=b.stencilBuffer?i.DEPTH_STENCIL_ATTACHMENT:i.DEPTH_ATTACHMENT,St=n.get(b),lt=v.length>1;if(lt)for(let ft=0;ft0&&t.has("WEBGL_multisampled_render_to_texture")===!0&&v.__useRenderToTexture!==!1}function Mt(b){const v=a.render.frame;h.get(b)!==v&&(h.set(b,v),b.update())}function ne(b,v){const F=b.colorSpace,Z=b.format,K=b.type;return b.isCompressedTexture===!0||b.isVideoTexture===!0||F!==Vi&&F!==Fn&&($t.getTransfer(F)===re?(Z!==an||K!==An)&&console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",F)),v}function Et(b){return typeof HTMLImageElement<"u"&&b instanceof HTMLImageElement?(c.width=b.naturalWidth||b.width,c.height=b.naturalHeight||b.height):typeof VideoFrame<"u"&&b instanceof VideoFrame?(c.width=b.displayWidth,c.height=b.displayHeight):(c.width=b.width,c.height=b.height),c}this.allocateTextureUnit=z,this.resetTextureUnits=W,this.setTexture2D=$,this.setTexture2DArray=G,this.setTexture3D=J,this.setTextureCube=H,this.rebindTextures=Gt,this.setupRenderTarget=ce,this.updateRenderTargetMipmap=rt,this.updateMultisampleRenderTarget=ve,this.setupDepthRenderbuffer=Ut,this.setupFrameBufferTexture=xt,this.useMultisampledRTT=Ht}function Hm(i,t){function e(n,s=Fn){let r;const a=$t.getTransfer(s);if(n===An)return i.UNSIGNED_BYTE;if(n===ja)return i.UNSIGNED_SHORT_4_4_4_4;if(n===Za)return i.UNSIGNED_SHORT_5_5_5_1;if(n===Gl)return i.UNSIGNED_INT_5_9_9_9_REV;if(n===Hl)return i.BYTE;if(n===Vl)return i.SHORT;if(n===ls)return i.UNSIGNED_SHORT;if(n===qa)return i.INT;if(n===ni)return i.UNSIGNED_INT;if(n===fn)return i.FLOAT;if(n===Tn)return i.HALF_FLOAT;if(n===Wl)return i.ALPHA;if(n===Xl)return i.RGB;if(n===an)return i.RGBA;if(n===Yl)return i.LUMINANCE;if(n===ql)return i.LUMINANCE_ALPHA;if(n===Ii)return i.DEPTH_COMPONENT;if(n===Hi)return i.DEPTH_STENCIL;if(n===Ka)return i.RED;if(n===$a)return i.RED_INTEGER;if(n===jl)return i.RG;if(n===Ja)return i.RG_INTEGER;if(n===Qa)return i.RGBA_INTEGER;if(n===qs||n===js||n===Zs||n===Ks)if(a===re)if(r=t.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===qs)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===js)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Zs)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===Ks)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=t.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===qs)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===js)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Zs)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===Ks)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===pa||n===ma||n===ga||n===_a)if(r=t.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===pa)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===ma)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===ga)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===_a)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===va||n===xa||n===Ma)if(r=t.get("WEBGL_compressed_texture_etc"),r!==null){if(n===va||n===xa)return a===re?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===Ma)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===Sa||n===ya||n===Ea||n===ba||n===Ta||n===wa||n===Aa||n===Ra||n===Ca||n===Pa||n===Da||n===La||n===Ua||n===Ia)if(r=t.get("WEBGL_compressed_texture_astc"),r!==null){if(n===Sa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===ya)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===Ea)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===ba)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===Ta)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===wa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===Aa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Ra)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Ca)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Pa)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Da)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===La)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Ua)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Ia)return a===re?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===$s||n===Na||n===Fa)if(r=t.get("EXT_texture_compression_bptc"),r!==null){if(n===$s)return a===re?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Na)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Fa)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Zl||n===Oa||n===Ba||n===za)if(r=t.get("EXT_texture_compression_rgtc"),r!==null){if(n===$s)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Oa)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===Ba)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===za)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===ki?i.UNSIGNED_INT_24_8:i[n]!==void 0?i[n]:null}return{convert:e}}const Vm={type:"move"};class $r{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new Pi,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new Pi,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new Pi,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(t){return this._targetRay!==null&&this._targetRay.dispatchEvent(t),this._grip!==null&&this._grip.dispatchEvent(t),this._hand!==null&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const n of t.hand.values())this._getHandJoint(e,n)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(t,e,n){let s=null,r=null,a=null;const o=this._targetRay,l=this._grip,c=this._hand;if(t&&e.session.visibilityState!=="visible-blurred"){if(c&&t.hand){a=!0;for(const _ of t.hand.values()){const m=e.getJointPose(_,n),d=this._getHandJoint(c,_);m!==null&&(d.matrix.fromArray(m.transform.matrix),d.matrix.decompose(d.position,d.rotation,d.scale),d.matrixWorldNeedsUpdate=!0,d.jointRadius=m.radius),d.visible=m!==null}const h=c.joints["index-finger-tip"],f=c.joints["thumb-tip"],p=h.position.distanceTo(f.position),u=.02,g=.005;c.inputState.pinching&&p>u+g?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!c.inputState.pinching&&p<=u-g&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else l!==null&&t.gripSpace&&(r=e.getPose(t.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));o!==null&&(s=e.getPose(t.targetRaySpace,n),s===null&&r!==null&&(s=r),s!==null&&(o.matrix.fromArray(s.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,s.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(s.linearVelocity)):o.hasLinearVelocity=!1,s.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(s.angularVelocity)):o.hasAngularVelocity=!1,this.dispatchEvent(Vm)))}return o!==null&&(o.visible=s!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=a!==null),this}_getHandJoint(t,e){if(t.joints[e.jointName]===void 0){const n=new Pi;n.matrixAutoUpdate=!1,n.visible=!1,t.joints[e.jointName]=n,t.add(n)}return t.joints[e.jointName]}}const Gm=` void main() { gl_Position = vec4( position, 1.0 ); @@ -3824,7 +3824,7 @@ void main() { } -}`;class Xm{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(t,e,n){if(this.texture===null){const s=new Te,r=t.properties.get(s);r.__webglTexture=e.texture,(e.depthNear!==n.depthNear||e.depthFar!==n.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=s}}getMesh(t){if(this.texture!==null&&this.mesh===null){const e=t.cameras[0].viewport,n=new Fe({vertexShader:Gm,fragmentShader:Wm,uniforms:{depthColor:{value:this.texture},depthWidth:{value:e.z},depthHeight:{value:e.w}}});this.mesh=new Se(new ds(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class Ym extends si{constructor(t,e){super();const n=this;let s=null,r=1,a=null,o="local-floor",l=1,c=null,h=null,d=null,p=null,f=null,g=null;const v=new Xm,m=e.getContextAttributes();let u=null,T=null;const b=[],y=[],L=new vt;let R=null;const A=new Ye;A.viewport=new le;const U=new Ye;U.viewport=new le;const S=[A,U],M=new cu;let D=null,W=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(Y){let nt=b[Y];return nt===void 0&&(nt=new $r,b[Y]=nt),nt.getTargetRaySpace()},this.getControllerGrip=function(Y){let nt=b[Y];return nt===void 0&&(nt=new $r,b[Y]=nt),nt.getGripSpace()},this.getHand=function(Y){let nt=b[Y];return nt===void 0&&(nt=new $r,b[Y]=nt),nt.getHandSpace()};function z(Y){const nt=y.indexOf(Y.inputSource);if(nt===-1)return;const xt=b[nt];xt!==void 0&&(xt.update(Y.inputSource,Y.frame,c||a),xt.dispatchEvent({type:Y.type,data:Y.inputSource}))}function V(){s.removeEventListener("select",z),s.removeEventListener("selectstart",z),s.removeEventListener("selectend",z),s.removeEventListener("squeeze",z),s.removeEventListener("squeezestart",z),s.removeEventListener("squeezeend",z),s.removeEventListener("end",V),s.removeEventListener("inputsourceschange",$);for(let Y=0;Y=0&&(y[at]=null,b[at].disconnect(xt))}for(let nt=0;nt=y.length){y.push(xt),at=Ut;break}else if(y[Ut]===null){y[Ut]=xt,at=Ut;break}if(at===-1)break}const wt=b[at];wt&&wt.connect(xt)}}const G=new P,J=new P;function k(Y,nt,xt){G.setFromMatrixPosition(nt.matrixWorld),J.setFromMatrixPosition(xt.matrixWorld);const at=G.distanceTo(J),wt=nt.projectionMatrix.elements,Ut=xt.projectionMatrix.elements,Gt=wt[14]/(wt[10]-1),ce=wt[14]/(wt[10]+1),rt=(wt[9]+1)/wt[5],Ct=(wt[9]-1)/wt[5],w=(wt[8]-1)/wt[0],ve=(Ut[8]+1)/Ut[0],Bt=Gt*w,kt=Gt*ve,Mt=at/(-w+ve),ne=Mt*-w;if(nt.matrixWorld.decompose(Y.position,Y.quaternion,Y.scale),Y.translateX(ne),Y.translateZ(Mt),Y.matrixWorld.compose(Y.position,Y.quaternion,Y.scale),Y.matrixWorldInverse.copy(Y.matrixWorld).invert(),wt[10]===-1)Y.projectionMatrix.copy(nt.projectionMatrix),Y.projectionMatrixInverse.copy(nt.projectionMatrixInverse);else{const Et=Gt+Mt,E=ce+Mt,_=Bt-ne,F=kt+(at-ne),Z=rt*ce/E*Et,K=Ct*ce/E*Et;Y.projectionMatrix.makePerspective(_,F,Z,K,Et,E),Y.projectionMatrixInverse.copy(Y.projectionMatrix).invert()}}function it(Y,nt){nt===null?Y.matrixWorld.copy(Y.matrix):Y.matrixWorld.multiplyMatrices(nt.matrixWorld,Y.matrix),Y.matrixWorldInverse.copy(Y.matrixWorld).invert()}this.updateCamera=function(Y){if(s===null)return;let nt=Y.near,xt=Y.far;v.texture!==null&&(v.depthNear>0&&(nt=v.depthNear),v.depthFar>0&&(xt=v.depthFar)),M.near=U.near=A.near=nt,M.far=U.far=A.far=xt,(D!==M.near||W!==M.far)&&(s.updateRenderState({depthNear:M.near,depthFar:M.far}),D=M.near,W=M.far),A.layers.mask=Y.layers.mask|2,U.layers.mask=Y.layers.mask|4,M.layers.mask=A.layers.mask|U.layers.mask;const at=Y.parent,wt=M.cameras;it(M,at);for(let Ut=0;Ut0&&(m.alphaTest.value=u.alphaTest);const T=t.get(u),b=T.envMap,y=T.envMapRotation;b&&(m.envMap.value=b,jn.copy(y),jn.x*=-1,jn.y*=-1,jn.z*=-1,b.isCubeTexture&&b.isRenderTargetTexture===!1&&(jn.y*=-1,jn.z*=-1),m.envMapRotation.value.setFromMatrix4(qm.makeRotationFromEuler(jn)),m.flipEnvMap.value=b.isCubeTexture&&b.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=u.reflectivity,m.ior.value=u.ior,m.refractionRatio.value=u.refractionRatio),u.lightMap&&(m.lightMap.value=u.lightMap,m.lightMapIntensity.value=u.lightMapIntensity,e(u.lightMap,m.lightMapTransform)),u.aoMap&&(m.aoMap.value=u.aoMap,m.aoMapIntensity.value=u.aoMapIntensity,e(u.aoMap,m.aoMapTransform))}function a(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform))}function o(m,u){m.dashSize.value=u.dashSize,m.totalSize.value=u.dashSize+u.gapSize,m.scale.value=u.scale}function l(m,u,T,b){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.size.value=u.size*T,m.scale.value=b*.5,u.map&&(m.map.value=u.map,e(u.map,m.uvTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function c(m,u){m.diffuse.value.copy(u.color),m.opacity.value=u.opacity,m.rotation.value=u.rotation,u.map&&(m.map.value=u.map,e(u.map,m.mapTransform)),u.alphaMap&&(m.alphaMap.value=u.alphaMap,e(u.alphaMap,m.alphaMapTransform)),u.alphaTest>0&&(m.alphaTest.value=u.alphaTest)}function h(m,u){m.specular.value.copy(u.specular),m.shininess.value=Math.max(u.shininess,1e-4)}function d(m,u){u.gradientMap&&(m.gradientMap.value=u.gradientMap)}function p(m,u){m.metalness.value=u.metalness,u.metalnessMap&&(m.metalnessMap.value=u.metalnessMap,e(u.metalnessMap,m.metalnessMapTransform)),m.roughness.value=u.roughness,u.roughnessMap&&(m.roughnessMap.value=u.roughnessMap,e(u.roughnessMap,m.roughnessMapTransform)),u.envMap&&(m.envMapIntensity.value=u.envMapIntensity)}function f(m,u,T){m.ior.value=u.ior,u.sheen>0&&(m.sheenColor.value.copy(u.sheenColor).multiplyScalar(u.sheen),m.sheenRoughness.value=u.sheenRoughness,u.sheenColorMap&&(m.sheenColorMap.value=u.sheenColorMap,e(u.sheenColorMap,m.sheenColorMapTransform)),u.sheenRoughnessMap&&(m.sheenRoughnessMap.value=u.sheenRoughnessMap,e(u.sheenRoughnessMap,m.sheenRoughnessMapTransform))),u.clearcoat>0&&(m.clearcoat.value=u.clearcoat,m.clearcoatRoughness.value=u.clearcoatRoughness,u.clearcoatMap&&(m.clearcoatMap.value=u.clearcoatMap,e(u.clearcoatMap,m.clearcoatMapTransform)),u.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=u.clearcoatRoughnessMap,e(u.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),u.clearcoatNormalMap&&(m.clearcoatNormalMap.value=u.clearcoatNormalMap,e(u.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(u.clearcoatNormalScale),u.side===ke&&m.clearcoatNormalScale.value.negate())),u.dispersion>0&&(m.dispersion.value=u.dispersion),u.iridescence>0&&(m.iridescence.value=u.iridescence,m.iridescenceIOR.value=u.iridescenceIOR,m.iridescenceThicknessMinimum.value=u.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=u.iridescenceThicknessRange[1],u.iridescenceMap&&(m.iridescenceMap.value=u.iridescenceMap,e(u.iridescenceMap,m.iridescenceMapTransform)),u.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=u.iridescenceThicknessMap,e(u.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),u.transmission>0&&(m.transmission.value=u.transmission,m.transmissionSamplerMap.value=T.texture,m.transmissionSamplerSize.value.set(T.width,T.height),u.transmissionMap&&(m.transmissionMap.value=u.transmissionMap,e(u.transmissionMap,m.transmissionMapTransform)),m.thickness.value=u.thickness,u.thicknessMap&&(m.thicknessMap.value=u.thicknessMap,e(u.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=u.attenuationDistance,m.attenuationColor.value.copy(u.attenuationColor)),u.anisotropy>0&&(m.anisotropyVector.value.set(u.anisotropy*Math.cos(u.anisotropyRotation),u.anisotropy*Math.sin(u.anisotropyRotation)),u.anisotropyMap&&(m.anisotropyMap.value=u.anisotropyMap,e(u.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=u.specularIntensity,m.specularColor.value.copy(u.specularColor),u.specularColorMap&&(m.specularColorMap.value=u.specularColorMap,e(u.specularColorMap,m.specularColorMapTransform)),u.specularIntensityMap&&(m.specularIntensityMap.value=u.specularIntensityMap,e(u.specularIntensityMap,m.specularIntensityMapTransform))}function g(m,u){u.matcap&&(m.matcap.value=u.matcap)}function v(m,u){const T=t.get(u).light;m.referencePosition.value.setFromMatrixPosition(T.matrixWorld),m.nearDistance.value=T.shadow.camera.near,m.farDistance.value=T.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function Zm(i,t,e,n){let s={},r={},a=[];const o=i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS);function l(T,b){const y=b.program;n.uniformBlockBinding(T,y)}function c(T,b){let y=s[T.id];y===void 0&&(g(T),y=h(T),s[T.id]=y,T.addEventListener("dispose",m));const L=b.program;n.updateUBOMapping(T,L);const R=t.render.frame;r[T.id]!==R&&(p(T),r[T.id]=R)}function h(T){const b=d();T.__bindingPointIndex=b;const y=i.createBuffer(),L=T.__size,R=T.usage;return i.bindBuffer(i.UNIFORM_BUFFER,y),i.bufferData(i.UNIFORM_BUFFER,L,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,b,y),y}function d(){for(let T=0;T0&&(y+=L-R),T.__size=y,T.__cache={},this}function v(T){const b={boundary:0,storage:0};return typeof T=="number"||typeof T=="boolean"?(b.boundary=4,b.storage=4):T.isVector2?(b.boundary=8,b.storage=8):T.isVector3||T.isColor?(b.boundary=16,b.storage=12):T.isVector4?(b.boundary=16,b.storage=16):T.isMatrix3?(b.boundary=48,b.storage=48):T.isMatrix4?(b.boundary=64,b.storage=64):T.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",T),b}function m(T){const b=T.target;b.removeEventListener("dispose",m);const y=a.indexOf(b.__bindingPointIndex);a.splice(y,1),i.deleteBuffer(s[b.id]),delete s[b.id],delete r[b.id]}function u(){for(const T in s)i.deleteBuffer(s[T]);a=[],s={},r={}}return{bind:l,update:c,dispose:u}}class Km{constructor(t={}){const{canvas:e=Th(),context:n=null,depth:s=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:d=!1,reverseDepthBuffer:p=!1}=t;this.isWebGLRenderer=!0;let f;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");f=n.getContextAttributes().alpha}else f=a;const g=new Uint32Array(4),v=new Int32Array(4);let m=null,u=null;const T=[],b=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Qe,this.toneMapping=On,this.toneMappingExposure=1;const y=this;let L=!1,R=0,A=0,U=null,S=-1,M=null;const D=new le,W=new le;let z=null;const V=new pt(0);let $=0,G=e.width,J=e.height,k=1,it=null,ut=null;const yt=new le(0,0,G,J),Lt=new le(0,0,G,J);let qt=!1;const Y=new eo;let nt=!1,xt=!1;this.transmissionResolutionScale=1;const at=new ee,wt=new ee,Ut=new P,Gt=new le,ce={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let rt=!1;function Ct(){return U===null?k:1}let w=n;function ve(x,I){return e.getContext(x,I)}try{const x={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:d};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Ya}`),e.addEventListener("webglcontextlost",q,!1),e.addEventListener("webglcontextrestored",lt,!1),e.addEventListener("webglcontextcreationerror",ct,!1),w===null){const I="webgl2";if(w=ve(I,x),w===null)throw ve(I)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(x){throw console.error("THREE.WebGLRenderer: "+x.message),x}let Bt,kt,Mt,ne,Et,E,_,F,Z,K,X,St,ot,dt,jt,tt,mt,bt,Pt,ft,Xt,zt,se,C;function et(){Bt=new rp(w),Bt.init(),zt=new km(w,Bt),kt=new Qf(w,Bt,t,zt),Mt=new zm(w,Bt),kt.reverseDepthBuffer&&p&&Mt.buffers.depth.setReversed(!0),ne=new lp(w),Et=new wm,E=new Hm(w,Bt,Mt,Et,kt,zt,ne),_=new ep(y),F=new sp(y),Z=new pu(w),se=new $f(w,Z),K=new ap(w,Z,ne,se),X=new hp(w,K,Z,ne),Pt=new cp(w,kt,E),tt=new tp(Et),St=new Tm(y,_,F,Bt,kt,se,tt),ot=new jm(y,Et),dt=new Rm,jt=new Im(Bt),bt=new Kf(y,_,F,Mt,X,f,l),mt=new Om(y,X,kt),C=new Zm(w,ne,kt,Mt),ft=new Jf(w,Bt,ne),Xt=new op(w,Bt,ne),ne.programs=St.programs,y.capabilities=kt,y.extensions=Bt,y.properties=Et,y.renderLists=dt,y.shadowMap=mt,y.state=Mt,y.info=ne}et();const H=new Ym(y,w);this.xr=H,this.getContext=function(){return w},this.getContextAttributes=function(){return w.getContextAttributes()},this.forceContextLoss=function(){const x=Bt.get("WEBGL_lose_context");x&&x.loseContext()},this.forceContextRestore=function(){const x=Bt.get("WEBGL_lose_context");x&&x.restoreContext()},this.getPixelRatio=function(){return k},this.setPixelRatio=function(x){x!==void 0&&(k=x,this.setSize(G,J,!1))},this.getSize=function(x){return x.set(G,J)},this.setSize=function(x,I,O=!0){if(H.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}G=x,J=I,e.width=Math.floor(x*k),e.height=Math.floor(I*k),O===!0&&(e.style.width=x+"px",e.style.height=I+"px"),this.setViewport(0,0,x,I)},this.getDrawingBufferSize=function(x){return x.set(G*k,J*k).floor()},this.setDrawingBufferSize=function(x,I,O){G=x,J=I,k=O,e.width=Math.floor(x*O),e.height=Math.floor(I*O),this.setViewport(0,0,x,I)},this.getCurrentViewport=function(x){return x.copy(D)},this.getViewport=function(x){return x.copy(yt)},this.setViewport=function(x,I,O,B){x.isVector4?yt.set(x.x,x.y,x.z,x.w):yt.set(x,I,O,B),Mt.viewport(D.copy(yt).multiplyScalar(k).round())},this.getScissor=function(x){return x.copy(Lt)},this.setScissor=function(x,I,O,B){x.isVector4?Lt.set(x.x,x.y,x.z,x.w):Lt.set(x,I,O,B),Mt.scissor(W.copy(Lt).multiplyScalar(k).round())},this.getScissorTest=function(){return qt},this.setScissorTest=function(x){Mt.setScissorTest(qt=x)},this.setOpaqueSort=function(x){it=x},this.setTransparentSort=function(x){ut=x},this.getClearColor=function(x){return x.copy(bt.getClearColor())},this.setClearColor=function(){bt.setClearColor.apply(bt,arguments)},this.getClearAlpha=function(){return bt.getClearAlpha()},this.setClearAlpha=function(){bt.setClearAlpha.apply(bt,arguments)},this.clear=function(x=!0,I=!0,O=!0){let B=0;if(x){let N=!1;if(U!==null){const Q=U.texture.format;N=Q===Qa||Q===Ja||Q===$a}if(N){const Q=U.texture.type,ht=Q===An||Q===ni||Q===ls||Q===Hi||Q===ja||Q===Za,gt=bt.getClearColor(),_t=bt.getClearAlpha(),It=gt.r,Ft=gt.g,Tt=gt.b;ht?(g[0]=It,g[1]=Ft,g[2]=Tt,g[3]=_t,w.clearBufferuiv(w.COLOR,0,g)):(v[0]=It,v[1]=Ft,v[2]=Tt,v[3]=_t,w.clearBufferiv(w.COLOR,0,v))}else B|=w.COLOR_BUFFER_BIT}I&&(B|=w.DEPTH_BUFFER_BIT),O&&(B|=w.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),w.clear(B)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",q,!1),e.removeEventListener("webglcontextrestored",lt,!1),e.removeEventListener("webglcontextcreationerror",ct,!1),bt.dispose(),dt.dispose(),jt.dispose(),Et.dispose(),_.dispose(),F.dispose(),X.dispose(),se.dispose(),C.dispose(),St.dispose(),H.dispose(),H.removeEventListener("sessionstart",ro),H.removeEventListener("sessionend",ao),kn.stop()};function q(x){x.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),L=!0}function lt(){console.log("THREE.WebGLRenderer: Context Restored."),L=!1;const x=ne.autoReset,I=mt.enabled,O=mt.autoUpdate,B=mt.needsUpdate,N=mt.type;et(),ne.autoReset=x,mt.enabled=I,mt.autoUpdate=O,mt.needsUpdate=B,mt.type=N}function ct(x){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",x.statusMessage)}function Nt(x){const I=x.target;I.removeEventListener("dispose",Nt),ue(I)}function ue(x){xe(x),Et.remove(x)}function xe(x){const I=Et.get(x).programs;I!==void 0&&(I.forEach(function(O){St.releaseProgram(O)}),x.isShaderMaterial&&St.releaseShaderCache(x))}this.renderBufferDirect=function(x,I,O,B,N,Q){I===null&&(I=ce);const ht=N.isMesh&&N.matrixWorld.determinant()<0,gt=Mc(x,I,O,B,N);Mt.setMaterial(B,ht);let _t=O.index,It=1;if(B.wireframe===!0){if(_t=K.getWireframeAttribute(O),_t===void 0)return;It=2}const Ft=O.drawRange,Tt=O.attributes.position;let Zt=Ft.start*It,Qt=(Ft.start+Ft.count)*It;Q!==null&&(Zt=Math.max(Zt,Q.start*It),Qt=Math.min(Qt,(Q.start+Q.count)*It)),_t!==null?(Zt=Math.max(Zt,0),Qt=Math.min(Qt,_t.count)):Tt!=null&&(Zt=Math.max(Zt,0),Qt=Math.min(Qt,Tt.count));const me=Qt-Zt;if(me<0||me===1/0)return;se.setup(N,B,gt,O,_t);let fe,Kt=ft;if(_t!==null&&(fe=Z.get(_t),Kt=Xt,Kt.setIndex(fe)),N.isMesh)B.wireframe===!0?(Mt.setLineWidth(B.wireframeLinewidth*Ct()),Kt.setMode(w.LINES)):Kt.setMode(w.TRIANGLES);else if(N.isLine){let At=B.linewidth;At===void 0&&(At=1),Mt.setLineWidth(At*Ct()),N.isLineSegments?Kt.setMode(w.LINES):N.isLineLoop?Kt.setMode(w.LINE_LOOP):Kt.setMode(w.LINE_STRIP)}else N.isPoints?Kt.setMode(w.POINTS):N.isSprite&&Kt.setMode(w.TRIANGLES);if(N.isBatchedMesh)if(N._multiDrawInstances!==null)Kt.renderMultiDrawInstances(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount,N._multiDrawInstances);else if(Bt.get("WEBGL_multi_draw"))Kt.renderMultiDraw(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount);else{const At=N._multiDrawStarts,we=N._multiDrawCounts,te=N._multiDrawCount,en=_t?Z.get(_t).bytesPerElement:1,oi=Et.get(B).currentProgram.getUniforms();for(let Ge=0;Ge{function Q(){if(B.forEach(function(ht){Et.get(ht).currentProgram.isReady()&&B.delete(ht)}),B.size===0){N(x);return}setTimeout(Q,10)}Bt.get("KHR_parallel_shader_compile")!==null?Q():setTimeout(Q,10)})};let Ve=null;function mn(x){Ve&&Ve(x)}function ro(){kn.stop()}function ao(){kn.start()}const kn=new dc;kn.setAnimationLoop(mn),typeof self<"u"&&kn.setContext(self),this.setAnimationLoop=function(x){Ve=x,H.setAnimationLoop(x),x===null?kn.stop():kn.start()},H.addEventListener("sessionstart",ro),H.addEventListener("sessionend",ao),this.render=function(x,I){if(I!==void 0&&I.isCamera!==!0){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(L===!0)return;if(x.matrixWorldAutoUpdate===!0&&x.updateMatrixWorld(),I.parent===null&&I.matrixWorldAutoUpdate===!0&&I.updateMatrixWorld(),H.enabled===!0&&H.isPresenting===!0&&(H.cameraAutoUpdate===!0&&H.updateCamera(I),I=H.getCamera()),x.isScene===!0&&x.onBeforeRender(y,x,I,U),u=jt.get(x,b.length),u.init(I),b.push(u),wt.multiplyMatrices(I.projectionMatrix,I.matrixWorldInverse),Y.setFromProjectionMatrix(wt),xt=this.localClippingEnabled,nt=tt.init(this.clippingPlanes,xt),m=dt.get(x,T.length),m.init(),T.push(m),H.enabled===!0&&H.isPresenting===!0){const Q=y.xr.getDepthSensingMesh();Q!==null&&_r(Q,I,-1/0,y.sortObjects)}_r(x,I,0,y.sortObjects),m.finish(),y.sortObjects===!0&&m.sort(it,ut),rt=H.enabled===!1||H.isPresenting===!1||H.hasDepthSensing()===!1,rt&&bt.addToRenderList(m,x),this.info.render.frame++,nt===!0&&tt.beginShadows();const O=u.state.shadowsArray;mt.render(O,x,I),nt===!0&&tt.endShadows(),this.info.autoReset===!0&&this.info.reset();const B=m.opaque,N=m.transmissive;if(u.setupLights(),I.isArrayCamera){const Q=I.cameras;if(N.length>0)for(let ht=0,gt=Q.length;ht0&&lo(B,N,x,I),rt&&bt.render(x),oo(m,x,I);U!==null&&A===0&&(E.updateMultisampleRenderTarget(U),E.updateRenderTargetMipmap(U)),x.isScene===!0&&x.onAfterRender(y,x,I),se.resetDefaultState(),S=-1,M=null,b.pop(),b.length>0?(u=b[b.length-1],nt===!0&&tt.setGlobalState(y.clippingPlanes,u.state.camera)):u=null,T.pop(),T.length>0?m=T[T.length-1]:m=null};function _r(x,I,O,B){if(x.visible===!1)return;if(x.layers.test(I.layers)){if(x.isGroup)O=x.renderOrder;else if(x.isLOD)x.autoUpdate===!0&&x.update(I);else if(x.isLight)u.pushLight(x),x.castShadow&&u.pushShadow(x);else if(x.isSprite){if(!x.frustumCulled||Y.intersectsSprite(x)){B&&Gt.setFromMatrixPosition(x.matrixWorld).applyMatrix4(wt);const ht=X.update(x),gt=x.material;gt.visible&&m.push(x,ht,gt,O,Gt.z,null)}}else if((x.isMesh||x.isLine||x.isPoints)&&(!x.frustumCulled||Y.intersectsObject(x))){const ht=X.update(x),gt=x.material;if(B&&(x.boundingSphere!==void 0?(x.boundingSphere===null&&x.computeBoundingSphere(),Gt.copy(x.boundingSphere.center)):(ht.boundingSphere===null&&ht.computeBoundingSphere(),Gt.copy(ht.boundingSphere.center)),Gt.applyMatrix4(x.matrixWorld).applyMatrix4(wt)),Array.isArray(gt)){const _t=ht.groups;for(let It=0,Ft=_t.length;It0&&ps(N,I,O),Q.length>0&&ps(Q,I,O),ht.length>0&&ps(ht,I,O),Mt.buffers.depth.setTest(!0),Mt.buffers.depth.setMask(!0),Mt.buffers.color.setMask(!0),Mt.setPolygonOffset(!1)}function lo(x,I,O,B){if((O.isScene===!0?O.overrideMaterial:null)!==null)return;u.state.transmissionRenderTarget[B.id]===void 0&&(u.state.transmissionRenderTarget[B.id]=new on(1,1,{generateMipmaps:!0,type:Bt.has("EXT_color_buffer_half_float")||Bt.has("EXT_color_buffer_float")?Tn:An,minFilter:Qn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:$t.workingColorSpace}));const Q=u.state.transmissionRenderTarget[B.id],ht=B.viewport||D;Q.setSize(ht.z*y.transmissionResolutionScale,ht.w*y.transmissionResolutionScale);const gt=y.getRenderTarget();y.setRenderTarget(Q),y.getClearColor(V),$=y.getClearAlpha(),$<1&&y.setClearColor(16777215,.5),y.clear(),rt&&bt.render(O);const _t=y.toneMapping;y.toneMapping=On;const It=B.viewport;if(B.viewport!==void 0&&(B.viewport=void 0),u.setupLightsView(B),nt===!0&&tt.setGlobalState(y.clippingPlanes,B),ps(x,O,B),E.updateMultisampleRenderTarget(Q),E.updateRenderTargetMipmap(Q),Bt.has("WEBGL_multisampled_render_to_texture")===!1){let Ft=!1;for(let Tt=0,Zt=I.length;Tt0),Tt=!!O.morphAttributes.position,Zt=!!O.morphAttributes.normal,Qt=!!O.morphAttributes.color;let me=On;B.toneMapped&&(U===null||U.isXRRenderTarget===!0)&&(me=y.toneMapping);const fe=O.morphAttributes.position||O.morphAttributes.normal||O.morphAttributes.color,Kt=fe!==void 0?fe.length:0,At=Et.get(B),we=u.state.lights;if(nt===!0&&(xt===!0||x!==M)){const De=x===M&&B.id===S;tt.setState(B,x,De)}let te=!1;B.version===At.__version?(At.needsLights&&At.lightsStateVersion!==we.state.version||At.outputColorSpace!==gt||N.isBatchedMesh&&At.batching===!1||!N.isBatchedMesh&&At.batching===!0||N.isBatchedMesh&&At.batchingColor===!0&&N.colorTexture===null||N.isBatchedMesh&&At.batchingColor===!1&&N.colorTexture!==null||N.isInstancedMesh&&At.instancing===!1||!N.isInstancedMesh&&At.instancing===!0||N.isSkinnedMesh&&At.skinning===!1||!N.isSkinnedMesh&&At.skinning===!0||N.isInstancedMesh&&At.instancingColor===!0&&N.instanceColor===null||N.isInstancedMesh&&At.instancingColor===!1&&N.instanceColor!==null||N.isInstancedMesh&&At.instancingMorph===!0&&N.morphTexture===null||N.isInstancedMesh&&At.instancingMorph===!1&&N.morphTexture!==null||At.envMap!==_t||B.fog===!0&&At.fog!==Q||At.numClippingPlanes!==void 0&&(At.numClippingPlanes!==tt.numPlanes||At.numIntersection!==tt.numIntersection)||At.vertexAlphas!==It||At.vertexTangents!==Ft||At.morphTargets!==Tt||At.morphNormals!==Zt||At.morphColors!==Qt||At.toneMapping!==me||At.morphTargetsCount!==Kt)&&(te=!0):(te=!0,At.__version=B.version);let en=At.currentProgram;te===!0&&(en=ms(B,I,N));let oi=!1,Ge=!1,Yi=!1;const de=en.getUniforms(),Ze=At.uniforms;if(Mt.useProgram(en.program)&&(oi=!0,Ge=!0,Yi=!0),B.id!==S&&(S=B.id,Ge=!0),oi||M!==x){Mt.buffers.depth.getReversed()?(at.copy(x.projectionMatrix),Ah(at),Rh(at),de.setValue(w,"projectionMatrix",at)):de.setValue(w,"projectionMatrix",x.projectionMatrix),de.setValue(w,"viewMatrix",x.matrixWorldInverse);const Oe=de.map.cameraPosition;Oe!==void 0&&Oe.setValue(w,Ut.setFromMatrixPosition(x.matrixWorld)),kt.logarithmicDepthBuffer&&de.setValue(w,"logDepthBufFC",2/(Math.log(x.far+1)/Math.LN2)),(B.isMeshPhongMaterial||B.isMeshToonMaterial||B.isMeshLambertMaterial||B.isMeshBasicMaterial||B.isMeshStandardMaterial||B.isShaderMaterial)&&de.setValue(w,"isOrthographic",x.isOrthographicCamera===!0),M!==x&&(M=x,Ge=!0,Yi=!0)}if(N.isSkinnedMesh){de.setOptional(w,N,"bindMatrix"),de.setOptional(w,N,"bindMatrixInverse");const De=N.skeleton;De&&(De.boneTexture===null&&De.computeBoneTexture(),de.setValue(w,"boneTexture",De.boneTexture,E))}N.isBatchedMesh&&(de.setOptional(w,N,"batchingTexture"),de.setValue(w,"batchingTexture",N._matricesTexture,E),de.setOptional(w,N,"batchingIdTexture"),de.setValue(w,"batchingIdTexture",N._indirectTexture,E),de.setOptional(w,N,"batchingColorTexture"),N._colorsTexture!==null&&de.setValue(w,"batchingColorTexture",N._colorsTexture,E));const Ke=O.morphAttributes;if((Ke.position!==void 0||Ke.normal!==void 0||Ke.color!==void 0)&&Pt.update(N,O,en),(Ge||At.receiveShadow!==N.receiveShadow)&&(At.receiveShadow=N.receiveShadow,de.setValue(w,"receiveShadow",N.receiveShadow)),B.isMeshGouraudMaterial&&B.envMap!==null&&(Ze.envMap.value=_t,Ze.flipEnvMap.value=_t.isCubeTexture&&_t.isRenderTargetTexture===!1?-1:1),B.isMeshStandardMaterial&&B.envMap===null&&I.environment!==null&&(Ze.envMapIntensity.value=I.environmentIntensity),Ge&&(de.setValue(w,"toneMappingExposure",y.toneMappingExposure),At.needsLights&&Sc(Ze,Yi),Q&&B.fog===!0&&ot.refreshFogUniforms(Ze,Q),ot.refreshMaterialUniforms(Ze,B,k,J,u.state.transmissionRenderTarget[x.id]),tr.upload(w,ho(At),Ze,E)),B.isShaderMaterial&&B.uniformsNeedUpdate===!0&&(tr.upload(w,ho(At),Ze,E),B.uniformsNeedUpdate=!1),B.isSpriteMaterial&&de.setValue(w,"center",N.center),de.setValue(w,"modelViewMatrix",N.modelViewMatrix),de.setValue(w,"normalMatrix",N.normalMatrix),de.setValue(w,"modelMatrix",N.matrixWorld),B.isShaderMaterial||B.isRawShaderMaterial){const De=B.uniformsGroups;for(let Oe=0,vr=De.length;Oe0&&E.useMultisampledRTT(x)===!1?N=Et.get(x).__webglMultisampledFramebuffer:Array.isArray(Ft)?N=Ft[O]:N=Ft,D.copy(x.viewport),W.copy(x.scissor),z=x.scissorTest}else D.copy(yt).multiplyScalar(k).floor(),W.copy(Lt).multiplyScalar(k).floor(),z=qt;if(O!==0&&(N=Ec),Mt.bindFramebuffer(w.FRAMEBUFFER,N)&&B&&Mt.drawBuffers(x,N),Mt.viewport(D),Mt.scissor(W),Mt.setScissorTest(z),Q){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_CUBE_MAP_POSITIVE_X+I,_t.__webglTexture,O)}else if(ht){const _t=Et.get(x.texture),It=I;w.framebufferTextureLayer(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,_t.__webglTexture,O,It)}else if(x!==null&&O!==0){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,_t.__webglTexture,O)}S=-1},this.readRenderTargetPixels=function(x,I,O,B,N,Q,ht){if(!(x&&x.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ht!==void 0&&(gt=gt[ht]),gt){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);try{const _t=x.texture,It=_t.format,Ft=_t.type;if(!kt.textureFormatReadable(It)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!kt.textureTypeReadable(Ft)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N&&w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),Q)}finally{const _t=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,_t)}}},this.readRenderTargetPixelsAsync=async function(x,I,O,B,N,Q,ht){if(!(x&&x.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ht!==void 0&&(gt=gt[ht]),gt){const _t=x.texture,It=_t.format,Ft=_t.type;if(!kt.textureFormatReadable(It))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!kt.textureTypeReadable(Ft))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);const Tt=w.createBuffer();w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.bufferData(w.PIXEL_PACK_BUFFER,Q.byteLength,w.STREAM_READ),w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),0);const Zt=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,Zt);const Qt=w.fenceSync(w.SYNC_GPU_COMMANDS_COMPLETE,0);return w.flush(),await wh(w,Qt,4),w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.getBufferSubData(w.PIXEL_PACK_BUFFER,0,Q),w.deleteBuffer(Tt),w.deleteSync(Qt),Q}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(x,I=null,O=0){x.isTexture!==!0&&(Ri("WebGLRenderer: copyFramebufferToTexture function signature has changed."),I=arguments[0]||null,x=arguments[1]);const B=Math.pow(2,-O),N=Math.floor(x.image.width*B),Q=Math.floor(x.image.height*B),ht=I!==null?I.x:0,gt=I!==null?I.y:0;E.setTexture2D(x,0),w.copyTexSubImage2D(w.TEXTURE_2D,O,0,0,ht,gt,N,Q),Mt.unbindTexture()};const bc=w.createFramebuffer(),Tc=w.createFramebuffer();this.copyTextureToTexture=function(x,I,O=null,B=null,N=0,Q=null){x.isTexture!==!0&&(Ri("WebGLRenderer: copyTextureToTexture function signature has changed."),B=arguments[0]||null,x=arguments[1],I=arguments[2],Q=arguments[3]||0,O=null),Q===null&&(N!==0?(Ri("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Q=N,N=0):Q=0);let ht,gt,_t,It,Ft,Tt,Zt,Qt,me;const fe=x.isCompressedTexture?x.mipmaps[Q]:x.image;if(O!==null)ht=O.max.x-O.min.x,gt=O.max.y-O.min.y,_t=O.isBox3?O.max.z-O.min.z:1,It=O.min.x,Ft=O.min.y,Tt=O.isBox3?O.min.z:0;else{const Ke=Math.pow(2,-N);ht=Math.floor(fe.width*Ke),gt=Math.floor(fe.height*Ke),x.isDataArrayTexture?_t=fe.depth:x.isData3DTexture?_t=Math.floor(fe.depth*Ke):_t=1,It=0,Ft=0,Tt=0}B!==null?(Zt=B.x,Qt=B.y,me=B.z):(Zt=0,Qt=0,me=0);const Kt=zt.convert(I.format),At=zt.convert(I.type);let we;I.isData3DTexture?(E.setTexture3D(I,0),we=w.TEXTURE_3D):I.isDataArrayTexture||I.isCompressedArrayTexture?(E.setTexture2DArray(I,0),we=w.TEXTURE_2D_ARRAY):(E.setTexture2D(I,0),we=w.TEXTURE_2D),w.pixelStorei(w.UNPACK_FLIP_Y_WEBGL,I.flipY),w.pixelStorei(w.UNPACK_PREMULTIPLY_ALPHA_WEBGL,I.premultiplyAlpha),w.pixelStorei(w.UNPACK_ALIGNMENT,I.unpackAlignment);const te=w.getParameter(w.UNPACK_ROW_LENGTH),en=w.getParameter(w.UNPACK_IMAGE_HEIGHT),oi=w.getParameter(w.UNPACK_SKIP_PIXELS),Ge=w.getParameter(w.UNPACK_SKIP_ROWS),Yi=w.getParameter(w.UNPACK_SKIP_IMAGES);w.pixelStorei(w.UNPACK_ROW_LENGTH,fe.width),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,fe.height),w.pixelStorei(w.UNPACK_SKIP_PIXELS,It),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ft),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Tt);const de=x.isDataArrayTexture||x.isData3DTexture,Ze=I.isDataArrayTexture||I.isData3DTexture;if(x.isDepthTexture){const Ke=Et.get(x),De=Et.get(I),Oe=Et.get(Ke.__renderTarget),vr=Et.get(De.__renderTarget);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,Oe.__webglFramebuffer),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,vr.__webglFramebuffer);for(let Vn=0;Vn<_t;Vn++)de&&(w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(x).__webglTexture,N,Tt+Vn),w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(I).__webglTexture,Q,me+Vn)),w.blitFramebuffer(It,Ft,ht,gt,Zt,Qt,ht,gt,w.DEPTH_BUFFER_BIT,w.NEAREST);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else if(N!==0||x.isRenderTargetTexture||Et.has(x)){const Ke=Et.get(x),De=Et.get(I);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,bc),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,Tc);for(let Oe=0;Oe<_t;Oe++)de?w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Ke.__webglTexture,N,Tt+Oe):w.framebufferTexture2D(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,Ke.__webglTexture,N),Ze?w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,De.__webglTexture,Q,me+Oe):w.framebufferTexture2D(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,De.__webglTexture,Q),N!==0?w.blitFramebuffer(It,Ft,ht,gt,Zt,Qt,ht,gt,w.COLOR_BUFFER_BIT,w.NEAREST):Ze?w.copyTexSubImage3D(we,Q,Zt,Qt,me+Oe,It,Ft,ht,gt):w.copyTexSubImage2D(we,Q,Zt,Qt,It,Ft,ht,gt);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else Ze?x.isDataTexture||x.isData3DTexture?w.texSubImage3D(we,Q,Zt,Qt,me,ht,gt,_t,Kt,At,fe.data):I.isCompressedArrayTexture?w.compressedTexSubImage3D(we,Q,Zt,Qt,me,ht,gt,_t,Kt,fe.data):w.texSubImage3D(we,Q,Zt,Qt,me,ht,gt,_t,Kt,At,fe):x.isDataTexture?w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ht,gt,Kt,At,fe.data):x.isCompressedTexture?w.compressedTexSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,fe.width,fe.height,Kt,fe.data):w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ht,gt,Kt,At,fe);w.pixelStorei(w.UNPACK_ROW_LENGTH,te),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,en),w.pixelStorei(w.UNPACK_SKIP_PIXELS,oi),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ge),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Yi),Q===0&&I.generateMipmaps&&w.generateMipmap(we),Mt.unbindTexture()},this.copyTextureToTexture3D=function(x,I,O=null,B=null,N=0){return x.isTexture!==!0&&(Ri("WebGLRenderer: copyTextureToTexture3D function signature has changed."),O=arguments[0]||null,B=arguments[1]||null,x=arguments[2],I=arguments[3],N=arguments[4]||0),Ri('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(x,I,O,B,N)},this.initRenderTarget=function(x){Et.get(x).__webglFramebuffer===void 0&&E.setupRenderTarget(x)},this.initTexture=function(x){x.isCubeTexture?E.setTextureCube(x,0):x.isData3DTexture?E.setTexture3D(x,0):x.isDataArrayTexture||x.isCompressedArrayTexture?E.setTexture2DArray(x,0):E.setTexture2D(x,0),Mt.unbindTexture()},this.resetState=function(){R=0,A=0,U=null,Mt.reset(),se.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return En}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;const e=this.getContext();e.drawingBufferColorspace=$t._getDrawingBufferColorSpace(t),e.unpackColorSpace=$t._getUnpackColorSpace()}}const El={type:"change"},so={type:"start"},_c={type:"end"},Ys=new hs,bl=new Nn,$m=Math.cos(70*bh.DEG2RAD),Me=new P,Be=2*Math.PI,oe={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Jr=1e-6;class Jm extends du{constructor(t,e=null){super(t,e),this.state=oe.NONE,this.enabled=!0,this.target=new P,this.cursor=new P,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Li.ROTATE,MIDDLE:Li.DOLLY,RIGHT:Li.PAN},this.touches={ONE:Ci.ROTATE,TWO:Ci.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new P,this._lastQuaternion=new ii,this._lastTargetPosition=new P,this._quat=new ii().setFromUnitVectors(t.up,new P(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new $o,this._sphericalDelta=new $o,this._scale=1,this._panOffset=new P,this._rotateStart=new vt,this._rotateEnd=new vt,this._rotateDelta=new vt,this._panStart=new vt,this._panEnd=new vt,this._panDelta=new vt,this._dollyStart=new vt,this._dollyEnd=new vt,this._dollyDelta=new vt,this._dollyDirection=new P,this._mouse=new vt,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=tg.bind(this),this._onPointerDown=Qm.bind(this),this._onPointerUp=eg.bind(this),this._onContextMenu=lg.bind(this),this._onMouseWheel=sg.bind(this),this._onKeyDown=rg.bind(this),this._onTouchStart=ag.bind(this),this._onTouchMove=og.bind(this),this._onMouseDown=ng.bind(this),this._onMouseMove=ig.bind(this),this._interceptControlDown=cg.bind(this),this._interceptControlUp=hg.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(El),this.update(),this.state=oe.NONE}update(t=null){const e=this.object.position;Me.copy(e).sub(this.target),Me.applyQuaternion(this._quat),this._spherical.setFromVector3(Me),this.autoRotate&&this.state===oe.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Be:n>Math.PI&&(n-=Be),s<-Math.PI?s+=Be:s>Math.PI&&(s-=Be),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(Me.setFromSpherical(this._spherical),Me.applyQuaternion(this._quatInverse),e.copy(this.target).add(Me),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=Me.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=Me.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Ys.origin.copy(this.object.position),Ys.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Ys.direction))<$m?this.object.lookAt(this.target):(bl.setFromNormalAndCoplanarPoint(this.object.up,this.target),Ys.intersectPlane(bl,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),r=!0)}return this._scale=1,this._performCursorZoom=!1,r||this._lastPosition.distanceToSquared(this.object.position)>Jr||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Jr||this._lastTargetPosition.distanceToSquared(this.target)>Jr?(this.dispatchEvent(El),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?Be/60*this.autoRotateSpeed*t:Be/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){Me.setFromMatrixColumn(e,0),Me.multiplyScalar(-t),this._panOffset.add(Me)}_panUp(t,e){this.screenSpacePanning===!0?Me.setFromMatrixColumn(e,1):(Me.setFromMatrixColumn(e,0),Me.crossVectors(this.object.up,Me)),Me.multiplyScalar(t),this._panOffset.add(Me)}_pan(t,e){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;Me.copy(s).sub(this.target);let r=Me.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*r/n.clientHeight,this.object.matrix),this._panUp(2*e*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=t-n.left,r=e-n.top,a=n.width,o=n.height;this._mouse.x=s/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Be*this._rotateDelta.x/e.clientHeight),this._rotateUp(Be*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(n,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const n=this._getSecondPointerPosition(t),s=.5*(t.pageX+n.x),r=.5*(t.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Be*this._rotateDelta.x/e.clientHeight),this._rotateUp(Be*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,o=(t.pageY+e.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e=0&&(y[ot]=null,E[ot].disconnect(xt))}for(let nt=0;nt=y.length){y.push(xt),ot=Ut;break}else if(y[Ut]===null){y[Ut]=xt,ot=Ut;break}if(ot===-1)break}const wt=E[ot];wt&&wt.connect(xt)}}const G=new P,J=new P;function H(Y,nt,xt){G.setFromMatrixPosition(nt.matrixWorld),J.setFromMatrixPosition(xt.matrixWorld);const ot=G.distanceTo(J),wt=nt.projectionMatrix.elements,Ut=xt.projectionMatrix.elements,Gt=wt[14]/(wt[10]-1),ce=wt[14]/(wt[10]+1),rt=(wt[9]+1)/wt[5],Ct=(wt[9]-1)/wt[5],w=(wt[8]-1)/wt[0],ve=(Ut[8]+1)/Ut[0],Bt=Gt*w,Ht=Gt*ve,Mt=ot/(-w+ve),ne=Mt*-w;if(nt.matrixWorld.decompose(Y.position,Y.quaternion,Y.scale),Y.translateX(ne),Y.translateZ(Mt),Y.matrixWorld.compose(Y.position,Y.quaternion,Y.scale),Y.matrixWorldInverse.copy(Y.matrixWorld).invert(),wt[10]===-1)Y.projectionMatrix.copy(nt.projectionMatrix),Y.projectionMatrixInverse.copy(nt.projectionMatrixInverse);else{const Et=Gt+Mt,b=ce+Mt,v=Bt-ne,F=Ht+(ot-ne),Z=rt*ce/b*Et,K=Ct*ce/b*Et;Y.projectionMatrix.makePerspective(v,F,Z,K,Et,b),Y.projectionMatrixInverse.copy(Y.projectionMatrix).invert()}}function it(Y,nt){nt===null?Y.matrixWorld.copy(Y.matrix):Y.matrixWorld.multiplyMatrices(nt.matrixWorld,Y.matrix),Y.matrixWorldInverse.copy(Y.matrixWorld).invert()}this.updateCamera=function(Y){if(s===null)return;let nt=Y.near,xt=Y.far;_.texture!==null&&(_.depthNear>0&&(nt=_.depthNear),_.depthFar>0&&(xt=_.depthFar)),M.near=U.near=A.near=nt,M.far=U.far=A.far=xt,(D!==M.near||W!==M.far)&&(s.updateRenderState({depthNear:M.near,depthFar:M.far}),D=M.near,W=M.far),A.layers.mask=Y.layers.mask|2,U.layers.mask=Y.layers.mask|4,M.layers.mask=A.layers.mask|U.layers.mask;const ot=Y.parent,wt=M.cameras;it(M,ot);for(let Ut=0;Ut0&&(m.alphaTest.value=d.alphaTest);const T=t.get(d),E=T.envMap,y=T.envMapRotation;E&&(m.envMap.value=E,jn.copy(y),jn.x*=-1,jn.y*=-1,jn.z*=-1,E.isCubeTexture&&E.isRenderTargetTexture===!1&&(jn.y*=-1,jn.z*=-1),m.envMapRotation.value.setFromMatrix4(qm.makeRotationFromEuler(jn)),m.flipEnvMap.value=E.isCubeTexture&&E.isRenderTargetTexture===!1?-1:1,m.reflectivity.value=d.reflectivity,m.ior.value=d.ior,m.refractionRatio.value=d.refractionRatio),d.lightMap&&(m.lightMap.value=d.lightMap,m.lightMapIntensity.value=d.lightMapIntensity,e(d.lightMap,m.lightMapTransform)),d.aoMap&&(m.aoMap.value=d.aoMap,m.aoMapIntensity.value=d.aoMapIntensity,e(d.aoMap,m.aoMapTransform))}function a(m,d){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,d.map&&(m.map.value=d.map,e(d.map,m.mapTransform))}function o(m,d){m.dashSize.value=d.dashSize,m.totalSize.value=d.dashSize+d.gapSize,m.scale.value=d.scale}function l(m,d,T,E){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,m.size.value=d.size*T,m.scale.value=E*.5,d.map&&(m.map.value=d.map,e(d.map,m.uvTransform)),d.alphaMap&&(m.alphaMap.value=d.alphaMap,e(d.alphaMap,m.alphaMapTransform)),d.alphaTest>0&&(m.alphaTest.value=d.alphaTest)}function c(m,d){m.diffuse.value.copy(d.color),m.opacity.value=d.opacity,m.rotation.value=d.rotation,d.map&&(m.map.value=d.map,e(d.map,m.mapTransform)),d.alphaMap&&(m.alphaMap.value=d.alphaMap,e(d.alphaMap,m.alphaMapTransform)),d.alphaTest>0&&(m.alphaTest.value=d.alphaTest)}function h(m,d){m.specular.value.copy(d.specular),m.shininess.value=Math.max(d.shininess,1e-4)}function f(m,d){d.gradientMap&&(m.gradientMap.value=d.gradientMap)}function p(m,d){m.metalness.value=d.metalness,d.metalnessMap&&(m.metalnessMap.value=d.metalnessMap,e(d.metalnessMap,m.metalnessMapTransform)),m.roughness.value=d.roughness,d.roughnessMap&&(m.roughnessMap.value=d.roughnessMap,e(d.roughnessMap,m.roughnessMapTransform)),d.envMap&&(m.envMapIntensity.value=d.envMapIntensity)}function u(m,d,T){m.ior.value=d.ior,d.sheen>0&&(m.sheenColor.value.copy(d.sheenColor).multiplyScalar(d.sheen),m.sheenRoughness.value=d.sheenRoughness,d.sheenColorMap&&(m.sheenColorMap.value=d.sheenColorMap,e(d.sheenColorMap,m.sheenColorMapTransform)),d.sheenRoughnessMap&&(m.sheenRoughnessMap.value=d.sheenRoughnessMap,e(d.sheenRoughnessMap,m.sheenRoughnessMapTransform))),d.clearcoat>0&&(m.clearcoat.value=d.clearcoat,m.clearcoatRoughness.value=d.clearcoatRoughness,d.clearcoatMap&&(m.clearcoatMap.value=d.clearcoatMap,e(d.clearcoatMap,m.clearcoatMapTransform)),d.clearcoatRoughnessMap&&(m.clearcoatRoughnessMap.value=d.clearcoatRoughnessMap,e(d.clearcoatRoughnessMap,m.clearcoatRoughnessMapTransform)),d.clearcoatNormalMap&&(m.clearcoatNormalMap.value=d.clearcoatNormalMap,e(d.clearcoatNormalMap,m.clearcoatNormalMapTransform),m.clearcoatNormalScale.value.copy(d.clearcoatNormalScale),d.side===He&&m.clearcoatNormalScale.value.negate())),d.dispersion>0&&(m.dispersion.value=d.dispersion),d.iridescence>0&&(m.iridescence.value=d.iridescence,m.iridescenceIOR.value=d.iridescenceIOR,m.iridescenceThicknessMinimum.value=d.iridescenceThicknessRange[0],m.iridescenceThicknessMaximum.value=d.iridescenceThicknessRange[1],d.iridescenceMap&&(m.iridescenceMap.value=d.iridescenceMap,e(d.iridescenceMap,m.iridescenceMapTransform)),d.iridescenceThicknessMap&&(m.iridescenceThicknessMap.value=d.iridescenceThicknessMap,e(d.iridescenceThicknessMap,m.iridescenceThicknessMapTransform))),d.transmission>0&&(m.transmission.value=d.transmission,m.transmissionSamplerMap.value=T.texture,m.transmissionSamplerSize.value.set(T.width,T.height),d.transmissionMap&&(m.transmissionMap.value=d.transmissionMap,e(d.transmissionMap,m.transmissionMapTransform)),m.thickness.value=d.thickness,d.thicknessMap&&(m.thicknessMap.value=d.thicknessMap,e(d.thicknessMap,m.thicknessMapTransform)),m.attenuationDistance.value=d.attenuationDistance,m.attenuationColor.value.copy(d.attenuationColor)),d.anisotropy>0&&(m.anisotropyVector.value.set(d.anisotropy*Math.cos(d.anisotropyRotation),d.anisotropy*Math.sin(d.anisotropyRotation)),d.anisotropyMap&&(m.anisotropyMap.value=d.anisotropyMap,e(d.anisotropyMap,m.anisotropyMapTransform))),m.specularIntensity.value=d.specularIntensity,m.specularColor.value.copy(d.specularColor),d.specularColorMap&&(m.specularColorMap.value=d.specularColorMap,e(d.specularColorMap,m.specularColorMapTransform)),d.specularIntensityMap&&(m.specularIntensityMap.value=d.specularIntensityMap,e(d.specularIntensityMap,m.specularIntensityMapTransform))}function g(m,d){d.matcap&&(m.matcap.value=d.matcap)}function _(m,d){const T=t.get(d).light;m.referencePosition.value.setFromMatrixPosition(T.matrixWorld),m.nearDistance.value=T.shadow.camera.near,m.farDistance.value=T.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:s}}function Zm(i,t,e,n){let s={},r={},a=[];const o=i.getParameter(i.MAX_UNIFORM_BUFFER_BINDINGS);function l(T,E){const y=E.program;n.uniformBlockBinding(T,y)}function c(T,E){let y=s[T.id];y===void 0&&(g(T),y=h(T),s[T.id]=y,T.addEventListener("dispose",m));const L=E.program;n.updateUBOMapping(T,L);const R=t.render.frame;r[T.id]!==R&&(p(T),r[T.id]=R)}function h(T){const E=f();T.__bindingPointIndex=E;const y=i.createBuffer(),L=T.__size,R=T.usage;return i.bindBuffer(i.UNIFORM_BUFFER,y),i.bufferData(i.UNIFORM_BUFFER,L,R),i.bindBuffer(i.UNIFORM_BUFFER,null),i.bindBufferBase(i.UNIFORM_BUFFER,E,y),y}function f(){for(let T=0;T0&&(y+=L-R),T.__size=y,T.__cache={},this}function _(T){const E={boundary:0,storage:0};return typeof T=="number"||typeof T=="boolean"?(E.boundary=4,E.storage=4):T.isVector2?(E.boundary=8,E.storage=8):T.isVector3||T.isColor?(E.boundary=16,E.storage=12):T.isVector4?(E.boundary=16,E.storage=16):T.isMatrix3?(E.boundary=48,E.storage=48):T.isMatrix4?(E.boundary=64,E.storage=64):T.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",T),E}function m(T){const E=T.target;E.removeEventListener("dispose",m);const y=a.indexOf(E.__bindingPointIndex);a.splice(y,1),i.deleteBuffer(s[E.id]),delete s[E.id],delete r[E.id]}function d(){for(const T in s)i.deleteBuffer(s[T]);a=[],s={},r={}}return{bind:l,update:c,dispose:d}}class Km{constructor(t={}){const{canvas:e=Th(),context:n=null,depth:s=!0,stencil:r=!1,alpha:a=!1,antialias:o=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:f=!1,reverseDepthBuffer:p=!1}=t;this.isWebGLRenderer=!0;let u;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");u=n.getContextAttributes().alpha}else u=a;const g=new Uint32Array(4),_=new Int32Array(4);let m=null,d=null;const T=[],E=[];this.domElement=e,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this._outputColorSpace=Qe,this.toneMapping=On,this.toneMappingExposure=1;const y=this;let L=!1,R=0,A=0,U=null,S=-1,M=null;const D=new le,W=new le;let z=null;const V=new at(0);let $=0,G=e.width,J=e.height,H=1,it=null,dt=null;const yt=new le(0,0,G,J),Lt=new le(0,0,G,J);let qt=!1;const Y=new eo;let nt=!1,xt=!1;this.transmissionResolutionScale=1;const ot=new ee,wt=new ee,Ut=new P,Gt=new le,ce={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let rt=!1;function Ct(){return U===null?H:1}let w=n;function ve(x,I){return e.getContext(x,I)}try{const x={alpha:!0,depth:s,stencil:r,antialias:o,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:f};if("setAttribute"in e&&e.setAttribute("data-engine",`three.js r${Ya}`),e.addEventListener("webglcontextlost",q,!1),e.addEventListener("webglcontextrestored",ct,!1),e.addEventListener("webglcontextcreationerror",ht,!1),w===null){const I="webgl2";if(w=ve(I,x),w===null)throw ve(I)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(x){throw console.error("THREE.WebGLRenderer: "+x.message),x}let Bt,Ht,Mt,ne,Et,b,v,F,Z,K,X,St,lt,ft,jt,tt,mt,bt,Pt,pt,Xt,zt,se,C;function et(){Bt=new rp(w),Bt.init(),zt=new Hm(w,Bt),Ht=new Qf(w,Bt,t,zt),Mt=new zm(w,Bt),Ht.reverseDepthBuffer&&p&&Mt.buffers.depth.setReversed(!0),ne=new lp(w),Et=new wm,b=new km(w,Bt,Mt,Et,Ht,zt,ne),v=new ep(y),F=new sp(y),Z=new pu(w),se=new $f(w,Z),K=new ap(w,Z,ne,se),X=new hp(w,K,Z,ne),Pt=new cp(w,Ht,b),tt=new tp(Et),St=new Tm(y,v,F,Bt,Ht,se,tt),lt=new jm(y,Et),ft=new Rm,jt=new Im(Bt),bt=new Kf(y,v,F,Mt,X,u,l),mt=new Om(y,X,Ht),C=new Zm(w,ne,Ht,Mt),pt=new Jf(w,Bt,ne),Xt=new op(w,Bt,ne),ne.programs=St.programs,y.capabilities=Ht,y.extensions=Bt,y.properties=Et,y.renderLists=ft,y.shadowMap=mt,y.state=Mt,y.info=ne}et();const k=new Ym(y,w);this.xr=k,this.getContext=function(){return w},this.getContextAttributes=function(){return w.getContextAttributes()},this.forceContextLoss=function(){const x=Bt.get("WEBGL_lose_context");x&&x.loseContext()},this.forceContextRestore=function(){const x=Bt.get("WEBGL_lose_context");x&&x.restoreContext()},this.getPixelRatio=function(){return H},this.setPixelRatio=function(x){x!==void 0&&(H=x,this.setSize(G,J,!1))},this.getSize=function(x){return x.set(G,J)},this.setSize=function(x,I,O=!0){if(k.isPresenting){console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting.");return}G=x,J=I,e.width=Math.floor(x*H),e.height=Math.floor(I*H),O===!0&&(e.style.width=x+"px",e.style.height=I+"px"),this.setViewport(0,0,x,I)},this.getDrawingBufferSize=function(x){return x.set(G*H,J*H).floor()},this.setDrawingBufferSize=function(x,I,O){G=x,J=I,H=O,e.width=Math.floor(x*O),e.height=Math.floor(I*O),this.setViewport(0,0,x,I)},this.getCurrentViewport=function(x){return x.copy(D)},this.getViewport=function(x){return x.copy(yt)},this.setViewport=function(x,I,O,B){x.isVector4?yt.set(x.x,x.y,x.z,x.w):yt.set(x,I,O,B),Mt.viewport(D.copy(yt).multiplyScalar(H).round())},this.getScissor=function(x){return x.copy(Lt)},this.setScissor=function(x,I,O,B){x.isVector4?Lt.set(x.x,x.y,x.z,x.w):Lt.set(x,I,O,B),Mt.scissor(W.copy(Lt).multiplyScalar(H).round())},this.getScissorTest=function(){return qt},this.setScissorTest=function(x){Mt.setScissorTest(qt=x)},this.setOpaqueSort=function(x){it=x},this.setTransparentSort=function(x){dt=x},this.getClearColor=function(x){return x.copy(bt.getClearColor())},this.setClearColor=function(){bt.setClearColor.apply(bt,arguments)},this.getClearAlpha=function(){return bt.getClearAlpha()},this.setClearAlpha=function(){bt.setClearAlpha.apply(bt,arguments)},this.clear=function(x=!0,I=!0,O=!0){let B=0;if(x){let N=!1;if(U!==null){const Q=U.texture.format;N=Q===Qa||Q===Ja||Q===$a}if(N){const Q=U.texture.type,ut=Q===An||Q===ni||Q===ls||Q===ki||Q===ja||Q===Za,gt=bt.getClearColor(),_t=bt.getClearAlpha(),It=gt.r,Ft=gt.g,Tt=gt.b;ut?(g[0]=It,g[1]=Ft,g[2]=Tt,g[3]=_t,w.clearBufferuiv(w.COLOR,0,g)):(_[0]=It,_[1]=Ft,_[2]=Tt,_[3]=_t,w.clearBufferiv(w.COLOR,0,_))}else B|=w.COLOR_BUFFER_BIT}I&&(B|=w.DEPTH_BUFFER_BIT),O&&(B|=w.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),w.clear(B)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){e.removeEventListener("webglcontextlost",q,!1),e.removeEventListener("webglcontextrestored",ct,!1),e.removeEventListener("webglcontextcreationerror",ht,!1),bt.dispose(),ft.dispose(),jt.dispose(),Et.dispose(),v.dispose(),F.dispose(),X.dispose(),se.dispose(),C.dispose(),St.dispose(),k.dispose(),k.removeEventListener("sessionstart",ro),k.removeEventListener("sessionend",ao),Hn.stop()};function q(x){x.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),L=!0}function ct(){console.log("THREE.WebGLRenderer: Context Restored."),L=!1;const x=ne.autoReset,I=mt.enabled,O=mt.autoUpdate,B=mt.needsUpdate,N=mt.type;et(),ne.autoReset=x,mt.enabled=I,mt.autoUpdate=O,mt.needsUpdate=B,mt.type=N}function ht(x){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",x.statusMessage)}function Nt(x){const I=x.target;I.removeEventListener("dispose",Nt),ue(I)}function ue(x){xe(x),Et.remove(x)}function xe(x){const I=Et.get(x).programs;I!==void 0&&(I.forEach(function(O){St.releaseProgram(O)}),x.isShaderMaterial&&St.releaseShaderCache(x))}this.renderBufferDirect=function(x,I,O,B,N,Q){I===null&&(I=ce);const ut=N.isMesh&&N.matrixWorld.determinant()<0,gt=Mc(x,I,O,B,N);Mt.setMaterial(B,ut);let _t=O.index,It=1;if(B.wireframe===!0){if(_t=K.getWireframeAttribute(O),_t===void 0)return;It=2}const Ft=O.drawRange,Tt=O.attributes.position;let Zt=Ft.start*It,Qt=(Ft.start+Ft.count)*It;Q!==null&&(Zt=Math.max(Zt,Q.start*It),Qt=Math.min(Qt,(Q.start+Q.count)*It)),_t!==null?(Zt=Math.max(Zt,0),Qt=Math.min(Qt,_t.count)):Tt!=null&&(Zt=Math.max(Zt,0),Qt=Math.min(Qt,Tt.count));const me=Qt-Zt;if(me<0||me===1/0)return;se.setup(N,B,gt,O,_t);let fe,Kt=pt;if(_t!==null&&(fe=Z.get(_t),Kt=Xt,Kt.setIndex(fe)),N.isMesh)B.wireframe===!0?(Mt.setLineWidth(B.wireframeLinewidth*Ct()),Kt.setMode(w.LINES)):Kt.setMode(w.TRIANGLES);else if(N.isLine){let At=B.linewidth;At===void 0&&(At=1),Mt.setLineWidth(At*Ct()),N.isLineSegments?Kt.setMode(w.LINES):N.isLineLoop?Kt.setMode(w.LINE_LOOP):Kt.setMode(w.LINE_STRIP)}else N.isPoints?Kt.setMode(w.POINTS):N.isSprite&&Kt.setMode(w.TRIANGLES);if(N.isBatchedMesh)if(N._multiDrawInstances!==null)Kt.renderMultiDrawInstances(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount,N._multiDrawInstances);else if(Bt.get("WEBGL_multi_draw"))Kt.renderMultiDraw(N._multiDrawStarts,N._multiDrawCounts,N._multiDrawCount);else{const At=N._multiDrawStarts,we=N._multiDrawCounts,te=N._multiDrawCount,en=_t?Z.get(_t).bytesPerElement:1,oi=Et.get(B).currentProgram.getUniforms();for(let Ge=0;Ge{function Q(){if(B.forEach(function(ut){Et.get(ut).currentProgram.isReady()&&B.delete(ut)}),B.size===0){N(x);return}setTimeout(Q,10)}Bt.get("KHR_parallel_shader_compile")!==null?Q():setTimeout(Q,10)})};let Ve=null;function mn(x){Ve&&Ve(x)}function ro(){Hn.stop()}function ao(){Hn.start()}const Hn=new dc;Hn.setAnimationLoop(mn),typeof self<"u"&&Hn.setContext(self),this.setAnimationLoop=function(x){Ve=x,k.setAnimationLoop(x),x===null?Hn.stop():Hn.start()},k.addEventListener("sessionstart",ro),k.addEventListener("sessionend",ao),this.render=function(x,I){if(I!==void 0&&I.isCamera!==!0){console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(L===!0)return;if(x.matrixWorldAutoUpdate===!0&&x.updateMatrixWorld(),I.parent===null&&I.matrixWorldAutoUpdate===!0&&I.updateMatrixWorld(),k.enabled===!0&&k.isPresenting===!0&&(k.cameraAutoUpdate===!0&&k.updateCamera(I),I=k.getCamera()),x.isScene===!0&&x.onBeforeRender(y,x,I,U),d=jt.get(x,E.length),d.init(I),E.push(d),wt.multiplyMatrices(I.projectionMatrix,I.matrixWorldInverse),Y.setFromProjectionMatrix(wt),xt=this.localClippingEnabled,nt=tt.init(this.clippingPlanes,xt),m=ft.get(x,T.length),m.init(),T.push(m),k.enabled===!0&&k.isPresenting===!0){const Q=y.xr.getDepthSensingMesh();Q!==null&&_r(Q,I,-1/0,y.sortObjects)}_r(x,I,0,y.sortObjects),m.finish(),y.sortObjects===!0&&m.sort(it,dt),rt=k.enabled===!1||k.isPresenting===!1||k.hasDepthSensing()===!1,rt&&bt.addToRenderList(m,x),this.info.render.frame++,nt===!0&&tt.beginShadows();const O=d.state.shadowsArray;mt.render(O,x,I),nt===!0&&tt.endShadows(),this.info.autoReset===!0&&this.info.reset();const B=m.opaque,N=m.transmissive;if(d.setupLights(),I.isArrayCamera){const Q=I.cameras;if(N.length>0)for(let ut=0,gt=Q.length;ut0&&lo(B,N,x,I),rt&&bt.render(x),oo(m,x,I);U!==null&&A===0&&(b.updateMultisampleRenderTarget(U),b.updateRenderTargetMipmap(U)),x.isScene===!0&&x.onAfterRender(y,x,I),se.resetDefaultState(),S=-1,M=null,E.pop(),E.length>0?(d=E[E.length-1],nt===!0&&tt.setGlobalState(y.clippingPlanes,d.state.camera)):d=null,T.pop(),T.length>0?m=T[T.length-1]:m=null};function _r(x,I,O,B){if(x.visible===!1)return;if(x.layers.test(I.layers)){if(x.isGroup)O=x.renderOrder;else if(x.isLOD)x.autoUpdate===!0&&x.update(I);else if(x.isLight)d.pushLight(x),x.castShadow&&d.pushShadow(x);else if(x.isSprite){if(!x.frustumCulled||Y.intersectsSprite(x)){B&&Gt.setFromMatrixPosition(x.matrixWorld).applyMatrix4(wt);const ut=X.update(x),gt=x.material;gt.visible&&m.push(x,ut,gt,O,Gt.z,null)}}else if((x.isMesh||x.isLine||x.isPoints)&&(!x.frustumCulled||Y.intersectsObject(x))){const ut=X.update(x),gt=x.material;if(B&&(x.boundingSphere!==void 0?(x.boundingSphere===null&&x.computeBoundingSphere(),Gt.copy(x.boundingSphere.center)):(ut.boundingSphere===null&&ut.computeBoundingSphere(),Gt.copy(ut.boundingSphere.center)),Gt.applyMatrix4(x.matrixWorld).applyMatrix4(wt)),Array.isArray(gt)){const _t=ut.groups;for(let It=0,Ft=_t.length;It0&&ps(N,I,O),Q.length>0&&ps(Q,I,O),ut.length>0&&ps(ut,I,O),Mt.buffers.depth.setTest(!0),Mt.buffers.depth.setMask(!0),Mt.buffers.color.setMask(!0),Mt.setPolygonOffset(!1)}function lo(x,I,O,B){if((O.isScene===!0?O.overrideMaterial:null)!==null)return;d.state.transmissionRenderTarget[B.id]===void 0&&(d.state.transmissionRenderTarget[B.id]=new on(1,1,{generateMipmaps:!0,type:Bt.has("EXT_color_buffer_half_float")||Bt.has("EXT_color_buffer_float")?Tn:An,minFilter:Qn,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:$t.workingColorSpace}));const Q=d.state.transmissionRenderTarget[B.id],ut=B.viewport||D;Q.setSize(ut.z*y.transmissionResolutionScale,ut.w*y.transmissionResolutionScale);const gt=y.getRenderTarget();y.setRenderTarget(Q),y.getClearColor(V),$=y.getClearAlpha(),$<1&&y.setClearColor(16777215,.5),y.clear(),rt&&bt.render(O);const _t=y.toneMapping;y.toneMapping=On;const It=B.viewport;if(B.viewport!==void 0&&(B.viewport=void 0),d.setupLightsView(B),nt===!0&&tt.setGlobalState(y.clippingPlanes,B),ps(x,O,B),b.updateMultisampleRenderTarget(Q),b.updateRenderTargetMipmap(Q),Bt.has("WEBGL_multisampled_render_to_texture")===!1){let Ft=!1;for(let Tt=0,Zt=I.length;Tt0),Tt=!!O.morphAttributes.position,Zt=!!O.morphAttributes.normal,Qt=!!O.morphAttributes.color;let me=On;B.toneMapped&&(U===null||U.isXRRenderTarget===!0)&&(me=y.toneMapping);const fe=O.morphAttributes.position||O.morphAttributes.normal||O.morphAttributes.color,Kt=fe!==void 0?fe.length:0,At=Et.get(B),we=d.state.lights;if(nt===!0&&(xt===!0||x!==M)){const De=x===M&&B.id===S;tt.setState(B,x,De)}let te=!1;B.version===At.__version?(At.needsLights&&At.lightsStateVersion!==we.state.version||At.outputColorSpace!==gt||N.isBatchedMesh&&At.batching===!1||!N.isBatchedMesh&&At.batching===!0||N.isBatchedMesh&&At.batchingColor===!0&&N.colorTexture===null||N.isBatchedMesh&&At.batchingColor===!1&&N.colorTexture!==null||N.isInstancedMesh&&At.instancing===!1||!N.isInstancedMesh&&At.instancing===!0||N.isSkinnedMesh&&At.skinning===!1||!N.isSkinnedMesh&&At.skinning===!0||N.isInstancedMesh&&At.instancingColor===!0&&N.instanceColor===null||N.isInstancedMesh&&At.instancingColor===!1&&N.instanceColor!==null||N.isInstancedMesh&&At.instancingMorph===!0&&N.morphTexture===null||N.isInstancedMesh&&At.instancingMorph===!1&&N.morphTexture!==null||At.envMap!==_t||B.fog===!0&&At.fog!==Q||At.numClippingPlanes!==void 0&&(At.numClippingPlanes!==tt.numPlanes||At.numIntersection!==tt.numIntersection)||At.vertexAlphas!==It||At.vertexTangents!==Ft||At.morphTargets!==Tt||At.morphNormals!==Zt||At.morphColors!==Qt||At.toneMapping!==me||At.morphTargetsCount!==Kt)&&(te=!0):(te=!0,At.__version=B.version);let en=At.currentProgram;te===!0&&(en=ms(B,I,N));let oi=!1,Ge=!1,Yi=!1;const de=en.getUniforms(),Ze=At.uniforms;if(Mt.useProgram(en.program)&&(oi=!0,Ge=!0,Yi=!0),B.id!==S&&(S=B.id,Ge=!0),oi||M!==x){Mt.buffers.depth.getReversed()?(ot.copy(x.projectionMatrix),Ah(ot),Rh(ot),de.setValue(w,"projectionMatrix",ot)):de.setValue(w,"projectionMatrix",x.projectionMatrix),de.setValue(w,"viewMatrix",x.matrixWorldInverse);const Oe=de.map.cameraPosition;Oe!==void 0&&Oe.setValue(w,Ut.setFromMatrixPosition(x.matrixWorld)),Ht.logarithmicDepthBuffer&&de.setValue(w,"logDepthBufFC",2/(Math.log(x.far+1)/Math.LN2)),(B.isMeshPhongMaterial||B.isMeshToonMaterial||B.isMeshLambertMaterial||B.isMeshBasicMaterial||B.isMeshStandardMaterial||B.isShaderMaterial)&&de.setValue(w,"isOrthographic",x.isOrthographicCamera===!0),M!==x&&(M=x,Ge=!0,Yi=!0)}if(N.isSkinnedMesh){de.setOptional(w,N,"bindMatrix"),de.setOptional(w,N,"bindMatrixInverse");const De=N.skeleton;De&&(De.boneTexture===null&&De.computeBoneTexture(),de.setValue(w,"boneTexture",De.boneTexture,b))}N.isBatchedMesh&&(de.setOptional(w,N,"batchingTexture"),de.setValue(w,"batchingTexture",N._matricesTexture,b),de.setOptional(w,N,"batchingIdTexture"),de.setValue(w,"batchingIdTexture",N._indirectTexture,b),de.setOptional(w,N,"batchingColorTexture"),N._colorsTexture!==null&&de.setValue(w,"batchingColorTexture",N._colorsTexture,b));const Ke=O.morphAttributes;if((Ke.position!==void 0||Ke.normal!==void 0||Ke.color!==void 0)&&Pt.update(N,O,en),(Ge||At.receiveShadow!==N.receiveShadow)&&(At.receiveShadow=N.receiveShadow,de.setValue(w,"receiveShadow",N.receiveShadow)),B.isMeshGouraudMaterial&&B.envMap!==null&&(Ze.envMap.value=_t,Ze.flipEnvMap.value=_t.isCubeTexture&&_t.isRenderTargetTexture===!1?-1:1),B.isMeshStandardMaterial&&B.envMap===null&&I.environment!==null&&(Ze.envMapIntensity.value=I.environmentIntensity),Ge&&(de.setValue(w,"toneMappingExposure",y.toneMappingExposure),At.needsLights&&Sc(Ze,Yi),Q&&B.fog===!0&<.refreshFogUniforms(Ze,Q),lt.refreshMaterialUniforms(Ze,B,H,J,d.state.transmissionRenderTarget[x.id]),tr.upload(w,ho(At),Ze,b)),B.isShaderMaterial&&B.uniformsNeedUpdate===!0&&(tr.upload(w,ho(At),Ze,b),B.uniformsNeedUpdate=!1),B.isSpriteMaterial&&de.setValue(w,"center",N.center),de.setValue(w,"modelViewMatrix",N.modelViewMatrix),de.setValue(w,"normalMatrix",N.normalMatrix),de.setValue(w,"modelMatrix",N.matrixWorld),B.isShaderMaterial||B.isRawShaderMaterial){const De=B.uniformsGroups;for(let Oe=0,vr=De.length;Oe0&&b.useMultisampledRTT(x)===!1?N=Et.get(x).__webglMultisampledFramebuffer:Array.isArray(Ft)?N=Ft[O]:N=Ft,D.copy(x.viewport),W.copy(x.scissor),z=x.scissorTest}else D.copy(yt).multiplyScalar(H).floor(),W.copy(Lt).multiplyScalar(H).floor(),z=qt;if(O!==0&&(N=Ec),Mt.bindFramebuffer(w.FRAMEBUFFER,N)&&B&&Mt.drawBuffers(x,N),Mt.viewport(D),Mt.scissor(W),Mt.setScissorTest(z),Q){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_CUBE_MAP_POSITIVE_X+I,_t.__webglTexture,O)}else if(ut){const _t=Et.get(x.texture),It=I;w.framebufferTextureLayer(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,_t.__webglTexture,O,It)}else if(x!==null&&O!==0){const _t=Et.get(x.texture);w.framebufferTexture2D(w.FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,_t.__webglTexture,O)}S=-1},this.readRenderTargetPixels=function(x,I,O,B,N,Q,ut){if(!(x&&x.isWebGLRenderTarget)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");return}let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ut!==void 0&&(gt=gt[ut]),gt){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);try{const _t=x.texture,It=_t.format,Ft=_t.type;if(!Ht.textureFormatReadable(It)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");return}if(!Ht.textureTypeReadable(Ft)){console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");return}I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N&&w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),Q)}finally{const _t=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,_t)}}},this.readRenderTargetPixelsAsync=async function(x,I,O,B,N,Q,ut){if(!(x&&x.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let gt=Et.get(x).__webglFramebuffer;if(x.isWebGLCubeRenderTarget&&ut!==void 0&&(gt=gt[ut]),gt){const _t=x.texture,It=_t.format,Ft=_t.type;if(!Ht.textureFormatReadable(It))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!Ht.textureTypeReadable(Ft))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");if(I>=0&&I<=x.width-B&&O>=0&&O<=x.height-N){Mt.bindFramebuffer(w.FRAMEBUFFER,gt);const Tt=w.createBuffer();w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.bufferData(w.PIXEL_PACK_BUFFER,Q.byteLength,w.STREAM_READ),w.readPixels(I,O,B,N,zt.convert(It),zt.convert(Ft),0);const Zt=U!==null?Et.get(U).__webglFramebuffer:null;Mt.bindFramebuffer(w.FRAMEBUFFER,Zt);const Qt=w.fenceSync(w.SYNC_GPU_COMMANDS_COMPLETE,0);return w.flush(),await wh(w,Qt,4),w.bindBuffer(w.PIXEL_PACK_BUFFER,Tt),w.getBufferSubData(w.PIXEL_PACK_BUFFER,0,Q),w.deleteBuffer(Tt),w.deleteSync(Qt),Q}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(x,I=null,O=0){x.isTexture!==!0&&(Ri("WebGLRenderer: copyFramebufferToTexture function signature has changed."),I=arguments[0]||null,x=arguments[1]);const B=Math.pow(2,-O),N=Math.floor(x.image.width*B),Q=Math.floor(x.image.height*B),ut=I!==null?I.x:0,gt=I!==null?I.y:0;b.setTexture2D(x,0),w.copyTexSubImage2D(w.TEXTURE_2D,O,0,0,ut,gt,N,Q),Mt.unbindTexture()};const bc=w.createFramebuffer(),Tc=w.createFramebuffer();this.copyTextureToTexture=function(x,I,O=null,B=null,N=0,Q=null){x.isTexture!==!0&&(Ri("WebGLRenderer: copyTextureToTexture function signature has changed."),B=arguments[0]||null,x=arguments[1],I=arguments[2],Q=arguments[3]||0,O=null),Q===null&&(N!==0?(Ri("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Q=N,N=0):Q=0);let ut,gt,_t,It,Ft,Tt,Zt,Qt,me;const fe=x.isCompressedTexture?x.mipmaps[Q]:x.image;if(O!==null)ut=O.max.x-O.min.x,gt=O.max.y-O.min.y,_t=O.isBox3?O.max.z-O.min.z:1,It=O.min.x,Ft=O.min.y,Tt=O.isBox3?O.min.z:0;else{const Ke=Math.pow(2,-N);ut=Math.floor(fe.width*Ke),gt=Math.floor(fe.height*Ke),x.isDataArrayTexture?_t=fe.depth:x.isData3DTexture?_t=Math.floor(fe.depth*Ke):_t=1,It=0,Ft=0,Tt=0}B!==null?(Zt=B.x,Qt=B.y,me=B.z):(Zt=0,Qt=0,me=0);const Kt=zt.convert(I.format),At=zt.convert(I.type);let we;I.isData3DTexture?(b.setTexture3D(I,0),we=w.TEXTURE_3D):I.isDataArrayTexture||I.isCompressedArrayTexture?(b.setTexture2DArray(I,0),we=w.TEXTURE_2D_ARRAY):(b.setTexture2D(I,0),we=w.TEXTURE_2D),w.pixelStorei(w.UNPACK_FLIP_Y_WEBGL,I.flipY),w.pixelStorei(w.UNPACK_PREMULTIPLY_ALPHA_WEBGL,I.premultiplyAlpha),w.pixelStorei(w.UNPACK_ALIGNMENT,I.unpackAlignment);const te=w.getParameter(w.UNPACK_ROW_LENGTH),en=w.getParameter(w.UNPACK_IMAGE_HEIGHT),oi=w.getParameter(w.UNPACK_SKIP_PIXELS),Ge=w.getParameter(w.UNPACK_SKIP_ROWS),Yi=w.getParameter(w.UNPACK_SKIP_IMAGES);w.pixelStorei(w.UNPACK_ROW_LENGTH,fe.width),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,fe.height),w.pixelStorei(w.UNPACK_SKIP_PIXELS,It),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ft),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Tt);const de=x.isDataArrayTexture||x.isData3DTexture,Ze=I.isDataArrayTexture||I.isData3DTexture;if(x.isDepthTexture){const Ke=Et.get(x),De=Et.get(I),Oe=Et.get(Ke.__renderTarget),vr=Et.get(De.__renderTarget);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,Oe.__webglFramebuffer),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,vr.__webglFramebuffer);for(let Vn=0;Vn<_t;Vn++)de&&(w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(x).__webglTexture,N,Tt+Vn),w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Et.get(I).__webglTexture,Q,me+Vn)),w.blitFramebuffer(It,Ft,ut,gt,Zt,Qt,ut,gt,w.DEPTH_BUFFER_BIT,w.NEAREST);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else if(N!==0||x.isRenderTargetTexture||Et.has(x)){const Ke=Et.get(x),De=Et.get(I);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,bc),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,Tc);for(let Oe=0;Oe<_t;Oe++)de?w.framebufferTextureLayer(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,Ke.__webglTexture,N,Tt+Oe):w.framebufferTexture2D(w.READ_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,Ke.__webglTexture,N),Ze?w.framebufferTextureLayer(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,De.__webglTexture,Q,me+Oe):w.framebufferTexture2D(w.DRAW_FRAMEBUFFER,w.COLOR_ATTACHMENT0,w.TEXTURE_2D,De.__webglTexture,Q),N!==0?w.blitFramebuffer(It,Ft,ut,gt,Zt,Qt,ut,gt,w.COLOR_BUFFER_BIT,w.NEAREST):Ze?w.copyTexSubImage3D(we,Q,Zt,Qt,me+Oe,It,Ft,ut,gt):w.copyTexSubImage2D(we,Q,Zt,Qt,It,Ft,ut,gt);Mt.bindFramebuffer(w.READ_FRAMEBUFFER,null),Mt.bindFramebuffer(w.DRAW_FRAMEBUFFER,null)}else Ze?x.isDataTexture||x.isData3DTexture?w.texSubImage3D(we,Q,Zt,Qt,me,ut,gt,_t,Kt,At,fe.data):I.isCompressedArrayTexture?w.compressedTexSubImage3D(we,Q,Zt,Qt,me,ut,gt,_t,Kt,fe.data):w.texSubImage3D(we,Q,Zt,Qt,me,ut,gt,_t,Kt,At,fe):x.isDataTexture?w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ut,gt,Kt,At,fe.data):x.isCompressedTexture?w.compressedTexSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,fe.width,fe.height,Kt,fe.data):w.texSubImage2D(w.TEXTURE_2D,Q,Zt,Qt,ut,gt,Kt,At,fe);w.pixelStorei(w.UNPACK_ROW_LENGTH,te),w.pixelStorei(w.UNPACK_IMAGE_HEIGHT,en),w.pixelStorei(w.UNPACK_SKIP_PIXELS,oi),w.pixelStorei(w.UNPACK_SKIP_ROWS,Ge),w.pixelStorei(w.UNPACK_SKIP_IMAGES,Yi),Q===0&&I.generateMipmaps&&w.generateMipmap(we),Mt.unbindTexture()},this.copyTextureToTexture3D=function(x,I,O=null,B=null,N=0){return x.isTexture!==!0&&(Ri("WebGLRenderer: copyTextureToTexture3D function signature has changed."),O=arguments[0]||null,B=arguments[1]||null,x=arguments[2],I=arguments[3],N=arguments[4]||0),Ri('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(x,I,O,B,N)},this.initRenderTarget=function(x){Et.get(x).__webglFramebuffer===void 0&&b.setupRenderTarget(x)},this.initTexture=function(x){x.isCubeTexture?b.setTextureCube(x,0):x.isData3DTexture?b.setTexture3D(x,0):x.isDataArrayTexture||x.isCompressedArrayTexture?b.setTexture2DArray(x,0):b.setTexture2D(x,0),Mt.unbindTexture()},this.resetState=function(){R=0,A=0,U=null,Mt.reset(),se.reset()},typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return En}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(t){this._outputColorSpace=t;const e=this.getContext();e.drawingBufferColorspace=$t._getDrawingBufferColorSpace(t),e.unpackColorSpace=$t._getUnpackColorSpace()}}const El={type:"change"},so={type:"start"},_c={type:"end"},Ys=new hs,bl=new Nn,$m=Math.cos(70*bh.DEG2RAD),Me=new P,Be=2*Math.PI,oe={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},Jr=1e-6;class Jm extends du{constructor(t,e=null){super(t,e),this.state=oe.NONE,this.enabled=!0,this.target=new P,this.cursor=new P,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:Li.ROTATE,MIDDLE:Li.DOLLY,RIGHT:Li.PAN},this.touches={ONE:Ci.ROTATE,TWO:Ci.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new P,this._lastQuaternion=new ii,this._lastTargetPosition=new P,this._quat=new ii().setFromUnitVectors(t.up,new P(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new $o,this._sphericalDelta=new $o,this._scale=1,this._panOffset=new P,this._rotateStart=new vt,this._rotateEnd=new vt,this._rotateDelta=new vt,this._panStart=new vt,this._panEnd=new vt,this._panDelta=new vt,this._dollyStart=new vt,this._dollyEnd=new vt,this._dollyDelta=new vt,this._dollyDirection=new P,this._mouse=new vt,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=tg.bind(this),this._onPointerDown=Qm.bind(this),this._onPointerUp=eg.bind(this),this._onContextMenu=lg.bind(this),this._onMouseWheel=sg.bind(this),this._onKeyDown=rg.bind(this),this._onTouchStart=ag.bind(this),this._onTouchMove=og.bind(this),this._onMouseDown=ng.bind(this),this._onMouseMove=ig.bind(this),this._interceptControlDown=cg.bind(this),this._interceptControlUp=hg.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(t){t.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=t}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(El),this.update(),this.state=oe.NONE}update(t=null){const e=this.object.position;Me.copy(e).sub(this.target),Me.applyQuaternion(this._quat),this._spherical.setFromVector3(Me),this.autoRotate&&this.state===oe.NONE&&this._rotateLeft(this._getAutoRotationAngle(t)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let n=this.minAzimuthAngle,s=this.maxAzimuthAngle;isFinite(n)&&isFinite(s)&&(n<-Math.PI?n+=Be:n>Math.PI&&(n-=Be),s<-Math.PI?s+=Be:s>Math.PI&&(s-=Be),n<=s?this._spherical.theta=Math.max(n,Math.min(s,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+s)/2?Math.max(n,this._spherical.theta):Math.min(s,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(Me.setFromSpherical(this._spherical),Me.applyQuaternion(this._quatInverse),e.copy(this.target).add(Me),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const o=Me.length();a=this._clampDistance(o*this._scale);const l=o-a;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const o=new P(this._mouse.x,this._mouse.y,0);o.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(o),this.object.updateMatrixWorld(),a=Me.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Ys.origin.copy(this.object.position),Ys.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Ys.direction))<$m?this.object.lookAt(this.target):(bl.setFromNormalAndCoplanarPoint(this.object.up,this.target),Ys.intersectPlane(bl,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),r=!0)}return this._scale=1,this._performCursorZoom=!1,r||this._lastPosition.distanceToSquared(this.object.position)>Jr||8*(1-this._lastQuaternion.dot(this.object.quaternion))>Jr||this._lastTargetPosition.distanceToSquared(this.target)>Jr?(this.dispatchEvent(El),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(t){return t!==null?Be/60*this.autoRotateSpeed*t:Be/60/60*this.autoRotateSpeed}_getZoomScale(t){const e=Math.abs(t*.01);return Math.pow(.95,this.zoomSpeed*e)}_rotateLeft(t){this._sphericalDelta.theta-=t}_rotateUp(t){this._sphericalDelta.phi-=t}_panLeft(t,e){Me.setFromMatrixColumn(e,0),Me.multiplyScalar(-t),this._panOffset.add(Me)}_panUp(t,e){this.screenSpacePanning===!0?Me.setFromMatrixColumn(e,1):(Me.setFromMatrixColumn(e,0),Me.crossVectors(this.object.up,Me)),Me.multiplyScalar(t),this._panOffset.add(Me)}_pan(t,e){const n=this.domElement;if(this.object.isPerspectiveCamera){const s=this.object.position;Me.copy(s).sub(this.target);let r=Me.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*t*r/n.clientHeight,this.object.matrix),this._panUp(2*e*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(t*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(e*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(t){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=t:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(t,e){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),s=t-n.left,r=e-n.top,a=n.width,o=n.height;this._mouse.x=s/a*2-1,this._mouse.y=-(r/o)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(t){return Math.max(this.minDistance,Math.min(this.maxDistance,t))}_handleMouseDownRotate(t){this._rotateStart.set(t.clientX,t.clientY)}_handleMouseDownDolly(t){this._updateZoomParameters(t.clientX,t.clientX),this._dollyStart.set(t.clientX,t.clientY)}_handleMouseDownPan(t){this._panStart.set(t.clientX,t.clientY)}_handleMouseMoveRotate(t){this._rotateEnd.set(t.clientX,t.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Be*this._rotateDelta.x/e.clientHeight),this._rotateUp(Be*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(t){this._dollyEnd.set(t.clientX,t.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(t){this._panEnd.set(t.clientX,t.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(t){this._updateZoomParameters(t.clientX,t.clientY),t.deltaY<0?this._dollyIn(this._getZoomScale(t.deltaY)):t.deltaY>0&&this._dollyOut(this._getZoomScale(t.deltaY)),this.update()}_handleKeyDown(t){let e=!1;switch(t.code){case this.keys.UP:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),e=!0;break;case this.keys.BOTTOM:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateUp(-Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),e=!0;break;case this.keys.LEFT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),e=!0;break;case this.keys.RIGHT:t.ctrlKey||t.metaKey||t.shiftKey?this.enableRotate&&this._rotateLeft(-Be*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),e=!0;break}e&&(t.preventDefault(),this.update())}_handleTouchStartRotate(t){if(this._pointers.length===1)this._rotateStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._rotateStart.set(n,s)}}_handleTouchStartPan(t){if(this._pointers.length===1)this._panStart.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panStart.set(n,s)}}_handleTouchStartDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enablePan&&this._handleTouchStartPan(t)}_handleTouchStartDollyRotate(t){this.enableZoom&&this._handleTouchStartDolly(t),this.enableRotate&&this._handleTouchStartRotate(t)}_handleTouchMoveRotate(t){if(this._pointers.length==1)this._rotateEnd.set(t.pageX,t.pageY);else{const n=this._getSecondPointerPosition(t),s=.5*(t.pageX+n.x),r=.5*(t.pageY+n.y);this._rotateEnd.set(s,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const e=this.domElement;this._rotateLeft(Be*this._rotateDelta.x/e.clientHeight),this._rotateUp(Be*this._rotateDelta.y/e.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(t){if(this._pointers.length===1)this._panEnd.set(t.pageX,t.pageY);else{const e=this._getSecondPointerPosition(t),n=.5*(t.pageX+e.x),s=.5*(t.pageY+e.y);this._panEnd.set(n,s)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(t){const e=this._getSecondPointerPosition(t),n=t.pageX-e.x,s=t.pageY-e.y,r=Math.sqrt(n*n+s*s);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(t.pageX+e.x)*.5,o=(t.pageY+e.y)*.5;this._updateZoomParameters(a,o)}_handleTouchMoveDollyPan(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enablePan&&this._handleTouchMovePan(t)}_handleTouchMoveDollyRotate(t){this.enableZoom&&this._handleTouchMoveDolly(t),this.enableRotate&&this._handleTouchMoveRotate(t)}_addPointer(t){this._pointers.push(t.pointerId)}_removePointer(t){delete this._pointerPositions[t.pointerId];for(let e=0;e{var e;(t instanceof Se||t instanceof tu)&&((e=t.geometry)==null||e.dispose(),Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material&&t.material.dispose())}),i.renderer.dispose(),i.composer.dispose()}class yg{constructor(t){Wt(this,"positions");Wt(this,"velocities");Wt(this,"running",!0);Wt(this,"step",0);Wt(this,"repulsionStrength",500);Wt(this,"attractionStrength",.01);Wt(this,"dampening",.9);Wt(this,"baseMaxSteps",300);Wt(this,"maxSteps",300);Wt(this,"cooldownExtension",0);this.positions=t,this.velocities=new Map;for(const e of t.keys())this.velocities.set(e,new P)}addNode(t,e){this.positions.set(t,e.clone()),this.velocities.set(t,new P),this.cooldownExtension=100,this.maxSteps=Math.max(this.maxSteps,this.step+this.cooldownExtension),this.running=!0}removeNode(t){this.positions.delete(t),this.velocities.delete(t)}tick(t){if(!this.running)return;if(this.step>this.maxSteps){this.cooldownExtension>0&&(this.cooldownExtension=0,this.maxSteps=this.baseMaxSteps);return}this.step++;const e=Math.max(.001,1-this.step/this.maxSteps),n=Array.from(this.positions.keys());for(let s=0;s0,o=new mr(s,16,16),l=new iu({color:new pt(r),emissive:new pt(r),emissiveIntensity:a?0:.3+t.retention*.5,roughness:.3,metalness:.1,transparent:!0,opacity:a?.2:.3+t.retention*.7}),c=new Se(o,l);c.position.copy(e),c.scale.setScalar(n),c.userData={nodeId:t.id,type:t.type,retention:t.retention},this.meshMap.set(t.id,c),this.group.add(c);const h=new Qs({map:Eg(),color:new pt(r),transparent:!0,opacity:n>0?a?.1:.3+t.retention*.35:0,blending:Ne,depthWrite:!1}),d=new Ns(h);d.scale.set(s*6*n,s*6*n,1),d.position.copy(e),d.userData={isGlow:!0,nodeId:t.id},this.glowMap.set(t.id,d),this.group.add(d);const p=t.label||t.type,f=this.createTextSprite(p,"#e2e8f0");return f.position.copy(e),f.position.y+=s*2+1.5,f.userData={isLabel:!0,nodeId:t.id,offset:s*2+1.5},this.group.add(f),this.labelSprites.set(t.id,f),{mesh:c,glow:d,label:f,size:s}}addNode(t,e){const n=(e==null?void 0:e.clone())??new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40);this.positions.set(t.id,n);const{mesh:s,glow:r,label:a}=this.createNodeMeshes(t,n,0);return s.scale.setScalar(.001),r.scale.set(.001,.001,1),r.material.opacity=0,a.material.opacity=0,this.materializingNodes.push({id:t.id,frame:0,totalFrames:30,mesh:s,glow:r,label:a,targetScale:.5+t.retention*2}),n}removeNode(t){const e=this.meshMap.get(t),n=this.glowMap.get(t),s=this.labelSprites.get(t);!e||!n||!s||(this.materializingNodes=this.materializingNodes.filter(r=>r.id!==t),this.dissolvingNodes.push({id:t,frame:0,totalFrames:60,mesh:e,glow:n,label:s,originalScale:e.scale.x}))}growNode(t,e){const n=this.meshMap.get(t);if(!n)return;const s=n.scale.x,r=.5+e*2;n.userData.retention=e,this.growingNodes.push({id:t,frame:0,totalFrames:30,startScale:s,targetScale:r})}createTextSprite(t,e){const n=document.createElement("canvas"),s=n.getContext("2d");if(!s){const c=new Te;return new Ns(new Qs({map:c,transparent:!0,opacity:0}))}n.width=512,n.height=64;const r=t.length>40?t.slice(0,37)+"...":t;s.clearRect(0,0,n.width,n.height),s.font="bold 28px -apple-system, BlinkMacSystemFont, sans-serif",s.textAlign="center",s.textBaseline="middle",s.shadowColor="rgba(0, 0, 0, 0.8)",s.shadowBlur=6,s.shadowOffsetX=0,s.shadowOffsetY=2,s.fillStyle=e,s.fillText(r,n.width/2,n.height/2);const a=new lc(n);a.needsUpdate=!0;const o=new Qs({map:a,transparent:!0,opacity:0,depthTest:!1,sizeAttenuation:!0}),l=new Ns(o);return l.scale.set(12,1.5,1),l}updatePositions(){this.group.children.forEach(t=>{if(t.userData.nodeId){const e=this.positions.get(t.userData.nodeId);if(!e)return;t.userData.isGlow?t.position.copy(e):t.userData.isLabel?(t.position.copy(e),t.position.y+=t.userData.offset):t instanceof Se&&t.position.copy(e)}})}animate(t,e,n){var r,a;for(let o=this.materializingNodes.length-1;o>=0;o--){const l=this.materializingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=wl(c);if(l.mesh.scale.setScalar(Math.max(.001,h)),l.frame>=5){const d=Math.min((l.frame-5)/5,1),p=l.glow.material;p.opacity=d*.4;const f=l.targetScale*6*h;l.glow.scale.set(f,f,1)}if(l.frame>=40){const d=Math.min((l.frame-40)/20,1);l.label.material.opacity=d*.9}l.frame>=60&&this.materializingNodes.splice(o,1)}for(let o=this.dissolvingNodes.length-1;o>=0;o--){const l=this.dissolvingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=1-bg(c),d=Math.max(.001,l.originalScale*h);l.mesh.scale.setScalar(d);const p=d*6;l.glow.scale.set(p,p,1);const f=l.mesh.material;f.opacity*=.97,l.glow.material.opacity*=.95,l.label.material.opacity*=.93,l.frame>=l.totalFrames&&(this.group.remove(l.mesh),this.group.remove(l.glow),this.group.remove(l.label),l.mesh.geometry.dispose(),l.mesh.material.dispose(),(r=l.glow.material.map)==null||r.dispose(),l.glow.material.dispose(),(a=l.label.material.map)==null||a.dispose(),l.label.material.dispose(),this.meshMap.delete(l.id),this.glowMap.delete(l.id),this.labelSprites.delete(l.id),this.positions.delete(l.id),this.dissolvingNodes.splice(o,1))}for(let o=this.growingNodes.length-1;o>=0;o--){const l=this.growingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=l.startScale+(l.targetScale-l.startScale)*wl(c),d=this.meshMap.get(l.id);d&&d.scale.setScalar(h);const p=this.glowMap.get(l.id);if(p){const f=h*6;p.scale.set(f,f,1)}l.frame>=l.totalFrames&&this.growingNodes.splice(o,1)}const s=new Set([...this.materializingNodes.map(o=>o.id),...this.dissolvingNodes.map(o=>o.id),...this.growingNodes.map(o=>o.id)]);this.meshMap.forEach((o,l)=>{if(s.has(l))return;const c=e.find(p=>p.id===l);if(!c)return;const h=1+Math.sin(t*1.5+e.indexOf(c)*.5)*.15*c.retention;o.scale.setScalar(h);const d=o.material;if(l===this.hoveredNode)d.emissiveIntensity=1;else if(l===this.selectedNode)d.emissiveIntensity=.8;else{const f=.3+c.retention*.5+Math.sin(t*(.8+c.retention*.7))*.1*c.retention;d.emissiveIntensity=f}}),this.labelSprites.forEach((o,l)=>{if(s.has(l))return;const c=this.positions.get(l);if(!c)return;const h=n.position.distanceTo(c),d=o.material,p=l===this.hoveredNode||l===this.selectedNode?1:h<40?.9:h<80?.9*(1-(h-40)/40):0;d.opacity+=(p-d.opacity)*.1})}getMeshes(){return Array.from(this.meshMap.values())}dispose(){this.group.traverse(t=>{var e,n,s,r,a;t instanceof Se?((e=t.geometry)==null||e.dispose(),(n=t.material)==null||n.dispose()):t instanceof Ns&&((r=(s=t.material)==null?void 0:s.map)==null||r.dispose(),(a=t.material)==null||a.dispose())}),this.materializingNodes=[],this.dissolvingNodes=[],this.growingNodes=[]}}function wg(i){return 1-Math.pow(1-i,3)}class Ag{constructor(){Wt(this,"group");Wt(this,"growingEdges",[]);Wt(this,"dissolvingEdges",[]);this.group=new Pi}createEdges(t,e){for(const n of t){const s=e.get(n.source),r=e.get(n.target);if(!s||!r)continue;const a=[s,r],o=new pe().setFromPoints(a),l=new lr({color:9133302,transparent:!0,opacity:Math.min(.25+n.weight*.5,.8),blending:Ne,depthWrite:!1}),c=new Va(o,l);c.userData={source:n.source,target:n.target},this.group.add(c)}}addEdge(t,e){const n=e.get(t.source),s=e.get(t.target);if(!n||!s)return;const r=[n.clone(),n.clone()],a=new pe().setFromPoints(r),o=new lr({color:9133302,transparent:!0,opacity:0,blending:Ne,depthWrite:!1}),l=new Va(a,o);l.userData={source:t.source,target:t.target},this.group.add(l),this.growingEdges.push({line:l,source:t.source,target:t.target,frame:0,totalFrames:45})}removeEdgesForNode(t){const e=[];this.group.children.forEach(n=>{const s=n;(s.userData.source===t||s.userData.target===t)&&e.push(s)});for(const n of e)this.growingEdges=this.growingEdges.filter(s=>s.line!==n),this.dissolvingEdges.push({line:n,frame:0,totalFrames:40})}animateEdges(t){for(let e=this.growingEdges.length-1;e>=0;e--){const n=this.growingEdges[e];n.frame++;const s=wg(Math.min(n.frame/n.totalFrames,1)),r=t.get(n.source),a=t.get(n.target);if(!r||!a)continue;const o=r.clone().lerp(a,s),l=n.line.geometry.attributes.position;l.setXYZ(0,r.x,r.y,r.z),l.setXYZ(1,o.x,o.y,o.z),l.needsUpdate=!0;const c=n.line.material;c.opacity=s*.65,n.frame>=n.totalFrames&&(c.opacity=.65,this.growingEdges.splice(e,1))}for(let e=this.dissolvingEdges.length-1;e>=0;e--){const n=this.dissolvingEdges[e];n.frame++;const s=n.frame/n.totalFrames,r=n.line.material;r.opacity=Math.max(0,.65*(1-s)),n.frame>=n.totalFrames&&(this.group.remove(n.line),n.line.geometry.dispose(),n.line.material.dispose(),this.dissolvingEdges.splice(e,1))}}updatePositions(t){this.group.children.forEach(e=>{const n=e;if(this.growingEdges.some(a=>a.line===n)||this.dissolvingEdges.some(a=>a.line===n))return;const s=t.get(n.userData.source),r=t.get(n.userData.target);if(s&&r){const a=n.geometry.attributes.position;a.setXYZ(0,s.x,s.y,s.z),a.setXYZ(1,r.x,r.y,r.z),a.needsUpdate=!0}})}dispose(){this.group.children.forEach(t=>{var n,s;const e=t;(n=e.geometry)==null||n.dispose(),(s=e.material)==null||s.dispose()}),this.growingEdges=[],this.dissolvingEdges=[]}}class Rg{constructor(t){Wt(this,"starField");Wt(this,"neuralParticles");this.starField=this.createStarField(),this.neuralParticles=this.createNeuralParticles(),t.add(this.starField),t.add(this.neuralParticles)}createStarField(){const e=new pe,n=new Float32Array(3e3*3),s=new Float32Array(3e3);for(let a=0;a<3e3;a++)n[a*3]=(Math.random()-.5)*1e3,n[a*3+1]=(Math.random()-.5)*1e3,n[a*3+2]=(Math.random()-.5)*1e3,s[a]=Math.random()*1.5;e.setAttribute("position",new he(n,3)),e.setAttribute("size",new he(s,1));const r=new ei({color:6514417,size:.5,transparent:!0,opacity:.4,sizeAttenuation:!0,blending:Ne});return new Fi(e,r)}createNeuralParticles(){const e=new pe,n=new Float32Array(500*3),s=new Float32Array(500*3);for(let a=0;a<500;a++)n[a*3]=(Math.random()-.5)*100,n[a*3+1]=(Math.random()-.5)*100,n[a*3+2]=(Math.random()-.5)*100,s[a*3]=.4+Math.random()*.3,s[a*3+1]=.3+Math.random()*.2,s[a*3+2]=.8+Math.random()*.2;e.setAttribute("position",new he(n,3)),e.setAttribute("color",new he(s,3));const r=new ei({size:.3,vertexColors:!0,transparent:!0,opacity:.4,blending:Ne,sizeAttenuation:!0});return new Fi(e,r)}animate(t){this.starField.rotation.y+=1e-4,this.starField.rotation.x+=5e-5;const e=this.neuralParticles.geometry.attributes.position;for(let n=0;n=0;s--){const r=this.pulseEffects[s];if(r.intensity-=r.decay,r.intensity<=0){this.pulseEffects.splice(s,1);continue}const a=t.get(r.nodeId);if(a){const o=a.material;o.emissive.lerp(r.color,r.intensity*.3),o.emissiveIntensity=Math.max(o.emissiveIntensity,r.intensity)}}for(let s=this.spawnBursts.length-1;s>=0;s--){const r=this.spawnBursts[s];if(r.age++,r.age>120){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.spawnBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let c=0;c=0;s--){const r=this.rainbowBursts[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.rainbowBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let p=0;p=0;s--){const r=this.rippleWaves[s];if(r.age++,r.radius+=r.speed,r.age>r.maxAge){this.rippleWaves.splice(s,1);continue}const a=r.radius,o=3;n.forEach((l,c)=>{if(r.pulsedNodes.has(c))return;const h=l.distanceTo(r.origin);h>=a-o&&h<=a+o&&(r.pulsedNodes.add(c),this.addPulse(c,.8,new pt(65489),.03))})}for(let s=this.implosions.length-1;s>=0;s--){const r=this.implosions[s];if(r.age++,r.age>r.maxAge+20){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),r.flash&&(this.scene.remove(r.flash),r.flash.geometry.dispose(),r.flash.material.dispose()),this.implosions.splice(s,1);continue}if(r.age<=r.maxAge){const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity,l=1+r.age*.02;for(let h=0;hr.maxAge){const a=(r.age-r.maxAge)/20;r.flash.material.opacity=Math.max(0,1-a),r.flash.scale.setScalar(1+a*3)}}for(let s=this.shockwaves.length-1;s>=0;s--){const r=this.shockwaves[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.mesh),r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.shockwaves.splice(s,1);continue}const a=r.age/r.maxAge;r.mesh.scale.setScalar(1+a*20),r.mesh.material.opacity=.8*(1-a),r.mesh.lookAt(e.position)}for(let s=this.connectionFlashes.length-1;s>=0;s--){const r=this.connectionFlashes[s];if(r.intensity-=.015,r.intensity<=0){this.scene.remove(r.line),r.line.geometry.dispose(),r.line.material.dispose(),this.connectionFlashes.splice(s,1);continue}r.line.material.opacity=r.intensity}}dispose(){for(const t of this.spawnBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.rainbowBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.implosions)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose(),t.flash&&(this.scene.remove(t.flash),t.flash.geometry.dispose(),t.flash.material.dispose());for(const t of this.shockwaves)this.scene.remove(t.mesh),t.mesh.geometry.dispose(),t.mesh.material.dispose();for(const t of this.connectionFlashes)this.scene.remove(t.line),t.line.geometry.dispose(),t.line.material.dispose();this.pulseEffects=[],this.spawnBursts=[],this.rainbowBursts=[],this.rippleWaves=[],this.implosions=[],this.shockwaves=[],this.connectionFlashes=[]}}const Sn={bloomStrength:.8,rotateSpeed:.3,fogColor:328976,fogDensity:.008,nebulaIntensity:0,chromaticIntensity:.002,vignetteRadius:.9,breatheAmplitude:1},In={bloomStrength:1.8,rotateSpeed:.08,fogColor:656672,fogDensity:.006,nebulaIntensity:1,chromaticIntensity:.005,vignetteRadius:.7,breatheAmplitude:2};class Pg{constructor(){Wt(this,"active",!1);Wt(this,"transition",0);Wt(this,"transitionSpeed",.008);Wt(this,"current");Wt(this,"auroraHue",0);this.current={...Sn}}setActive(t){this.active=t}update(t,e,n,s,r){const a=this.active?1:0;this.transition+=(a-this.transition)*this.transitionSpeed*60*(1/60),this.transition=Math.max(0,Math.min(1,this.transition));const o=this.transition;this.current.bloomStrength=this.lerp(Sn.bloomStrength,In.bloomStrength,o),this.current.rotateSpeed=this.lerp(Sn.rotateSpeed,In.rotateSpeed,o),this.current.fogDensity=this.lerp(Sn.fogDensity,In.fogDensity,o),this.current.nebulaIntensity=this.lerp(Sn.nebulaIntensity,In.nebulaIntensity,o),this.current.chromaticIntensity=this.lerp(Sn.chromaticIntensity,In.chromaticIntensity,o),this.current.vignetteRadius=this.lerp(Sn.vignetteRadius,In.vignetteRadius,o),this.current.breatheAmplitude=this.lerp(Sn.breatheAmplitude,In.breatheAmplitude,o),e.strength=this.current.bloomStrength,n.autoRotateSpeed=this.current.rotateSpeed;const l=new pt(Sn.fogColor),c=new pt(In.fogColor),h=l.clone().lerp(c,o);if(t.fog=new pr(h,this.current.fogDensity),o>.01){this.auroraHue=r*.1%1;const d=new pt().setHSL(.75+this.auroraHue*.15,.8,.5),p=new pt().setHSL(.55+this.auroraHue*.2,.7,.4);s.point1.color.lerp(d,o*.3),s.point2.color.lerp(p,o*.3)}else s.point1.color.set(6514417),s.point2.color.set(11032055)}lerp(t,e,n){return t+(e-t)*n}}const Dg=50,os=[];function Lg(i,t,e){const n=i.tags??[],s=i.type??"";let r=null,a=0;for(const o of t){let l=0;o.type===s&&(l+=2);for(const c of o.tags)n.includes(c)&&(l+=1);l>a&&(a=l,r=o.id)}if(r&&a>0){const o=e.get(r);if(o)return new P(o.x+(Math.random()-.5)*10,o.y+(Math.random()-.5)*10,o.z+(Math.random()-.5)*10)}return new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40)}function Ug(i,t){if(os.length<=Dg)return;const e=os.shift();i.edgeManager.removeEdgesForNode(e),i.nodeManager.removeNode(e),i.forceSim.removeNode(e),i.onMutation({type:"edgesRemoved",nodeId:e}),i.onMutation({type:"nodeRemoved",nodeId:e});const n=t.findIndex(s=>s.id===e);n!==-1&&t.splice(n,1)}function Ig(i,t,e){var d,p;const{effects:n,nodeManager:s,edgeManager:r,forceSim:a,camera:o,onMutation:l}=t,c=s.positions,h=s.meshMap;switch(i.type){case"MemoryCreated":{const f=i.data;if(!f.id)break;const g={id:f.id,label:(f.content??"").slice(0,60),type:f.node_type??"fact",retention:Math.max(0,Math.min(1,f.retention??.9)),tags:f.tags??[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),isCenter:!1},v=Lg(g,e,c),m=s.addNode(g,v);a.addNode(f.id,m),os.push(f.id),Ug(t,e);const u=new pt(Fl[g.type]||"#00ffd1");n.createRainbowBurst(v,u),n.createShockwave(v,u,o);const T=u.clone();T.offsetHSL(.15,0,0),setTimeout(()=>{n.createShockwave(v,T,o)},166),n.createRippleWave(v),l({type:"nodeAdded",node:g});break}case"ConnectionDiscovered":{const f=i.data;if(!f.source_id||!f.target_id)break;const g=c.get(f.source_id),v=c.get(f.target_id),m={source:f.source_id,target:f.target_id,weight:f.weight??.5,type:f.connection_type??"semantic"};r.addEdge(m,c),g&&v&&n.createConnectionFlash(g,v,new pt(54527)),f.source_id&&h.has(f.source_id)&&n.addPulse(f.source_id,1,new pt(54527),.02),f.target_id&&h.has(f.target_id)&&n.addPulse(f.target_id,1,new pt(54527),.02),l({type:"edgeAdded",edge:m});break}case"MemoryDeleted":{const f=i.data;if(!f.id)break;const g=c.get(f.id);if(g){const m=new pt(16729943);n.createImplosion(g,m)}r.removeEdgesForNode(f.id),s.removeNode(f.id),a.removeNode(f.id);const v=os.indexOf(f.id);v!==-1&&os.splice(v,1),l({type:"edgesRemoved",nodeId:f.id}),l({type:"nodeRemoved",nodeId:f.id});break}case"MemoryPromoted":{const f=i.data,g=f==null?void 0:f.id;if(!g)break;const v=f.new_retention??.95;if(h.has(g)){s.growNode(g,v),n.addPulse(g,1.2,new pt(65416),.01);const m=c.get(g);m&&(n.createShockwave(m,new pt(65416),o),n.createSpawnBurst(m,new pt(65416))),l({type:"nodeUpdated",nodeId:g,retention:v})}break}case"MemoryDemoted":{const f=i.data,g=f==null?void 0:f.id;if(!g)break;const v=f.new_retention??.3;h.has(g)&&(s.growNode(g,v),n.addPulse(g,.8,new pt(16729943),.03),l({type:"nodeUpdated",nodeId:g,retention:v}));break}case"MemoryUpdated":{const f=i.data,g=f==null?void 0:f.id;if(!g||!h.has(g))break;n.addPulse(g,.6,new pt(8490232),.02),f.retention!==void 0&&(s.growNode(g,f.retention),l({type:"nodeUpdated",nodeId:g,retention:f.retention}));break}case"SearchPerformed":{h.forEach((f,g)=>{n.addPulse(g,.6+Math.random()*.4,new pt(8490232),.02)});break}case"DreamStarted":{h.forEach((f,g)=>{n.addPulse(g,1,new pt(11032055),.005)});break}case"DreamProgress":{const f=(d=i.data)==null?void 0:d.memory_id;f&&h.has(f)&&n.addPulse(f,1.5,new pt(12616956),.01);break}case"DreamCompleted":{n.createSpawnBurst(new P(0,0,0),new pt(11032055)),n.createShockwave(new P(0,0,0),new pt(11032055),o);break}case"RetentionDecayed":{const f=(p=i.data)==null?void 0:p.id;f&&h.has(f)&&n.addPulse(f,.8,new pt(16729943),.03);break}case"ConsolidationCompleted":{h.forEach((f,g)=>{n.addPulse(g,.4+Math.random()*.3,new pt(16758784),.015)});break}case"ActivationSpread":{const f=i.data;if(f.source_id&&f.target_ids){const g=c.get(f.source_id);if(g)for(const v of f.target_ids){const m=c.get(v);m&&n.createConnectionFlash(g,m,new pt(1370310))}}break}}}const Ng=` + }`})}}Wi.BlurDirectionX=new vt(1,0);Wi.BlurDirectionY=new vt(0,1);function vg(){const t=new Float32Array(6e3),e=new Float32Array(2e3*3);for(let r=0;r<2e3;r++){const a=Math.random()*Math.PI*2,o=Math.acos(2*Math.random()-1),l=600+Math.random()*400;t[r*3]=l*Math.sin(o)*Math.cos(a),t[r*3+1]=l*Math.sin(o)*Math.sin(a),t[r*3+2]=l*Math.cos(o);const c=Math.random();e[r*3]=.55+c*.25,e[r*3+1]=.55+c*.15,e[r*3+2]=.75+c*.25}const n=new pe;n.setAttribute("position",new he(t,3)),n.setAttribute("color",new he(e,3));const s=new ei({size:1.6,sizeAttenuation:!0,vertexColors:!0,transparent:!0,opacity:.6,depthWrite:!1,blending:Ne});return new Fi(n,s)}function xg(i){const t=new Kh;t.background=new at(328975),t.fog=new pr(657946,.0035);const e=new Ye(60,i.clientWidth/i.clientHeight,.1,2e3);e.position.set(0,30,80);const n=new Km({antialias:!0,alpha:!0,powerPreference:"high-performance"});n.setSize(i.clientWidth,i.clientHeight),n.setPixelRatio(Math.min(window.devicePixelRatio,2)),n.toneMapping=zl,n.toneMappingExposure=1.25,i.appendChild(n.domElement);const s=new Jm(e,n.domElement);s.enableDamping=!0,s.dampingFactor=.05,s.rotateSpeed=.5,s.zoomSpeed=.8,s.minDistance=10,s.maxDistance=500,s.autoRotate=!0,s.autoRotateSpeed=.3;const r=new mg(n);r.addPass(new gg(t,e));const a=new Wi(new vt(i.clientWidth,i.clientHeight),.55,.6,.2);r.addPass(a);const o=new lu(2763354,.7);t.add(o);const l=new qo(6514417,1.8,240);l.position.set(50,50,50),t.add(l);const c=new qo(11032055,1.2,240);c.position.set(-50,-30,-50),t.add(c);const h=vg();t.add(h);const f=new uu;f.params.Points={threshold:2};const p=new vt;return{scene:t,camera:e,renderer:n,controls:s,composer:r,bloomPass:a,raycaster:f,mouse:p,lights:{ambient:o,point1:l,point2:c},starfield:h}}function Mg(i,t){const e=t.clientWidth,n=t.clientHeight;i.camera.aspect=e/n,i.camera.updateProjectionMatrix(),i.renderer.setSize(e,n),i.composer.setSize(e,n)}function Sg(i){i.scene.traverse(t=>{var e;(t instanceof Se||t instanceof tu)&&((e=t.geometry)==null||e.dispose(),Array.isArray(t.material)?t.material.forEach(n=>n.dispose()):t.material&&t.material.dispose())}),i.renderer.dispose(),i.composer.dispose()}class yg{constructor(t){Wt(this,"positions");Wt(this,"velocities");Wt(this,"running",!0);Wt(this,"step",0);Wt(this,"repulsionStrength",500);Wt(this,"attractionStrength",.01);Wt(this,"dampening",.9);Wt(this,"baseMaxSteps",300);Wt(this,"maxSteps",300);Wt(this,"cooldownExtension",0);this.positions=t,this.velocities=new Map;for(const e of t.keys())this.velocities.set(e,new P)}addNode(t,e){this.positions.set(t,e.clone()),this.velocities.set(t,new P),this.cooldownExtension=100,this.maxSteps=Math.max(this.maxSteps,this.step+this.cooldownExtension),this.running=!0}removeNode(t){this.positions.delete(t),this.velocities.delete(t)}tick(t){if(!this.running)return;if(this.step>this.maxSteps){this.cooldownExtension>0&&(this.cooldownExtension=0,this.maxSteps=this.baseMaxSteps);return}this.step++;const e=Math.max(.001,1-this.step/this.maxSteps),n=Array.from(this.positions.keys());for(let s=0;s0,o=new mr(s,16,16),l=new iu({color:new at(r),emissive:new at(r),emissiveIntensity:a?0:.3+t.retention*.5,roughness:.3,metalness:.1,transparent:!0,opacity:a?.2:.3+t.retention*.7}),c=new Se(o,l);c.position.copy(e),c.scale.setScalar(n),c.userData={nodeId:t.id,type:t.type,retention:t.retention},this.meshMap.set(t.id,c),this.group.add(c);const h=new Qs({map:Eg(),color:new at(r),transparent:!0,opacity:n>0?a?.1:.3+t.retention*.35:0,blending:Ne,depthWrite:!1}),f=new Ns(h);f.scale.set(s*6*n,s*6*n,1),f.position.copy(e),f.userData={isGlow:!0,nodeId:t.id},this.glowMap.set(t.id,f),this.group.add(f);const p=t.label||t.type,u=this.createTextSprite(p,"#e2e8f0");return u.position.copy(e),u.position.y+=s*2+1.5,u.userData={isLabel:!0,nodeId:t.id,offset:s*2+1.5},this.group.add(u),this.labelSprites.set(t.id,u),{mesh:c,glow:f,label:u,size:s}}addNode(t,e){const n=(e==null?void 0:e.clone())??new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40);this.positions.set(t.id,n);const{mesh:s,glow:r,label:a}=this.createNodeMeshes(t,n,0);return s.scale.setScalar(.001),r.scale.set(.001,.001,1),r.material.opacity=0,a.material.opacity=0,this.materializingNodes.push({id:t.id,frame:0,totalFrames:30,mesh:s,glow:r,label:a,targetScale:.5+t.retention*2}),n}removeNode(t){const e=this.meshMap.get(t),n=this.glowMap.get(t),s=this.labelSprites.get(t);!e||!n||!s||(this.materializingNodes=this.materializingNodes.filter(r=>r.id!==t),this.dissolvingNodes.push({id:t,frame:0,totalFrames:60,mesh:e,glow:n,label:s,originalScale:e.scale.x}))}growNode(t,e){const n=this.meshMap.get(t);if(!n)return;const s=n.scale.x,r=.5+e*2;n.userData.retention=e,this.growingNodes.push({id:t,frame:0,totalFrames:30,startScale:s,targetScale:r})}createTextSprite(t,e){const n=document.createElement("canvas"),s=n.getContext("2d");if(!s){const c=new Te;return new Ns(new Qs({map:c,transparent:!0,opacity:0}))}n.width=512,n.height=64;const r=t.length>40?t.slice(0,37)+"...":t;s.clearRect(0,0,n.width,n.height),s.font="bold 28px -apple-system, BlinkMacSystemFont, sans-serif",s.textAlign="center",s.textBaseline="middle",s.shadowColor="rgba(0, 0, 0, 0.8)",s.shadowBlur=6,s.shadowOffsetX=0,s.shadowOffsetY=2,s.fillStyle=e,s.fillText(r,n.width/2,n.height/2);const a=new lc(n);a.needsUpdate=!0;const o=new Qs({map:a,transparent:!0,opacity:0,depthTest:!1,sizeAttenuation:!0}),l=new Ns(o);return l.scale.set(12,1.5,1),l}updatePositions(){this.group.children.forEach(t=>{if(t.userData.nodeId){const e=this.positions.get(t.userData.nodeId);if(!e)return;t.userData.isGlow?t.position.copy(e):t.userData.isLabel?(t.position.copy(e),t.position.y+=t.userData.offset):t instanceof Se&&t.position.copy(e)}})}animate(t,e,n){var r,a;for(let o=this.materializingNodes.length-1;o>=0;o--){const l=this.materializingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=wl(c);if(l.mesh.scale.setScalar(Math.max(.001,h)),l.frame>=5){const f=Math.min((l.frame-5)/5,1),p=l.glow.material;p.opacity=f*.4;const u=l.targetScale*6*h;l.glow.scale.set(u,u,1)}if(l.frame>=40){const f=Math.min((l.frame-40)/20,1);l.label.material.opacity=f*.9}l.frame>=60&&this.materializingNodes.splice(o,1)}for(let o=this.dissolvingNodes.length-1;o>=0;o--){const l=this.dissolvingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=1-bg(c),f=Math.max(.001,l.originalScale*h);l.mesh.scale.setScalar(f);const p=f*6;l.glow.scale.set(p,p,1);const u=l.mesh.material;u.opacity*=.97,l.glow.material.opacity*=.95,l.label.material.opacity*=.93,l.frame>=l.totalFrames&&(this.group.remove(l.mesh),this.group.remove(l.glow),this.group.remove(l.label),l.mesh.geometry.dispose(),l.mesh.material.dispose(),(r=l.glow.material.map)==null||r.dispose(),l.glow.material.dispose(),(a=l.label.material.map)==null||a.dispose(),l.label.material.dispose(),this.meshMap.delete(l.id),this.glowMap.delete(l.id),this.labelSprites.delete(l.id),this.positions.delete(l.id),this.dissolvingNodes.splice(o,1))}for(let o=this.growingNodes.length-1;o>=0;o--){const l=this.growingNodes[o];l.frame++;const c=Math.min(l.frame/l.totalFrames,1),h=l.startScale+(l.targetScale-l.startScale)*wl(c),f=this.meshMap.get(l.id);f&&f.scale.setScalar(h);const p=this.glowMap.get(l.id);if(p){const u=h*6;p.scale.set(u,u,1)}l.frame>=l.totalFrames&&this.growingNodes.splice(o,1)}const s=new Set([...this.materializingNodes.map(o=>o.id),...this.dissolvingNodes.map(o=>o.id),...this.growingNodes.map(o=>o.id)]);this.meshMap.forEach((o,l)=>{if(s.has(l))return;const c=e.find(p=>p.id===l);if(!c)return;const h=1+Math.sin(t*1.5+e.indexOf(c)*.5)*.15*c.retention;o.scale.setScalar(h);const f=o.material;if(l===this.hoveredNode)f.emissiveIntensity=1;else if(l===this.selectedNode)f.emissiveIntensity=.8;else{const u=.3+c.retention*.5+Math.sin(t*(.8+c.retention*.7))*.1*c.retention;f.emissiveIntensity=u}}),this.labelSprites.forEach((o,l)=>{if(s.has(l))return;const c=this.positions.get(l);if(!c)return;const h=n.position.distanceTo(c),f=o.material,p=l===this.hoveredNode||l===this.selectedNode?1:h<40?.9:h<80?.9*(1-(h-40)/40):0;f.opacity+=(p-f.opacity)*.1})}getMeshes(){return Array.from(this.meshMap.values())}dispose(){this.group.traverse(t=>{var e,n,s,r,a;t instanceof Se?((e=t.geometry)==null||e.dispose(),(n=t.material)==null||n.dispose()):t instanceof Ns&&((r=(s=t.material)==null?void 0:s.map)==null||r.dispose(),(a=t.material)==null||a.dispose())}),this.materializingNodes=[],this.dissolvingNodes=[],this.growingNodes=[]}}function wg(i){return 1-Math.pow(1-i,3)}class Ag{constructor(){Wt(this,"group");Wt(this,"growingEdges",[]);Wt(this,"dissolvingEdges",[]);this.group=new Pi}createEdges(t,e){for(const n of t){const s=e.get(n.source),r=e.get(n.target);if(!s||!r)continue;const a=[s,r],o=new pe().setFromPoints(a),l=new lr({color:9133302,transparent:!0,opacity:Math.min(.25+n.weight*.5,.8),blending:Ne,depthWrite:!1}),c=new Va(o,l);c.userData={source:n.source,target:n.target},this.group.add(c)}}addEdge(t,e){const n=e.get(t.source),s=e.get(t.target);if(!n||!s)return;const r=[n.clone(),n.clone()],a=new pe().setFromPoints(r),o=new lr({color:9133302,transparent:!0,opacity:0,blending:Ne,depthWrite:!1}),l=new Va(a,o);l.userData={source:t.source,target:t.target},this.group.add(l),this.growingEdges.push({line:l,source:t.source,target:t.target,frame:0,totalFrames:45})}removeEdgesForNode(t){const e=[];this.group.children.forEach(n=>{const s=n;(s.userData.source===t||s.userData.target===t)&&e.push(s)});for(const n of e)this.growingEdges=this.growingEdges.filter(s=>s.line!==n),this.dissolvingEdges.push({line:n,frame:0,totalFrames:40})}animateEdges(t){for(let e=this.growingEdges.length-1;e>=0;e--){const n=this.growingEdges[e];n.frame++;const s=wg(Math.min(n.frame/n.totalFrames,1)),r=t.get(n.source),a=t.get(n.target);if(!r||!a)continue;const o=r.clone().lerp(a,s),l=n.line.geometry.attributes.position;l.setXYZ(0,r.x,r.y,r.z),l.setXYZ(1,o.x,o.y,o.z),l.needsUpdate=!0;const c=n.line.material;c.opacity=s*.65,n.frame>=n.totalFrames&&(c.opacity=.65,this.growingEdges.splice(e,1))}for(let e=this.dissolvingEdges.length-1;e>=0;e--){const n=this.dissolvingEdges[e];n.frame++;const s=n.frame/n.totalFrames,r=n.line.material;r.opacity=Math.max(0,.65*(1-s)),n.frame>=n.totalFrames&&(this.group.remove(n.line),n.line.geometry.dispose(),n.line.material.dispose(),this.dissolvingEdges.splice(e,1))}}updatePositions(t){this.group.children.forEach(e=>{const n=e;if(this.growingEdges.some(a=>a.line===n)||this.dissolvingEdges.some(a=>a.line===n))return;const s=t.get(n.userData.source),r=t.get(n.userData.target);if(s&&r){const a=n.geometry.attributes.position;a.setXYZ(0,s.x,s.y,s.z),a.setXYZ(1,r.x,r.y,r.z),a.needsUpdate=!0}})}dispose(){this.group.children.forEach(t=>{var n,s;const e=t;(n=e.geometry)==null||n.dispose(),(s=e.material)==null||s.dispose()}),this.growingEdges=[],this.dissolvingEdges=[]}}class Rg{constructor(t){Wt(this,"starField");Wt(this,"neuralParticles");this.starField=this.createStarField(),this.neuralParticles=this.createNeuralParticles(),t.add(this.starField),t.add(this.neuralParticles)}createStarField(){const e=new pe,n=new Float32Array(3e3*3),s=new Float32Array(3e3);for(let a=0;a<3e3;a++)n[a*3]=(Math.random()-.5)*1e3,n[a*3+1]=(Math.random()-.5)*1e3,n[a*3+2]=(Math.random()-.5)*1e3,s[a]=Math.random()*1.5;e.setAttribute("position",new he(n,3)),e.setAttribute("size",new he(s,1));const r=new ei({color:6514417,size:.5,transparent:!0,opacity:.4,sizeAttenuation:!0,blending:Ne});return new Fi(e,r)}createNeuralParticles(){const e=new pe,n=new Float32Array(500*3),s=new Float32Array(500*3);for(let a=0;a<500;a++)n[a*3]=(Math.random()-.5)*100,n[a*3+1]=(Math.random()-.5)*100,n[a*3+2]=(Math.random()-.5)*100,s[a*3]=.4+Math.random()*.3,s[a*3+1]=.3+Math.random()*.2,s[a*3+2]=.8+Math.random()*.2;e.setAttribute("position",new he(n,3)),e.setAttribute("color",new he(s,3));const r=new ei({size:.3,vertexColors:!0,transparent:!0,opacity:.4,blending:Ne,sizeAttenuation:!0});return new Fi(e,r)}animate(t){this.starField.rotation.y+=1e-4,this.starField.rotation.x+=5e-5;const e=this.neuralParticles.geometry.attributes.position;for(let n=0;n=0;s--){const r=this.pulseEffects[s];if(r.intensity-=r.decay,r.intensity<=0){this.pulseEffects.splice(s,1);continue}const a=t.get(r.nodeId);if(a){const o=a.material;o.emissive.lerp(r.color,r.intensity*.3),o.emissiveIntensity=Math.max(o.emissiveIntensity,r.intensity)}}for(let s=this.spawnBursts.length-1;s>=0;s--){const r=this.spawnBursts[s];if(r.age++,r.age>120){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.spawnBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let c=0;c=0;s--){const r=this.rainbowBursts[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),this.rainbowBursts.splice(s,1);continue}const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity;for(let p=0;p=0;s--){const r=this.rippleWaves[s];if(r.age++,r.radius+=r.speed,r.age>r.maxAge){this.rippleWaves.splice(s,1);continue}const a=r.radius,o=3;n.forEach((l,c)=>{if(r.pulsedNodes.has(c))return;const h=l.distanceTo(r.origin);h>=a-o&&h<=a+o&&(r.pulsedNodes.add(c),this.addPulse(c,.8,new at(65489),.03))})}for(let s=this.implosions.length-1;s>=0;s--){const r=this.implosions[s];if(r.age++,r.age>r.maxAge+20){this.scene.remove(r.particles),r.particles.geometry.dispose(),r.particles.material.dispose(),r.flash&&(this.scene.remove(r.flash),r.flash.geometry.dispose(),r.flash.material.dispose()),this.implosions.splice(s,1);continue}if(r.age<=r.maxAge){const a=r.particles.geometry.attributes.position,o=r.particles.geometry.attributes.velocity,l=1+r.age*.02;for(let h=0;hr.maxAge){const a=(r.age-r.maxAge)/20;r.flash.material.opacity=Math.max(0,1-a),r.flash.scale.setScalar(1+a*3)}}for(let s=this.shockwaves.length-1;s>=0;s--){const r=this.shockwaves[s];if(r.age++,r.age>r.maxAge){this.scene.remove(r.mesh),r.mesh.geometry.dispose(),r.mesh.material.dispose(),this.shockwaves.splice(s,1);continue}const a=r.age/r.maxAge;r.mesh.scale.setScalar(1+a*20),r.mesh.material.opacity=.8*(1-a),r.mesh.lookAt(e.position)}for(let s=this.connectionFlashes.length-1;s>=0;s--){const r=this.connectionFlashes[s];if(r.intensity-=.015,r.intensity<=0){this.scene.remove(r.line),r.line.geometry.dispose(),r.line.material.dispose(),this.connectionFlashes.splice(s,1);continue}r.line.material.opacity=r.intensity}}dispose(){for(const t of this.spawnBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.rainbowBursts)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose();for(const t of this.implosions)this.scene.remove(t.particles),t.particles.geometry.dispose(),t.particles.material.dispose(),t.flash&&(this.scene.remove(t.flash),t.flash.geometry.dispose(),t.flash.material.dispose());for(const t of this.shockwaves)this.scene.remove(t.mesh),t.mesh.geometry.dispose(),t.mesh.material.dispose();for(const t of this.connectionFlashes)this.scene.remove(t.line),t.line.geometry.dispose(),t.line.material.dispose();this.pulseEffects=[],this.spawnBursts=[],this.rainbowBursts=[],this.rippleWaves=[],this.implosions=[],this.shockwaves=[],this.connectionFlashes=[]}}const Sn={bloomStrength:.8,rotateSpeed:.3,fogColor:328976,fogDensity:.008,nebulaIntensity:0,chromaticIntensity:.002,vignetteRadius:.9,breatheAmplitude:1},In={bloomStrength:1.8,rotateSpeed:.08,fogColor:656672,fogDensity:.006,nebulaIntensity:1,chromaticIntensity:.005,vignetteRadius:.7,breatheAmplitude:2};class Pg{constructor(){Wt(this,"active",!1);Wt(this,"transition",0);Wt(this,"transitionSpeed",.008);Wt(this,"current");Wt(this,"auroraHue",0);this.current={...Sn}}setActive(t){this.active=t}update(t,e,n,s,r){const a=this.active?1:0;this.transition+=(a-this.transition)*this.transitionSpeed*60*(1/60),this.transition=Math.max(0,Math.min(1,this.transition));const o=this.transition;this.current.bloomStrength=this.lerp(Sn.bloomStrength,In.bloomStrength,o),this.current.rotateSpeed=this.lerp(Sn.rotateSpeed,In.rotateSpeed,o),this.current.fogDensity=this.lerp(Sn.fogDensity,In.fogDensity,o),this.current.nebulaIntensity=this.lerp(Sn.nebulaIntensity,In.nebulaIntensity,o),this.current.chromaticIntensity=this.lerp(Sn.chromaticIntensity,In.chromaticIntensity,o),this.current.vignetteRadius=this.lerp(Sn.vignetteRadius,In.vignetteRadius,o),this.current.breatheAmplitude=this.lerp(Sn.breatheAmplitude,In.breatheAmplitude,o),e.strength=this.current.bloomStrength,n.autoRotateSpeed=this.current.rotateSpeed;const l=new at(Sn.fogColor),c=new at(In.fogColor),h=l.clone().lerp(c,o);if(t.fog=new pr(h,this.current.fogDensity),o>.01){this.auroraHue=r*.1%1;const f=new at().setHSL(.75+this.auroraHue*.15,.8,.5),p=new at().setHSL(.55+this.auroraHue*.2,.7,.4);s.point1.color.lerp(f,o*.3),s.point2.color.lerp(p,o*.3)}else s.point1.color.set(6514417),s.point2.color.set(11032055)}lerp(t,e,n){return t+(e-t)*n}}const Dg=50,os=[];function Lg(i,t,e){const n=i.tags??[],s=i.type??"";let r=null,a=0;for(const o of t){let l=0;o.type===s&&(l+=2);for(const c of o.tags)n.includes(c)&&(l+=1);l>a&&(a=l,r=o.id)}if(r&&a>0){const o=e.get(r);if(o)return new P(o.x+(Math.random()-.5)*10,o.y+(Math.random()-.5)*10,o.z+(Math.random()-.5)*10)}return new P((Math.random()-.5)*40,(Math.random()-.5)*40,(Math.random()-.5)*40)}function Ug(i,t){if(os.length<=Dg)return;const e=os.shift();i.edgeManager.removeEdgesForNode(e),i.nodeManager.removeNode(e),i.forceSim.removeNode(e),i.onMutation({type:"edgesRemoved",nodeId:e}),i.onMutation({type:"nodeRemoved",nodeId:e});const n=t.findIndex(s=>s.id===e);n!==-1&&t.splice(n,1)}function Ig(i,t,e){var f,p;const{effects:n,nodeManager:s,edgeManager:r,forceSim:a,camera:o,onMutation:l}=t,c=s.positions,h=s.meshMap;switch(i.type){case"MemoryCreated":{const u=i.data;if(!u.id)break;const g={id:u.id,label:(u.content??"").slice(0,60),type:u.node_type??"fact",retention:Math.max(0,Math.min(1,u.retention??.9)),tags:u.tags??[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),isCenter:!1},_=Lg(g,e,c),m=s.addNode(g,_);a.addNode(u.id,m),os.push(u.id),Ug(t,e);const d=new at(Fl[g.type]||"#00ffd1");n.createRainbowBurst(_,d),n.createShockwave(_,d,o);const T=d.clone();T.offsetHSL(.15,0,0),setTimeout(()=>{n.createShockwave(_,T,o)},166),n.createRippleWave(_),l({type:"nodeAdded",node:g});break}case"ConnectionDiscovered":{const u=i.data;if(!u.source_id||!u.target_id)break;const g=c.get(u.source_id),_=c.get(u.target_id),m={source:u.source_id,target:u.target_id,weight:u.weight??.5,type:u.connection_type??"semantic"};r.addEdge(m,c),g&&_&&n.createConnectionFlash(g,_,new at(54527)),u.source_id&&h.has(u.source_id)&&n.addPulse(u.source_id,1,new at(54527),.02),u.target_id&&h.has(u.target_id)&&n.addPulse(u.target_id,1,new at(54527),.02),l({type:"edgeAdded",edge:m});break}case"MemoryDeleted":{const u=i.data;if(!u.id)break;const g=c.get(u.id);if(g){const m=new at(16729943);n.createImplosion(g,m)}r.removeEdgesForNode(u.id),s.removeNode(u.id),a.removeNode(u.id);const _=os.indexOf(u.id);_!==-1&&os.splice(_,1),l({type:"edgesRemoved",nodeId:u.id}),l({type:"nodeRemoved",nodeId:u.id});break}case"MemoryPromoted":{const u=i.data,g=u==null?void 0:u.id;if(!g)break;const _=u.new_retention??.95;if(h.has(g)){s.growNode(g,_),n.addPulse(g,1.2,new at(65416),.01);const m=c.get(g);m&&(n.createShockwave(m,new at(65416),o),n.createSpawnBurst(m,new at(65416))),l({type:"nodeUpdated",nodeId:g,retention:_})}break}case"MemoryDemoted":{const u=i.data,g=u==null?void 0:u.id;if(!g)break;const _=u.new_retention??.3;h.has(g)&&(s.growNode(g,_),n.addPulse(g,.8,new at(16729943),.03),l({type:"nodeUpdated",nodeId:g,retention:_}));break}case"MemoryUpdated":{const u=i.data,g=u==null?void 0:u.id;if(!g||!h.has(g))break;n.addPulse(g,.6,new at(8490232),.02),u.retention!==void 0&&(s.growNode(g,u.retention),l({type:"nodeUpdated",nodeId:g,retention:u.retention}));break}case"SearchPerformed":{h.forEach((u,g)=>{n.addPulse(g,.6+Math.random()*.4,new at(8490232),.02)});break}case"DreamStarted":{h.forEach((u,g)=>{n.addPulse(g,1,new at(11032055),.005)});break}case"DreamProgress":{const u=(f=i.data)==null?void 0:f.memory_id;u&&h.has(u)&&n.addPulse(u,1.5,new at(12616956),.01);break}case"DreamCompleted":{n.createSpawnBurst(new P(0,0,0),new at(11032055)),n.createShockwave(new P(0,0,0),new at(11032055),o);break}case"RetentionDecayed":{const u=(p=i.data)==null?void 0:p.id;u&&h.has(u)&&n.addPulse(u,.8,new at(16729943),.03);break}case"ConsolidationCompleted":{h.forEach((u,g)=>{n.addPulse(g,.4+Math.random()*.3,new at(16758784),.015)});break}case"ActivationSpread":{const u=i.data;if(u.source_id&&u.target_ids){const g=c.get(u.source_id);if(g)for(const _ of u.target_ids){const m=c.get(_);m&&n.createConnectionFlash(g,m,new at(1370310))}}break}case"MemorySuppressed":{const u=i.data;if(!u.id)break;const g=c.get(u.id);if(g){n.createImplosion(g,new at(11032055));const _=Math.max(1,u.suppression_count??1),m=Math.min(.4+_*.15,1);n.addPulse(u.id,m,new at(11032055),.04)}break}case"MemoryUnsuppressed":{const u=i.data;if(!u.id)break;const g=c.get(u.id);g&&h.has(u.id)&&(n.createRainbowBurst(g,new at(65416)),n.addPulse(u.id,1,new at(65416),.02));break}case"Rac1CascadeSwept":{const g=i.data.neighbors_affected??0;if(g===0)break;const _=Array.from(h.keys()),m=Math.min(g,_.length,12);for(let d=0;d');function Xg(i,t){ur(t,!0);let e=nr(t,"events",19,()=>[]),n=nr(t,"isDreaming",3,!1),s,r,a,o,l,c,h,d,p,f,g,v=0,m=[];Rl(()=>{r=xg(s),f=Og(r.scene).material,g=Vg(r.composer),c=new Rg(r.scene),o=new Tg,l=new Ag,h=new Cg(r.scene),p=new Pg;const U=o.createNodes(t.nodes);l.createEdges(t.edges,U),d=new yg(U),m=[...t.nodes],r.scene.add(l.group),r.scene.add(o.group),u(),window.addEventListener("resize",b),s.addEventListener("pointermove",y),s.addEventListener("click",L)}),Cl(()=>{cancelAnimationFrame(a),window.removeEventListener("resize",b),s==null||s.removeEventListener("pointermove",y),s==null||s.removeEventListener("click",L),h==null||h.dispose(),c==null||c.dispose(),o==null||o.dispose(),l==null||l.dispose(),r&&Sg(r)});function u(){a=requestAnimationFrame(u);const A=performance.now()*.001;d.tick(t.edges),o.updatePositions(),l.updatePositions(o.positions),l.animateEdges(o.positions),c.animate(A),o.animate(A,m,r.camera),p.setActive(n()),p.update(r.scene,r.bloomPass,r.controls,r.lights,A),Bg(f,A,p.current.nebulaIntensity,s.clientWidth,s.clientHeight),Gg(g,A,p.current.nebulaIntensity),T(),h.update(o.meshMap,r.camera,o.positions),r.controls.update(),r.composer.render()}function T(){if(!e()||e().length<=v)return;const A=e().slice(v);v=e().length;const U={effects:h,nodeManager:o,edgeManager:l,forceSim:d,camera:r.camera,onMutation:S=>{var M;S.type==="nodeAdded"?m=[...m,S.node]:S.type==="nodeRemoved"&&(m=m.filter(D=>D.id!==S.nodeId)),(M=t.onGraphMutation)==null||M.call(t,S)}};for(const S of A)Ig(S,U,m)}function b(){!s||!r||Mg(r,s)}function y(A){const U=s.getBoundingClientRect();r.mouse.x=(A.clientX-U.left)/U.width*2-1,r.mouse.y=-((A.clientY-U.top)/U.height)*2+1,r.raycaster.setFromCamera(r.mouse,r.camera);const S=r.raycaster.intersectObjects(o.getMeshes());S.length>0?(o.hoveredNode=S[0].object.userData.nodeId,s.style.cursor="pointer"):(o.hoveredNode=null,s.style.cursor="grab")}function L(){var A;if(o.hoveredNode){o.selectedNode=o.hoveredNode,(A=t.onSelect)==null||A.call(t,o.hoveredNode);const U=o.positions.get(o.hoveredNode);U&&r.controls.target.lerp(U.clone(),.5)}}var R=Wg();Nc(R,A=>s=A,()=>s),He(i,R),dr()}var Yg=je('

'),qg=je('
');function jg(i,t){ur(t,!0);let e=nr(t,"width",3,240),n=nr(t,"height",3,80);function s(m){return t.stability<=0?0:Math.exp(-m/t.stability)}let r=ti(()=>{const m=[],u=Math.max(t.stability*3,30),T=4,b=e()-T*2,y=n()-T*2;for(let L=0;L<=50;L++){const R=L/50*u,A=s(R),U=T+L/50*b,S=T+(1-A)*y;m.push(`${L===0?"M":"L"}${U.toFixed(1)},${S.toFixed(1)}`)}return m.join(" ")}),a=ti(()=>[{label:"Now",days:0,value:t.retention},{label:"1d",days:1,value:s(1)},{label:"7d",days:7,value:s(7)},{label:"30d",days:30,value:s(30)}]);function o(m){return m>.7?"#10b981":m>.4?"#f59e0b":"#ef4444"}var l=qg(),c=Dt(l),h=Dt(c),d=Ot(h),p=Ot(d),f=Ot(p),g=Ot(f);Rc(),Rt(c);var v=Ot(c,2);Qr(v,21,()=>j(a),ta,(m,u)=>{var T=Yg(),b=Dt(T),y=Dt(b);Rt(b);var L=Ot(b,2),R=Dt(L);Rt(L),Rt(T),ln((A,U)=>{_e(y,`${j(u).label??""}:`),Ul(L,`color: ${A??""}`),_e(R,`${U??""}%`)},[()=>o(j(u).value),()=>(j(u).value*100).toFixed(0)]),He(m,T)}),Rt(v),Rt(l),ln(m=>{ze(c,"width",e()),ze(c,"height",n()),ze(c,"viewBox",`0 0 ${e()??""} ${n()??""}`),ze(h,"y1",4+(n()-8)*.5),ze(h,"x2",e()-4),ze(h,"y2",4+(n()-8)*.5),ze(d,"y1",4+(n()-8)*.8),ze(d,"x2",e()-4),ze(d,"y2",4+(n()-8)*.8),ze(p,"d",j(r)),ze(f,"d",`${j(r)??""} L${e()-4},${n()-4} L4,${n()-4} Z`),ze(g,"cy",4+(1-t.retention)*(n()-8)),ze(g,"fill",m)},[()=>o(t.retention)]),He(i,l),dr()}function Al(i,t,e){const n=e.getTime(),s=new Set,r=new Map,a=i.filter(l=>{const c=new Date(l.createdAt).getTime();if(c<=n){s.add(l.id);const h=n-c,d=1440*60*1e3,p=hs.has(l.source)&&s.has(l.target));return{visibleNodes:a,visibleEdges:o,nodeOpacities:r}}function Zg(i){if(i.length===0){const n=new Date;return{oldest:n,newest:n}}let t=1/0,e=-1/0;for(const n of i){const s=new Date(n.createdAt).getTime();se&&(e=s)}return{oldest:new Date(t),newest:new Date(e)}}var Kg=je(`
');function Xg(i,t){ur(t,!0);let e=nr(t,"events",19,()=>[]),n=nr(t,"isDreaming",3,!1),s,r,a,o,l,c,h,f,p,u,g,_=0,m=[];Rl(()=>{r=xg(s),u=Og(r.scene).material,g=Vg(r.composer),c=new Rg(r.scene),o=new Tg,l=new Ag,h=new Cg(r.scene),p=new Pg;const U=o.createNodes(t.nodes);l.createEdges(t.edges,U),f=new yg(U),m=[...t.nodes],r.scene.add(l.group),r.scene.add(o.group),d(),window.addEventListener("resize",E),s.addEventListener("pointermove",y),s.addEventListener("click",L)}),Cl(()=>{cancelAnimationFrame(a),window.removeEventListener("resize",E),s==null||s.removeEventListener("pointermove",y),s==null||s.removeEventListener("click",L),h==null||h.dispose(),c==null||c.dispose(),o==null||o.dispose(),l==null||l.dispose(),r&&Sg(r)});function d(){a=requestAnimationFrame(d);const A=performance.now()*.001;f.tick(t.edges),o.updatePositions(),l.updatePositions(o.positions),l.animateEdges(o.positions),c.animate(A),o.animate(A,m,r.camera),p.setActive(n()),p.update(r.scene,r.bloomPass,r.controls,r.lights,A),Bg(u,A,p.current.nebulaIntensity,s.clientWidth,s.clientHeight),Gg(g,A,p.current.nebulaIntensity),T(),h.update(o.meshMap,r.camera,o.positions),r.controls.update(),r.composer.render()}function T(){if(!e()||e().length<=_)return;const A=e().slice(_);_=e().length;const U={effects:h,nodeManager:o,edgeManager:l,forceSim:f,camera:r.camera,onMutation:S=>{var M;S.type==="nodeAdded"?m=[...m,S.node]:S.type==="nodeRemoved"&&(m=m.filter(D=>D.id!==S.nodeId)),(M=t.onGraphMutation)==null||M.call(t,S)}};for(const S of A)Ig(S,U,m)}function E(){!s||!r||Mg(r,s)}function y(A){const U=s.getBoundingClientRect();r.mouse.x=(A.clientX-U.left)/U.width*2-1,r.mouse.y=-((A.clientY-U.top)/U.height)*2+1,r.raycaster.setFromCamera(r.mouse,r.camera);const S=r.raycaster.intersectObjects(o.getMeshes());S.length>0?(o.hoveredNode=S[0].object.userData.nodeId,s.style.cursor="pointer"):(o.hoveredNode=null,s.style.cursor="grab")}function L(){var A;if(o.hoveredNode){o.selectedNode=o.hoveredNode,(A=t.onSelect)==null||A.call(t,o.hoveredNode);const U=o.positions.get(o.hoveredNode);U&&r.controls.target.lerp(U.clone(),.5)}}var R=Wg();Nc(R,A=>s=A,()=>s),ke(i,R),dr()}var Yg=je('
'),qg=je('
');function jg(i,t){ur(t,!0);let e=nr(t,"width",3,240),n=nr(t,"height",3,80);function s(m){return t.stability<=0?0:Math.exp(-m/t.stability)}let r=ti(()=>{const m=[],d=Math.max(t.stability*3,30),T=4,E=e()-T*2,y=n()-T*2;for(let L=0;L<=50;L++){const R=L/50*d,A=s(R),U=T+L/50*E,S=T+(1-A)*y;m.push(`${L===0?"M":"L"}${U.toFixed(1)},${S.toFixed(1)}`)}return m.join(" ")}),a=ti(()=>[{label:"Now",days:0,value:t.retention},{label:"1d",days:1,value:s(1)},{label:"7d",days:7,value:s(7)},{label:"30d",days:30,value:s(30)}]);function o(m){return m>.7?"#10b981":m>.4?"#f59e0b":"#ef4444"}var l=qg(),c=Dt(l),h=Dt(c),f=Ot(h),p=Ot(f),u=Ot(p),g=Ot(u);Rc(),Rt(c);var _=Ot(c,2);Qr(_,21,()=>j(a),ta,(m,d)=>{var T=Yg(),E=Dt(T),y=Dt(E);Rt(E);var L=Ot(E,2),R=Dt(L);Rt(L),Rt(T),ln((A,U)=>{_e(y,`${j(d).label??""}:`),Ul(L,`color: ${A??""}`),_e(R,`${U??""}%`)},[()=>o(j(d).value),()=>(j(d).value*100).toFixed(0)]),ke(m,T)}),Rt(_),Rt(l),ln(m=>{ze(c,"width",e()),ze(c,"height",n()),ze(c,"viewBox",`0 0 ${e()??""} ${n()??""}`),ze(h,"y1",4+(n()-8)*.5),ze(h,"x2",e()-4),ze(h,"y2",4+(n()-8)*.5),ze(f,"y1",4+(n()-8)*.8),ze(f,"x2",e()-4),ze(f,"y2",4+(n()-8)*.8),ze(p,"d",j(r)),ze(u,"d",`${j(r)??""} L${e()-4},${n()-4} L4,${n()-4} Z`),ze(g,"cy",4+(1-t.retention)*(n()-8)),ze(g,"fill",m)},[()=>o(t.retention)]),ke(i,l),dr()}function Al(i,t,e){const n=e.getTime(),s=new Set,r=new Map,a=i.filter(l=>{const c=new Date(l.createdAt).getTime();if(c<=n){s.add(l.id);const h=n-c,f=1440*60*1e3,p=hs.has(l.source)&&s.has(l.target));return{visibleNodes:a,visibleEdges:o,nodeOpacities:r}}function Zg(i){if(i.length===0){const n=new Date;return{oldest:n,newest:n}}let t=1/0,e=-1/0;for(const n of i){const s=new Date(n.createdAt).getTime();se&&(e=s)}return{oldest:new Date(t),newest:new Date(e)}}var Kg=je(`
`),$g=je('');function Jg(i,t){ur(t,!0);let e=Ie(!1),n=Ie(!1),s=Ie(1),r=Ie(100),a,o=0,l=ti(()=>Zg(t.nodes)),c=ti(()=>{const b=j(l).oldest.getTime(),L=j(l).newest.getTime()-b||1;return new Date(b+j(r)/100*L)});function h(b){return b.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function d(){ie(e,!j(e)),t.onToggle(j(e)),j(e)&&(ie(r,100),t.onDateChange(j(c)))}function p(){ie(n,!j(n)),j(n)?(ie(r,0),o=performance.now(),f()):cancelAnimationFrame(a)}function f(){j(n)&&(a=requestAnimationFrame(b=>{const y=(b-o)/1e3;o=b;const L=j(l).oldest.getTime(),A=(j(l).newest.getTime()-L)/(1440*60*1e3)||1,U=j(s)/A*100;if(ie(r,Math.min(100,j(r)+U*y),!0),t.onDateChange(j(c)),j(r)>=100){ie(n,!1);return}f()}))}function g(){t.onDateChange(j(c))}Cl(()=>{ie(n,!1),cancelAnimationFrame(a)});var v=Pc(),m=Pl(v);{var u=b=>{var y=Kg(),L=Dt(y),R=Dt(L),A=Dt(R),U=Dt(A),S=Dt(U,!0);Rt(U);var M=Ot(U,2),D=Dt(M);D.value=D.__value=1;var W=Ot(D);W.value=W.__value=7;var z=Ot(W);z.value=z.__value=30,Rt(M),Rt(A);var V=Ot(A,2),$=Dt(V,!0);Rt(V);var G=Ot(V,2);Rt(R);var J=Ot(R,2);Ll(J);var k=Ot(J,2),it=Dt(k),ut=Dt(it,!0);Rt(it);var yt=Ot(it,2),Lt=Dt(yt,!0);Rt(yt),Rt(k),Rt(L),Rt(y),ln((qt,Y,nt)=>{_e(S,j(n)?"⏸":"▶"),_e($,qt),_e(ut,Y),_e(Lt,nt)},[()=>h(j(c)),()=>h(j(l).oldest),()=>h(j(l).newest)]),Je("click",U,p),Nl(M,()=>j(s),qt=>ie(s,qt)),Je("click",G,d),Je("input",J,g),Il(J,()=>j(r),qt=>ie(r,qt)),He(b,y)},T=b=>{var y=$g();Je("click",y,d),He(b,y)};Ai(m,b=>{j(e)?b(u):b(T,!1)})}He(i,v),dr()}Dl(["click","input"]);var Qg=je('

Loading memory graph...

'),t_=je('

Your Mind Awaits

'),e_=je(' · · ',1),n_=je(' '),i_=je('
'),s_=je("
"),r_=je(`
`),$g=je('');function Jg(i,t){ur(t,!0);let e=Ie(!1),n=Ie(!1),s=Ie(1),r=Ie(100),a,o=0,l=ti(()=>Zg(t.nodes)),c=ti(()=>{const E=j(l).oldest.getTime(),L=j(l).newest.getTime()-E||1;return new Date(E+j(r)/100*L)});function h(E){return E.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function f(){ie(e,!j(e)),t.onToggle(j(e)),j(e)&&(ie(r,100),t.onDateChange(j(c)))}function p(){ie(n,!j(n)),j(n)?(ie(r,0),o=performance.now(),u()):cancelAnimationFrame(a)}function u(){j(n)&&(a=requestAnimationFrame(E=>{const y=(E-o)/1e3;o=E;const L=j(l).oldest.getTime(),A=(j(l).newest.getTime()-L)/(1440*60*1e3)||1,U=j(s)/A*100;if(ie(r,Math.min(100,j(r)+U*y),!0),t.onDateChange(j(c)),j(r)>=100){ie(n,!1);return}u()}))}function g(){t.onDateChange(j(c))}Cl(()=>{ie(n,!1),cancelAnimationFrame(a)});var _=Pc(),m=Pl(_);{var d=E=>{var y=Kg(),L=Dt(y),R=Dt(L),A=Dt(R),U=Dt(A),S=Dt(U,!0);Rt(U);var M=Ot(U,2),D=Dt(M);D.value=D.__value=1;var W=Ot(D);W.value=W.__value=7;var z=Ot(W);z.value=z.__value=30,Rt(M),Rt(A);var V=Ot(A,2),$=Dt(V,!0);Rt(V);var G=Ot(V,2);Rt(R);var J=Ot(R,2);Ll(J);var H=Ot(J,2),it=Dt(H),dt=Dt(it,!0);Rt(it);var yt=Ot(it,2),Lt=Dt(yt,!0);Rt(yt),Rt(H),Rt(L),Rt(y),ln((qt,Y,nt)=>{_e(S,j(n)?"⏸":"▶"),_e($,qt),_e(dt,Y),_e(Lt,nt)},[()=>h(j(c)),()=>h(j(l).oldest),()=>h(j(l).newest)]),Je("click",U,p),Nl(M,()=>j(s),qt=>ie(s,qt)),Je("click",G,f),Je("input",J,g),Il(J,()=>j(r),qt=>ie(r,qt)),ke(E,y)},T=E=>{var y=$g();Je("click",y,f),ke(E,y)};Ai(m,E=>{j(e)?E(d):E(T,!1)})}ke(i,_),dr()}Dl(["click","input"]);var Qg=je('

Loading memory graph...

'),t_=je('

Your Mind Awaits

'),e_=je(' · · ',1),n_=je(' '),i_=je('
'),s_=je("
"),r_=je(`
`),a_=je(`
`);function A_(i,t){ur(t,!0);const e=()=>Uc(Fc,"$eventFeed",n),[n,s]=Lc();let r=Ie(null),a=Ie(null),o=Ie(!0),l=Ie(""),c=Ie(!1),h=Ie(""),d=Ie(150),p=Ie(!1),f=Ie(Cc(new Date)),g=Ie(0),v=Ie(0),m=ti(()=>j(r)?j(p)?Al(j(r).nodes,j(r).edges,j(f)).visibleNodes:j(r).nodes:[]),u=ti(()=>j(r)?j(p)?Al(j(r).nodes,j(r).edges,j(f)).visibleEdges:j(r).edges:[]);function T(rt){if(j(r))switch(rt.type){case"nodeAdded":j(r).nodes=[...j(r).nodes,rt.node],j(r).nodeCount=j(r).nodes.length,ie(g,j(r).nodeCount,!0);break;case"nodeRemoved":j(r).nodes=j(r).nodes.filter(Ct=>Ct.id!==rt.nodeId),j(r).nodeCount=j(r).nodes.length,ie(g,j(r).nodeCount,!0);break;case"edgeAdded":j(r).edges=[...j(r).edges,rt.edge],j(r).edgeCount=j(r).edges.length,ie(v,j(r).edgeCount,!0);break;case"edgesRemoved":j(r).edges=j(r).edges.filter(Ct=>Ct.source!==rt.nodeId&&Ct.target!==rt.nodeId),j(r).edgeCount=j(r).edges.length,ie(v,j(r).edgeCount,!0);break;case"nodeUpdated":{const Ct=j(r).nodes.find(w=>w.id===rt.nodeId);Ct&&(Ct.retention=rt.retention);break}}}Rl(()=>b());async function b(rt,Ct){ie(o,!0),ie(l,"");try{ie(r,await qi.graph({max_nodes:j(d),depth:3,query:rt||void 0,center_id:Ct||void 0}),!0),j(r)&&(ie(g,j(r).nodeCount,!0),ie(v,j(r).edgeCount,!0))}catch{ie(l,"No memories yet. Start using Vestige to populate your graph.")}finally{ie(o,!1)}}async function y(){ie(c,!0);try{await qi.dream(),await b()}catch{}finally{ie(c,!1)}}async function L(rt){try{ie(a,await qi.memories.get(rt),!0)}catch{ie(a,null)}}function R(){j(h).trim()&&b(j(h))}var A=a_(),U=Dt(A);{var S=rt=>{var Ct=Qg();He(rt,Ct)},M=rt=>{var Ct=t_(),w=Dt(Ct),ve=Ot(Dt(w),4),Bt=Dt(ve,!0);Rt(ve),Rt(w),Rt(Ct),ln(()=>_e(Bt,j(l))),He(rt,Ct)},D=rt=>{Xg(rt,{get nodes(){return j(m)},get edges(){return j(u)},get centerId(){return j(r).center_id},get events(){return e()},get isDreaming(){return j(c)},onSelect:L,onGraphMutation:T})};Ai(U,rt=>{j(o)?rt(S):j(l)?rt(M,1):j(r)&&rt(D,2)})}var W=Ot(U,2),z=Dt(W),V=Dt(z);Ll(V);var $=Ot(V,2);Rt(z);var G=Ot(z,2),J=Dt(G),k=Dt(J);k.value=k.__value=50;var it=Ot(k);it.value=it.__value=100;var ut=Ot(it);ut.value=ut.__value=150;var yt=Ot(ut);yt.value=yt.__value=200,Rt(J);var Lt=Ot(J,2),qt=Dt(Lt,!0);Rt(Lt);var Y=Ot(Lt,2);Rt(G),Rt(W);var nt=Ot(W,2),xt=Dt(nt);{var at=rt=>{var Ct=e_(),w=Pl(Ct),ve=Dt(w);Rt(w);var Bt=Ot(w,4),kt=Dt(Bt);Rt(Bt);var Mt=Ot(Bt,4),ne=Dt(Mt);Rt(Mt),ln(()=>{_e(ve,`${j(g)??""} nodes`),_e(kt,`${j(v)??""} edges`),_e(ne,`depth ${j(r).depth??""}`)}),He(rt,Ct)};Ai(xt,rt=>{j(r)&&rt(at)})}Rt(nt);var wt=Ot(nt,2);{var Ut=rt=>{Jg(rt,{get nodes(){return j(r).nodes},onDateChange:Ct=>{ie(f,Ct,!0)},onToggle:Ct=>{ie(p,Ct,!0)}})};Ai(wt,rt=>{j(r)&&rt(Ut)})}var Gt=Ot(wt,2);{var ce=rt=>{var Ct=r_(),w=Dt(Ct),ve=Ot(Dt(w),2);Rt(w);var Bt=Ot(w,2),kt=Dt(Bt),Mt=Dt(kt),ne=Dt(Mt,!0);Rt(Mt);var Et=Ot(Mt,2);Qr(Et,17,()=>j(a).tags,ta,(C,et)=>{var H=n_(),q=Dt(H,!0);Rt(H),ln(()=>_e(q,j(et))),He(C,H)}),Rt(kt);var E=Ot(kt,2),_=Dt(E,!0);Rt(E);var F=Ot(E,2);Qr(F,21,()=>[{label:"Retention",value:j(a).retentionStrength},{label:"Storage",value:j(a).storageStrength},{label:"Retrieval",value:j(a).retrievalStrength}],ta,(C,et)=>{var H=i_(),q=Dt(H),lt=Dt(q),ct=Dt(lt,!0);Rt(lt);var Nt=Ot(lt,2),ue=Dt(Nt);Rt(Nt),Rt(q);var xe=Ot(q,2),Jt=Dt(xe);Rt(xe),Rt(H),ln(Ve=>{_e(ct,j(et).label),_e(ue,`${Ve??""}%`),Ul(Jt,`width: ${j(et).value*100}%; background: ${j(et).value>.7?"#10b981":j(et).value>.4?"#f59e0b":"#ef4444"}`)},[()=>(j(et).value*100).toFixed(1)]),He(C,H)}),Rt(F);var Z=Ot(F,2),K=Ot(Dt(Z),2);{let C=ti(()=>j(a).storageStrength*30);jg(K,{get retention(){return j(a).retentionStrength},get stability(){return j(C)}})}Rt(Z);var X=Ot(Z,2),St=Dt(X),ot=Dt(St);Rt(St);var dt=Ot(St,2),jt=Dt(dt);Rt(dt);var tt=Ot(dt,2);{var mt=C=>{var et=s_(),H=Dt(et);Rt(et),ln(q=>_e(H,`Accessed: ${q??""}`),[()=>new Date(j(a).lastAccessedAt).toLocaleString()]),He(C,et)};Ai(tt,C=>{j(a).lastAccessedAt&&C(mt)})}var bt=Ot(tt,2),Pt=Dt(bt);Rt(bt),Rt(X);var ft=Ot(X,2),Xt=Dt(ft),zt=Ot(Xt,2);Rt(ft);var se=Ot(ft,2);Rt(Bt),Rt(Ct),ln((C,et)=>{_e(ne,j(a).nodeType),_e(_,j(a).content),_e(ot,`Created: ${C??""}`),_e(jt,`Updated: ${et??""}`),_e(Pt,`Reviews: ${j(a).reviewCount??0??""}`),ze(se,"href",`${Ic??""}/explore`)},[()=>new Date(j(a).createdAt).toLocaleString(),()=>new Date(j(a).updatedAt).toLocaleString()]),Je("click",ve,()=>ie(a,null)),Je("click",Xt,()=>{j(a)&&qi.memories.promote(j(a).id)}),Je("click",zt,()=>{j(a)&&qi.memories.demote(j(a).id)}),He(rt,Ct)};Ai(Gt,rt=>{j(a)&&rt(ce)})}Rt(A),ln(()=>{Lt.disabled=j(c),Dc(Lt,1,`px-4 py-2 rounded-xl bg-dream/20 border border-dream/40 text-dream-glow text-sm + placeholder:text-muted focus:outline-none focus:!border-synapse/40 transition"/>
`);function A_(i,t){ur(t,!0);const e=()=>Uc(Fc,"$eventFeed",n),[n,s]=Lc();let r=Ie(null),a=Ie(null),o=Ie(!0),l=Ie(""),c=Ie(!1),h=Ie(""),f=Ie(150),p=Ie(!1),u=Ie(Cc(new Date)),g=Ie(0),_=Ie(0),m=ti(()=>j(r)?j(p)?Al(j(r).nodes,j(r).edges,j(u)).visibleNodes:j(r).nodes:[]),d=ti(()=>j(r)?j(p)?Al(j(r).nodes,j(r).edges,j(u)).visibleEdges:j(r).edges:[]);function T(rt){if(j(r))switch(rt.type){case"nodeAdded":j(r).nodes=[...j(r).nodes,rt.node],j(r).nodeCount=j(r).nodes.length,ie(g,j(r).nodeCount,!0);break;case"nodeRemoved":j(r).nodes=j(r).nodes.filter(Ct=>Ct.id!==rt.nodeId),j(r).nodeCount=j(r).nodes.length,ie(g,j(r).nodeCount,!0);break;case"edgeAdded":j(r).edges=[...j(r).edges,rt.edge],j(r).edgeCount=j(r).edges.length,ie(_,j(r).edgeCount,!0);break;case"edgesRemoved":j(r).edges=j(r).edges.filter(Ct=>Ct.source!==rt.nodeId&&Ct.target!==rt.nodeId),j(r).edgeCount=j(r).edges.length,ie(_,j(r).edgeCount,!0);break;case"nodeUpdated":{const Ct=j(r).nodes.find(w=>w.id===rt.nodeId);Ct&&(Ct.retention=rt.retention);break}}}Rl(()=>E());async function E(rt,Ct){ie(o,!0),ie(l,"");try{ie(r,await qi.graph({max_nodes:j(f),depth:3,query:rt||void 0,center_id:Ct||void 0}),!0),j(r)&&(ie(g,j(r).nodeCount,!0),ie(_,j(r).edgeCount,!0))}catch{ie(l,"No memories yet. Start using Vestige to populate your graph.")}finally{ie(o,!1)}}async function y(){ie(c,!0);try{await qi.dream(),await E()}catch{}finally{ie(c,!1)}}async function L(rt){try{ie(a,await qi.memories.get(rt),!0)}catch{ie(a,null)}}function R(){j(h).trim()&&E(j(h))}var A=a_(),U=Dt(A);{var S=rt=>{var Ct=Qg();ke(rt,Ct)},M=rt=>{var Ct=t_(),w=Dt(Ct),ve=Ot(Dt(w),4),Bt=Dt(ve,!0);Rt(ve),Rt(w),Rt(Ct),ln(()=>_e(Bt,j(l))),ke(rt,Ct)},D=rt=>{Xg(rt,{get nodes(){return j(m)},get edges(){return j(d)},get centerId(){return j(r).center_id},get events(){return e()},get isDreaming(){return j(c)},onSelect:L,onGraphMutation:T})};Ai(U,rt=>{j(o)?rt(S):j(l)?rt(M,1):j(r)&&rt(D,2)})}var W=Ot(U,2),z=Dt(W),V=Dt(z);Ll(V);var $=Ot(V,2);Rt(z);var G=Ot(z,2),J=Dt(G),H=Dt(J);H.value=H.__value=50;var it=Ot(H);it.value=it.__value=100;var dt=Ot(it);dt.value=dt.__value=150;var yt=Ot(dt);yt.value=yt.__value=200,Rt(J);var Lt=Ot(J,2),qt=Dt(Lt,!0);Rt(Lt);var Y=Ot(Lt,2);Rt(G),Rt(W);var nt=Ot(W,2),xt=Dt(nt);{var ot=rt=>{var Ct=e_(),w=Pl(Ct),ve=Dt(w);Rt(w);var Bt=Ot(w,4),Ht=Dt(Bt);Rt(Bt);var Mt=Ot(Bt,4),ne=Dt(Mt);Rt(Mt),ln(()=>{_e(ve,`${j(g)??""} nodes`),_e(Ht,`${j(_)??""} edges`),_e(ne,`depth ${j(r).depth??""}`)}),ke(rt,Ct)};Ai(xt,rt=>{j(r)&&rt(ot)})}Rt(nt);var wt=Ot(nt,2);{var Ut=rt=>{Jg(rt,{get nodes(){return j(r).nodes},onDateChange:Ct=>{ie(u,Ct,!0)},onToggle:Ct=>{ie(p,Ct,!0)}})};Ai(wt,rt=>{j(r)&&rt(Ut)})}var Gt=Ot(wt,2);{var ce=rt=>{var Ct=r_(),w=Dt(Ct),ve=Ot(Dt(w),2);Rt(w);var Bt=Ot(w,2),Ht=Dt(Bt),Mt=Dt(Ht),ne=Dt(Mt,!0);Rt(Mt);var Et=Ot(Mt,2);Qr(Et,17,()=>j(a).tags,ta,(C,et)=>{var k=n_(),q=Dt(k,!0);Rt(k),ln(()=>_e(q,j(et))),ke(C,k)}),Rt(Ht);var b=Ot(Ht,2),v=Dt(b,!0);Rt(b);var F=Ot(b,2);Qr(F,21,()=>[{label:"Retention",value:j(a).retentionStrength},{label:"Storage",value:j(a).storageStrength},{label:"Retrieval",value:j(a).retrievalStrength}],ta,(C,et)=>{var k=i_(),q=Dt(k),ct=Dt(q),ht=Dt(ct,!0);Rt(ct);var Nt=Ot(ct,2),ue=Dt(Nt);Rt(Nt),Rt(q);var xe=Ot(q,2),Jt=Dt(xe);Rt(xe),Rt(k),ln(Ve=>{_e(ht,j(et).label),_e(ue,`${Ve??""}%`),Ul(Jt,`width: ${j(et).value*100}%; background: ${j(et).value>.7?"#10b981":j(et).value>.4?"#f59e0b":"#ef4444"}`)},[()=>(j(et).value*100).toFixed(1)]),ke(C,k)}),Rt(F);var Z=Ot(F,2),K=Ot(Dt(Z),2);{let C=ti(()=>j(a).storageStrength*30);jg(K,{get retention(){return j(a).retentionStrength},get stability(){return j(C)}})}Rt(Z);var X=Ot(Z,2),St=Dt(X),lt=Dt(St);Rt(St);var ft=Ot(St,2),jt=Dt(ft);Rt(ft);var tt=Ot(ft,2);{var mt=C=>{var et=s_(),k=Dt(et);Rt(et),ln(q=>_e(k,`Accessed: ${q??""}`),[()=>new Date(j(a).lastAccessedAt).toLocaleString()]),ke(C,et)};Ai(tt,C=>{j(a).lastAccessedAt&&C(mt)})}var bt=Ot(tt,2),Pt=Dt(bt);Rt(bt),Rt(X);var pt=Ot(X,2),Xt=Dt(pt),zt=Ot(Xt,2);Rt(pt);var se=Ot(pt,2);Rt(Bt),Rt(Ct),ln((C,et)=>{_e(ne,j(a).nodeType),_e(v,j(a).content),_e(lt,`Created: ${C??""}`),_e(jt,`Updated: ${et??""}`),_e(Pt,`Reviews: ${j(a).reviewCount??0??""}`),ze(se,"href",`${Ic??""}/explore`)},[()=>new Date(j(a).createdAt).toLocaleString(),()=>new Date(j(a).updatedAt).toLocaleString()]),Je("click",ve,()=>ie(a,null)),Je("click",Xt,()=>{j(a)&&qi.memories.promote(j(a).id)}),Je("click",zt,()=>{j(a)&&qi.memories.demote(j(a).id)}),ke(rt,Ct)};Ai(Gt,rt=>{j(a)&&rt(ce)})}Rt(A),ln(()=>{Lt.disabled=j(c),Dc(Lt,1,`px-4 py-2 rounded-xl bg-dream/20 border border-dream/40 text-dream-glow text-sm hover:bg-dream/30 transition-all backdrop-blur-sm disabled:opacity-50 - ${j(c)?"glow-dream animate-pulse-glow":""}`),_e(qt,j(c)?"◈ Dreaming...":"◈ Dream")}),Je("keydown",V,rt=>rt.key==="Enter"&&R()),Il(V,()=>j(h),rt=>ie(h,rt)),Je("click",$,R),Je("change",J,()=>b()),Nl(J,()=>j(d),rt=>ie(d,rt)),Je("click",Lt,y),Je("click",Y,()=>b()),He(i,A),dr(),s()}Dl(["keydown","click","change"]);export{A_ as component}; + ${j(c)?"glow-dream animate-pulse-glow":""}`),_e(qt,j(c)?"◈ Dreaming...":"◈ Dream")}),Je("keydown",V,rt=>rt.key==="Enter"&&R()),Il(V,()=>j(h),rt=>ie(h,rt)),Je("click",$,R),Je("change",J,()=>E()),Nl(J,()=>j(f),rt=>ie(f,rt)),Je("click",Lt,y),Je("click",Y,()=>E()),ke(i,A),dr(),s()}Dl(["keydown","click","change"]);export{A_ as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/6.FZZPojTg.js.br b/apps/dashboard/build/_app/immutable/nodes/6.FZZPojTg.js.br new file mode 100644 index 0000000000000000000000000000000000000000..6a9be1d23cce2e553f4a2b6da5b7b0959bc8c298 GIT binary patch literal 120063 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%0D(Y91QG~zMIeX3_PO-^hSIa12n5b?VJ$gPs(qR7 zv&%d=OU{)UPlk4uoO`ZT0Gw0>(_Ww{aF{q3C7uUN*%pZj_e_xC{H%Qr{vOZ#a|F&E zJLf=!opr&PNq)8s?o9Ht9ym0~&-&+Rj`On}@Y$Z9?Vh6v&d>JF(FG)LpQ9Q4`rr>M zKl3}_0xLiByXWW-ez(uj5`KHkYbCg^Y}ph@+|1Ct8KPNpftJmYwJJ~oL*U>yGBj_5 zXx3PuWut)KDdGoc-k73UV}h2A6BoZ*tWSXE%_*8SCurF$;BOc4Q#5am(X4ramd!&O zp9teVFe}_@rD)z5qgmquEgN<+Wk`nzLpsIeDH@{-RFP(+Xv}ATE==X zIWM7FjdFAk{=iYpPTV-VyU-9&j8B3*3M=G>3i0SJ(j)md<&pe@M0=T9bkv97 zj=sg?taOx12KL|UTl~MkC%4$yp)JzONM6PB;r<<&yAUatV4Ndm4sR2D);>4bbl}!b zc&b;bo?*E|XM%DtS2wMU1zLmq3Tpc2?7M-(%oK*0X2PI`A;lCM4OQ;b5(J`5j5x48 zG;zuRI;U0MQG?o324}JowKR#BU>7HkE@Kd0rPErHCQa63WK`pgke>TMdetNt?&WP- zz3c-Ahq>&^c{S-YBl$FqN6e+Sib8BGXz6(DaR0q;YrgUUhL0?7Y!WB zyhnJ-9sOQ-=tO;k-?&5kMR;|kD9TX`uKv8?Ay8_Jn{eo@q*YsUJz>jH_v!(4leWrRV%YpY!2u z=llfE(FI-%C;Jz}i9VucI24qKH~f&7?)YOg^U#a5{vk&*6a$YQ@yTqHBDYp?eBUZo z)@LH?GjZ$l|5FqHGBxocHK_@c74aglj(z^>BgF9ci59uxyX_067@3otGe;FZ*maIw z$s%PQKd&GIVpdGJp9>lw{Drx8kgGUzh3iA46Tc6Z1Fit^XGZI(C#Zy25CHVP1VFG- zk5uoXJDW#jel4A&gTXe`i`U)FMq2{gR)qFUms|z8D{pSvSJC#W!~58)#;+pwiVoMX zSJ9(K@cT0I3NQN4z>Kpfzs3zN*Jg{Hc~B-1osz7^ul5Y_IY&q>;4vjh7{xqp!y6`s zLgW@AP^L0a}C^0(Atg9=V@7Sj%D|s4AbH%AvT1W?fN;M*7 z=TuATJ&skhExKPN;17plkdfzNX|faHPSly5jJl8?F$U;lVHyT3lvjdp7^fR)Ex$P_ zF(oc^EwomG<-&yV*X8@oM!}nUVYrax|9p@j+yD6>Uugletquw>+3KK_pIYNM1?dDh zxs7n{p%AAHc&&&VKA8F6O3@sXtr#s}ub;r53-~iLRia1W#(sY~9O)hX1dlf7%|M|X z;`Z=xKO7!vlqEjg95=J!gl}+5)I0%h%Z1q6xp#<}cyicE)wkaqZN=cs-6}n1rAyce zZVylP)8UCO?hv0e!p#v{vfug$UOJBONyAs6_aZbJE<~wliQao?AuD)<-V2pPr31Op zCW9(9AK#Jsgo!%#lj@Q0NPUJn-d%1o#?&cslc!^)pclL{hBY8d9K&c( zF1R6UiKlnr)CmcIoNp>Z0@P8Gq}9u!)f4NY+d=#V7YGG5C*Qr=?36B)_faxgvreKU zA=!IIEe|M47gU8{iy|~Imdtz_>GdLFnT^DZ2e?*#felE)(= zM>uQDwvx?YxM*GD@upIZ9Kp0*N(iV&j(|2{6M50PhDfvkS9hVc+$ODS4Dnl};d@&h zG-)j%yp-W7$DXvVAt_G(R>y`nKghxml8&7|S8b(u6e zd_@jZYc;0UYIK%kdbi~m-*GvHcUX?o|BmIDq>NRf<~f+&)$<(DmNm~Ie?8AtEX;Em z;PYIq*jcvzAnSJEBYu~IX0 z5eL>HPFIMSi`Y2$2v|7LaUEnGlKLr6-S~n=iexi~N*ut>^2Ynk%+s4j&^X*oJv44Dv4N$a-y{@pE7FSNecZZ+Y#@<`=6q?4 zZDAd8^3Pk>Xx>_)Ibe!2|9xYL{N|yDPIwr^-B)5WI`LLzn~O~f5StX3o{i4WP8vQ4 zNAd4-bOc`wpMAeq-(Zof4u;0t-@gaHw7o}QY?g zR#HLiP+~_?tNAWlRkXPKQ#Gib9@8Kh1=*ip$v9Y@S zMLSCulPNO>?n^ac8pNihe^(x3GNrFeK?Q66L24tiaM9-fEXwofipUDecM}P(Okihz zxtPt15GL-7EirZ*Nx@E_ga2+pd17I>1I#2KrAiV9A(NK0Gc#kXlFf)GQK0%(^}d~t z8iUuj@f%2TRR*YXyinHvU!#nSVeP2vuYw%8!Z%h-K?=u;EfL3w1LiCxN+w#B{>OPC zw@vsmHi@3?RDZkkp6c%knIEwPsQRp02($<@mj>m(rK^KF0DJB$PX{9G6_*AzLsd(P z7Gd^sqVmgKQ&fMutBdOIvPDMiaAC#SiZTpTvGS-3sal4#2&-6_v;ZnusniOVtXXOW zZ{f*_HB7}v**Z2HTNqHUd|gu);;wV5zbh9!Edf^S0ki8LHquva>b6 z=h@008`m7HR=he@=XClm2){th#?w1;f&ao2;y%0cy*E&!ZPW_hkE#6MxGevoNiC;T zcHb!#DHY$!S>>Q?{MXN+d(Mmh`NJ-UYZ|U`#a(#E22rWWloljeCsVr4PgtZjR$}ND z-%)m;k`jrG?K-kH>K}03&g)&~V@#n$wjUh3$QF0GBQ0hq`vxkt5s%#jsxW;>vk70C zk&Lu;2c^dfume__jKyG$q;{|{SeBOqF<2wXDiHei^E;(-QnO(GF358Wq6{h#X@gpO(JEz{ zike)ExvCORn<`*1BZsgR2m_ebh3(=hB46ieMxQd1F1`Z=cefz;PWU@B^1XAgb@IVX zN(;QxAQrPAg`a zlZEhV{wak(iED85A}d-AA+5QiDaL&Nx&|ISd*~{)%wA;RQd$@?6jngZKiU$gUY-k{?b(8qjO01y zrX<98s*Yl)?i| zDo;+!bp5b|Rt1wv&Ug9W2ey=-L82v}!sE#`*F1=*=0 zP8>NOGf!38K5}wq+wMfzHGq0H^SpJ9;O~!Fb9+;;eVF?% zj!TtEEwwjq)fJ-Wo_K*!N5h2pLmJXJ>4TMO$e) z*OomgO=of(L6}nbHeu`5a^G28x_9hzUJv$TR)+FlT_p;Ct!h#6VbqRmedsDO-4CNH zDEl$`gYq9PpvDc*lXXH*XKc7*!lIPjG8a)enGA+k*S&v45+e~!>gdYAUV(sEQ*vPZoodv zac4087?l|iUZLA(0k}goy3FXO2gQEUEs__Z%8aWb6roqw)2XSZnzvQ&Y^n(X_AKgh ziZzYN<)S5KZVe+hkg-xZG^`vtLoTPCG%2VzG$`05X%H|=(qt+Q#f~WSgKSM$)tZuF z-%|BP)2h~$%?q7wm^E;?S(qd!z*)nD^T)`viKhkR&!EB3G~s-{aMrzh)UiX;+{Nlr z_ExQJwW#GIl{D#b%q)7y#}X%FacUX|x{IMzIey>~i*G8byA_;oYI2k`T1uHE~mv#r-x3*@eNOPkM_AO!K$z9wWbi+zEs@pWD3s^!;KefNQg4h;b3+dk#gd} zj8fw4p)TOFD;{-rUN{li6~;LVIR%1Cno$rs$Rgm4U>S-9;}0moYu5su*}UyxIOFkDyQkZuC1aTYGj$Wt_O13_P}4c zNi2#BlslMhIImEXm5yV6`6zCy4NDd9=+OhS29^Oi(IrSHlUQnPLH7(Plif7>$lLNs z*Y34qM>Q~2MrjOf6v$Dwa85F&N05Z1m84%8IRfSWE-$O%YPwidP{jV0oGsE9_cS-A zI9q**rZjSM5}IUIums^B_D+!+GC?`M0Zz-{W`%&QGq_Qza07pZj@~|l7_KGf#0j4& zH>;I4nJMe3JZLK`ldL|{)N6^Wk;iqFRw&Yx-?m7J86HS9lD8*bbn6E?=+;cODrX<--TGPHhCnCW+C5 z6dpVOo`U~fCw*>b;P{=Fx^B`E31obhpX?vy$vrZh{$(TH!Q`M;S>R zE7h56r21n}&(4B#R-*@Pb-90-mIxC=|F!MSUOp&_Eod64>mEn|8oo!%ydd8#aoJ08 z=>sohz+@85OoS{V&kD%F<6!KbSdj3uFa`<9ebVepq2VS3Y!kcOVrbW`liC_HO7bX3 zo&qVEt8Ij~z8Tx6gHzczT4#`M(gxWijbt;i-gcRkaouQfTlYrW8<;UHvw#Lkr%siz zV!-1OATj)z*2$KUJG=z?p7*1#Of104p4hQ}{Fo0WJ1CAR)+{{~-OG=J}6>>m+cpv0{+Qr?5{%deA^iNjq z-P_QE#6;h|4gI&^Ug&@31K#9ZCNq=_>QSTXZEXwjc>$vWw#zg4U1ae0duQPHc@DFH z=Wr2NIe^MT1m1NvRgj`xZ)=;Unu}DEvQ)cnA~9vIM56292V46(_|aA#|8UA>Mape& ztG7Po;XP7vm`r(Dk+SD)_1C97xkpM4lPSMeq}=hgcGs7AaF3LBneXqBlEY-mrxhvp zye+@IzPj)3lhm&7v->2qD|~dHqyi|@o>rvweQ(R}+>-d!y%I~PO#M*oFK@)seQxI# zk|?f6Y6-C*HP^uJF;DmQj_JfgeXJ1r0kTX{HN%M--FvyY>O00#8dn!QjW{Y+Ab^WMSL4(cU9KSUy}4|qPiBYg0+V? z(F!^e0_nJRalx*W7tanqoVbO^r#4TJcd9yPZv2&XFR--kx2yi(G7Gn zA~cBN!A(Z4qC85I!RKJL^1Pua^J|oh(yzRnIuEpDc^8juql+I8-oJVE=Eb1)n)5VC zO?r{ZYw5UlGR+8S{WGs!5^y0N&Go_IyCFDZ81TA4uBjClF}p6R z#dEf9B^w21(MJ+|c^%Akr;vJzV$GaLg{Pn?PFssSm=H9^p+T>qIoxzJ5>Ub|^whm! z)Vhok;ajmDgYV0z#ht~2^UFH39|FqBX>vM`(_r*8h~vv3{8H!Yp$lf?MNPGIZ21cE z7C34>KYDv`qD+rlxTjG<{XR!cTT#x^`hCZI&|}Eu<-yVO3zpRYf~RkeU%hy9`0V2N z<=giaxxdnxLy|R^P!F@pD)(1!s`EAzti#*YXiq+$99Gw0x1<8Mq<9(!vpE^9O;};L z{Uf=2aionY*^gs<2GqbqlQ>e~jVzQ;J2yOjFh}h9Y=K~o!KeHhwm>A zj}BiSzBxg_0)j0rZHX@g_TmO(W6CFWVJb&z9LHitk8vzmkjye!&R>9xnHwUexGP+N zfg=?;jgJ?XY$k`Oji$nk`)fZ^u;a?W~oxC{_7O>dFo*O=?7T6yy_GRwFh1R&8 z;PKfUbf3p(i}T?H&tM;moEj5uFRS4{7GGKwTL6$q)41SaRf$2p(U>F19bb4W)v~$a z<8Fc5Xo7XM_9tf5M4gJ=AWGbvmWgpt_ogUA3dt4IAyNDKoV|3z}l0}D1(gdo`YeUlIJvpO+IRI**Uq%i5`LSctkz* zj4}hhse*~DyH_1hUmQ6YdLFC#)E`X0f1k<~u&>qv^Nj-UekqcRD;4$RYb<5&(}jhW zO6MCORajhNE4gB&O>kWk*iW$GMu8X3PZaGbA}p!u4THnteSqbeW1KSHT{oPQDXBp& zK%USkk(-XPulKjS#`0FXQA)t(3a!n6xME58%X$#Ad|I{lB#*uUdE;i4*CL)&ZE;{n z8f@^1K898!)mW@MP*M{U0`?d(GE1+>AVYjJ8U(A=Rgl$Y3;f4_MB@<|*G`WQFAk30 zy*zk%aQyP;pQ3TCUK>T@@gkRQ0BifT384p|5c4v~rzeuDRIgo0ra;ZBc{O+~3$oGh z=l>wdC>sBPCY7b|!5zctS!3V}fL|OxJvch7;aa=Z?hSwbiN{ZaeA;krpH|UT-H1!zQ4H{SM@ZMGuOQhMezi) z;QATKqN^H)&-%|l{q&P?msT4+A6?f~s@CjFGgKaR!jnx#mxhO8W>t7VoU zM@N*R>e0HcZI<^(Wr}4<3cGt^lFgq7@Y-F&axxaHtnsgFxW=Yyt!bu(ImsHr=Bp7Q z!AqS5G!~4X7-*;@N6|su8r(F+Aaq#=K|frxk?gQJAFu_%a|l$Y)N9wZX06@oF$|C4 zD;$QwLv;ne7E4Qq)|BCPq+(aI4!W-G+vrf<$9`TdoNTTyS>hrI@O&5(xz(A%)1ygnD4@y8_m;}7`ep0Y21}*OvUT1* zIKQqp_ukeGglo?9ZZw+RPG`}WA>4|lGgtm}wwxXqXc^l;)-_Ug?Hfi7SUBDiHvWff z&`H~iY+S8Ex-EKtn%H|zJGMADFiE&et?D_DoE4{bMdzK)U`{qrn0$CpM{Gn#d^ji0 zHk~qLQY(%NoGp^E`)Xqn^#)OA7Inc~iTL7$%ke|naWZZ6W_Mu_9qQ?!n*lrzPU?Hj zgY&(XlXYHgY=BtX8HKaUanzX)!byXHO@c@1XTrTauGh~f%;{|u4L=uN{p|X5@50GC zuV2dy?y3S-BqeosG&{Q{Q!t#(i7(0wNy#|eT`mnS=!$P*{dpKqIQLATDMy|l%{)Bw zB!PT}Htia{avkB!TDUoY*0i~|v`!$)njOJ{)n}wKN#wMwt5Em%S_j9Cv$vGO-$+uv zJ!$Wqy*;V7!TP^V{9O~O{tqqS^at(3N%*00=(NR8i9$S_p>#BiyufYTza67K+z??k z9`>29(p|me+$`GY%EEWytU#ogeU``UYaJ@`#Y0AumsdCnX1ijE;rtcuqEV zzsqX;=F~{XG5}`NDe!c%xBlk*KY+;7mXP*Fq%ERO!CCmU!Dw(45jC^fUQ9)|d)EPR z%@f;c!C3_BRwfL=1|a_k0D%oa;Sm7xDgd@0l5xs73*U7Xf$J>tE&-~GqMRd8hgotA z30>D6K`}YBF(hLZTgECzW5q>$f=|ZUVFcYAvD`%2*I!u{Tl?Vr647<@MAIb@qVR=_sv2aSv7`N7^v`=S97xTx)Hf^5GfgqiW^1KlZ)T~sPd zu!7F-HxG~OctJM!e>#jOu9m)_`?#LW!c%LhQ?_@*RCN=3PWuQoZo@&3hzT`E8iop7 z$SIzS5kjLtsbt6@93c)ct5&(TR1sZM>i}LyPR%)LUv_Q>ap!$T@0g$STn1IP^46&( zP8Ct;(5Y$D1I-6E0d~dsAHkTvbvB(t7)j^N8waABhO?;q&TXm-ywPkN)-Mn0X9snz zq`3=cdFRKUekR9?X8mBttAM6q1_wzep9>0Jp;!o9XWPqFN|m5g@>~ZrIK@&SUm(ZC zZ9iAc@A&z0(RCa@SKcXkzE_4CfmiT?Vg*Whxk9B}%=-mezu*^(0L#yL#hoB12Cp_G zaVODq7!ADEs6n_dr1e-DW4&}b{XUr;d1T;-jU6h2IAw;dV!8~rcpZ9n#aY`Ti*A$9 zLSr;(jW{|C6JTL?@oW}#8)UHAo-piyEp7u&`$$n*CsTP2< zonIU}oAgXy5t@$$V(-OVpvjjBcU*H{9LK*d(oB$ zx`LfbF;9O7xxgzI$Zu4Us8@N#LM|Wdl%p-L;yRUF-Yb;o?^3Sh2R`|YDw55k1_*Dm z*@`+xpb{2MY&Ze8O-6z(L7Yt|x*unpZ8k8|O{X$K7X?mT8+<-Qp3R@8!I_YqqKC2&eH7a11VgcWR7? z61MY3ZysyiXlc<)6);bxfN2HP7|4`FMT5(I%al2U4163ATO@TJ%mxI{#h?%-O~REm zmZbK|#a+fV{XpGXn;zRwQKx0`mLK?{uT4KditXDNKzX3Ep&i!<`>le5sBzIypg;o` z4MKcUK+I?|gXrwg_A920q%+Lr6Qfe8RA9JR^`>uGNz{6NYCS)(UXWTZK=s5?g) zj3^NWphZbpA4tUpk4(c<%UaqwS&`K*`W(dAbasG8(0+SlBQ@vlNy^=Flo0kaa`a z-g25#lG<=;&VeWM?@0dC*#@{kqtS#+?BUEIS^lnb=X_gpf?a28%emw0`rwWz&nTR1o(Wr{Utcr|IDjwDafH=|zI( zjk#_$bZ^3QE0r7rr+eJJU$%Q6x*5UP1E+i0>XHL2y)j$tQ(#y4GK&;h(jrT<2yN_m zK%@=PB$<3tk<6XTDs|~`pPe!G?;lrti{YKkk$als!2rWrJ_XiNg(aDNkRj-~02hmH z<7hIQPj2WzdT(;W1mNj>(rb@Ld?$rZa=daKIRO{Wzr$r^sT!Ao}5xv8Rs0rv{k!HID zGFc-^$0aszCm~UMz{6@&klF!fPb8sXaBt`j@oI#*|n^D`ZDlC`zP zxf~!5EIb~M<6$2#oBra&&ac3%G@PB9v(3itU=WYFipix!U=wMJeSJ_M@J^CDVR43$fcA9*Q(#lQq}w(K=cc3x-~g7&a+td2%^YxK8?mEdm*m7fJ7t}3Z8L?mN(Xg5 zj7P%*+sLL4tv0ragKBME9qpCF{S4#%)B)cx$g?Tr@n;(Rha^(dfz{_6ZCpnSRwBDG zvfO@m)RK?84E{@&I7M;A7=Opd_=Q)>&1f{Bn1ZrRD*$1EeFV@7QG%JH^q2Gl2yBaUj)X$T2rq>?uFEPwC%Gs+D7CktktkaKeff9 z=Wo&Z;}12xaYk$x4#ef4rHFcaxDxC0b+D$R182~JP_4W;+Njk$YE{23Ww)dYF@-v~ zhq$DU2CoE6VzVY*1c=1lHEw5_HU-^cs<(~o5_aWfqlSwDQC(L1WXPC-#YMx(=lp_S ztOTWEzF4m8RPwK6X5f@^K{@Z2i+OLy->DSKC6wDH4?!G1SKRS-Dy4i-+Nl)Em69x? z-q3luykE|Hm2$b{m-9OnZ^vFRAm*#ZieD^L3VE;Mmn+45Q53CTTsBV5&xm58MCdvs zgynZvqLjSMBGznw8A*q0dkN+{tXnuPr*6%gHRrE(-s{|EEfd3Z%_aVWS+IP9vh0%yLUn>;h< zN2Q4opdaKa1(<8)^(SuyAik{QKIzG^&)I`GJl zxb!$-2FoU)xGD335{Ai^Yk|N<)Cc^Roba9#bnMhx!vz%odOmBg6AI+13bknYNIdTrl<#Q@?$!=W5w# za8p!~EyE2tbe6aWIVD%)axp?C)3VZncSK1!yBl-GIbGm)@JU$49caecuYml52?#ZO zv&K@?Sc)1;StBrOd=xc4iW(pBdIc08UcvlRe1CDH9!fifY!uEfPM)+^qZYDkSOO>d zeGUV0wNS=^0$|z#r{)mXH9&2G82LlZ$+dltJm!$EL&&>_5I76lzev5MOA%nZmn3$toPqE557!370mbUCAf?RkdDORwVD%zUnoG4+^TgHv

KPokMh2O8a20DKV8(@2Uq*`_SLmCxdrdu0F6L$zt`=%cz7C*PohOMa0)rkmfwm8 zVDjhqB~n0GRvv}qzFOt^Sos~^Or=u1M)x9A5NVjh4%J)v=oS;#&fPoTsR_x=}Yo@D|Bs}qZ__ylhnPQ8nb}TiPqJ|GO3be+918?^d5c;?_LLUYA0KgZYj1V$B z4Lgyz?Fh)YU0v&=hVL;Pbf+|5h~c0u*YG|1e8C?q;V!rec0^yO4m{fnIL#E`z7_a3 zuIwtGA8idRlN$)uX?|RAg3CAW<|tnZjp(u*>2)N zOuSMa0AIeLAXt!{slG-+^QIAddY+YGuZtp-?gtPan% z)YbUcCAE;IET7{{iqI1XKhV_p0>u5Kt8SBxG(g&BQ*}$>iBR%8brzFno;6Vs*aZ~Z zu5o@wMu?nvcsX`&$BTE4g+)5Znd`istF zMKhZfzc7C`mf<2rGAw@dZXWJ41dz~tVb{$mSS^XOR_F|Fnce$sAWNT-hw|)BVsaUvRu!!7N{}LobqZ zw^uaF7s()--?cnYjhfqxy>4SeuU4Z@mRA@lI6auAu6yLP0MEx zIky$an=%h*BOP$>zaVhTbfgiujK2q6o=B|=4g&!SCkGt(aWR@u+_#IzH?f>UjE z;<4C|3VeaD*p6s2*vGG)Ps!`Ctbo)LgGv%R4jL2c8dk2Hr-D6(Oth7Ll|MZM#+->EPP#gan&KIIV3dL(u$ksfMx6U+%7DN~xM<ik zo@9thJQ|Rf%%`dn(=4v&G$p+-p7utz*Pzuq_gFQhJZxNEoa`Nd7o`M~N-e~(VOnWK zHcl-;f)>i_wd)nw;75R4iZP$^a*uA0NZi!JGCPYyHH8{of?`g?p4ilB_~OTWZ&i%z zr;W?Y#&sRAg*`F4i>Ff(Ac0*^Vj-AiQH<*HigE~Qa^7UWi%YnL-vi?Xci85%gwMG6P`g14N4U%q4O^PkkVyyx}Z)< z5I@dq|LPCgN0U%o+tRJAH9DWq#`9T=JX3{xT3IH$`!Dw=x)~Lm6Iz^g^Sn;FN!6tV z?0AQ7ek6tISql~drPP$$CcJ~B{&~Rgfmn7IcFLulpi(Z0w^rndTj1w|9nUYYlTn^L zlqt{)F}1$8vy-n>@@4YujTRgb8Rs?})_-G=l&6C56 z^GoT}hQz}lZzICKe7>QC|KM^ME~=UaQ|z|kAt&X~up_eFPEGd{(gT*xZwj$om(nuC z&k!a)+pIqq=+!b6z@f7rNMX6hCSP;$N30S-3Q5&!pAtUPtRJ1!4_a{J%3mzdtHtYx z+y%3bj6!KwK_#o4{;eRW7@i2iX^i)x#vz3qTxd0 z%|yPI(l!0dgQL)$I#15$@wg6IK(Hb5t3I&I;tcMa!4d17(4buFj|3wE3y+ zret2S>S#t;wp>|+PAAc|pV#S{P95FSj6Jup7?PcxH&6FY%)E=^^Ru^F+R5JOe!ba( zAr$sW3O_d&gTm|;Qv-!-?jov)E@5VZ*P{Z)U>=-s|4!V8zC_xrB+sheuR%VAJpcQs zZCc&pYLxG*W~?fQ=i9_}G?_*BYwqf_@L#j9+uAmI`D~lJaUy-nKFUhh9+6F=<85Ri2Qrh-i~74Mw6zdW+bji%Ec==$LOQ-{%Q%8`ZPpA` z%-=Tm4jaizjXrxcgHEZhxJxJgpr$dIumf^NbycIdxxqFY(yz=3Hy6GmneKf~?FbFNRX z16B71J7h_GAd)fpy~Tb5XzE5+j^4vNH&zGkgxpsqj2aNpri0=c7Vmn~ZtWej-a2JY z{)D%`-B-fzpJK^XbM$8qsH7oZ)(nwz_nkZG*50YREz$nTEtwf{>X=C@PHZp6-9hNh z5W`Gxgx##S>D;mys;TCt^v;~g=&IEjcep5@_1N>ztR9;*ca2He2i$w50VQdWh?(YS zZrHo3ejsh@Z-swJM2Q@>y%NraVzK_|VuqE8YjKlZ%_XJk*FVk}0BWiJ?7%XDl3Qj`ABxg@YA;vx{ZfgzELx^k3hb3WrdG<^E8VA7Dkzl-LB%WN!L#-% z6pQwX%av%Bpd#$Gg}fgSld+HRAMw*26n1uqhBXz!PBPBvO_$lQi7FX~x)I+7yqDMp zmqHQt&i#l^ZxsYtU=|414_dn#BoKam>0VsLgIVoTEr8zCCiki%g#h6etDv>(ywM>epLzTl zmI_}X@a1?kOCxS)G>i^L(|Bl-ZX6BgcQ=zTAv+xQ2dt`ci-W~&3|$AO)MpQ^;IZ*x zqe(Xt_Rg3|qhhUu1M#THe2}ERS9(CgxKY2WC9rqZsCn|h93&l>scPxQus1@~TnQaC z;F`QUkW$3PKuT@c0G!np;v6g2MRxZ_S%n_7JbR)g-|u68!_e)E^Tt`rM)!+RjGlvS zC{aEPf@_NlrI6L5jR=A~7C+f2DCppEkd?F%utHlcZl;e4<@q$)HaNrLfOBJcE2aar z4-@wM$^haB9m=Awi8p*oQFV?WWVG4Q;V+<*IIPCn5Tvd(kqjP2K~5(Ii#7R8Ezwby zm}r+5=hk^fIMu3Ymb}tePP`3;-yzp{k}YY|QzA6wzu4r&UBGiw)X=7;1=2H5Oab?~ z=OyRTTxF!ycTvk$EB&du|4{pQV^fkq*!W<$XoTdhfs7jUCh*q#nAN2%FN_l`C%qw~ z&iV@u6U~w)m)qmln{ox9_DJ)eXu$4;19)hQO)kZCh_)7ynr+r;`@0Dl0ji?nG{IkN85>>tbyx58as9Mm>+mtL zBpTmFlW3(ZGJU^1Q0UN~jON4cfki~oq28+B3~h|lugKfKR@*Ai+gh;lBYcoaQymKc z_T^8qnd;$(h+W9jS40#Vf8%O7On_Ebf=5)tt#azRmZtEVczpgq_Qa#E^{$YUw6TAZ zd@NE(l=dR?x$I+vy~b%cwpfW^D{R9~L^&cF_SoI;k@r*{}Dd^b@qG2<$J--B^2I_TEkwML`i=iGh0b35zZW+@HXud>V=D^lricwJ>B z>Lczn%-uNQ>UrIJt1sbhN*l{B`(o;INANGYl_F?A_DYJ>dFS4CYwu*hnCHC>7mpEy z(;)N0Ttw}u$yhayzF42H$BHcdOt@P&;|-Y??h@NaT*X^MB>i33Tgp87@4S$=0~KK> ztx)j{u=dV12TG@keWh8_FHumeO($_xrLphipk7}r6Mvq0`WLZsiTq<3x~%!m?RIPL zE^e38xC1X9pUTvc6nhuV!U35|(m;@M&if_z>OmcufEWJZXm~;W|BH8%@Un*&Stb=B zaQQ779p|Qyd~3*sA~?Kv9qQ;lOMigp6id`rR!=1Gu-NcStLS8REp@hPCIU&oiHk8a zN1XTBIj2Fqm5O39&^rd!gbr|*7xjaylf5QV})7aLiHS}`odhnC@-{PmS(9_ zRcb@HVFRN^wN^^d7mSx$(v`)zhqdL#S*w0_*=YTwwXS#Ej)5qpVu6zZlTg9KV2DQ* zkE_5E+Gp`{EUQ7Y-c24j=6NP%sI(AD320I{yfcZ?7xV_^D38#lOhO*8`i-8kg*@b0 z&{V8Fl|lx^bgp70AERD+H{|({VJJ za?1q%VfDg|19{37FJohoeMx@p+6&RxWom*tH&HvCsRU=w@P{qo}!d z>$q|7Z_6x2;AP0Knv=1mpN9AG-JAr(vF64@lABedC)wd>{lGcUp*{(KncN22Sypu< zr5|ZNL@tl(bv&7-w^1|{hj;OzNh+igmKSW*war>&uw5E|BSFF3(nvv-w}M9?H62#$ zj=W|ukWFG<8h8uR8q>Pe(}Zl1NMo#-wmfa3tsZh&A znKc;ShAl2OQNho0c*!zxRx6;~)hPR)%pt&MH$!f-jk-qM9?~q|$XeQg?Q>wh1=w~{ zJLpAEuUmV^4d?V@Z|eJ*3EHyP(E1%!yj^6< zAbkV0g`!Q0PisvVy9crn5Sc9Es5L7AH@3qt3gaDx(^uiBCJ;D0b38{0B0#ITcXkP$ zXy84o62*GT#>tYpN7f3;!hL6Vm(r%_5LvoW-YN6ME@`5sT+HehqNpKQwido@OWQ|J z=9n@@%o2V8rb;E<2+3ZS>yxadVSv_vs+7|q;)2XQczZT#A9;qe^GCV}cO1u&Pf?h3 zK=oEo2nR0N#ib#p2Yt+eQi~D@WCrk$7L1qH5P{-*!X*xIB~G@jd+vvkB645E{?V`7 zZ{PmdzPyWPw+ExiBpMJez^Pnf&*OPvic;6>(`0jSdNo9zm1iHGAKUhNC-? z%WD!;e6g~h7WbQ8lL_W*vpv&LMkSe-Cx1re4NpQxSzxJP^lNKx(@<% zxzKf&SV=Ua*EvqE!%^4kTwCgh(bOu@2q|g^dlF6rgaaAvgY#RbmbA^XJ%nwfjQhx% zBxF3>d{D__g<~AShC!Iqp*p{nnf#~CUt~a}&R_d^Mw`I4r zdM!akrPh8Liu;Ku?q8=@v!l3woLm%a>uBd?wntCkqC4(mH69Kwv5pJkz=2^(q^6noF}zu3GKO#?N)9 z=9Fj@A0zi*@1zcId_-A!Daw;9_4XTkmqM&WzL@hLcG720-U$lzZa<>>*yQ#XzOgR`x}OQkaD5lD1htnu5Y|0P3}JN2 z#X`PPF2eED%M~i6qF>hzvP#8f`YSU zl!ica&Ku`Oq|9!kS=gS&L-+x6>s~yN``%eNRrVZ*Jy4+I4TNRN0-`@~Ns!hZP=aqe z3poJHoShSa+(9YrsdOjKbYcEIVpT!Hg{#LZYz!BAA)?+nAYPo9&kHGrEPQzUA+w2Y zcUwvE-nnguhQH{b5wMr`Ev19R(t)LPKCyJ(Qkvq8pJ?DQF;KP?^tFOPQo%qg zm`^I0X9eke)L51Aj?*ZxRZHb_qI<5kF(^Km+=D3d`jfgN z8O>&uSe*F`ha;R_=qFB4JYFqI-AZlTV+&ur_dVvCorI7Xfvzy z6$wLXmD-<7!3oF?wnw3gC@4#iEk7ta-#gp+d?iP8l@oG(;g|eeL5Xy=?F7YK#i=^m zjDJs&VrLh8CKofGu5ae?^3WzNyp9@M()$wzc9bPJ*3-nT6ZYPlQ z;4KY}m~ld}{WW`@ecF zP=N4qx8n(~`rD50LifC2r$~Plcj#4K5E%7*QO}1Wg`fzxh6M(rz<0)iGtuT;hp_36 zFK3+R6}X|_1j5RI#SV??NG42BR(K}lJ6p~KY$T``*6;>JBc*8gfCN#o6ZoX~#}6pL zad;zGZ+*CkC!-+*toe+kY8pkDJXdNDSB)#`7n(TQfa!qnn z?Jf?h)!>~=XLL87&!W@$U=~k17m(=p^rovTuU79@|g^NCILSEw^O_D0ANUM z(u&f`fq-X;q^rt6krM>1N6x}{phyN(tlv$sPddBz8|_Uc_c+t$mm_GZrg)?I!XB+9 z-t0W$$=U{XkW$ky78huI+pOtG8!m%Tkqh065cPKn9;y_w=92vl8Aa1P5m^fhCq)Pc zZm6u5)*O_ryv*9LX|w2cpQ=--$)0bau5Du{N@^`%t+kz0OKU7huC|p@EuV~|UQH^X zx#E2VJ7f`Febqo1Ttm??&azBkmI-7Tp-$wnD!J>Jj5G7WNxVybke7Wj$8kuq@4^oy zXXcXt@U+ech?pX;i+l8vj7D6vKQ7vIW&v=@jPj;wJE?q@)>!iU;1zFx(Jb8*=xl1r zS%dOp!G@^XRgQ5=v*>ZE(yINv=VNdH#UxYiYpBSZZ z{!4zO(n@-mqTZuE+VcQh%ziGS$!-r`%z=!Bk9^tw2cCm_yp;C=oydI3BvLtv#>v!| zCT{=4;epXfV6w?3^;u3_OH+pR|P;~7kiEf(t;iEVq?vFD6tdIXRRk1#- z$z4j}d*<<d!RIz#6KhM-XC#e;0Ld746Y_ z24mRfL?fze5D@Dwl9WU*)wd@giY5$%xK^fuF@?5tD7)&jF??{;q-fzHMR+IC+RIH` zBdJd$X+7~qsNk*KAMfvIZt8tm4}eaz&BV2^yUupR$&?0WrSlukn$2=T%Y%y>nxDtI z%t@=qX{A&&w#!%i(ifHk&pz*T2J@*c@Pqv^1&iPzs;yF^8&@=NCCo2?OlbVp!7tG( zD0K0|pV`u1W@Q$Hd)%$Pdu83d!PG@_xMtbL#l@?Zdo8q4mSCRWbCwOKd*8`ARV9=s zZdJT2OV~qo{%_yIlPh=Bl$EX((0IqmcUU?ZvNE*Eir4=55pseX2M_EW(F5d!a+bHn zy3YC`1u4b#d&<5;E-M$|K-mkaHyyi!31(s%yXmBG6ZJH^N%)ZaLG1xz>V64WvY}K| z9*GJK8mTK|jq%}Ro!76W*^1z2L~~^gr(ui0e0jWgc>V*8CH(re-VV!V3UdjRh8aVk zdE7B60*)tP|1Naq!^vncXb(oCaeF!oC$m=@z0rg$(&5Y@6WZH#V&_|Wa(;f%Zk!#~e>CwH1j{OD zGkVnwipee*Y7XK+LOp16U;nRPtKr^&!*LSOB-VfWaT<=H8P{k&H{}H`gu+%dIUk_7e2MB9hL1QRJPWn4D#RSWb7?}YeO4qZ>Texh+~&Z z3QPeAivGr)^#L54t4jc0#11mfAev5Fx8aa^q14(UQ4K-D)uI#&U+iM}IhuPx+0rle z4*%+Ejpgon5E*l4sA&t>`QEW?ACeh>56-GxlP*VNJ|qID4ZF|W9}{M+#wYMPeu2%A z?~9}jeOuJp)ptdEHrf>J1?Zk=&l6jsWrF_w_cApGVA@u;GVtD-dy{BU-I{dpY)W*k z$)CAV$xbW#l-`ylCf)9>O6QVQAXvaEP_4_0?|Fnp1 zRGv(pJjt^M0a7N8iFrz3HZ#H-FeXb+$mk{xuj%g5I?O`r&c``@h|P;aU31Bt-rdnC zYOAIeQcwcjsHaIdbq<&u+KTQ$J%=r}SeEN7xU_n;KxQ92UzxB9Jmx@N6vTeY)xk1h zX>&-Kvov6o#=I_DduNAx%|k8O5?qQ-b7iH``JzRgOPVICxTWH52E#qL_) zt_0ni**zH~d6VSlOcSBcLL=$A*?NuMd`jDi%zMSb{;cii5xmEe zoI&;-%9?O(W*mQRpWeA`eJFs3oxeS-U$l<*uZ~Ek`h)h-BD?H;O8OVF-$2OE~$s~D8S`oZ~Oy?xy{te>}A^&eYTO=7EI z2RCiL-KP;Fqe=a|b(FC-i}{#p4^Xp}mz`T$I%kH}y(8LPUZrlEd33A!;}11;@8sfm z53(#fC){^j@;wmwAGuoSE|noYzN!#%p#}qeSMoh~GL<7w(I;D< zdc$<&5J2MWo8$XITR93c78;@EB#=E7NaKu1jt7mix9!vO=EX6;x4#=r#<#6-Ld1?? zZ!jm?8s` zv5!W>&?a33^vZ#nEZB#VsCB;KMidN3DrcUO3c%;Cqsc6~ZydT#>^judPBOGzaT8=B z^)l$N6V@t}c%)!HXb0LlB2+#jVH{2_Uu}$T$i~bLJ@pu$5kmI= z!qR_+F);RFGIP)bycFUjmt2FN@G&!(+TLUmE-|nvTe~QnJuG5d8KPI^_sx==!qSWk zjrPhf;6gfKC zqZc0aL+y|cIVv)1Ls-a*|Wddi?(qKZvG70M?~E5)Gm$C|U7A%Cl> zbhO2zsJlw?z6`I@&+mN4b~zsTjfTyQen{i&b?B(xm=^?`~O!zpiA`ChTs(Fh&1GVcAbUN zf5uP)I9n@$|Bg-?7djsyHrU*}T34^yIS3CB__9izebGUolyWt8HmWt<|8jWN2<-O6+psuEDx;)v|1j?HUo zCcIRYdji2QoeU-&w>D8T*N``yrwSZoxdE!iZUM6=T1M^hXv&@b%_qG!>67bl4JC4V z^1CPGKUNKRhPB*CXg7wTkDFT2#sq7YNvXvW=7!b6mn>$D)4F8SDZ zoqaVz!<5WGPz6K9n($#vUCAl_i%AK5I%3{z2@V7bfh~TXY3HGRbM?n^`h`mI3E(&Wv}8#wd3hW6W=%q+G7J(g zqcqwWE`nlF<`+diXxj)*^oC<9Jxr1}WdsucLs*FAQ~b>$kOAue0~!cFky^i8=Dimo zkn1au@+zdfFgDUDqym}rZJ=)y&;=EAL3Di;=o=gCkUj7$zWs>H?%q6@QnMMD=b^ z*?G^|#4}AV+h41!f-fycC#FjPY~rQilIFFPu!lT1t3-YRjq{mD&^Mo1P1~Df+TMIF zz4B|(OM1OksPhEk1erAn6J*kf(pQN>IEAf$fu(=QIk@1%d#w?4OXb4_-XjK(hlbOZ zw+)~bUVa^Tc^f<{xIhE9$dN}hDuc{{kMCUH%;>X0rF4T_zX)=hg^6($|Lr6*Qa}4BYXcT0c8mP@Flm zho9TDtVCy|*~14#$r!iQ zPy9uJS>S;8W_qa5b6saUDMRf5R(a6QZW(nHUB_?Y_EVTe3%e`ilNL=X^>8fhuA0cL zEz(^~&=J{n7Wl->u2%Ghx!sj0ip}JHR?pU}PU;iu0sY_1Qb>DOdT@T;Jmh|zrRum~ zKCrY`{8iCx+TI=mXcJ5IX|Ju~ueRka-saJ3sgx&-mNxBg;_NVf)s*RlRiR86G!9c~-Zp=a7eVMj}14TeIk^x?Sd@H*l24eekXZ+sHiXx#u*k$N0`L z&G$jVjL?R~QX7+1ccAda&~t@nhiPi>bP^`Im9fxJcV3cI-!i*RA0w%i*$^16ZT`wJ zP)bWLC<$3dG)Eb@m7aR0>15$!$HEZuE#Y8vHx4IJ2J<2!hE2s?3J(O;p(Vv@OzLNB z7L7AJ%e9>r(dNSe!~IN_zmSAxM5)7gI-A5d^BK5ELrW0)s9*5#pqA!Q2fJ!uRcW(0 zi2L>BDI;bku_dGXQd$`aPiQs%1Q;rHQ6KR3tMv_`C2v)3!%4S272Xptc^y}QoMQ%O z#AplG`i3bB@O&rr*h4%HY+DD0=Heop@OOJ~9Yg|}J?hQKUf&*1 zMmOP2Jcwt+%u2w1<7C9|Es5c#{F&V){x|GkI)m_TOwJJ2d=io;&yE>hu2SR)5W0s; z_!}D=cmx?l=rE$EYi~gX#a@H5=_sJ$xrY5!XmgFqVg}!E9V@d^lj$>dlNY&^cTOeO zR0M4?!`Qq<<*1*P8m>zHtKfu>#OzPymCOs#(PTcI&F>r)z&+7n5oOow*IN3wbh>Kk z%Y^bvR$esNqs_IV=?qR%ym_tOM^q229C1C1&A1Te=mXJpUiK z65sFMdtitoYJxh**gII^rCxZMQuv`=S+{)<2jTo{p; zpg{24xaMC3s>i}gKRaEY3+l5I@ddi;zZ4P4(tnA`nSYVVnSX)FN!Z>?P{4l?24#av zU}l9w>o<y!Qh#y+EJNFuEyB)%X}fW zK-My~L}0S)eBo@@9CAMmM3Ao7FY#!AilnvRMy)}t}joSzfjJ6g#za>vezzt zyCXn-jx?t@e?y7@7$>mi61oKSEU)OmI`f;THM+WHw_`%{BpB{b*sM9cnUWWY;L~(r z*yXlH2lJaq#GwbJ2B|?z66D9yrGGzi%U%FV+*C*ypw-gSP-F`_12Bq04K^Nx!w}3N z*xt(wp$2!O>1>ZXmhy8&1%O`gd>DzSq`0a$$+I4OS3?!J5z?hk*2U?Ke>wVI&f0s>Cj-DCx~7@gqD+SqbMV?UwBmbS+3 zl}3J|U%1#(!RaSDcADmjvwWXKw`PIAH~B!y9U;F1**is5ovQmQ|7-MIYANh-+^T3# zRf|b~W~~vrQ`fX*q@)0$l|G4veQ=F4fFBtHn$Y1U)Z8`@{#Izl)~P|d&XsAZPIwH) z`)k9X+Eg7GTS1~(?T$?iAtmQcH-D&_vRg^A>adW}g!WCAU*Pfzci_BIuctgjNj$%# zl@c2hMVh^MM*-TY%NteIhPfU)xag;fbZK1f7eG?}K0bH9T)K*ikG$a+3z6q(K$kB8 z^nQ8&5|}<4&==_O{Y#9^O8~vUe~Gb4016GB%4T>0PCmMiGp zT>)E`5L2ua%azZ!c=-&o6u{MDks@*aYLxP48>M`;D>0|2Vp1X}=U1zeKi#T?GsOR6 z3^B99ZG9paB2re$3;?^4KmIV{>mZgZoCwga|1g>iq+15|C{_5^6ARh$jGRV0=T0a^ zG#&}nX6u{S@73J*Nj|R)V5;Y93${+p`JjAnF&k);UYn^=0do5M<*tl2Hc}nt*OIpu zlD%ms@p|sI*We&eBC`eD^Ag$~L@bTO*1%gl9N9CIHQA09i#ned3W|YJ146B)stoLu z#&I4U$i~(*7{-W0tvY_zFgH0HhZl0EHBL;;lo8WLZ)JdickX|LNx85#Kv97)~;<4!AOjwsUYg(w1rv@rn6{2KyaFW!pBu@)Sk}^Bi7CaN> zy4}xS@V23}hJbt0;H3tIN(={;5(vs30_t(WpB^(JPl?&N``J-Ct)r3<$7K|0%8b(kT9OTJeuY@gLHPf530TqNKhl$GMw$*yTQn zl5!eUfJX&xKJ|0pJqvQdmm={$2pYW1X)+8>eYQoI} z&E)A@HMz<*aXa*bMy-dzH*5TqQe$bY@pDRzkJcJLq|_kx+1Mv5x!5rl4XZ++X6dyR zC;2p$_mE1A$~88Cn073S2*!v^&ZeMdTDhex_fuNAkFwm)Y2`l1azCi$YKa69Ge}`T zikE3VXO!a1TMjD6ERQ&O?M~=u1?h=y1!Pvx0Ie!sCOt0Y^FZg9vk6?~DX&E@FX{(Z zCwoopv8V_IqlGx7sr1_RQhu?QqIyfh5|5?lCc+)Ar6}@g^v(^n35e0OJ;xKMND!l* z=5M}reg;7jE*fWVQ8*a6GH2j>#d9++GVnMObTn1ws9xD~FAB{1QI60Q&im8+f z1ZkM9C%aNkD&yyNphsTLE6G5?K`u~w*KD@-hTZeS)=@mmDBet{#SU5Q0DM6~1%={H zxdc8V=nJcgSIqBlm(w?*xRa0aMZ$Oo08?=h5ueAz4evcIA8#<>wl?H$xF zkK(~y+*v_(A{2qkMN*?N9M6dcf;$0bwh#oDVr9p#!0g^BdDQYgC>O{O$TIn2p;#ta z6|bBxkRN_NU(QoAFfnR{azIVl{bH#^ew6b&J3C~pW_JyY&gZiPlpH@-@(RQxW!ua7 zUf`ACm*?e!9fZ}kmn-IdlIi$4-z)ohT5KoSDPhDQEnnJUKuTT_YLMOr61U_@>b!Bh zTnSB8g`R9qp=@>5hy|-umz|gO6P96CdOZW$oixtsdrcBrGw=eh-8yfxluPF4fYOq$ z+!FM68*G3ICHl+r%K=b`5r|BJ@=l2`H$NX#SaHuQX@$I^9 z!3Uwo5Y{pDa;0DgW|UW|&?gIisel^xa`~VF)2iZEz)Z<2mp!F`SIDz@=fmG}rC6d^ z(RJFtKa6_ed@ws04QG>ZI@=qMCnLshoO`sS;fWO4vG4h+y(jYVJ>ebqfgGeQ$1j4N z+kF9YUTth_I|VQ27ev~tjg2iQ@8>EdNP-fjT)9++3ZjIUD+HA?2SUDmzv8oOO6njV z$kpHfaqVT_|FJQgMl&qxDGR?`ER}*CznIVa#Y#C(SM^TbFIRSgN>C{mb|A_3%awBA z2bD^tQq)#_rRWEKQ1FWRvR^C%huA6kLBX$7ypk6b*@*6xb}E&EUoLrhzv5ZgM$s>M zCBINC7a1O&U&vRye5p{{DVE^jPTBYKUXU-9^OaJ$Sg~=H{*UMLS#pp4oFDA?o>wgU zWxr6!m)K^6~*)5XGHxkl*owz%KclPPMG(JTP_KYX~3A8q^apqFRT z2!19j%?Keu^q21YqHj0{Rb)aPYfpLj%Zns)4GT-xW}ewSkXe#s98&<%>72mr&2~~c zhW*wEesUJgXA|P>b0tqx)C3g$XA}Q(z|!QgsymLSx2QhH`S!>L${3zqQo%za6vJFa$RzF3o{#9+H$&<%8nw*a0qXp ziu5ALL4y0zj5VO}V@8U*y8|unXJ?VBH!xZBVMxogZRA@A=@bzdgzl)j?JQpMoNT3Xtyv|6Cq>Q~L zqhzkSNJ>AdcrIMH5Lm>^8$}VL>l!ZIlxC;InID9p5Q(wUlo%NokE1@}aQJ7-oX)OV zIP_svVhI=1nmE9 zktg*0qu02p2-8;dS}WHAMR7}RM3|#?_^72zT9X-}rDMg)s(#=>tBhv1o~6(4T|EGa z&Lk+wKX@5VeAPV=H!22K*|2Ga=-+K8B-a&?x6S@;2`NZCZu#Ip3OWOxhZi{^h!qrY z!2lc}z>mP1gWeK2C*z)f6z=pt^=VHMZ3)psXq6C1ua!hI(q~pHZ`8U?YHORtmu4-2 zJYux3!Ain_LCPaYI!@?u9=U?-%x~fje$+H0p$>(YD5OnCZ<+=p?so^?qr+o!X_5Z% z1NVB*EIeZ<)fTq?ti;A& z2TXn?HY>oenb?=agcV4JbCZiwC!=nLPPDP-ve~o+!)hzy^CIk(M&Dl#bg&w9UVui6 zf)(30*9QA#cu|ww3QcrDA*jD~Qb zj#{YT^ypp(7mX@CT)`kRxII^PKkM>EFNsW{cGiO0!B9I0YA1>Z3Q&9~V;H-<5#f?t zA881~LoL_zbUy|W-rmlpm0t9PG9Ne$kQv0Id1=!CJf7#-W+-!D zj?@INHa65;O{!I1Ok}4@YmkXm3~CNJkQq6`v#3xwq_T6J`5T@6j9IHI zZ@4Y2Wy-Mk0{n1%*too?H|e=wx?mmjF2|E7q;^y>Tp0N5ghXz;i_}Re>$jYnu?XUn z=hY-Em(n8!djix1bD3&0&CRQCOqAa64Vdbw682`Qr$QSp!I0UzDm&}0gwM8;sM`#e z_4}Aw{E8PWTI-@-!5MZt7oftElZAzv(9D|j29OU`CT_{y3^*kLN}&^HWpDWJ5446+ zcuRP1uw=fe3AY%^tU-L5g($Y{M>;fD+Ynfkbk-GpKJo`1W{bjr+N_idNq@{LB(Q~2 zp3H6ezDhC`{(i)=vv7e!pHW%YvKFn2Pa;lU5!sM`QzKdl#pBMi%wpU8ed6?ezS;Ze z$(uHJ)26OY=%-IvhPl40;u-W(lSh3Fg?E6c%dbIHyfzIUPt?7F&mTE8r#@W7lhN=l z8qW5chev$!Xd9`rb4sZdDKnIYMF@_Jnhuep)RexFasx6ATLemEC+LAc+sm4%2smI`nkkXQ@e zq*!Y4_#6pso!c53C6;F~zV#aW^Sg0k9UL%Lsf7Z-+UnIor+;0y)U3lgT11I;PwTC{ z6B+D9C44js2jYg!R$B`dqtsRd!B}Z3W`~Wo!+1KHO-AEoVtq9Lty=v61)p6}JDKjb z2)vI8ESmsrHD&aOvMQj45>0j`1ns&e5te$PYIpomub;IK&QH#p7EqVBQAFAE3IJ(D z0wAjiq*|S;5U^EwTHWN1VAj4GOyjIoKf7$Seo6r)UY8|;GcMq#~0}RuK&?HD{#X42qx!srE85CUa(okGu*HD0kY|}`FxbC*1fE}=1B^m5m`;Ln0 zC>_r=b|nSg4c(NIA+Eb?DNu);XC}j4!B)vh`eg5*ep)}XP?j8*2Vo~7f>~-Shibt! z_E4prNN%CYZ9He<#BR6BE2^=LYxrs;b*y^mr8+OX<3t{*EKv2JpL9A?0)6%H28GS)x6Y4~3xc>T$DT}}+ zpQ$aMB`*sL$VZ@|jctOorXtf!9c?@8l_(i1C0*R1HMkQK&mict~$8R|3>4;#+E?78{gZ_9nSk zduOUvm4nB8fsPxCQQURz!gxqsIWE`~L1o0mV8;bE7l6`e-nso= z?VaVBM{u~Sc{I5RJMa6G(R|oNPLRz$>6kN9VsYtX6q3jEP?0JKM7;tKC*c@}teAtpSP!cMug6I9A2>Xel}uq_6DKG^a60)Ajy zAY^k*5Z=yCzEUBcH+b1WG@Z6?!(sjRc{orTb!8(3uRz_6s9-4LgH*H*&ruk7n=aYsxk;JtV^Ycent&rJRn#PK5Fw-nngcHu6U|;vpSzD@DQeFUt35 z2#UX2@?Dl5fODfVC#FRKB zG+H!Oi>U(7aooSXm_(hJ920*2Vb|oGsPC3JEhuKmBR#nZr;#lW2*Kr6Tp(F7s4p?9 zew1}}=qdR?V=Y?>-76O|9>s)y4-;sj&y#i7gnjHS+4{JPBKk0EyyhciHcNK;I;>x` zj@uV|2mdC%32QYcA9$Yrf?TXiaZpTNR^zbqJ|6aMD@iU-L|(prY?+|iUtMArO=l~L z+=kQJ>T7Y%9Hi7Wrom(fI zg!v!knwnRsP7?m^yK?%L`*lzKa`#lwdW}cZ$8D&oQD3MNg1u2ZWSrqw*y{Y-Hs=xaiq*={ z>f6d>Vtz%?95M<>2-1x!Bv=k{#+JqlKD={Vf6L?f!#nqbUA0{QeGY9tLRpp2EBeS* zb_zY3*L%#|fCUVZD-vEkVu)NVP&lB3BeqalbL?FSDf>Lf>pes+6zzTYRXCeX;+y#_ z;(j*bVPtYHnzuMnGSfI$^2QGsCS~?U{m+mDKKuNwO#$3phsCjXHZ>Bhlo@D;A0ref z1rn=2b-#XrL##T0Xq7h6w8PKV6IEeqayOjbQdcRu1N>Pypczk|p=ci3wy`JgvtkOr z*wJ;}vuT&Rxl;~9>+GiB%;Aps@KFfrO2Ru?=Q}YxBAVK?6HdCwE5&F&>yP4LpT9Ll zE@^kyI9jf;snbzJS$dPoxtc!ul(k3W@b`IShx{~Ft1Sg<#&{Cl%?Go1Jcy%i8zc*r zSs%QZE;Jf0QVv@$$eLeVb^5q-+>7yK%lWXUnK@XDCb)G33!ekmOV4}!QxB#q&W88^ zM?F*jHK)fH-Ko+Jmu#7=-rp`ByT9>RFh?hQG-6);Q1?+ujTG0?-ge{JZ8Q)Z?-gz#&sNh_(GKQFC$elnd9YTP8vfs1@nKfP?{=Rt`IHPyYjGJ zI;@l{_0fMuy~h`L_m9^w1kkx#s23HVEw9QszFL?)vGAO9;TBT)YpfKR_fa<-UxnH= zgjz=Pzg+UYnRa_q19!#;VWlRq^u&%&+k^1#CYq#>SmWGQ#O8P7)B+Tj)FS^RvHnjI zf~k)_q9x?dHc9w&?s8RdihtlK!*O$>mS~^4Re7%>84Z~Kiq}04tWmrR6g-vAb6+Bva6)i=MX8sDuG{GJbSYAMVCt) zeK?FKn!S&*o`sluuayE(m;uOrWEQyFBIO>7$i#7VXEGwOAy~fa+)G2E`9g%I>5gU@ z=bi^9Au>0lEM*FFFJGt>u_d+i=>xolX`(5Qu-G2a43|fUQl6cum9XhGJeBowG;T7f z3=xB}=1VlIT&Qb;Nw^W&)ZgN^ezhQXhWI>nE%HivM~`j-EuNg1GayTjbW_sWJ9}F{ zYh7OKkw^FXb)v@qS6?c=xVreCCiZ=u{wQD4%5|>{?J-hL2D_HC`5evW zi{taNw_oor|EupVUre*{b?f|kcL`GVzQJ*xbaSZ$Pt#Q|)7yAx^``Rmrt|Af=hJRF z$G4-j(f@kS`SqUj>piDfC;#kQPHTPc$ub!LD)HZVPx=vU{Nxq);a>A_#c9LpuTwwy z{$TUC_}3m)z8*%t-ot)9jJ)V!WbGqIG8b9H{e)DMyti>L2K(apr_08{-pQ*CUZQc{ zlpomtvF;-B3D%mz_q?7VJm9CjX(IRnc50EBc#cbU+pHHid^7LL5@uLy^_t7#iQ3{) zQ+Gmb_voA8RyqY9_9iW1rg)6kyDq%K?WU;t=PlALU zy{AnR8G1qKX@EjDTt_5itJ)zg=z|3dCFFyF!BdsAUsW3~r`kZv!%oFCU%OA%klZe( zaVJfGk?!T-Su`W7P{3aF|8fHaX83HF^#^Q*3nbHHx2MxG=*bKJ$vb? z4Mr`y7>Fc$?iX$}JG<_5R2OZ;bgv(c?xNXbsl}^uMaDHVLZpm~Qv3)Y9knkzw}ZIz z9(7(Up(D?=rB*yw;IbBVxJOkJma_?XWSuP>$jTs_k;6#`mWn1=>&x=Lr#kW&9q3!< z=VxE8;lo#L;#Y0rS8d{#p-p^v=U(fKFKMA`rX1`yCwZUxk1)P+>o=X4A zPNjdMnE*`i|Ms`ge^0^rt?8iH;`o(0End^F>zC$V7#$Zc&KqZ~%l6f^9{inzIowE& z-N-fd)*xyc;KxLEG|yjOyxU?3lM@eT;DNTrri-FdX#8B?YqjcUS9>kE7~8lRjRsCU zy@)2{;%*i%NJZtF`X$detThPGDm;}_zqo4stfSzu2{C5DQS=*CaQv9yLG5KdS!z<| z50Cd(`D72uObVFAok8@MzU%#)NF2}aFoD+2$ zm9l{LWy!OV$ph~`%luaeW?OBxy+c=KAAXI@8)j8q^kB=7N$_OjS|)33znmhta^`A)e5I`SJlr| zFL{bua5;BvQhv3L(pl2Y+{Kb+wZ*;_!L<5e?t=JK-J82MW4>y0?ppQg)q}a4G;gaH zW}aI4Frfg$>cq@uIahO6JsDOTJVkBcOi5<7k9Z>cJ}2LVuT}TwZi=m9_2b;N$@SIu zb2sHeyLxP9vz+U>Yf~Fn->T_qpMGHItCPL@qmryv`DyNIud1rQizJ)9W%W0at)~C1 zrn7$hTc%n~BCDgWtGuDE{_otCyHfT4=obe0ADSc}%(||@$*WPLh49J%EQ6xt(Kuyo1uGt;ACx7zQzwq2&$R?{_pXvt)QeXnM*)YGo3azpy9@j{WPs*$R7Ekmt# z({-(OhSipqp;r6Qb!|F@>K;p1_)3!{s?6emrJ8z{>V=xcQV+YX^?Is$VrIagU5RuR z`G%U#z@Ld!&K`M!+5PjbyTWj?x}R1A(EEr>sPNx+-9!uI>T%cAB!ud9*JWyg>f5fH zraG(sK=QGAr21pmHSc+!#(^XYxJ=dnJt41iDB@J1UG7Y9Z*Y>))I#JVAJi?x9lhmpsHC?SV=($!y&T2=? zP^;bcT>bD-oy#=VjV`3Hk6zE!G+otk&%Fsd@B5R{eAtD=>Yb8AU|0J%>41m`P_k_# zL+M42iV;xeo_#>hY0m{NN3$;Z7vwE_L`(p-LPFruB6TehO5XHb9=es5YM}%u@uBCE z2%seRVZ?g1rzAnCX3xEgrnfiYH15zs2RH@FT+kH08$zi=H4Vz0&@}2BkrumBlAu(B zCZU;DJyVjP)Dcah+aDA<$0<-|pQo^m4vKx$5~1XKnh0AklsZNUP~y7hj>+v9ofOr# z;uCUz=&^N2bAJ?{koyx^4wHDsM*Da13Aw-Z9^C1y_KC@tpV;}Q`e_jk=23MReQ?5A z#xL#c>;!%>`{1&pAur%RkWEY!pAQC*Ag)R=p!c%}dbBvzYw*9S1CU{(1TU=Q#dloHNv5(5PZl;?j@HttDks$D;2I0^$LL&QL+-Dv-4N=6Zv7l zW{HU-O!6;@3Qo59Ah-GIC;HO>E0Pld(-I13lC_v+eAmxDJm^OsvIb;=(V&)@*eoum z^-IaykHaaR)aY1M{lq`aIVm%e2Ly|W)lcHf0ETmtpW%t`>U<1}(RLAX&!TXGDBBzLk7Pm+s$SD3q_u z<>@m{Pbbj>`=T!))HGt`G)Ld3;h30O7)bCtn{h%Xc|Oqy<08}XXqHL<-e;Gq1NKmZ!kdN+=~qC)F)sedF6`60N`9rtg;roPJCcmMf5y+nYq; zkK2gUrQim$PTSYE)mf(l9ra)==sckNINy63Vi(D?UfipNd zl`5aqBYG>R?asNPnyCR0h0INva`57<U24SfZ~J-!B)+J}JN* zW%3evFOgvKAeulfc`hZ#y>QqKC*3r9y%>S86iL3ZjQThN3P_muacGEH(BqrsNRv!V zbYf4WCpy4Cxa6dsM$Ts@A`+gTWxWZ_LqczbB7$&QqAN-3>mygoCk_#Bj|q4p-Aw|f zNR=b^SRGfIp3HlZs>RX_(!4ylR9Tfq4(Ox4N0Vxo>NZYad!w|#N(N17X2DO>p*>Iy zUK)zp$XHsHDnUzwQbWiO+s`pQJ{e*{(yTzbx`bJQRCiKN(NU!7$+H3}(Jaj%o!SFZ zxuRx1B@0jPEI8D(B?5wtaT&O23StX>n!fl!Qww7}Z8|W!mP^9eAIv9{SmV5@oj|z> zs7+)v^z5iJdo zW~?-vlgKYRs?&>PAZIJpqgv5KJ*jKD(6jZYnWz`E7D-i~Qipq}6?FA#Pc<4<^AcNA zJ@H8ueO}4Zz3_>0o|jOLdf?;b3d!Y?(Z+=m@dpF>z35>x^VLn?=JpY==5q z^_1Mi(Z$X=^~0r0m$L4_(|%#LdLHP0JMmPo`1G_lgG(fnMRVDxkCx(+QPcF`tVH$I zvz-NZJEP%r=DeNOK255gdsFq?J{h{-hc(jHcQ3A+`-wss)x^l|4x*Ves7-3M+Be?!Ue$Ly?ycLakxshfn&-~pr-a$h)U%&RrDd(2 zi>H^JXc*DTbtEDIk#;B1Y(5z}%h#`$xp>;50S#Zj&Ma#gTv$qZ-+A9h)mb*zk7k)= zHtQ}QM7wR-?l(T8#z~D}vwKpj0g~T$Gb4A9t)9GoeUgi(FwtJW&U7;;uAg<6wQsyE ztJti?x%&xeraoN6lhF{a%m&f0dphbyne1+}R;&Fh>~>@FR^VUX4|6y3UN4$Vb07}n zrqK)>L}fge{NH!OY?W3a>b>n70_k6`U$3a={vJa`GC=85J+UQ9hY;nsjYE=o8g5OKogEE;y=K{hLg;Vx5mmwX-(`Y*G) zC$C>;fZ+3+hz;@|f1Ko)(MzpX>rJxXXKrh?8kmfGuU}_wVFq4C8S-a7Wh}%cUq?~q z(=fb?s{h(oB<@q@n(AM!5RTr)na)rX%!P!ctvs_J&eqqUSz0aNPUCJ=J&x!p81%W{ z`1IokI0t^?!zJT4{zEqF-sZUXuv|A9M6+mbHk-sZ^I4Sn7d=G&E4|Qs0R=|G{irvZ zM9pZ}jV3idD4C|a=U!z$&2Hmq?hdXtz|nQCGa4_s*qyn;S=k5o{Dv5X<)~Ym3wkNB z%-rU<3o!Rz^u+cr_ftQbRYhajPi$F3bDY{aS~v&n@8KcqPIL2dm-tn?&1T)-hk#3F znKO@PkbA#b+xE$iCI9geerVH*E^ONU78nb%48no@*RL}M1VT39)Xa)(?ZjF{9!+_% z$Ds24wqNzFaBXalwXn2iu7D!;ISUYxw*m$q3JQYojibrvj$V=#GC%incj5bp7b02p z`5>BPejjEP@)Aq8({MbFy0!nE5#~y_#b}Z_p&aRwm}qCesnsTto9TU1tDXGu$C&&f zYmrDqfBZ53rdEpuq52v?rZVmk-N2d$SgRtFpv(QV$NStx^`mCf9x9RJaHzUFvhw!pN-he zB=QiMHna!qZKAywNPWkaA8<+zH2bK9(s}wq>7*}||IgmLf2WNk4Z}Yte+6d!_>oLm z0Xs9hBhv99hS<)4?FDRShVT*v1ZW~8MG}s&&Hw(L>YG{@Y|re>?!Mo7&+NviySn;b zU0q$5v9cPJekdCy;SnZ`M`+=|VF1hH2%@p(=!F~#V~CC;BZT9~nBhNPU#rdy25G^H)bx8F`>3^a zaLEc7f4T;NwSnAX0aiD`ngKx`n6xCKkRCtg2&~DZ@3X_G?L@J;0Nxj~zfJ~no8AWm z_hu6ZXXwHTt%V)i$QyPVA4gZMZol<$)aduSr|)_?cm!1)NTAVaruT)AL|`EsE;0LB z2bypVcW}kH^zDR8KPFS{4z8i8*TXGBj(2vnkQ~EU3k{zV4_$|CveY_&P**x^@9fNy zud6M_-S6zgf+AdjW3<|>PV1~cYIM7eUq z-qCfa72^TA=d~-HFIRPOyU8>;#yGUC*uJ9FxDkfdN>d=mT1NrJN>#v)0y$4XGFrO{ zcFOuBCh?A38{ZwO@VQ`ghtALy@dh2knGEY!>S=X_bIEha6`Ra$ay4jD&}|iT8$o#v z*=C@}WP5No6xX_A75tb4nu{9_A;_@~$4Qd|>>g`wlMIG%jsM({!LUB{Lya}JTEBW@ z*RLuSy*aoVk}6!YKX>#`U2aFVeNA>f4gFbYE!c+~1U$n$`@1}=BC`pMrcIQzYZQ90 zkEV0uM1B~Vcfi)8*-0{~Hj?8_&{}{B(q*rfa&hs#U6Ig8%E2~iDxZA(s(ep;AlJCW zk_Kry9SoLxQgXb~2i=)!9|k8w!}Z6M^Lk6FqOM6yt_CMViggu}ZT#&_wNAe!DoG3Xr<8mZkU_jnUGHR%}48AQGL=DOajRP@fEIV4q8z|hg}Ct3%pDUPB8O;N>l zwhFi-p^@9-klK%8lh>~Yogt~g9sVH%XUyScImM+V1l?tDH5{SNaEp*8g}+fCIbzyC z3PqY3)@8%MK(naTa=5OM_>ral!3 zZ8+BNkD25y-J?_LG0hG+@D*(9W*Q<5K(Q&cB&Y8ENE6HQirl4%V{YfcF=-my%vh#h zAx9i3oALv0%55>ICuDo@fl|Jc{Qh*1MzUNdwM9QXcZ)hjTlB;8wy0A?7oAwLqY5Q= zgwBFdC@q)1&BAR=ej#{;I6dn>Jg}daXT8(ovsQCN)126t1_K)&Le#m3QaBD^t$ zu5I1eoQsmPCFRSs3rJevdrbV;h+=$sf=in2Pp6R`BRZd`!>r)lY>R!UKJ0sdVd zpTL)1tgmf1vP;it_9ESEy`JGqQ~c<+Sg$_^X)7}ptN2wK41R%04Bz8jF9z*0uH*oA zk7Iq8E)Uk1`()Pn=;h{IG|b0_`MHMqxk>V4aQ@;+D!{+%6i?D)&0eIN{rpLK3~4Jf z78@pMMJFjgL4GXehxNmmYR5%X<(SjHi9&Ot?@m0PYm=BCEBgJ|itN&UhQ9AlZX>?_Q^)8`uAJ;W6i*sZLDX?6Y^%dPoutU|dQbdig3rkc2G$r)g5 zZCz;@y?XuSjl)`!<~6W+3DRb2ysn8iXws!~oo#*Qz_}yWx%NN1fxM_PXqTFP-_vvy zEmQ$T1rZe$L@7~00^ZZ~`$$T3*o$Rk@JpfiOzy^8H6hfA?06ZNK7@8;$L1yb+hohH zhu*8qo)n+7A+%lFifoz@ollR&6||epx!~8)1~{Ihur}t1-#=v%6VG7MrMHYy_fl0{ z^MOC#GIqvGq%Dy)*6%$sPC!F#40HY7F(#q)oic!t=HXMW4z_%V0S}+)Wf@DOPrdp* z3K$t9oRpSyn4y7b2GLZV3147xrrH#_YO%~2=Tg3Iy*qA?sE>jXR#Das`q7ltQ3zU9 z73NTdDHAv>NmY{68L8H1Z>IHGrJ^q@WImV;>#|A9Oy6AAA_($rV#{<%Hnt5{{*pf_ z>*?CZf*r?3SlW0n8v-^2g28O4*Xe<|%=S$VWww(+($SgH(GjWEM{lO}QKh2Ku%n~l zZZH@ry`8b%uBr4KUwQqBO(LM5Oe9D`^-HuMB9@xm5$z;?VRBN;O-A;gQm23|%c!m_ zLOR;fR)*S@A{^4#m|KxnZhh>JV)m9YnmTT5ha;&<;f%{Vy^#n~)DW}uRH=HD6=pW5 zFtgwK*uU(yM)*64z&UDt>~k(4lES4@q;8Fd5Xfz5jV(ef4`1`gzK3U%*3hZ&JtI6l z?OZTfBK2CxVwaA(twwY79)ptai`glnigpj_sv!f0XbEv|2`O(~Rrz7f{uB<;i zY=YtddR=XJ<6mlc|CfuFzO#dfrryrZ)@5poHRyC>>&tUzHV?}5o1$mWO&6g(cJR63 zJzj5O%`v!exp&fNwz}XLC#T0JqxbFeMqf7q0sXd$Qrbtbyze%SsnGT*JbVH2=G7ad zys#(EauJk;e2KPRBtB7Xw(*@-^YpUwXEc8!rbF2_v+VlcgYp{p+?d!2klbyDN}?&c z%+}bPxY}5+BSSsLcM#u;eAhOay{$sGxLB`& z#GxmM%DofOg|csMRq+|CW8F5SBAglWB)Q~G7dX{si@$4I6J&c#OQfTCL8khUEZ{K| zuO)K|`9)*~u&{3V6MbYZ@r#MXWZF!Dpo*CzOhAQ>1-CL@V1mMmO%g1Z;<>(0(^yc5 z$ZX-)d;Y>MVOIR*URK>kFsAGonO%j!iv!IO$3RT*2&T+{&6rn@R3XA=tT1^?v#7ek znFmaT?`sS$QPdJadG*Cd{JQ$SPF!}%d&|WI^(siJGJ(ooB4*kwl97u|bc`r3C3vSP z=Yx=Oe0T^R9z6Cdl4mIiz>{FGTr-r^RTj4%C+fQ=(uX;FVdS8;Hz@|Jae&B7T(@>kt@dpZ#C3GGRmZD2DGBt$HMK(Av;z{bzz=9|8rirbtO)1y76+Jx6IOq8A zFyp-^bZEkzovno)9`atAV~z8RtO0!z9#%~cTBN`Gnmy}~iEI*W`ojZNs&s`C1FXng zn?V3ASSFH(HmTOzTZFXgl}cM*4cbFu58A_e1{qlu&;95yy++JxX3_MJ5w1hZ zhAaqg2+XJ$>EU4^czPitA7qHS{F<4a&h6Kw}20dPjAzwgN??bRT>bQ@J#vK+4U9u@%!gj~BTi3Sr z6=TvT0Gb7Uq69$*nOldJ)cAbon3%T2x27cZ&e6e2D)BUnPL#E?VmR}RVITkb$NmtuJ+fbg zk0Hgp97F7KWp%pKe+k*y_$?$=_znO0RXH7h^@vuhbS%`1{uajC54!$pAHF-J_Ucy; zY?lnE(V4dQs|Vj5s4`8x3oY}xhad2(C%!YE_#5`VJE`yFa}RZy_iExZ{k5kkI$vX(JPDnDwEamcWwx-C?=S8$6#9#5Wn;!c6=ew%!op(yB5+)()UD+!(bu@a zsC|JJ1Ge5HMhzlTt5)^8 zW1}+MuQ|Y5`G5->bC7}KBWlwyRNDRzKZ@NaFj_8^aNDfusD>cbA12CGX-mu?+Hl!@ zAA50mrNzv?LkAnLp2-2*$Okov)M`cwOq537;)M{Y3$VXQSkwPy8dim zLq)y}$)TBn|6SWp(I$O8%63`Z`k4l*S-H*?5yMRRB9H`+)hVDj}`lycMeJolkYp{FinzT#s(=Dmc!bQCQltyhpawCB2!oany#D0*l6af*E;;) zM65Yw_K5xP@C0#Y*+P(^P~!rE>tzWpvJ>k(ZYd2o*rj`CVclx!Jq5Mez795dy_-q* z$o;~ay{FP~bK=3m@sf`jGJvRyPDd$1B}r5cG5a1&sc6QuJV;dA%_|3#lLuu95D~}K znBZKi;(zHD7L)uVktJ&Gq(G4D1_1#I^g%5Fqz?+$zim6!4jEi z4hiJ`H#77A7|Ud;{L`9vc(&?AOq3I7A${Ik%Lj=3iIFI4b32nP5vmR$*6W!S&CzH! zd<>C_XV?X55Slgy{l(UPLPJIz5^%`?nO5Nc4PlH4jFV;m8^S!ZzhFw{iRB;!WUks5 z)KO($(UaF=7d7@32y*U$f*{$6OWMA1B+O~(elilHnsV9}Puj7lCN66f4W}#)QDnj% z+hj!xqB{AgFAf)q5$Td!EYSP<0xx$7DC28K_-bi;0wG=diSD>rF;C0=66e|`* zNU1^EB5A@>zmBvB`nxTdyxl)+nN?^(3uiBTu0=YGc6R3c8Bv>|2t$6w;OpyIkpaf6 zzyKq&HiFdBn5IX6u`Zy&Qjp+f*J(r^KN{=Nq4tM4&|5!t}oiM<(;T0MLd)x%_OS|pJssC0c04tF!(d+G1JS{7ojhTD_a z?m&z7!o8aQKeo%8Fsv)Lwiv>_8k+0lj!}E!tpxzL=ucX?`K05R@d^1ID{S%NW!H+G zcsX%Av`CcPsD!itFP03__hu^STE!>b3!q3aJ@s;W#w33L)=~FA)rg%PmZa9Uvm;(B z?J)F1t&Av2(hqBCv5ex<7rSKB;1wkWUC9qiDyprrE}ugWV7h66M?;j@1!SD~+F6n` z4>0hCdo_G)jNaoTiLHhDAzddIr?0gA-KB2s?<(Kh9twa)Bz!f)mqeuy7gn*0)O>fO zo7-M}@pjuwdQIPGKhrhDBFaZl+P)9hP;#PD?E57br@3T#lhSv`bxSDahmsYQoVXO) z-(64GCTOFBJEO0tr!+{l z-gvX^)hiWMhvC%-dTg`Uw}G~IxqJC)U$0M$U>VJ|o(>IqzV$1lXExp}c6PLWh3xP4 z^mQ8VL~P0iYK;yWLxTUj>eqt|k&*J!z~KFoLh!)&PWeWWGJ(KQ)&)wm94j0%Jj6i+Dn7Pv{!0vdbqLLYo}yu6DKPZELUT z97cPsO4Bi`I&{hF-3-IOx6&EuY(p0gc2}^!yF#IC0qJxF>6}v1sR-LsFO7pC*!Yhp z<~JgaJSd#KrcrGg<67uM)7yL-C+ibdh;Z~&f%CB2*5#ymt{^<{_ zJ*U!i_G&}Z;>H&)p^htPF;}d+F{!=M{Jni0=45XSQ&OvpAs~Y})#<|jZ?*AO@ z?!P+NtHCAdzTH2pntL_qkwF74p$d)4{;LD^SEYu(i&F6Ku->PvS`VZ)2`vy)E2Lm#H9nZfkuQ={jV=mNych1&acJ zsWrAw(HKa=tzd#o5S!4p4$<4Dv$GTJ?TOa`<@yBjie-ztlc%g%#}(?2f|J8Ke2=G! zTev4Ef#l+*AtZ@-X(0U4fII3E`;?ZfRKZJXy^a!}IjB&1JUn*Gzzpsq^WHPJJwQ#A%PZ7F zX|+e!r_KI}S$h?ylTTWw$0vQW_R1FNsNm5#y)Zv--#crg`gskHyKCfxR`JKg39SS} zhtZOvic}OHFj}cP+orTqNf2~bBt==Lg^sW3S!V~IU%q_t;)T>2DRFHn7Ra?;oacCP zoff-cdK@ek?9KTy4wi9KFcu6%1cqfj5BHlTHZFBF)A3?)wx-fqG+91GgOW$XCnwo7 zsIf9!1!dW&6=bl{OJ&erh(Tnn{~KE*rPkRM)l&N9qQ!KUF0W{I5=3-!@W;1os1P}- zw9#&AycIFF4p`0BtrL|n5G;bfVEJP|q8$)1jVU~f$o%5Pt5>D2KM9@L(vJR@7T>eH znQP0K!xW0*W`irI24lcxW~;O-E2G6;R7&H}k0OmChCDnC&5Uu7d7DHj+Kt`P#E%~> zD#DS=9_nnwU+^vb#X*0$R><$8eAPg2K;S1Z}ymX<5Knnc#+|MBWy@TwU=7OimySO_rwbvEl(*2(%NFiC?qjjtRI zRTvGPB2WIQ@zB2+aEz;q5vb*ctCohPU3Jyc(y8jEeu$C5y}0C*NU2sYIi)uxuU>L0 z6{Ytqe0b?Ckt}qQ_kvlk@GsuU7s~#?=)Y`@?6PfxsCe@qZ@-gm{~q>yS8O}ckw1Va zgF%^}^~)D8J_B`NhS3GTJmxB9tsHof;uj%(eq~i8xQwR!_*wH`P5U#%lg9>sZ0q`& zjhNa1Mcb5@+%GL}N~9#jGnY474%MSOhjT&u%~C>xmNz9Gmx$a*|H{0F8|R(B>OOP6 zi(Ntg)vF+Vs3uMLqiY1anp!0V>mf5we1@=OGDVEeChaNh7EsnaeK%HjNVWg98O1^7 zGfKzyk)ho@veMLB46V2*(A=j77MX*S(%APyJm+G&6s@AzUersJk*DbPs22i6L#-P; z&N2v2MdH&+d>?_*7D>SA_S&apb$L_T!!1!yIG%~ha?m+JG|IN2Cj&)D2tPRaG^<4? z$w|4ot(RWCLjD0tH&9xZ^itqQrCT;-C2rBFAgw)(^!9F5PiGsqccooI&kJ7N-V(6N zy&GQPYGZ}_g%ujN1qg90IKI1$_zs>oDo=KR4cH!zm}k!(8L`)YY{XUt9i)}=3OA3~ z55*&v?ExFGy&A`Nr*M3nfKF0-fM(?hNba;CndMGby4Y|0ESb3@;RsTm4MGT@F6i~k z7oU|wy;u*FYxmR@RZgF(a{4pjFY0iEw$(9=UK37~7+Ne7_%blI2)L(sg znA4O9uD}ew5<4IjPp?Z^rd` zrK0MwBk?TDNE3TwmxM$THNg4UyAqONmEs& zGpx6$tr6N$WKU$l=pY_%9`{WJ9-V>TQ7APR8_PYbBf(AhJA1-P{DD^Sf*E%bxtcwx zZ-cvlL=cH>Hn*b0)1oJ@HMo=bHeFNGe$`{6z1a{KY}rd{(YSQok%&XWa?e}6WT{}G z5tACR+(*rT6Xev|oZUYr{K0h;`^n}>AbDmqw?ca|vTp<5v%R>?98#uwE*{LW>xoI1 zAXQzb*l4s=u6UJl$reLhN*R!%wP>_fXqOcvmgJ(s`!$5cCMT9Q6<`6G3ZflIPjJFT zBqQP)&rrRB%+NDMpm?Fu73d_DTJi@^90rzjX%P(q>H$L>%v2*$3-tPu9tpgHr4FGu z9s-@|I25{-&;lKTyt^Hd&8=m5-9g^-4cNxQUijfkXxcb7KE5c1=hQw<%qeR;VFpq- z44V&ZO9uhIRV}KfQqdt$?ZZeAg0o3&RLbQU6q#8gdj2tJ*7MtLjMrLmciq&! z1k}hr1WWaAi<^c7%%hq`f~-F^b=_0DQszvB=b|%~C4>;{T8bZ)tkaUQ#_b(vDTgcq zhw74rBZFB6-Aqr-1jmOf?{~Uo5tRy`B}=Gcl~9G5&TTHM8KuS3*DQ;yYZg{}AoeOYVyp#&$?%m0*c2F{b|W*kUF3V1bI+1=b(C~> zqI4IvVft@o^**YoV0Zh&-O-@0^m+1#gOCHUtbVV3vXC1bTiygMipK#bRRn}wr zijdH2H0>28>KM?J+%x~VRTx{YOS40VKFQ&49`&*cE`4^cuGQ;5SN`I63EQ9uDis=W z2AzO8M!$R7I6H2)dZukiv=!p-YT>Jcl*2H`XrG=@I9d~j*)M<@_4?h@i!|U~tq8Dv zex8C0(=Zq3r)Pbvk#$mq5Nu>d2~A;tPQ9sbmM*=op8wq|;W{lX{E2PiiOG?04_kVQa?14I}P7)p_`gT(Om~8J}Cc_$0F-Mboh+>WNr$psd1|AzdET(kP#ibzaAOx=HtOBj&?yj9%S@ z0}@}QtWnoSHIEznux8fwmi4C_M2o$%B3lyWGIEE{ESOO8GK}^0GfPEs7$ivq``L9y z%4S9kIK`5w=Vw=_oL%!E<9V)FP!MX$aV2aC49eQzYeN#nL_99IFsBDe#P1c{NtV2n zPB9h@yXRmi8aKO=sLzwR6>VC8zRsglxsNSVA8TP^W!?bEO}ZH$)Y%&{xM@ez@={fR zK?HqEBVhe=v45q8}vMs z_`xeVi7Cvk%|p5P?jWMjq3TpQ%-0#|Kw$}*iZDMrp7cx;f@0)mksA1@Esh4B^-9Ik z{R*+c8CXN5fG-zFs5p$W77&2fYTN>rqGjsB)A$Na zR%2br0~ACz>6W(`pmI7)|K+CR?|t_BF4c{Lf^Gl;<+}oif+DC3nO|&#MOBAN)ib5) zFOOA?|DU1tqpUg9q3%oxc5(>9q4_(P`(&z1H~) z>9q4l>GY$-^65VH{!PTv`Rj@0)16)Y&b7RJYB9I|CyP|7cS@JU$dT{ z(X0NyX+bal4J-N?-Tj`EiYsSLgq{To`Eif+JlaUQBOMTiL_BOJv&D~DL?y>yzLmS9 z{U-GUetvzZSuXY6Vukj5-Z--DLP#uEH$yTVgUzDBbFF?Yes~B|hKG&6yep|D9MC2# z#;G=R|GjOXs`K%~!z|s3qknHJ_M7~U_wW#;8*)J(;P~5^!(YUHsO|q~@(bNE;DL31 z`0>ZrB5|T5{vZ;kN}?ZhdC-vwwR0sTic$ya_V)yhtHlV<-z!FnKn)@n&9*{q{Lp;=8% zqLs^in$9T!k}}l%qoZ+Gq9}5OeSOnK+g6ZVK91x--*mlHk(@q`( z*Vg4m*yCJdH^W}%TDuwcW3IWIVSjo2d=L^q2+1teZ1irivNaDv{oz5|FdrdhE)Ygf zd(FTDg~~y*$M?V*K0Hjv5Du)N(zb8^>9!q+wk>jP`|Us7Hg?|A*3ELQ`}IFRtDFy@ z4GeM({P`(vpjpHXw2Qcb%OY;zw1^uxE8+&;7jXmUk8=a>p5O-Vp5O+)KEVx~6mSDq zMclw~5jSvM#0`A>SGj>-p3e<@`$OEoZ-0mz_%&Fsnd9*7AniDuJ(02)9uwg;9G5bN zT#&m#y7s2`5u0f?3Jo>-UP~?ljiu|Nst~8>i zK!v}uriB%d`}JBrJ!kaH1-#<>tqK;AF5ysQZ`CW6F!6MRKHloSp<*2Ps18jFH66M{qS(RFy_y6em$vWywOQJ}w+Gg6{W%#P<2T>& zXk&O+0+&adQdH#^$h>UF#)yXeqVaJ87q(;LyB~gaJm%kk`jQ4msOrV!^TLV`w9@u{ z;K~OaT;ZBc-r7d&zjto!iS}C8*CqY4uua^i+o>N~UPQw#>q4tIP(SRU7HZO9=s z20}gG?9#02a1A`sqE0bBLwQ{uDr-AYN?It29AeSMe34mm(}4EUZYpQYYFS3HzbJ1| zSAX6jR$MKcW%@=Vd(4SKnYzO$SDZ>&V{SXx!q-dpVsgtByHf5am^1-WFRja*kbLA0 z?-awDg+|H9%#Pd3h2t?*EPFb2#tt={`6xpbIpkwx+$ux@VoX`7DK@6uDJfz}m6`7k zSJa`EI8u*w2N#ZBx-Y}$7c7IOat}(<`v)#bbiW$Yf9*9}R?>X~It}ARfMKkcH?BID zQc&JJ$BR|gHY%Vkh7O8byvREdF2 z8pY6H=F6HD=|vqFFVa3m6}vtg$JJ34((EDCazZwMJBKU_?{swGpzUa4m|IlcJVP<= z*TCs!j+H~g$yqrTZS%6HJU5HxzFFTE!y`e9a- ztg(`VzLm?0s)(C;$m33`~#W1XScx=$-B1h-v-6j^YGceuOQGe9v zwi=msbnS862yLsdE!2o8Q{Vy(dJ3UWTAkAj@QJ-}3Ss5g@n^!^5b`P5+*4j|bbZ=C zDITfJEIx^96N1fyk}a8xjVP+9{_v$)yq1pIrxzC(^Y)_MIBQ9SN2&OoN<%KsXjtp# zl-iSNYIsD!2QL@o)&CikKE=ab>He+qMjL$k{%K;o8dmhTuVxEHG1pRepKQ-^0n>#* zIbne#QyT13l^-EjF)EfiQ_Ut><6)0X7E}>CW}IL0Do=}fLrC!f|66FZ&v>@dc)s+$ zmdgJVl}mFgDt)nSuQajI!j7>Td!1ce6@MFZ5k^hx+=Eg0Y%U}Tu)%ba_$l55B%ZiLia@NS}zL8((%(zm~qYAZG;H&o2Ks0>#Y6j&& zsay#w<^!oJ{etfTSuq8)AO^>W~K;tO_(Xv zX*EyreA-yd^}h#YGy_sgwa>4WB04Cd+Swx6UuAaGNuSH_8okq_a$1h$fA3g9pD~2z z?qR;r#nJn+nTNd_7sHNv=kNPP1y&yRB3I<9*D0quFj6~^^%z~QQ-ciVpHdgESNt2T z+xczzox@%#?i{lai*kLPhD9Kw%PS5gF9V7iZ9x+|=gror+j`$_9raJo&z{@RR09Q$ zZiD04)PUQ92E1#x&YH+qoSmO-8mFp7Db5A;{%bRF1bJco6udr0pPxx9;f)LlmeL)TUxVH};slAH%8o!V2TidtUE zPXOPaACFoeFZMa)!V1zzI*kjS#pp~rml3WF0OiV@Ww`u8pDs(UmPu*L&p|ZKlk6|c zMUVq{ciFi}K$wGs9MIW$x6^1BfSrH&%^t_}p<_dd(fPX%t)qVLq9Iq6EZw)f84{$& ziuW65$E~wed9+H!8vqisTvMB;y^D6^sMTqmDI;SqoG8LDskzbboc4OBS1n}_g}cI4 zW+cx}d*}V``Nc0e!2GC7*aRUAS=)3Wk1R z$Cg_N+-db2?KH6E26HRFeA*W$jSSF<70nBvP8vNy#$tSMqwAcWxe8>z+c@jdg?@fk z0Gz8|g-@ChZ=Btt8J*jTCKC(1R?z9#m>qUjkXnB-XyR{F)pv@DM)kDqpU)T zF&5wnOq$@TWdykuWfB;L{-!E9S8MPUP=z3=1r%~5ilrb^gj_Ai$+##aAu<$KEt1e! zUPyr|B(!Sb44D-uawYP6A~jvgj*#<~g3WJ0wY<6@MENvq0jW++kV>fKM5Uqg;Gm;Ty&s~dNaaly;ty<=&V(esDElo!)$}mXEoq|C% z@PH_SVh3>w_VT8dfxNt`Wgzx*5c?U3gB-*GhhVPqE^jgb%#$AqkrDe#+***;QF}U)76|)cjtgN9UJkeFc|Nh99E-@{4QtoQXYA zj?eSUcc|BNn#=;myU9Sk$1AxCBc+=y&-&u3po~f4GR`NV%N3V{ICuEqZ+lDnmY%_P z`fIDv@3+n_8~ucH^p*?yZg~;%!Uc)oDPP4sNf{HJA# zogX(_7yXlWm+uA7ZKKf0-dLjBx@vWMtyHP92uQTB;@8vVr%`PtZcy&Ti_Edd%BeL0wm*PhTOuk z1*HzuQu!83qMxq~PYI?wzajIQ3C(&?1f74f9FN`z`~H!CV~5tv&RiWw z{qxb$`BkgiIBq>H_*+=$mc#(wwZa$=ADiGAfv zY@c5=l%Z%Hp=!(3X|r`MF8>>gwfM>VcyW0S|A+6k#n;b2bi+i;CTX^^Maa2AYx?JB zl#9Jcl_JHlMO|zg;rJ)GcdY1x#PJVrnW%yw13j-CT;Np>)TS9 zvGa?@KQGzTT*b_rKebIuHwwaqR%W5b`aTOM+D8VKVx*sm^_~uBqQkBYbh<9A@z->l zaFRwBjiaAW&yLv}hysUA*?0>=`-+d2X5rtNt68WMWRVg7wL~=@*%dPw(-{tjFl{b+x4c{K9%#@zkpMd<$~zVLSuOxvGeBlvgQpKL;u2IMKl zZF&~Y`Ivk^R^c0R~8iu<9$^o6(8DU>S_^0##O7^Z+&D3 zUl&?BbVbhlZsQoAA4T3uuSXbu!y3=IJ@N?J=#o8?)}{LeB^gy2!~tapNyL@N_~Lkz zjL{K>Ln>_Lt?%7|-qTSJnq= zWgtzyuSuksfeEA7kuZvdJC>ienQhDLtD@|#G^u65JhrNEj6p&~oPeCo*$5(xHT1Kv z)TIm|`XS#Y=wfyi*#5L6y5f6EKL{y{K9}`E2rYsUw4uwr9kO13APZatZ74Gat*pZd zOX@;dQ2H`kUB!`$q%9~n0iku3$`#r{RS zXXYIQp*?kO&BYqhTBj`kO5{)0YkeK@U_^X_(k+`x>FRLFq6^TqphJ($7xWhmRd>l8 zODa(})UZdwTae;cqe0yp>2SHG%eyDbC!v4}F!TyA^caQ?v3aBoJCvbTabdWw?XpfB zF-Hk>UkFur=D;QD+SX)MP+^A$&d@q!(}J@Xx(=N+^YbyWqd4?am~w$O1*Kul7vr4J zABKrfFYoR;<-JCc%hF_A$|NO<6@F>FMWv#+!TH%<30F1C$e#3_g&mPvy226rR96&f zv$XU&B3+tF=YNIXC73^y)*|H(ML0uYGeCXuaC0-^8HMe?RMwgY^GMl-rj)7Chf2CR zz4q~w9Pd-}^&Bke8K!t-z_Z-CViHPCFIZP1YyId% zKQaZ(g$j{VA*>NpPeCk_UC)l0S61|EgK>7(xo%}DQo8W`YQCViicCe^A<>t`CNEX1 zgc@Kt$Q&i8st%Z?#REhT(m0CTqYFI+d|)0~S_>GAl$UCRR963#}q&ELw8Gzc%G} z=(|;t%igidfc`Oxdx1GkE1KI%ofG<925R&iDRt5BGW57ONu)FJQW<(d=)}q>NA$a_ z1m7HKJ-Ls^l-Bi-Js_ldSYF z9h08nL`7qGc#ThMPUw47#6craejwULaNCS^x~Y2nN$%m{7`fFCJ3Ai?E;b>AOvA$u zhO@9{wlU|{K#19i$!yT0r|+=dOV+B4=ADFQ+L1Yu>VAmH*c&+Uu>LJ3 zA2MvkFPM@(br_HTEhfDzXfMlwxFQHyPX{lik>0WgXHSP)o|8Kcdt%D`m>HKb6M1%} z)pYod$>^yJ-&&ENMoiAdK&d!$qUmrMV_d_6Sc7oPa^9hoUris|WNWL3`vAh2|3n%C zNBH#tzSA`N{0lb>Ry-KPJ63={{=y0Sly9)mVF?+fWbhao<*gN3ylUlP3ck=J^C_{a_go~JbWDu$6FbLA= zsp>wmQC6NZ;Vzvd(L{DCU44{?DA!Wm1D#&n#0u*tbs?@95sJwcZ?!f^EA!H*3m`q))B6J7Rr(O#nKJ5}z@ zci^o}?jyc0O(%xr#$~c|0Fuj=*<&6tQ+M!harV~z3vlaDvnT9CVN6|TrAdV8#XLPr zAk5ns3S`V?uSoLDcD5p)HG8VG7UW@KEz>>Gh8=ljqx3NnjVz@Z<@K+59;{K|oh z-jONSVUh+5D=^3S2T7$F#=tlW^GN(cV{h{)R#*(k8#$XNKnbh)9Ry7^Z*1W7)O;6% zq^0Ib3>i9V20J^Q7!)#UdNvg4&zL9i&W=Kuxo!Sp4u$$M8^C{dL8Z@TD+ZM~n_nOy znC1&Da+j@X)3)mBO6pgY4&2s5Ki+5RC;OJF(|~+{0i)) z&EympBeZximofB=FD~l)Q6~1%!Gz3erGOx4t@#Zkp*6=bND^z#W8kg=%${%>0L+YQ zZ13!hG|DCzyrwpc$j67DufnC%_pCs4omwO;yG)W9#H{%&GJQJY(53<__VTC6*86|W-n_C!oZ59Y33C2IxOb*7=$Si?VJ)un;}zQNzG?m(?PW(GM~Jw zgJLygK6PJ*yt&RQh5~z_b_}Y&Mzdo~oRHauSgr`Dk@j|Ic9>F_lAAbjG&@EV_=S1s zdyr>~Zv`yvf6?q1Ax}_X5-*Bo$C%p-N6E|hOH6k}h~R?49wkL+zlwmft`K=Yo&ze} zE}EUkoH9aMH;e%*36OJVXj;_MBK-{ojtyD9ngUYk2ro+FH)Pe_R6kRO&C+&un$o8W zq`Xk2pjq$-#pCeOhP*Nw<#!mj<3wr(rxY2V;G8c?w3Y}VVG&-TMWRyX%R>M16vCpKg>ujman`Fu;NFxi~_@KA*Ul?}YM=2Ky# zryTQ)-bj+mzcJ20@B#Da`&;?C_3pS`;H9{%L*6g3spYUQL>@)^@NgXK8Qh86;<66U zdwVuHf}c;is1Qd1Mog42;(q+gI=}vNLGTfOxJ7=vC|%Rn;+^PLRktN$T2)PlTUE!F zC-0|{4@B~T4rBR_cB}aDMWH?ypmxyHvNNSz5)(`uc9=uuBt@qZm38Pk zNHIy`R5W=3ZK8i?388arDqfy7XeJKiHwsGdnYOQWpr=EN{o!cx!UR3n^vrx7*>Fbh`lfD@hWtDBGs)&` ztTuJmC`d0xS$Kg^0CJZEHE&ZFgag4Og>$`X&1vpco#iZ}m(7!hKsGn!r#qFby0%Vb zD9*Zz)2V;yRF>lTI+dRBw_VsQ;XHan;|jBLPOBfyl|HdkPzv9bT2KnxqfV?M}dtEu<)lk}u()maWkSA-nu7(t`Sdxnoc^L1eRS_zY3@bUcbj}gGT6786jVw50aJ^FrwYuEDHv5`ssQ~Rfh1K?GX6mun@|iT>nF^T zQaQE%bZFGeubNp)GTB90&D>8iktI;G4%DpuRMu-X>mZf&Lz0!4Atl*#a1#2gX8m1u z59N$%4jmKm?4V}Q5lO_n>YP{AGPxB|lk3zs7FP6ChunIc`m^lf6IRLTg{NHFvx~0y zUY=ch`Ad3s9f}Kkb|tDrGrI!Q-aXO_Pq~6;mtOuRkX?b}o4LZYmlUSiKc74y*u0`C?h^r(wNlzvT?zgGLV`fyE;TF!}uSpf| z$XvuVyMA+5zfR(lT#@!QE_5E=nTnxAX>jy8zN#q(AYhKYUOIW zqTklQ3S5KhU-r~E(;8+-Jwx7&`?NmJ0upUtc|)6kq5y5Kz#7v~HbVcq4O|mgBy>fB zqLOGfgl2bS&VjeWyi{8L9Rn8OggJC9uWjpVDtJSzSxTG$ywzDs?`+Ivp=79ziDt>` zk*`jakKt_`s$Xbn=%zM7eOg+} z#9;N1DNLm5A_-t3C!H)YN7hDWFi~qD>G~$d9T|xNWT8V`sem%-etI;xk{?MAQhk|G zX*%RF7$>^9%swEav6aZQ#V;jH*dMKM=|yvA8gHyq$+wjcCB7F{q2G&@^0tO1?~xzI z+VtU}vC!qh!5oj}1P>1#SC{Jub0RfI3FoCH(M6{uhJZLSqV1cYK26TPC2ZV1)K{NzQJ&!h=2zVC6lJcw0_>UF}-MJUiPg+3Q-Nejrj|DVN1c-v1vh;d7 z-XaV3Od}+eo5`~by=RwAo7~H{8X8OZ0;u$z{W4cN^Mp# za*}=IM`jfQ+gmQagckdn*kfyDR#O!w;)bFcH`P#t2_+#>Ft!tPH}_GZ@jL)1IR z!pUPF?BbS6>RJ&O?|91KC}O6HT{FHA&jv*L90oPk-`d+}F@ zXT^7dIQ5X70T-CW$f>{E{i7PQ;!sldSqhy71XfGG>b<0vL2pQpZ92g^x528yj8tJns<6QKTvCNTsX~iXVMVIYCRON?Dm1XojGt;R zbhQ%bkg?#OdT%j9IX zU#YB91rX>MmYM00JGEdQj-~n&Zjbk&zhKn~M?PAUS9a}(?nH;wq+REx>kc8r!X{S~ zoU(K*aMjq4w5DNsGuK8yg~`k1?`pNZri9QbUgX_y{4L+V}UOn znwL^+8nkg3(d?&PslW$ry+r#wwj+E^R~OmNP8ZFVQz+Onsk1~rV#mN>fpr;pvJkVCr@@m2Q|>o_e(?^`fAdeGIeAv}W#Qg^N$z%O0Owx(bymn}Al5ipqFYmvJz` z#!V`f^?E@Ar!fh0`MlK|@k4n;L%5EZcdxR}q&-@)Y>^`)QEasPM0Fg0Q5w+NYFN+DCfMM$4#s*L>>AuXP)F!x)8tdvyb zKDP*I^CX1@-6Eu+)3YG2L`#;O7>e(aGP)vdAr`ernDNCSz9&T|x5(^oIP%qeWy^@< zR&IZ(ISKt1sjDniS2H%S6&sq6&TQpRK#982-s`5bWwmYa9#icgU6!xR6KO!f>LW`? zEj=;=b={E>WEUM-fV$$y1U4);(udqyBQ3}-G_r!!DkE*U%s1UL_)VBJ7nMp%oIHj( zyRPu73MiKkz5y3xuCiLE9(_ZX*9~?%k=KpMn|^(gTsK-|JeW{%ZR-*KdqvXR;&fPF zB?%iCz*d?8j5dPB^w~ZQokG9-g05rKBr4>^r$gCdZK1I-5DmjA5Q#!~tZCNbskQUXZDI z14o0^Q%+;_2R7u>YY16-`Q8%Q@iH)dpnowGiRl7$uwZ(MEP3T-C4N)}2=axquDpNG z_4_er6v@2!kyCvRpX2iu75dC|^~H0Jj>B^4KE9nAw6&U@qN#J4f!)w-nColS;xW0W zioOwzY;M|IuF5|>U~OdrF$QR+ZBtdVY4d(9W$E-8D&pfcW@E_hUVQb7k1KYDCh(^# zE^f1wfj(7&TNl1l*;)i)q61=a<~L$8EMI!+QeLWYr0Cny3hl|L zAZvNUY`RKB;(tSErwNE8fK7;i>E3m~{3mNecMhc~0-l-`JP z_))2pXul=y^XW9Q5xJVr|N%yr0-Ru z3dzL$j=p1s#a*V&+f5)?u$-4K)-PZ1B}@Ojk}Kuqi_DTveX4ML1H_Zj#J-_`VXURW z_ZaqF_6HlC@{~+UIB0aK^nDyVjSmEZgG8+}Dv=P!bMCQ?QBdY4&h}HU2sbf*M!1Rj zGlFXaBYn|QyH6Q$1@pDeoxFuh7^6DaoM03kp}kGzC{uDjxbueQi4B7jduZNyFqnHo zbMCDnpoQPth?sdkxmPHN`HwXS6-D!2SqtXP+vw4qmf3Qza zR&B6XgS{FUKfnS1yH|q)Fn$>7a3H;NjkxnXZ3cl33+fS&`9kG3jnsE9ep}1fzoY_M zG~;D{KW%#wiL{#HBJ|v?vulz}VmO(eQR1Dn3k|rWuiy(=ADTlwJS^1un1$3LRUZTE z3Z@1%Guc7NJJu_7Vbx)&jdASUPzTlTt+B1?&{WeqPOz|owtZuxuJ*NXdR4#1Ie5n% zU1(oC9j>J#EGE;8?D&WpuhoG5r$R7SS&<#1dcC$)#k|Oldt)bx{E#Kq#I)QI)ahG! z+=*t)yq~N*xFQph$)JGpYPwC(PqP@8`u3aS`gU?P{Xn{d?IAjzQ-t#;l3ih7g>K=J z=g2aAfb!gmN}kV2sKJ~p$BwtO*N8Abc_+Ea(?yAT#BMStLO3c0!HLNUcT~2psa<0n zX*zR2Ew4CEEU!Wd0?;Dk_U-)PAu?8P=O}EV-#a^6Xxy^bjj8MVp*DZz#KtXN9&br# z-0tERNIWbNb633ZDpz<#vq@;Iu<%MLOcQmTrATj3cif!wiur&NmyVdE=kxG>;dt+9 zzyR|bdO(@UkF|Nfu2ZDa{~!HIREBw#xU+o^yN*qSRm?M_&mro!_XG1pT~0*RWjGO{ zX7(a;k%@$;>1(QYmD*eswGNIj-%Q;9(Md!u94&CDeU+BH+^$e#a}~dt#PwC2EYx#CMtC)es$mFNVcCp8it|9sTI5m_6Pk{(TsjlDBMth4vP)NF zj3zEusu{!;^1YZ$u0$Y)tHIr{zO4dnlaAmi0dvVVG*Dlpbwl-0qS*HAP%HEEp$u&_ zA}8B;RCkOUCvv{HHfe}o&@sL{p*_V@mo$>!)Ti#sJM1vW3=O`_(cX$5M2Bjc*`RRd zbHS$rR$vH;xj0G2S2a!~%Aiu~N(5X`7Xoa7cv z28ON|Qm}?HaP(cdkxNqN13fEKQLQ>LG7)V86#)4g3O3cwPKP@y&TiTiV}jgo5c+`~ z#*R&W3~L>|e$8z6$)(VQ?5K8RoO+;zmowG6a)nW@k2C2s!?jk(8OO-`Hu#rLj|tW? z-Y>C=@i2AevcMy>p)t|)`S z2eK{L`QtYqs9u=VY}rPwFDE8fgA-W=jnF$}UWa#foLEeNw4I0vl6WVkb5!pdzW2_a z`XL`a%>g!pcQA?JWWxb+$qo<-(?uvm)0oC~Sd3-8mcsX|Y=gFGd#;{r&Ne@4A8*h$ zbUEDSCUHzcNP11W#(3_ylh96XQg@^Z=oXw0{oR|Z`dy`>ue9sI-B2!Z)u^$HtBAig zF(b0g6j+I-aEZP|#$qsfWIVVWLWf9H^nmD4ha)>XT5r%9Dy%*;f-7MvjxodWZb9w` zjx{tR3kIPzG+he@mNhiT77Wgvq3K&Nh^(RMSTJy{p&42*7+XWrvS8p_L-X8G*v>ny z#+`O(HzxZ_r} zJuqtn44%`~V^@RlCyd?db%#4E3Vad<<6XOm$zg*qFGnn`dfl-aBzM;QR&909sdLIqZ@J9c5qa*gV7sZ+nI(t=ufzH(;R>64+ z#+MeX&HR4K3}my`198fey9aV_qbEKg+`@y-jSGa*EpW_$#`1CvhzMzGmJyjK4pKV% zR=Q~$Fku|#tlBmqnqC6p>t*T8fN|qkk|04G58c_A zq_=wY1ZyIdG(1q!@Q_Lx=&%z$t#Xd`-@}CR?adw#AfZp#6mQ&uk?1O+Njje^tEmzr7d^BL5ao}wcg=4>w9Cm z;=e!`7zkvLw&cGMbcNBxw_mMCiekBh<$i^iOFGyS%A-kybS7mP^yqvc=*hXlFc1@; zRnVNKqJJP9e}nJ}W;j_vbE=_#fL6npUSSwfQ9*pw&_Q&*q^=ssTVOso;uvVNy6DI( zFdLclmGZY{T^{z_FoQp+_~Jc$rgjx^(iW4VaiH0UfbF-`JlY?9Y|XGrVK+copZ& z%bl05yOrj7x!$NA$xyuY^U`s(d)cUW+U$A^k?YVGsmFDa#B;?$zJnUD@ZYdYCEUCA zj^n)FKeWC$5Gxkb*A(mb|CeTFtp8_V|DMAO+_z5byZw6`9XntCa`x?lhNn5j{_$C+ z+UB^j**G!@u@2z@>xaiDeL%o^Pzs3?y=hnK?RK-(EjO=ibd~~eRj+=#Xtp{wdJ-&} zW#@)rFk!b3kb~Z&Wt_Eq9?&R^tmdE=aWBKiH~$odAWXwU4r>59SH1c z6io45L5!vnypZkmtP1jSVp7lRjc%=e)~U7-oO-1e(5B5LO2^3(l96wKh`B*NKNcGx zVXioiql$hwS}x6$gQIS#)hgW_(i-a!jpxIWg$c?dF9+|T^lj%!eR{deM!S9t>#}^) zsRDyqP-PFG>|P^Qd{beeM)E-T4qwnkupoDOBkvs_2)If>#s~Oa)C*KD%QTF0te8kf z$)xT@vt6g$*){qU!zRWk(Fm4|Qj+!)P5Kb;!w0<&AC6cN?NyCkAof8+M!mFwb0q~~ zqc~5;fa%fF^lVh7&ur*~Si^t=S1!-ay0ucJYNKa(*3%5zh*hy)AMPsmB9O8tTCzhP6EcuGw7YXUD(-I%{&&(WS6@cgihH90Yk-peRQVu z27xK-t4Spv;T)OLYYk8i`Q+RuPDO~pBS7+~#IJp!)4g0i-sNE^yj-Pu)@*f4oldE8 z0wA`0KRtdk>^2>QqIcPkAn+kad?!l~d>nsP3~b z3T79dvRN+&u2-21BC>Q>N`07ZF{KdiyaLlXla6;_EsUIs7-oKq6X*5r)W0uyx!Pr; z(k&ewp}Uj5{BB>CJFQZsgYK?WB99U;Ggrls+#UC!vFG&$3d!9!_EEa#qhEn)t|6oEA?23fa*~Li--F@vF3Eg(7bJ;3&s_5<=%{gj!MA=)J zz{`FY6#;?2YOER17ua2jdrKhkOlCASsrlnSxjRwxCk6r)}TFEb=6@CZ3gsUMf z3-q&%!DTSP7F#aq6Sg7GxaBplj#@`)fK7unEuf1xeL3lw2C~T;$Wl-w8ZR!N>w`+u zIJ<>R-JiQ-Z;%m@Q3{z|RN+_{mDzT%V}tw84S5X3f7igL4ER4gy5KE+L#KT=SR9M>t^`aCJpYd^X^>*O!#NB?l@bcbMD*1@42CX8=d` z3rH;yy$W~OO}M&T(wplUzqqzEl*YJM$lc>Ts*t-U`tJjwe;RqxvCsR2JPyPncO*zxc)2RrY zrAvu=MMyMgdNGjLpKSC5XNFc@hdk%rNL3p((F>AaEj&a! zjeKlXa?@b^G75aIMI8ICx!}6JypG zuaABJy}NQAMJv;gX&NW2t$b3sNJE!W>Pf0tkCxK!92Iqs&+ol^zi%Ut@VWJJF4gXo zatO#X#$Yaoz_`bFGPK`g413|x@d%Ih>I{HF7oYT!PtGgodKGxI8R0a9eXbBK;XK*M zdJ>9%mF4nD+>Pi!(-DR)Jf?Kvk#+(8jY(Kwf)?bi0?!LfF|C3mUcjn4U6X#QD$oUp zOIy(b+Ezr%)Nq(}F>N;X-pW2ia2F!cLl5T24?_lfF@->-B8nqf3&7+Srh1h&wBp_ooSP_I{w*ij7j>4{nzwp z_(pC2Y~Q|{<41zT2+5RUx=BMM^?wtXZc-3kn-Z?R5NQ=-A}!-dMVD={L*S8? ztJv{#fQse0XXf%a=s!{&9gDI;pnh$mM~bY1p7d7z5Umn?pKOavMovQ9p)R*^aCVgv`YlLTTiMAY@xOdYPJk-~f*tj(zt^*i zf()__5^UpDnttogvL6rr{qf(Q{&n#0KeQY}O916jDo}H3dAZYS6`lmNKe9scyve!~ zV`fnbw;X2>d7n*IMln``o6#lThU8i*fhD2h((DbOt!n8g6;u<`iX_E1vvKAmDo6S)N|UHl5fFJa=$ zO{ogpe{0C1z7<@=mu?|gA@)2|2&ki3`tzBf*z`lZa7}g(VaL_1LriVW&a3dubRxJy z`h(67fR4>a-5sUDepp+8?;!5i*6GX<=`5Op`ZLqzCYh6WJ815>z=4}jFwFSw+#9(h2>;rh?H=yz7k+Q{XX9B^4uj_ihrf@Q zwzC8Saub#ykd4h%H0A_7By=@~T=FwbXaX#=eh2}-=ob6DJKN1>p;#;f zj1(y!0a|)^L9E?_0o7Ze+9i~?dsTxwvU+GPAGKzOX$S$L5Qf$++uXYvKhcFuRAcX@p~v;OxoJVa9($a1NbWqsLP*np9xDax`(Chjz)oR%v~&~Pr4Fr^ewnPMSd z>(+<2zwx24QJcgw_}CPOIvYB4M%FcI6ZsN5CeHkjrxk`m?O;q8UgsK(3CHBL34FvC z3w;5l9kY6ro1v)CS|idH4^mmka9WlDJJKG;J{Zz_Kky&}3Md(CcaL{&Z+8K|Su6H- z?F)1DCkFo}cMuvs*NUwjZ>sk6hx4c6m{T1VN_fjW#p} zs_uzl>uEPMt0#9#FE;|+Z!kWjX2p>n)3V0`mFW3a&xqToBl05Jaxh!gExrzusv89f z{NZQ~D3E^vMAdh6xaAV^Dv~Hu06sK_N!^Zuo}}B6(LIlD(J8!b!sBF*lNav!yqD(o zymw#RV%8we-(*T)J3t558oYU;4pJZ=Kt*O_4aoE z&#p~9bzeJkpgMD^7tyMMh_=RbB*5ukHfvo&`iFy>jaWMM=VxT@f0CJo4v)zH)3%Ys z->o+~)nlr6v8l*qJ%O@)(rjsUra;siT7y--fmo)-(8+WINnJJlIDKS}HxAA5TVr#q z4bJg)V{`oG;2gg-I>+mV=XlNd9H$S^u{lEJEjv(ty9ebryHH-+hw{2kl-Km49P37D z+kTX`=t$}9o|M*irL?v$rFESt#d?#?ChPA0(fv35uT{NLCI8*6{-F7f@E zVj-|^?PA)7fCg;Z643Guo1#r<1non36+bTj$wV4|7WinSk9PMX`%kOm;~L06=zseP z@{ew5U)-#$Yu5MuPqpQe|Nd~Gejn=@$3_nAmHr8Xkj?5=C2(2mvYQw4&AMx&Yu#Xw za+W}pYw|EXoJ)@h^q0r}K6-~Whl`jFK6bfW=+6S=4SkjO;h<(_LX<))t!Ru{Ibv_K z?4p&~|CH%@!kv&yh}(Yvjt{s4KOh+%R1^;~&mMWm@LOmua~Z)Ybnx*#6jsG@yS80; zyI-K?e9>%F8=ZrXiH@nv4+piBo~e8YMOf3V({%nFI27)P0#17EZY<*u_Hxn#1;`c? zDFgqIGM(dKbYMyLe9qbPxn$4x_6tyu@;=%-l1vkUlJbY~q=LzW$d;Mrlf9e=44i#9 zj~Cz9!};~Zrk*=JZdg~GzhR}pp#xG#Dq&($}0`E(&I0AER5Ym|3HRZw1a%=k^XTi6Dyi#ZwjG z@cnyqYQ{UvX4_WJM$A$+_lRF2>(>k4vn6FdpR7pY(R{=N1hzHVT9LM4OGZY)8wwp9HyAZ#10WzTJ)ta|I@i?^RY z6>q_QH(>=VyRYrVyW4wP7C&|J#naDgz=Zni>E50#23D7Mt|@kRdT(>z3)>g6i!y^! z%N`FZD^Re`$8l(&fP>!Gwi^XIHiBs|qW`x)*Z-gFytxa1t@A)lcAESvPFQ#{1;q)*w1C^@G^Mg0W88D~K9A8`tE+)zZ{`e)cyJu8s zqoX}%A8EpkE1ino$rzY(=Crhzdk)=c8&;$C-HCm-mdm`BB)wbdX@b?z(o|$`Em2(a zYxI_{Wenp9)Q^+;jLBuR9L{OJi^3PpA-A=1{hm24;uE?*Vu? zRipThv14Kpo2OBn+c<|Tdcx=j3(w{+-aX;(9HJuBa@{Wf+;JS4CF;9%IMYNK0})U1 zC!}^0H+%$HT@Ys2145=ZBj68?V$Fd3Ei;5@4&WJ1xP7>#Dju-0r2n_SS0Ag)i!z=s zF!SnOZ>$=E0T%l7D{N>j8J1GD*!D)6l9$ex9dDYlZ3aKysP%2)CR5wC?8|>w%RX#B zS|@+EO+MMOQPPC%jiyPbg0FW2YH!l2UQ|mRboYfC-Biv>=NF(tP(3=XqPrmlIj^@` zO_1I(*cE+~y?ert$L$Q!-QYp{?4H*zz<5sPj-r&@vpOW8y8*3Qd@VxtmB91WPiC^O z6?%bIjd(Mzsx5T)LO=LR|6P}UfhGaEdpBmk!CD^O&1nw*Xw#2l{_j%H`5bS%mSFQ4~-4%1VhtL*daSm5-f@&MXf_@dtI#UUK!GV6vUCR6}*GB~6Mc<%Kv zJT}B_V0)Uq&8t!R$n(CVR@wiK?rrAEEo?6jH}H`GxK z6E1na(JDlpk)68>)ey_3(U#V?)X@>>zBrzUCWC|r^Lxnk{6l1JyfGMhJZ#%g7)@`N+f>QGsH)2vSUps(5N=M<~dCW>=fE>AhVz-#sD6w)zq*o($R=uO28V;hn)8b-GRM4U!qB@et?&Z8{mo<7WHceD zXQD_*x$WW^P@y?PGbMr+!Q^sDJNf}1W-;n10Y%tYpprm|m5M6Pbq?-{E$j|nz!T0H z?=n4oyhwkDu`h`8B0CPIgC62tL=kMmALI}lD*fgSZy#L{M7UZD{NQgB1+07NFpA{U zi=aFoIeKGOcUwUlM1x_k68W-Wzy2WEEVOh}D=~pOuOUnzua^Cmx;$LE_2}f$lOxd= zA3r}8ANTg`DRHi;mFN$0SP@l8EjzQWN2;we75$sa{;}Ro37wlw1M~=uO+k>4p(xJd zf)+3&rQ`O499r8AO3K`!x4OvGt5c?swU6-j{hdW1a2U%V@nB^qGK}*kb!~h&N|Og{ zULmwOuxs94D&EkNt3_<99mjEf$e9qKq~i^(AKY^R>jZVt%3OR$IndWqE{*%d`4U(u z3qqq;j3_C`mk%Tp3^OKL%`+iiLJ*(LrLO}IRZ6L?2eP+s zZ-lXnc%7wD+K97#@{qdH_hA(@h`pLK#rQL=7Z!Wq$oxWOsoPRaEmSFXR%#6!(WmcN zi90V)GcTPK{m*G)jRSX(nfdAptJ)@I&|DkK^E0{G6beYzRLBZb=-1yGuylg<%Y$TM zWDi;Yt@Pd4v4?WI9*S{Wqi4PS380Nunx^@-2Z2QM-@Awk|D(>oRh&gIh`*w+KXU@4 z97&S)qqj-*BT(uT92+S0(|SVPCk}}d>Zjixe<$n7^b=6&4G=)2-`xCc>p!Ip#y+2e z{#(R(%S!T_Mm)v~Xs9>h-8_w(Sq$SAYNxSLMy(%?wpurvNbZNDUl@wD)b_*C-yDFX zz7pRCiOrQLW2==O7rC8 zi%*|F6`%I@?49r6J(`fi33#wl5-@OQ1=1oAf`Q_k2;f#=aD*HxK=z}cm1ICvSVn(} zj`oN%0ZNH3wh)|6Qv_$|I#p;!Ilfr&O%kx{Q~}tn5P+R30T>mraUocbP{~`$zU890 zN7#_x$re&2SrWs=1NFqI)+32qhdx`cj}9GAA?8b*e8PJsJO5tAZQgkVXJ@O|LdAP@|$`!r|CZDjT`eRx<*6w zRwpjTte5mAX|4qW-hkuEbL)Mo^r%bpxqTSqhKbAd!I7qP4#9lPvM{4`D2+Qs9$b3P zZM$H_ySiMS{^e|3x7qCJ=QIczFX)ykAf>f*tF~R+2yf$LW~FKd~w@(>2k8E|7#WnSy( z4wNeARD-iW>w!}VD3xL6d{M&obC(_^ThP}XYaX*RGr!|X56KqlN0m`DGnv7)7iU~w zdJqALJ-edlSa+2|8b1|HL$=~=@<_CHZes)#BnD>Fsg#ON9w>vcUu&S))KV}$%Txz= z9X>}binYijsyI+QCiS~mMexok%_0-01m9#-4rid1iYRr@{^escg(e#!$5UWEng8K8 zkGU;y=@Rtx&Yb)Mok^ZOf4@^(;N+c4?3hdc(GQ;ejImi*hj+~|EGed;2#m|tkPj-u z5$1qBFm=&)8CB9W_LXLNqo)fDH0_9~jaJ<8xaamCfj*??ST@qkc`e)d>y_KXrnUxY znQ7?I?HeY_r}nCNyGhUWlvy99A$Lw!sf}`OS1FdaI{@p>NKhI>xNm}wbRNnZTD2rq zBq{XJRHXO(OeIOlckSXcNwxD7Y(R!q_?l+MsS7%F!`>~9f_1j2XpOC`vh-dDAe4NK zQ<4TZT2lh`5Cj|1Se;X_vi=*~Bq+M3R#kla0KeXzV>?BOvg!ftR|YvU`k@~koW{HZu5jFd_7EweB&{dJ@xyc?5y9qAB| z4$0?u`Qi}jScl z0^s-dEh6+*rFLREPmO8hqX%OP<5pbX8e?)}XTjUFcr#w@%~lBthD1mchQyEukQfw` zCrm(|FeGt-0=RCCVW76<*R2HEqB6}gch~ZBvV|U#Ly8B-pO(#}#qAp>;Ml?^xuJ$%$DUVuJZTRgIA^$Bw$z=VO;iZV?Fca?CF=R%J5_30>yaQK zu#U~_!4a4fp*4eoda%XU?jMtBnm}935jZ#kPA{$Rue`&Cg&nx=UE^+)ITuTJF$zMT zF>$tXRGMauXAa+(r0<3?LDYZOf8842w7$1k!JEoz>vK%f)?RquYleV zdZw(F7GbW(T*fNyf`01^MzV8MX2Z@LxMgw8O(wS&!_0_nw_NW?Rky!)ACsfeq zqdz7oD@^yRk>~sRVTi&@T{wPxbKe zV-a(=B2=H9JbG3?D}*_2N?(-;4l!-2g+CL4>e@!n@|TzMSjf`Ybth#2p6yNGi7BiQ zn_k24_EApo_OVmmBww%pzIqEdRSX z)lJevbSf|S(iaF-8E!Mq07)Lf49l73?o)cx*JKty6&{4s5s<*nA|dJ1Re$%57@S%g zTz-XSE2Q|qn*?IZY}R_9UO%WVe=oGle1!vk9&(;#)gnk2rP?`9-2qAi%AgUg_ zFW=%-@$?g3fmR~XDj}@tufPFS&gGABd~6{wuk!=ZEExI?f5vXcdiIWWUM;Z22g1YCiL66Y>+wbz&PaqGDk%E-3jj zfQIQ?UI2V|QveJn@&fX9JtTJ`FCdS{DUdNQ`vUevgVo!0rKQtKM8-H;*9-yiq&2kO zkjcK6-YStl)P{L1? zj>c13X4j~$u5~Zw@?DN~0)!vZ0^n2|xmNW^B)>D0MKlPxgp7`g)GvCW<9L~`t~mU&p50p2 zb{m!x#O`Q+=v2B#*PVTEHYWSJp#U@NN-cJ~b+He6vD2-K{Q<@FU`H9~r&R6PZkT>z zgno8_=p6sd&=>`_85E7d6aII^|90K&meh0}rVrNCT{~D8SFKK^`>}j+ zakbyApUZ7Bd8^1lqR7ZyKLG2h>AqP;)w6co=6swM{O|de_}^##x5WRp_}>cu zd%^!6@xN#M?{z4DXT_w$>FM&t|p7e9~x(;N7W(K-5g{C~cI-x!~>pU1zSf1?5hAZob$*%}Vs zs^K73L;V+OIC!fD3b2;kzvG-|gOlZ&NtSh|wt_f&f#2;-)2Z^i=&c@b&aQmXsdO(J z&DJ^aGAZph0Yq~f>-h;eCTh(fVmN?K${CKmHSi$6oiQg>LSM0WY@Ui=6!MpQS zFw8^vqUK*B^fg!RDPZwtdNpxgsgc+&Xm0PWiv6)0MVWUY6A*^8J_$n0ex>4vE>n4K zxjYy+OB{vXRR4Z(eHKA{HNxb?^#@e8Xep7Hf?`va&02a%{G7S)G+eofOG0l^nvp=5 zVC?JJb1(9G<9I4W${-Q=LDmvIe>x*=0yti$p5K3fnAAJ_D_aACR(C`{Q=6_vA=Z9v zc=S%lfDmMl~aoKS&7_j5e zo2HHxT^zAtVhcteAxPOUI5aykE;Mz+kkI@Mqan(#9S91raSQ-r1p-lsa!plzEwXO0 z?1)i_k8-@chC5bzA8X7+aB55%(ob`%C`mS!s-Za!Fq zG4R~n9nZiKn$6qC_WKvudKN~$hzrSv!fXkrI=mrxu#3P(zd-n2gi+NR`6eC(oOxE%dn=VR@m}!<85&)l31uTjIz#ryrGJVt;Jn#Nhz~E@f%>sYBH$h% zVy7aj*&BQ0g_64+$JynLdEXm@L;Jxlo%+6-dKXNQ)I4|7=2;l8I~WdSI?)#p(yohq z8x5S4Wza`myEsv!BglCUB6PE8ZIc|KlIS3u@Jt&?umOg{9_kq6ra|O^TpJB?VL)8| zGwQoztV(IuEjuuukak7AOG>cM&s@UUsf3>GspdpRz|L~%ziGPv5WulAFKaF-=Or&_h6Z3 z*u!hc-<_E~Fx3t!N)Q?mhvm?>^VA&ndS3jGM6>3&e~{@1K{#NoI$HHurv*{uxbKqA@#LfV%Zp# zQ*%RG@Q|wQ8j@Hq6b{aeiVj38xR;&d=s_^~TCRCfphISM7&|1_cPBV>Bk<2S_wX~Q zz#z7FYuI`PF#=w+AKU>B3&#^Q4BZi^t?-m@6U3K&RCra>UU;RfWI=Dt3aJGx@^S75 zPi9M5r9ZD$E4!#oHGa;tu?2qyk#&$q2YEYw^8mmVRWaFO-N3Nv7Ur=Vt!VU$Ez6rp z1}_Nq2T>;Sj1@|WVl~`!mvS3|%@L*Av7U^h)4EdrO3bUT;QyR@2&!1 zC7N@CizT@vXv!FKfJ*^zxdx!^+?CMfJvyh!{aKO4w584Y#;T&j%od-1GVuM2X~evN zJO;h!0%q1HI%~|k9tPtv4jrKmW8JVTmrtDP-Hi-6>l=}|eAeK1Ap#f&yrud~TP7wG zTBTG4Vvv8RI!&UYYJwy8AHuH*=CmM;KL9CTti*ZA(YsG`Xx;Ej0QC&aw1uFW_xq+F z;RQ6sC-=pL5zK2rgeIba2i-6gM$}&}U9dw+y-nOuHAHr$H;S)xwZ<#UevQ)oPegc( z`(zjWu+c^ceqnhFj9#ub06onx{(-judAmLa_eO;@`)X}A9Wdt6IqE;S{s`})cghOk z#>p3NK39b*_Kh;!f%%7Jhw=bx&8qEs+sb+h|!6@ zbED9f-3Zgb3n>_di0*J&m}w&2}!<9t4Hal(?g!60s?=$;boG?y2o3);aGZ9t}hnT5O9()walYbU)T;cNI zBU|%MoFHX5Q6RZs zMy4~Oq7NW$7*d$zT%UOE*mI-9kA*x+8p#xW)|!#gsS!G7?8gp!mssm7ZAyN z2E<@K7r=Zb>vac%4Ykr-dRc)|iF&=E74R#L?9wHmz9foWzU1C7F3Dfc3s1CPUzoKf z?45u(m!#MWvHK{^=3eeD$-R`fu&)I%K()$Q0&Dj(T(1IhUwkIn>@#>?k^PslPX5IG zh5c1?b7I{fpTLHGJ!TAUFgd5leZS-Xg+`@ztua(3(*5ACo*z{|A=$tqK`Q3W|yf?=-^09MHetZAS z?!fv$XipY5>dE3J_cU|CaSr?7j}|xV>0|5?d~Nw=!mV{qAVEj{6Nt59bx`(+FneGy za%`}p#FP%PL1c^VCOH|jY|1P`Rq-^VzLYXN-*94Ag<;-1C#dK2G5no7W%Aw!r)no; z&kEo-xK#_uZ+-lG@3$(LCRXG}F{R1C8(!crnqnGC$P(`2s|5V#zR~Ptwi+wVn$#n7 zKiRKT4nl7r@fp*`+%A}zB7_gEppT>2N|Lkq3-h_stkEh|h~^}&B*u|YyvDH;#=)bsdNlUU(R|=#5VqzahrPww)r!_d2>`#gP@d-MI`kYJpZ;Af9 zAjmq}aU51+x%@_d51DK{l^>C>(7|NY|lCCUFy286~46GQC7g}YXy^H~mBRXXF zu`?4x0`EH3F)IS2b2pZ1BLR1hElK7(*qF9`eWhN9{ zj!BA!ivm=%EhLJ#g+!-rAra&)OyQJ`s*=PkB%7&OO1{PzYTcziCHgqGKz*Ehfq%HI zKbAKBa#GKY(?IqXj{iiz&sDe2^vDKw0A-scy%kM}^j7QhV z`-qW=U8&1>$=5AiSaqLC6xcO~h7r3Y;1UfyT!7yZ`kM$p&yC}Fgwzk3Px>{Opn?55Nh%Pr#WFEi0gEbn0?A-&Qtm~~ zD+)t6U^Isc=#R_RBsUCLKv7m4MSaV&0h<@qg3%!Z0IrkeI|IgH(&Uv3LBmi7RnZGH&x_y;E4z``KZo7ox#Q(hB%isH9uA4fI1Fj0 z3L?7`&`r+rES8Ce^p66%cnJJa0_q_K)h4b#aKk|YaLWEDY%h`5cgF%Qo1M}AylA-2 zUD9`_2~49{m2`Wq>)H_)J0!4lV^|unyT@s0K&Q_b*F(!yoq^mVH+sMW)s;ZQeL=O) zWYMvhHJ00+h8|Ik>#JHpTPAo`RZjQ<)K)8BlkgrAOx?b|T==&_g+tXmYmgHfIG`0N z73_4^j$#|FL5z6au%QOta5#%_YRd*WJn^E)n`3|!zfDk)YD=ykB+zcCWz~Jc*FRO} zp3+@1ai_9b6L*TR#s1QqjyPTErlex-}9oesPSKpijgXN#*@7prU>Xd*{fMc;k4W?pRgxqzh#KVHO-AM{5RJciABSVm=m zgcNRH_&ZEsfXOzS!`Gf6mi}lxO{mCE06|uDHpZd#-M0Y;#M-VJJ@}cH9lqZ$?4wC8 z#KSSY+3SQ-PehZP7pODe3qn>ZbSbr^FJpQ^JsqZT42-l`9^yk55D7@-NqU(8k~wr4 zr4)@Vpg>a1z#y3cCy_yFZDul~t9l8o5_RUd;>_7}plmvke)eF{f-lOd-RJ?HCKWB< z322fd0ddEvnR|oWh{Y9$&1euF`lTvT$Nw+)bCQenHo(Vkomjoq-*SI!H6XM3f89a( zGsH)Wr1JMx!9?1Ds12nI!u~&I9e!;@9>jswr|=wt$oY(X=xgYsl0Sy;*PcY2Py?=zeNptLb8MyRwKbIqz^C5{A~1K z)Gkwy_FL4hCnQUV+KmLWkU6>RJkk!uBw385Ya_@mKOGpu_(=g%hq2F>4EWTlCUQpYbf*Q`1=j;ZNu z8q+W?Bgy1sGaAPABqccwjlu87vQus@X%LAk%my^_E+Z~8ECLo^H!8unJFp}w9tgbw zj{2ba!;5GsYL}}tWI)uLtu&x|vt`0{9=!e|ogUBkCbLOeAqmq0HA+xtScAe{Y>8t3 z-t3{6dow8wk(l#XQoN|S($X87s8Y|{*ol-z7^6 zTBEETX(g5lsF+YHe(!LZdq;}g&Dz8$#nMt+CPpQmmMCo=y+n+ULMl>__FJ|jZIVcQ zW{5c*Bz+Em+ad(}Gs@%%d7t8_l6hu{l*2Th%a}Lcivkh`(-*F#3`RTAGuw+X06xDA%m9eKrO01l*s1>W3|Q@fPFr&flEt6$?X z8g^|jQfUIyFcrFZX#x?cr`ItRF(&kJBDQrpxrmCO`Rkf|zjzZ6lxnzBDUfC0=%E&j zE``abk9eYxN6VZ@Q=+=1?>f3Kl-Css;U5=*_y{j39#!ji;kBGlU;pQ&>+WTvUISld zGHyxZsNOhk+ePgbPH*50%ZpQmx6V=MPKv$|jF-nj|50edchHM*L8XPMqJR_Kb#mU| zzWAa)7LTlsjb5Aw_`?C57u4Al^mAeh`P-S<94ec?EH}^H>6EqQOhAHFgW>N#WOeO0 zP772qpn9I?NA$hw3@y9Zf$+(!uk^K|4$7`hwJ63%1f(mAP;_Sw6amQtYB`OLW)ZwfXT&p1W)udqX_N`E+ke1=+^&uC`t@3yFutIuL{=2%6Vivm#m$3PRcaqC zCyz=}Il0*STq?HI`}3tk)dzB3#MB60?ppWuA^cmogMU@f(zcUF=gy_T)Bb#3Y%4rR z&gEU3M){gqN2rC`=!`|U5CGqtqg=Ne42KaW=tr#9BSvHFL;j<1$A2(wlq)AMoAJ)c z7vFvUA)4_{(_nFa+`YR;U!1OWY!`XlgJZ|pWz(~}Txw~(AQ)rU-#xUTS@8UQm%n$8 z<+5$hdg&|o+ujutMQpop4DX7R$bN{SQp#NUds*Uc-^kh5at@4~11;yny^~j89}Tz< z8r&a7&POfhlacd>mh&$I_n!vbCk^i3M$W(V9+{o}Q_tGJck*_@I?jyHB;OxAYtMY$0ni@NdJ z4kJ}lyM$9fG=hqxYYW~5UhMSqyqoRgPF z*#0NEElW-wT{=?5rS$o-SW;WF9oz5KyVAXV2>%xD;9o^$&S5z^ZGq?f^HK3!;rZsY z@6PWNwopFjLucAk9YK_;O?pGqmMxZN2I#4n{Ja z7xbd-7pXSWg0_k?t3|IYv;{32iNl*RCH&YB?l5(ZQ=98o(c3~E@tO+xRnc7Pos@;y zF-U4vj+*lkRYjYfk9Gl!tk^Z`zySMG1N&14`>=+KWRnw5A-r0HvoQO zfRbeEP1PIm@lPGl#P~_?)F<96{$hBzHgb_-8#t)&B@|`)uAc$B>mJTb-H-qy;rcPI zL626n0kGyGe8hU`-{cfff&em}~1ekQULI6L=t5$+F2UMIvw z1=?2_BgSqQ`iS?aFc98cPE996#Ccuu@p*HeChd;B!9FKbDdMy)93(9_zdfAa5}KMz+Vm< zxgMfcuY3FN=0F0vp}H*HQ|aBD*^yK?Q`=((qKKQ2LilrjwaW z=6cY|el-Y5vj=Lvkxc84J$lt-ilWdTnoKY*J^8S**$NcW3jek2sGzX^9jQ1*uoaz%4oV&&Pyy>s&D z*b$n_UmT&Tj82?=INjN_5*@{h(Cel#K#$QE2>u*TqR5}9PChGj!}L`HVMw*J4@Oiw z`)qOO0@W6ne$RlE(boq#90B1fuhe3a{kkOFlJi(9oA^jMxv& ztd}JOa~y(bTS#D7su#8U*vEyPJhOrbX-g%Atq^50aVgAyP73=}YyR2sjljwaRF}ZI zyD6HnBH@cLk8oaN7V42AlR9BcrHboFVv-)dK?PSp%636nSx|^w&(C1yHCH8CyTG=+ z$NtFk@hOUduX;Q{R-M{fuVH`wc7d=sn_P1a|44ee$VE4&Z z1*nh){M7*Y*hSoM{yFBqt?sZw2fI`i-kD>ojusjmBfyYsA8KTn{>iX9{1GR>yynca zM;kA0mEIg)dNuF(vQZ8TvyO~7!CPKb>vG~pHo!pCd@*l5bY zzVJzbhF`O!V5*XQEaa|{(VZX<@nL5!Z#Dk z!ZwYZAtXdxn|ta^=qC*{a1K8`e;7DEUcoBkME{Z58bPm~xkJN6=sX%;G+8J@&)v>ccUz|GP zoDkC%qdq3B#cwBY;P7~@T1Fi*nj+LW&PC*9EXptTcBhM7BocYyI!#puLDEVP*e1#k zC~Hmq9Did(e>*{6emk*wv$WCOgan4#eii*bahmCUZ?5ZmbE|Gtz>B^wA<{cR(c<3G~+ph~v;_<>v^cJ}VTI62PBKHF=a?f@_r1LW9T-o$lN3y!OF4>8l zqb#Onto^TM8nVYh9|+(+I_aB-Dk;mM+~9$O;+|Z%?54D6cX`75-m0%7xwEp ziRD^P#93%vZBE^%8E(gC)g#VA0ns;N<^Ui8IZ%+Wu+)uj{aE*i399-WrDL#Pd&JDk zxl^#c?-AsNqZt+7+p$(q7CdFxwAv|%6|X!|P^+BgZK#|oYH3}EJ8K>OVf2%-eNG4f&b+zxoU1g?nk|$^Bik-mU0%M+%XfMCZd!Sxcvl2vC@&qJ zs@~c=t9mwT(H!Q=PUYCBDYCf3J1vth5*kWEu)zE#2+QN#jUKI!2mk)~?@#|a`1c>S zE!t<5jm42z+A7Q1$)lZpIJWfyOi;3>z&@g7i~>T0vc3qEvez57;&d76`fK8w;3+r7 zH_N177JEdr*aCiB`}nSZRP~R!_PeJ2zSe$6So^4GzuP*dN8|SzN4uKGGZY4I0aE9Z zZeXJmpF51zT$(&lMlUyo%a~7&n8cKca4FL@4o2&EE`IMl3nI9)qBCbld#~>kOL1;* zBjF72fFly3pM~RND!FTcuUu4jCPWysqb7W~(zY3u;oDacE>Hs!fI=0i6Hy(Lvp@=y zQ%43Sr-@8VP8o4bPD4{6Aux2?+{{ZcNkKoDjR)dQgQ=Aaa+wx(qrfj@cF}^;fEk$N z(%ZbMvmxsQA;v;HNz~tXl4uYc%|Mu;J?mmR@$fG!WmewOjlOA~tgFhdAq!hx3X669 zdQgWmr0Vt`EV<2__G=q3kFgtp>r5zRHSLv+7AXd~3Y6tk;6=__*xbPjyG=4meB_0= zpXB*a1AVn$>nfgF-2rdhtOqmVG`N*>Hrt3fCL=hUc)sfs%l@2))9JjgklIDY;)teN zWi%s9&encop11c^VX~q5!pU$PS3ZHFD;i-JI%H=}6OzR`vKXJu33k4c z_qPN_e1bpcmrFX_`@hQ(jHuXhHnke4j79`CQI}8J5TjG#OljG!=DmA}om;xbyTk^F zYl2Sc#M8GrYY6@}#1gXO(|l;LMFN)a)FG$75FnA>uzmvpvdz(gXG!ZhcUEsy+qPXW z5<9JWsd0Q(ZQC;Fe1qHBGp4RYoH7l+L-7_%hNG4earW7zKyOfq@ahGoHl`sdqQjK- z6a)}>tVjZM&zjAPSet2jyVI&)aMq|HE&ojf7tMO3!>eGn|Jm%i-t&%^K^%$)bm(bP zmtJn*np@|OY0{PFsn7^KPkcU&fJeLN7}IUQhQ=z9yJLL+JND5thF|td zU-e?Z+4Rd&YF2Lvnqbu6G(yfwQ!mR-j$<55FbQ95HH^(%cj7Jt9331LAvPtmu>X4= z23pc5I03YLR3dh9Z6lvC@0;p8&Cpr0FGL7w7VLeD-HW-rX(8-(9(?$qQpC3BkH+}I zjhJKPLyH5QV6-q8nVmeEL>xQfKtKE~fF69iAQRb%3|@-7aYBg4u9!`A3O5~ar{{cU zYpF@iSm5EHZlfyGEFIXW2|cAU{wo&VO0f|Q`;`%+(F1{_n|q!jAZn=dFPl2_0Av)* zY5w_47@YV$mg#@HEgDNXBrXb z>)njp7rzjTp0EuYm1*R$5#g)+3$ecH8DF9M)!dXut>9sH%Hn3p)>8@M1f(x2F-|%- zUy?Gs3p@&k!NiNO)o}h&K9RmMM}Orcn>r)*D<^a_lAv_p`M@2#SavpB=BhLRwt^l} z{V~VM+pi64AtlNn&GIHVm_gt7^Y%)d4yPxr?$iz4@feT05oL0_ycfH+;Gw=+b|Ha* z`{cXAF`s-BD*C#@+3c0cyN7{gzpCq=axWm$sh4feVxIWIkriac9a&9$8*#0c2#<$M ziG=}5*WGwLeAC+%ZK<1A?-J>`dU7 z@h}Lv=UVFpUKG%!c6Ka~P@zpfM4m~~b#Oi5!w=O{oCbqKQEn!55rem$2}ECV)@lGD zpE!iShNox`(I^2EXDIs6k$sqm7xWJ6!epy)S8~{w+#*bK@M+oF1+N=gUr`;s2e#!! zR{&fJ`U0>s^?36iyMvJUoMl4rin2hrWVt>Mj^>& zdo*HYCuqqxV`~Bm8BF)i9|nez&)y!A><}Tj9v*oHY=;H+bCW$;#lf-@lvkT5_gf=6BG&dGE)OK+>~D0sAo92X6fhNbmC5}%Qdv6 zG$c6GNeh+8(i!AZPv$Gz*7fTouTqsAJG2H)^-g@h-@iAOP=v|xIOw@!hU_Iy3&f&i zGYszWct|f^Pe;`=aXNP$RZW4ZT59(MzJ2MdAw4TZWLV9ZfgK{Lj4LnXMaQ5)Z8x0- zpPyzpz@fZF0mNDJ$X@6YQuF+=>b40^4X|~t7!LULT=Bvz&iPi#=z1&^oMSx`O+a`p`m?ZMH!KvRJR)Lnf&8)f z6=+77VCk6TesHT9d2gj1VGR00GUW@&s>7{ebKe-rg}#X$xUqr2+JaAcribtOqxSRx zQ(w^hCY#8T?7@Pv(ldg~M!sc3$C%IZSkYV`Lp$LGZAR9iosl>3CJIZ$0AkG38*^wQ z^9nN}wnn&S5EUJ43njs;1Hr2irz^cZ*U9G^Db_WL*MaQ2I=M%;@Z@;cA#%8>MDV_N zOS0M9H7ny*u8fYPj$5xHaS|+Y{ReM62(iBvsfME-Xf!7Znrp8>Q3{5;;Vi^i1=Z+h z6};yff`_7Ua)HVP+~R+R>NRatriy)W?TRuLN2)Vp8d(h{clc_ier2gMVkXZBOHb1o zq`C;8FPN4|-%?|l%(rMP6SSj(@yjUio7B|EGF*g?1A_!pk&`-j4x71DHDlY1I#d*g zf~gFxPPV%;wO`gGyjzyw;iC4@K6)L&bqG#XdQ4JXd+P1DOn@=7cB|K&E**g`8;|aT zJ05mvQ0`rOxm*jzAr3n}#Fv_Qe$5*b92UO%GRD`(SYW9zEy@=)!l0>b19)d&4_ft( z{mW5~qIGA@_*B zP~`%8ilZU@7;)h4PSH{{ksB5(S>q3P9KMt5r=*n)P>Q!Cobo{fN*jrn&ARx@CRc3air+`f}|O z%}am~QA=52-K5C%bc!sexZ&jKfygJg@%d}9p=K9O#=FKnoWCBF7QTtxxS=m z2v|*2N9+ztYZcEOzg`%gLEZ*VUN_a8Xx622t;#jZqqrK13uUExfg19Bqb_eE^fgt= zfvB%}KV9T}b6F{Xl=Wzd&SIVS`+6>6 zeFb9pkpns-BUI)tAsuTihFW26voYYX%cW7bEs+Q}QI3(nqwYGqF1|sHrirqJMGP72 zX+2*1CMPzaYEx&172pv`jTTU@B0p2=M7+BK!LKP=$KNQ-HwedZY6PAi*rd}F^NLNY z<2W-S{1(iBHULGf5qaMbX3~6K<)iI_tx~o}EBq;CM8I22jV=PW|1|SLskSo$ItM+Y zipO0_mQY!t*QzSY>yygoGH$r@CN+O(V#|Ft)8V=-m;xsE%w{c61TjrBiLBU0asbL~ zgERKSdFexUQ-^OxOjuThJL!3Jc1I6HbLS=Z6we2>6pHgA40<>QGlevO7*GP?1-?6G zb;JO*{4{VbkX&Dg0YK4c8j#c~Aj1GiM+(^r8&psVv73rfWYQrZ{qFvn{IgDFU%(u! zhdBV4DM&_AYoj?PNO})wzUsmQxSOYfg;cbV9UF2HaANw_c*EXKFG`QdH%rrp2tFn2 zDmC(q`Ae-OmK!TDT@O8#L%XgeW@Z9Br7?+o*nlyzRwEh(0aD6Dp*4-4dkCnh0LTRm zz_>Z*VzYuutTcgJ{?j*)N6ND5@QD8Yp* zOcB8gdZPwZ`lrn8fV!nmRK7?6T@~&6QP;oJ5-~JL*Kl~K$KD^f%acpr)6_w}a`uRd zDz@jWM#Pbp=`V?uSGY{Z@uv48WzwMuTdq9d2(9v)Y*|^dWi!V9l=+zPd1sy8*)cR% zdF-5ITFxVQ(q_69AL%{REJ)ZyfCzo3tireePpJDRwLw=FiqaKTN~+AlRX#1BVFVr2 zv|QRm=KBJJsH80C9}luwOAP*Uxn`(=jhSFm03+snh@JJ#T`t!(H7$oW6C@2o?Ga#z z`Ng)72dRTp?*n}{^Jc-~H;b$Pg8f=9L1*e*${voe18N)Rz?*vT_}eZr(GC;pz-{jc zvyg%`wo`AXpur`C?4x1E|#Xfpd0Nc00ug6N4hh15^B9mlB?EmfRnJ8-?E>H5*T<2W5H zm7nK3j&rM}GV%_cV~H9`+i{!;PGA-4wWkEgAQisY1@;%|1i_J%g58<15A?$1@rv>t z+QPmwiL5fJqlSnI>w#*?F;E?J<0*rp0d}x&a);;^19Ev)^@gC!KT{?v*cX?0Xf$BX zQ_OjaIS-tzH`sBUb~bCZ;jkXCY#RmMa(TYvILu7ee1sZlUM=iHE0Axk$v~y02P+^p zYOy~9Y-m--!FM5MwOx1hg~z(4`~;#a z3_{B~3u9fbxck7u9aAGTG3r(qC!2}UL}rGE49J=fEAdM)x-d(xdoSrtLo4u z-1Whm*cAxi2lsy<2-p&TMPmncK?2R*T_f}KNi3bz;)&8QmV63NQVRN}}m@JPu}|JJZ6HmetWMtkJL;(639-Elx(s>ymhwJesmGPM&H$M zpQGFwm-hfrMknYCdh_jm!Q5ezFgKfy19xCOqldtPm&{wbpiwzRx?E0+^UC>#b(m0j zO>kINgAuPbu>qM56D&fm%@kj(vDY$yOgx~)isc z)LNUH*uu=MrVrVG!4%19FJ4LOA6eO$s{2!mA94@Y91wADGBMX5TV(*ZkM{55cI!}BnajGJ8R&Y z$tT}pIoItzxKVXMaOk^Z*@&Gyf-KO5TLjmw9%h%)q139|oBo?z^)HgOLp8oy>?L05}bUxi`RrU7Pk~776W=Kn$C5 zP7<538oYF~TUX4~CrxnACqpk(M@?2G*AO@IQoB1c_mrP{s zg@vTr?epEaF>!oaMD0sfR%TW%Y}*d|-W`h)q7*cl_qwzS?(Wf%2i|)e>+!<7N2lHq z+V|e|s3V^j4th(UMLqy4JIk0epL<2URZfCfv{#K-5@*1R2GKwr-i6(ET!k4Dpqo{S0+9hCYfdm}J!V|#8XUTC|?J%h-i)lre?ADWJM>>$_b(?*fsXE zj08h5)B%B685jNJ_uRcUV0(1|_Hve~ zZ?emyD{JqqM}AzsyXvx^a5@~Tdv7z9Q&11S0U3^>tTs43KR55GcHiFH;)v9u%ILcJ zA+Y{g=jedTZGLhOQz}>3q8y+mwsrWKQ~_Jv-c;_&wNM2E|_n< z!#-7QUUA5c%LZo!^nehppqwW>-N77Ji&kB}eYQXut$>ll5$@el%Pl$#1}Ck9 z+<3Snt^M=!{ntN0kOv3d+2@D9o?o0EUcbJ0b$ETU|Ni>@yR)P7qn{72e{CEgiI+Hf zcqhFFfN5{_px~kEsB~nI|Gk^CAwGPUc0}Ptx-0;;Os3(kg z{!B|<>429TYHUutjA|b6X=Q6go7l20yGEjJOUhECY2cvSJf6Sx5 zVHJbOIQ{IaZhWka@%&+m#R%X0JtMq`(qI(f!K;Ui z^tWKNG&qMC>(MSCxuYGA-Mh_KYisXF+B-<2_iOX*+S(l%6CH=i;rcTO+Chq$!P={z zpwb2knnC1;p|Zo=LUE4)-9;JDQ8nVF-~(ou^Mz-T`akgDU*k)U509_k@4xtcZ4#8P~Kr5HkR zhO>vLZ{FEwAK$*d{{H>N_3L*hC;M*?&fv%U)2(J`88XHs8PVgUq-an|J6# zhBn9&t+I|IoW0V*#g!FxKx%uZ2M?mvX%ZRo2f&z=+W8uw`{xX&5HS5Hr*>w6{9y^>n}$x0(1)^Idj24L zmU%}ngi8B;msp4@DGyzTGJ}$?yazXXcVrFE@%`EC<_Ov(1gAnyzC+;Io0_N+ixPMl zj}(R-e2LN--Bd_F(D_2K2pa%Fhou|Hy#JtA^ba-Aq1vCTZ)m=U6*lwL^3BvXyai0C z{A^!6JvrQS5&9tAVZ8-TVDBpp6nK9Y_sK|;zTrm$V*vgUi73yVrPp9>ne5rp>39AFjF#7&-SzraJ?#Y7_t7zHhz* z7il(V<+G#*mh^zA^UU;BeBa)qd7oL{=dKHvJg@tP|9qg{FJ&E4)=~Z9{e-oH_15am zH23vGeyD!J#DreYVkZjn?n|T|d)J^&N5w|n`@EQF9 z`@lRR_yBwI__q(N?oqkyr&9EzH`_X(GLvH4t%K|R)6@NrRyS9nv@9U1DO?q2;3GIN z@9c}WBkl6NQFmx>-x2S#k?w9N1!?)j`Ls*HZve?nd{`ZI1 zKO7!?|HC<`5LFgD`|0TYHMzOZ;FWiAxzl&QoLQh4val5C`wS?u()r67AbyZ4*GioR z5@)NjxH1_Kp)4#0b0G#uiwe=H0Ldd&zwS%Hxp0y}Bdi+owW6H0QRTCi#6{9{??8MU zS?Hbk_zBzB*DBF&!GkKxJSb$Alb1l_UaK_bJ6uAaRtN+SPWOM&D&Hn$m1V5h$a8u> zM?2S9@8_t|um+%But~(b)g*hzf;;7KY2QE%f8N_s!i-$l><=+1t7xPN+hcE0K^QPNOMyih(pvDb-v zYbhwMIMkc|sslamTbh0Vs03VRR3%`5_x>`V{Dey(>5P`@p<|32{QQ@eU)Ub(mrazaeX= zW&hqY^czsI6qQ$B1ABKMsHvJ95(G5yrT|wQiLc&WKpou?6-Yr%uhg_?_nD)yy15zZ z)5&vsAGE#CO{ts@sF+Pv%ba46#6b1*RvXW2IkdtaJ%~-O~B%_7!@o zd~N`LZK2b^{O2==34^=A7$lz41ovt1jf)f;wX&Ku;<^?41N)y=^-?Rgesk_QGN{t` zkQzhQBAp6&!7fv(P&z2eOQ=vpQA^!Z`71~#lAjXpHOCKXrHb@&1%fN%{zyw@(x*yb zCPtCO@JrRs%0)pw$+-JX;m46QKs^;-UlaM`^}*rK=kMMfpIu*5zs1FL5^o1|rin)f z6C{|gXK5Bs=yxr?A>nmv=y8BEKM1=p#JOe7LBigT<75y-KFCAU3{RvI*7iNZVR2iyLkP>HOp+XPsrL}ze#bD($P{_mCZT&G4Wj7-0by3KTVAvCsdW5X@4goR+MXe;z zWn-Gzlr8!9T8_w|%W>dOh;20wtv;aNZ+uu^&vrU$VKOJae4pcZayG?y;JIoU;>iVz zQVIFg%6-BQr^QrS`@J8Ds#8DGN~HY+hxfenmK@%B{F?44pB?cp z%m!FUqSafX#ngK|K74cDt?egCe0Pk8Sq)vhXP+0-8af4XhJBv`l~qHp-kqPnJ7H-D z@m*A7h;|asQv7O`We~)dwtF1d6ynjz(ZRv-AtaE4z#2Xd?DzX`=RAo0tUt!7_Xub2 zwWxXi%RBfICu**Ow&N)uc0Y_G%)KphYZF$4`qvVvdRbUWy&R;_yz41?io)rX29(%PatNQ26&sYW1;-+n2(NAM}rY4xfAX3A0 zkc%A4Qfe}@Do>{H+1ddW=3=aUa`nEAOp@JPtv^?K?vPnO#7*@*xo zP10{OE#oj6lqJi~Ls})n1yx!%Np2C43^&S~`ld#N598zU;*+d+@r&UhkTkK^cYW4tmR=xzB zP4B~GL5Yj0hf7;v*Zv8PW?ooY;shrC%NXO(OG^vaG{5_A{4CB1`9Vh!O^T%1}CeuaR=~HD}f>OIQ5CU;O+}| zUTg`dhd9pOLO?I8q}@;WL0zA+-Bo&UP~V>di_m@HlypWzZIjDrpC0&H6i2u=9|URj z#+8OleE!}oY6fy@WoY1e&CI4NLBOIWo&iYZVNVt=Ag4G{Y zvXtuCtE-hGN|ge+zw6fn)5YWO04%zFdaO$>~wacuj>h>4*VslZA!woKF*A3!`p1q6{m6o-vZh0G}sk>&>NUinOp3*~k zv)$z#m+gWadQq$*=Telel(kjT!^HoD&-|e{#JWs{xO-D^kv|v^pY;QJz|0(*h{~Wb zS3h6JQW<`E{;4EO&+Lc(WJ;BG%`%}>sYpt1LJWYlParvAhLQ!b3&#otrtj%VMPz0E zR;>I=CsaVj*gu$wxSz|5YB5}k;71Gf{&F{Uh4Hsg;`uKsx&ph86U;H}8PCl(y98y6 z7;3n9iIUwBD4Q*A7{{OXvy#iU1XRrhnAUTf%aN_btBZ;Y*v*^SmDRC|_?Y$rH$7;~ z@>^PIR%Tgfb)ckS2z(m%k%O}U(f2q>rsTl6(yB7L?*qo0ikd z6HmPYHB~^)un$GF{F@LrDwWsOCAC(g#u5))=@iCA2i#w6+Wm@Yms6F1ko)vx#>@B1 zS7C|nn{NOA%l_%xqqpC8jd#gS!1=4x{v$PTL_#v-1P{Qze-?d;;=71P$Ao7fqiMiw zL64bYZ{ZjK9*)ao<~={hG!!N9+V#fIUDLIwXBjwP0$?@xqn=Uy9d`zW}kuMk#g+Bi#HTBK12XSVqZClpPcayy(sJ3g~2%?($_1ljIuj6Ux zM}9&C1G#RHhNwTLGE5n9N@(7MS_#Xto_)OifA7KcOHLezr{(7re5>htt>hn2c+QCk7$z!TaS{w zqY(T$4ri0d#6$xF=W$&#D^f0uf+Ouh@6c-1+b1E}D!X*8uDN79{UlCP@n)u@p%XZ| z#W61#G9578D8}DP>CiK1s&uiSBP|L#7$c&RVo9BXO6Kc`ei+}b3w?%lcUvVO$zHbV zSv^^YM^JEt^#j$PE4wO0wTr3Qs^gU^aTC79xO&gjhm_T|DI~-iRJ(idFtgSRsF;uE z7orWgYz|oOC5xw8A2)H9#ghfSRL|P#nqQTWnfg(YdQmh8Tx(9r<##iA+^gYkIX}9m z+&=4G_LZkYhPqCuvx-@_#@wom?mxPMNE~pr!fd#y6)FoO;=|Wyr!9~ z$5y@7a7&-b31Pa3(QvH_HbY{*{LRli6+&P|Yo3=~h^x6k+3_+(>Q3ZjmNmZ~`_Ul8 z;$@j$)$)E+v>NE-7*6;V@n0W{jU2$D$TrG>pwQ5-RzZPb^)BE0^5_T+iq)#aYhwAd z52Hb46Gbf!*h1~vm8}$2L<%fYUaQK|)e@Eawjh#!h3mz^+^=H|ed`0hn3mUiSXhfL zsw5xf1oMym`Sr~~1Xo2_wz^U|rMS4fjRMe=RDRfH0$b(w;O`g;F||9Pk}wB!uW~*eGt5)cR|)4!=U2< zP}DxB89^=4zIflw?0%MnKjDX`r_7$<%x6E-aWI5;*u8>Arv5~yoNHYjb3K1wYNx!b z6Iw!+>PKc#6VpPV2HLwxu>Yx-n*!65{0h@(e)V}YpED7n$@y2Op<(B*G>`lwfa$BA z2GuzID)ac-8`4}nlQ|g0W?)zj0u$zoGp|%84x3c1lQ%i%ON9m^;~_oIbFC`sX6lbH z;1c-zQG09Rs-+{Go#B2Q4c_Z&jKD-kp53YQRvOs82l`VceQaR+!RnRw9ih~k7w5z9 z{R)%GQ9b{@nP?qXOhXU=&lv*iz6o@6%Dz4}fsRh73?Th8$;_x8HPU*@N0Xx-9h6uV z!%?qN$+&PBt(pNU2kG*CtLQmLZhl$k`bn)k2ig#HTDKag^aCPkjB22YR@l*01F8ss zD$#%{${!Eja|*lo|5My5#a-CfXJLv}w)Ahn6TDl3CH_A^ofa1P-;BrjdI1(I;fY9& zkdWuB6j>}kMIw>!NB1ig>qidA13U90=F z99zqyQ{L@!aCKGBm8e?7$Mb7{zyV0%@%S;Gg3me@Hx?&H0Gw2@Q>j8d%NgZ%7MDup zE8$`SJWSx7Qk2mHmlFkia*3}zPaQ{opy@OW`j|XcaEGJw>mWT({Qf71$|i^V^~ON^ zdEu}Q;V~?Nsxb%b)LK^A|EL6I)3TFm$_3b;t^Dh2CsT0aPTNrrJEsw*SbK;5X{!a_QTv_ zM_2AxM0SkCt>yS2uy2T+tlSf?U_wjeF8VCWN>RgF9hH=oBjOKMY(PZ_-3(m0b5LSq z;TF1Ge$goJSOCuYyHx3GN08qS(x5s-VHXU&1X3guNRdn+L^6_&m(QO|M*?I_VH{vR zOo)2DL1r$!v`t2x6q=<|nd|cd+y5_^+*cY)$t?fcvgH7$XwD&%UgT{i^y8Yw3N{N0 z*o-v6U{TDc`}{>x$jQJ`VUNS(vjJREw1o!QWZf;kt$~+3# z@7^A={MW%3K~zDOR5&B5M-UY_UI)(v4qa?k(a-z+x4oq&Qo9n$mgW4HcXC;z$C8S3 z!S?PsGZ4IL#WX~pxfRoVrK~cXmA6l2V;2re+sUPi{MGSdyy7v)VN1;~&GR8#!D<(X#Xq2q$WOj#sI!DAm+s>6(d;yQxZEk0hop3F$CL@zn1J*#l2>=W_%;S@1n=p!@r`-+uGWt)Dyu(a5;P z{g!ciaoZz_AcvXwL1bFSBP4utdvR-c#_YBSAEWS^b1#NxYea ztB~Q^j$x6$=D(w1;*Ve{)p4=O8N)F4GlNZ~r{>U@XG!b8;M4CtXF|BY0RbCvXm~tu zW9z^aZ6T-&L!|S4llU|=wc+u>7QgS4L2*(qgB@ed9Q86AGZ!lAx z=7`42#7}PD%7MgBqgo ze$wtcs<8=pa}=52%*bY0mPCx&cy#2K+3IH=1!cCLFz2v0Oh3$g>dooCZ)%f~K!7lc z*tYS`FZB($$}d(vp9M#cWYj;Udu83#0hD2iJu}OPa5bs(VYNL0y=c}btDl0jk0b1{rv<8I z?O_e)7ICu6otIL7XD{5`UJFwT&6Ooeyo?f5y@Z8<0#{8C2Ry~uiJyKlAvn9tBat^M z@U0zUQFW1Ctitb5ZPR&7^djsMpgp%XOmUzMGn< zeR}x*c>nbwD*07W?aeIeo2k8j{LB8wGvuR<*2|5Tn_I1yor($sc);AVG*?-Q5-=|Z zTPUhxXaWu@FqE~0zqqXh8|W_F!1B$ffZ;3v8fVE`xr?{v@WaLaF>;sh41s{34iDcW z?a$Jk;zxEmsyec{^Qs<0?VcqkYspj>l%fFciUCbVMa025v4pv4_QZ=Mc*#BmgFSlY z--~Y(6zW8PX{o3Kr3k@BUpBeM0kMb>mJy7FBT6a4NCMHewrOp zmW#J3)gZEl%M~G5A6%~e;Hbz+Rc2t@OuzxK0MYR=t(@u`M=?a6 zpx!;)#nB5_sE>fp*ug0khE@KsPpNe4MDLcewvWV-ym*Ke_$|L4DaAqiQIM6GNwv)nT3mY7uw z#CMFo}r5Xb`sAOO+H7=g&*Z zxYfSky9K*iWMHr3a3DE$LYw$mB`+(u_nz__?jf@Ih&x=$O+os(Vb>3texVpzkmr>) zY~`0m@u)*?2a#cxOqQXSe4)N7zu=9KWi~C#$}hd_G4Tq;l@4f1uCmq~-6;~ZCR0+( zGVZfXt^>p9YAmj&wf3drnWemO#TJw!}&PD={ODt^8Ey*lQ_=C!~uko%HGe&97Sv7WSNd7vft^iG0xX{jrn&! z$CN#~$lP1pZyV}z^a?LI`f3#OOE#cbNZE(K<;@2Q)1F|R$&iTYKdo%vKYZq;NRvu< z8^dF3tFD5bjBZeF=6W|ifW6_diKQ8ynq@12$`Xx+x*o_7Gsrz#O@ez<9V();L9BDW z{rnm0mtf(ohtm8dmnBrMS9@FF<6pM zzFVD5)aq;&P?5*aoZ`q(z46l@;w1PSN0}cA_Fl{X87CPDQNeSglVF;99qtbYOg<8D zcVXrRZQrlAh{L(+5)bPwt4MdfN~oZRN_P_Et74jp(m657MU-Gad=(Odjx@Dz5*j>Z zS?yflHkG>^dQNY+BUhj|lpN)>e6YRgl3|T&jUk#Y=zZaSQDMfEbIh}fLCls6;uZ!m zd)^>8P|zXFETjQKQrLKZy~SVcWAA!I_k0|T#xR15!qZrse;UgdwM$MsdmKtDYAD!% zm9!mKe|YYeg-sth^~Rh!cB=XfFh9Ov*S;;#$cw-^m*)b=#%zHsTsFCc<~FXEVW>L)nLl;|J} zw2c-C1{f2@a;WTqmA~=RfI9i@r)8QEG-!ns&Tu50c}_3eS$Nko8B)fvb49t!>`IDi zddu1u*Z9KL#ktekt|Fxt_Fi$PZKfAw4I*(x9=B3EQ<)nL-mo(nkmNa)lcy zRa5W+qIRjoklw+`vR%%J4i`{poxr(o$+32zyD71hPL2|cG5s^=!;=caVn6+jv+1M_HX$w&m$t%AZG z>+ezmjjD0=a>;+mO{dG~Nszd57F$vOxReewBG2hXJ6SJkG%QRxb-Vp?`{f38Mvd>M zX4CG}qk6P%X7$Xn)-&PVoKxytmH6?e!_&8i$JeL(2S*oY-E6K{R;XA)e<@&8gDUX9 z%}l$4><$S1`5CXsANjL14gBbJjEBRZ4^ACYUKAIe28#0SZ@$S3xWD-(Z>I4zUk0GH zlBa=x1W`Yn4Y0A(k0+Bj+NA?49d7XnL0w$E45`UhxFkocuAWC_>19iMscrEUm5-M# zAZ_A~JT9NjCWcquoO8uin7(+>^GwSt?+WVt*xLd;1sHYN0c!@p+6bb|2n^3~dq!aF z7}}5_snIaRIN3n&4Uf(mtb4VbyQ-lFeCXehrJUVT-}8niSJkNVwKwXTW1-S7;PkEp@hwP1aDVY!nH&uH0>k~bG;M13V8@GrYq7Y&f3 zAWp)Z7<80~+k|CD0n5C-IJrJKdY?lus?1GCFsjh3GN)acvr(DT$>%87xbm#2N^?qT z$lJ9fliumoZ=L_$BD7Uem%42$lxeL{roBR$jTOpt%8;VA$(04@wpC^`V7TOvd{scr zZ6gO8YT0ikb_#JaeI=VT=?x!5thXTzSEeK7NdQ)Dv;tsByJa+4Nd_J4uzu9LU|wKtg&YauoD~>9o=eOp zg(>pwNKp+Z_XhxeyS1Mr{)4%R+ZHng(9&DDU2o?_Y%Sa-vNfRyOhs0HG>9jr#Ur-V zTPS8RfckN2vPdqxRMQ1L+fB!5=#@7dr8UpGb3N+l(BJf)j zX^A3GGq%L*gVt#e(+=%Ur_rz5tq#Jx1D53Sq}G*ZZ?RHyt}h9zHpRVYq4DV$M4w=0 znlDC(6Hx|3nI2b@BZdKi`IrJT;M$uAe(Yx%j%FmD6WDaq%a7fbAcWVX^ukcv-pon! z6`}uJXI}!UNGU+)o>;M~u=CTnm)SRd|I>&FD!FzT6( zPga8Hp1_Z3e20_w2_E7EM}6F_fjFJ(`?IQwSZA2)@d2=P@6b(}mj^i$f z2JxLez_&pk%K~64j37!$girh_3F7%V)DsTxr*S$4V@^Nrv^3jcX>W~`5&w4`}L>H6PCT>$w?@zGIlqq*|Do@v8BV%G zMBJ}+rznI~PrHx)IVqc}rZ0?k~E6wJiCIQrvr>7Ub1y^1W&2Uc-oSj>p1Xd>&tHZ*b7SK{XwW;8) zj?vhQ7cEY|d~w7K*o}|M3-NIAut?*=B1MZANvux3S*u4p^P61ts4!>%`Z|dSTDp-No%`J9{&Y5*mf*+XDvgQ1zE z41E|v(<<=X);7w#LEN9w@HGjB01K2vHfw!9y7l1(%cw1(7odz85PE^MnpG`AYpp?z zLKBwV5fD1ZNOT;50Xpdmgg}1yJ-jp$SCi{41pjvs{}q643yB_2*tWAQo|+D-C8HbP zY;`)wkpFP0D zT5l0%fZc()ds8(%PrU3hy+Xd{He2;{-He*<)01m)c@t^RZTfW|E<&;W^>iJhzSnjd z5k#>Vvr8bB0;15W_mN-kqga9wqydK+q_4r9S+ce^R`3%lA>$G|7$A<+<xD) zpfR`&P+fG1>hnVBoY|z^X@C)3h9f9nZ=u9{6JBOEm?>O6J=OlP{pw|Bzf(gbYDYSo zP7|EMt$t0y!0zoi)-HJHAq;t9rpVny?j|P}f|*I*q`8GzVj(;UsQ18P(osaHt?Z%e z?>Sw&tqslYpd_A+#t}}_uH8o9G&-aoZk342-?LkVcDCklD>J`oF$y)#n#3)^7V6t1 zG%n%r=v5U#;w;6Ov?>znlm z(SKbF4U5Y)R8}TPzYpU(7?H9@Yy}vuk}EJQtiaF`5{S$uI11v>k+q$9$_W7ZHpO1% z6xIHLTX=iu)Wpp&D-KdgdT4klgy^+9Xr>MQ7&^?29mV8bx65kG^CO!2*o{O}EYq}{fIN~eSLsfzPU*^Q zvX#MfWg@mRDTd@&0ra&5AGAn$@!Ew(r47X`V8`x%BVR`?^hvk z;!2nK*z!7V3vt(4-sXmofOD#5cLQ8cro?@agW6kGqh{N7t(*0jQnjF@xz{eh@0s{n&AmDUWGyQ>BR4!k?%Kglp!PaqqLdgBpB8Z^#Qpb z2BXNU^$9h@6JPl$4uc4LwMj4-gc#D(u|J6KsLcjt2pnXv|Lko`7J=tSZ&Q3yy_#P= zCztZkYoSzO9x(fYeKiw4;dQxyz$K|K17RPY5d0hyq4D&5xBSZ8(hXdS?`d;R4ZS4~ zh72G=1r53_1UC^pV9uF1n&V{70n^*24-YsAj)YVfWXd4tlE;SLTX`o`8Yf>Yt+Ap# zC7<5qds*Q!?P`U{t+{6wi=j-rbCpW;PPMu@Q8);r^Nq~s*4&SRiBHcdkgp&|2bUh4 zq>n4{BRwTew-@hvPA_gY`O<_{RW9SJUT71nA|!b1eHR|(Sk`)ID+mYnZtUHKK)(e; zGbH%0Z~^L4z_A66m`G#0UWX5BD0|{vH9OWifsUycl50f_x;GWK;;?RS2!rF$RuBQ~ zF%!;SeX~C9v5FGrW@tv7jSWpPh7D)YAT}Ipy+t$tLVAl8Z{}g$emNJ-ZSok|CA-4> zoy9PO+#crdtz{dSEC1!Y=QeLfW*?|veV;;Gy8`QDSb@_0RY=!ieY3dcQ#2(GsKqX6 zUXpt=zL0g#ez}Emd#z@6P}LqlZd-ztHcc+vrnrO>Gz?TVDqQ41|K&NPa{%8857Q_& zHzmhR@=y$BIO2gT(HhaqDUJAEVFlDye65vS!JJ_kCso+XLTCp(vKJ@eia8n?SIjOv zWGH!g_*RZW;Vft*&$5G{7XI>65ZaP(YM2@#X{vcvonSjOEYf>qvc2Kj+OTj!#tL(n zCz5HkU}#SH#Ae>OzS)}=u~rp)7Z*)MG^!Nw3}@!0ZQE4{YT{4L*xQZCzVUMTtt&00 zb+4A-f-JsN{0=8F2zrmF_SgrZkxnW1J&=h;19R%_PVE4q9)9eZ1i zD?Ib;cB8LJf7F?o_O_n8Wx>p}iIsISo6pM*@H2Lzgq*6{i%1eO1E%P59@8Tu*A?#c zl4X5*DqXofw>#e1aQ5t%-SN&g{H>dA(;Sn_dBd@~PH)I>f`(^Ko8k+WhiZW{W?hJ> z^Y4uuJjLrt-f11Z3W{nC)R+|ftm!1(-U_M=CWvW;{sJ$dD=et3zJ<%oOgu9!*5eYB zwDMj7S8v7Md|mmWiV^4Tc5=u-q^sxOyS!4gR_@f-0kFGt1e;oC_%M>M7OiDb32SRW^ zn#2>Te`NZcLkbfvFMjE^+ij;+#dL|A%x-lW5q~`ebER!-p@@_6RO2beKge5F#6qOKH?_vk1i@h&6bt5f`fSBZ*sODwjgE3eyP z`ESS<2j2C2VR3P?+~Q;Ti&rBshN{0bR_vuMVrlWymYi*60?xoh;>g7%fwhHt0iYvf`b*ZED15GvXaD6u~?Z^w}C zqS(GivHgHznqDgR>GRG6?b8<=Zd$iDJ1FAhXOv^FWI-ra+yceTx1{y4R|){jwkub@ ze8H(4v-fq(KfD_agjNsO+yuZ$K>^!>paho$pCFW8A5}|+DRI@DH=bz|;~A8e=19dr-*bBYP8+v-exqSUmp<5{ zlso~txQ$3I7^W=DZ&l`}m;P1GT*tLLJ-p0xB_gIP`C=eF7e&Z*qN)6Y^99Jc1i7gW{YKlh0=B*^GkPFH%>|w9vUNe(ih`$-9rSniB=8s69F$=CMd*>$PY`AfPli0Yt?P1 z#a8%NUhr2@5cH2oK?lS>p!bgR7eVe8kTWc~wR0t^Ztu$3FDX}Sk0brp3#of+{ZDr#HTrQBQInE4 zp${^bd_^!15myp*x=+I6z@((xVk&V`Cdya?uAqVfp*4lMiVzy$zW>lo#Y^{@SPhj| zO*tYC~r{~k2#rYU2)}3RkK1DtsPoW6>R*JM(5vVz|>eG3;49z73&E<^bhMoTQ;upCO-*r%;5Q zDqciANmEFUFUL7b@#`M0Lb34-Q#}z;E>~rLXl$^P@t1)2sK>OS z9|Cs1AWT4$b_ulEhCEhgWY!{uw82+Lnwm$G3j1@1|ez&+(4D+TV+N{ce*SHRCcgaIh5KrAdUb2OtW2aXj| z4<7TVD2z`@S~nCaMj=Z~L6(?GSz=Nw%mVKvw&<+sB{m@_k&?LMIc2md6V|0n&xMF~ z=h7+ch*&cyT4%nDpC?s)d$D-Cr9$9@`oC2BuiI@4#U*dNLV#J4sWxEE=eZ?QsiS2p zrj!*6=8tfrfym!oKx2=}CNtq^VheZ$h3DxaHc8E{;9k${w8vNBe^keS+rNTUv9DVk39XO zp8gw8|Ba_t>3oJ>*{b)#GV!?EBwM{sZmiG-wCCBIATg)uEyuC)Ag15_%YaNPT?%HP zGY^>X-vMj-*#Fa@ZR$C_serbrgtjS%wyA)&sf4yEhqkGJwyA`+DTlVHfVQcGwkZ5HHZAcgND>X(8a8q;zh?)eXwS?Ty0y`6qIJ2uD2MfN5< zXVb{rghfhhK_s%Lv>_Bi{c>0i>mjjvB2c^yP#h9{AyZK)Vxwq-{Ew)PMphoa6+&|< zbjz{@*rwEI!%J*Jj+R5a+Sw9tWIlRhuicZc8)k_5Ox-8372=kt{`9T9K2NBs@gz(s z)as3QJ-->Rt&Mj)zY#;MJ*_R3z7fKmK18ZuySUle*nVjt+i8Q^NgiP+B+;_w}sxe1ZV}Yua{NH%~ZzBIUnqP%x%CSl>j|hT@JRFiMts`+kr=cUM zy4@BF?0I5^*VbO}y?s26y5rA^N>}Zhpg&6^a{cUp+KU5u8f_jLX=FEB&0}_n=cy_>n4&4v!iM%WDU+D?@{+t zZEqvRK_a|u4`b@Aw@X}HZo>BglkM1!1JvQoEcB&E1PArUNj&khpf3|`$7!M4U=-nu zI*FO3UHc`v0nyhO?@y*-kj)0fKlV{!Om2Qq&bA!YW@mGAtCbtoW?@ur#i%-kQEe4R z)#AZh-&g89gP){ZTthEZuWf`{U{X$}G@VQcoV_{Q>Vxbo0SZG^5b|e9ocKS?uyoeO zN_mgAZJ$MR2s5=$Mj@o>bWmQV3E*fTCC$SYEw|@(9on)SU&Ax~W-g6+hssT&zUkCW zcYTvP29en+J)sbA`BvqdV=hOVtsWhPnW_WNcoykd=qR5cM3<~3)e)%Hj*Z zB-rUq$aH8y`N}ttgHyegTqZP?Ps+DfgmS&fVm`E5lA3Q=KPGykdLA^GOUXBuKVi9j z%;l1;%%{afpG1R$QV;E#N*pY7;|e#Sief z3TP}8?}EY$JFfhUdr94P|HIY1p{imO@WZUvAby%5sALB;4+`Zw#qup=Zy|dF9OqJR zrc5Nm1TZlXTeG~Dnm46+b7DD_s|=QJOyR9inb?mrU$NGlG{qhSxI>_ZiJO^KkNE9$ zF!DMMib)t-VViPHJgTZ@41t~bqjYcY@(QK!@i4`Ed$k%1FAa|@2z1!w%^x$15gq|7 zCUrc|13lre;k8sUp$~;)(uEb-EG`R3U1(XbGT!yq*1*maB_6S#BOKYEb8s#XyDx z!_2gLfsF?veBwv`2q$)lK?DXjt?Kb&Fo|0mN z8h49>=jDYVyQHjeXqOQ~#v?FEq*f5bnh{&Q=!NGsT@o{j@-q=J4d;t=B)}8Yk%wr? z{L^4c`E?_t%(j~%WqrB{;nAq*kq7=tAes4AF=s$Ug1sUfEK4}? zAeTKX=Zx&(H9L9`B%-GHmny&iXVL_6Z_j=SA~S!Kc4zW5(}&T)enuYg4}gNP>?}Sy zdv}&4K?I(rC}Fd(2=`tFmP6>;J06)Mgu$WJ#3O=E0#YM%4N@uoN#;JWP|Th+$r7Op z>a&}zl5qY0CcGR;H)M`891h$XI5{j)(YZzgVlkD|Qo2S!TCj%Cy#c>ddgsjj1i|8N zhdN$^uw=mm$Fs~dK`dO>-Z_e`IdV5QWp|3Y#kGY(^(5>M2K*d!M{}!3pkYn`NWM!S z1ZkfdepbN|H6geT22W2fX3T2fx&T~#f(n(=7P=ORvJ#pIYc8cMH@{L!B5G9EoiXdW zy**F>pkOJP9}b);o`9$Per-;DrxUZd3Bbc>ZS8t(jjvYzJ${6)xgfl=(P?d2;HFCq z3tZ!YFkYP%v?T=T>J(hPAw-m8l?lnllOvBLo|{a+nB z@V#PI@FRZ9P56m$H@8|ZUv9MJA&^=(BQ&w*rFQ{6WT}ejX_8+^VnexxyM~*M(~N6| zo?{_zx+d;w7G4rib)GvCwKcPdD<-+Rv4WtaGH$Mvm0K+; z$(O4&QqceP+?tob+~2Tj?H*sTwKa3$lF3&s0juO;>shlZfd*dVIn#Q2dLcHN&QKrf zCLikd#!IKwZV7}T2J^!6Xsh{YD`lQBHKkT=l4saY`s4RBdI*{3SUytD(1_kf+TimV zY#XJs(NESvg8c~?9A&HYAuyoeEeAf`uj-%O<^F_&Z=2bAF>w(EesXaSd;F(0;n>1HmwfD7Oy zP^zHRfjlqqq3Z%wCS4kAG_Hx@!L@oCbpph5*`eGhxd<+z^smixB*`U0Cz+*$_b7LN zq5Oc|!WG)mao?%mcVGKy-yh(!J3P(AU`K4Qb_C?-O`N3HKH>K8U~kVM`v5MzbGMh` z&1B32Ca8-$Lf4GPMs7>$-w!;eH`tl<22#iPoK_l!ah&Kpe4RI8p+oQb^88BOrbDFQ zE@hM29c`Bw@M@dG2W&^+ztEx{Sm<7rZxq?35?cq~f;5*8tfYoiaq!(iiM#GK~|WeRI~2lNEqE7@7(^YtSr* z%#Ddk*k}>T`#OaVf&Bp|Lt6{ZQn$Aw@Aq$u@j7#%9F+i~dhk#Z z`%eoCYW2RIfBQRn1MN-|+z$Yw7!ZeSO5;-YzWr8@ia7)Jw)d?Tn|OAL(>R>b=)}3= z)y8|!~b@D-8h2>Gko7n!3U=?_S5mVB(^5}YPU`Dd)g+`o3$F{P0qQz!;tJGxxdqzjqvqb z$fr>!|2NyVV>DUJ-k}BILs{#FX9V`W(J%u0!KfQ%o`+uHD&X461W-ClzMzDbFl^#x3g&+?gqP)O}n+-cDDgY`w%76 zXcz;FE_ojN&=A{(XP6?MY@7`2`v;>5Gcf8ZzOe5fEMwgucZ8aXv_fQk*bD%*0S+?i zuxA|rr}cH?AchebcYXpv1-oRgr$$5nYgraMgj0$Q+ve=nsKZ(#BU8>BG((ONsnt`H zTRholuwr$iO%5Yz&$YLZ@zQP~BO?Q(C`eXs=c>0z_Z?n++ioMHWpDH9K8bD~Duasju zErM4GmUTJ;q0w@$lyYrSf|lOSm3z(05j4dA$rU<~jcpNRP6NGcI~;qo>2TG-b(F!$ zPDwF!Y@4J286nVaYB7Ci4(x(DG*U(x*)}P(LH>QIjEv(owtk2W73J?j(eRB{;T5a! zs=7j7tMHmtcwJp#pj9|v6%NWO@Ge*kXn{Tycy;U!0t|A40B;O9r0ov|MmoF6LTrGA ze=`g|VM0pK7>yiWAulyNBb~%?Hin=~rURa8*}Ww0QF=5x28 zL7_5OJyNi(h;2{9owE3`K@{PHhQ?G=SlH7!$}OU7dY%jLt2sK?baugeT*UQq$!iXO zFSUosEX`(<*RwFh1Mh{4A{JHhT{6Il*90dr0nyBjc%+O7adodQR{STvVvm5-FG67R zC9%nhP-j1|FJ5#_ET+2lo?ge#_7_Iczz%EiwPg5eP2m-3YcV?#76EFNfP z&F4tl*WU?Mktd-`!nrG4z&ANQV490lYSand4}T8uok%HV79e{3H^1j03&zCB{uC${ zoU{%MKFgkx%a{W7td-2BbUKhrqXW>>(lQ;pLj#hNyg@)RE^dt`D@XFm&gmdX$PwhZ z3AONs<&p@bPAVyFj6^9)EAsRkk=`t+F2t`m_LjJ zVH1c5@tK9>2Ub6Tpb|&c64Qj;3Enw`I$oK56ULbT&Rnm!U4y&6qOuv~}bvy?ZtzSmoAK3io z&LFroh?2KgyK4?-VQ7rWpW5!u`XIR7{ih{2<5#8$H%rWn1plVqQ6u=Q;aePmyDs-7 z0_~j3E3z#lD@X~MN5XiwK~tc|=?f&~WEmS@l$wWfpDcBj$c-f5d`7zE;XGZ`&ibrWampYvC)2 zl2;1;mNj?WM8_{h7d$NA!^pgVrwkIcfY!M}iR$EudhxWh#F!_7TT4d$gL)3E=5df_ zIKqipOE7i3cnFFj#cZN*iWAV>sG*1QGW{^CVqZy&d19effvgvZMG8-ew)g?G0@j;+#SPSeF-qL!q#c7E3io$kseW zYk7U1XYNDW;sZ@kVpBay3z1Nb%>E&Qm!T=^ki$1hsA4!EJg65(SrUgSv10?-0ou3F ztC2ZF`)FFFo{u0@8ALXwOe+6k3@Z8_bPE?$x6rw1p)ns=%r!T~G>|rLIY?fErqNT* zm{U_xK0T+Qp)Gp=i`=pF7+Trojs1Y2Bn^+H?|Yi-S(coXiL{J`5ipm7AxxSJLW znI~Rm$I}%*YF0Pb z2+_&UmmVelO-)(fW0UGo?-P}IEtJb+tOXnKv|MEF6CgMvCB*LU^WE2*QtmoESW2$g z1=v=L<483>s6E7maLiSKFu=X_myFuvhy>%WwG|%oCb424u~# zJ0fY|r(+-9?7dnGZ2%nw4OKLUhZ`Fk8*S%H8l3vs*nn_~fG;Afw7S{e+#I_3Hd`VA z>i7MrS4-gNLW|Ir*5WJ)&42V~$t{Mc_Eyc{7Roh{@5(CuAnAwL=--ohC0?x!c{Fu* zXMl$(ow=VtJ8-s*VBpn6%QdnjPR)3rf9_lKtL4>P*q1Dx8dMkDt2zGxGl-|nK8;Yx z=efJH4#~OFu2WIoab%5keQW?PWXS93?P%91fG0p?%YdKFyTqSzBDqK^|FMWvCi?-T zaBIVnR5C?$kW4(d@|IF_B29(Bzwb>DQv3Bihng7R`>ENStSgydXGF~714idDZHmh) zG?2m8>)K>J>5 zo?7U_J8zJbLv-eyH%zy=Z`B`q6KYcM`*)AWpcb@OJE?VR$F=!)kAUjm1owDgy4D6)L5hTHomK&f&TzL5~*N83-Ha0xdT?pWu;Qm zEzjQK*;^ueOUZ6KJiqOT0&T~dUnyG_D_b_%wYT18;hoEV!2yln@676*_Du_&LeUv<(2R|d9Wc3p^=3_Gc z<^~+6i2N{)H{|c%=uAea)_)-FyG`Y+SasGPF9bJ24JbsuLu%nGcDsk{b{D5$Kg?S! z5@SG+c$nM){~6AhGe=+td@tZ+ZYZ!8<>`ru6KB8&`qD#Sa+wje)`SMo)Iu*DhI+{BSxju>_~2Oh zIUYS^ZH*_em?2yY^>`bk!A(d-30)ttPr~hWW5Qy*BNuCc({7?jn|>pLuV82fj3yI{$HHO#J)iUGp9YHKn-`{Ao`82!{qCZt$Ra9~#qU+fd29g=FU+ zvos5a56v5#-C-OpD^6&F+V0NHEX(3ZQjuH6xVa?;5sr+TQ8Rsr{AmiV2aTH;o>$o) zkzFBvzA9sJlDy6h^Y^-tVllpFC-+nACQZ zv~@aQMr#>GM&LfBecvR2+YN}E-kjh;Fq^2{fxb(HffH_mts_Z*f3!7x9mXjZ>&QnF zMAKPj5ca*6_|XX0K<|o>vJ?NF5Tihg;whn@YXy<3Yj+HPI>mkhLMF0W`c7tXW4i*xw-1*n_pb|uGwBvV%%)6(ycb? z#YH9H61ZQbbsBBHdFfm`*W1(kYZA2HZM{V9hJ#ug+sLsutgG632`!&H<_w5m>Y%_l z&c*Dd`tR=+`i`-hI;a&99f8y421RSr`(_&sV9OvVOhsPeL~$^$22Z1ciMBg@BLDiY z|4p9?pm;c;Vnz(IRc_|Ta&G1bn;^`O_>UBRxDZ?b{yN}49L1i4LQbpyHWJcwAaiy0 z>j+z%|HS{=%qio!TupvoCX#H+2noV#L^lRt=`-%LVE7Z;qWRMU9?ZqD^ z2BU5}j?UxJD8wdBfPdH4%m6%oleK{o(EsZ(;0yB)@Mx(tIHe6n&|pOBN7f##P8_fo zWYTB`QCKTP`m)`bX+1()#CJovF&V3zNWuiQt}rld0_Q^Vfnv^{4J9I z8S;OzdY@VTXOZ7_fI&JTY|=jM_Gc)(58ZwT-Tur+^)t=>9|MUM@>(>7Dzx^LI!cu;R{>;daL54n(AIBL~Vyw%U!43Z{pjbwk)HZ)HdJDpnS&&=Bmz_Z_Mj~QE2|i>L#LY zLhF74yQBwej?NWG`VNGtN~;ghDlggF56lUI!hl%z4$XnpJv7e&falhnaAenvBRdGq zOWp<>(G}f@4@IFUef?cZYU)HWxr$ghPG)cDMedsJCeS&X#^k;Uo{4mFhLM-85_*`W z2%6Yn4`I!88bmcgflal+i0d+))OL?!AKoVnYS{|PF4M7X+dJ#iocs=D*MH-JFqUO9 zfXjZnq(bLD%aa_e0JlOPV0s$ty|mu7|#;pB!~va{+%CW>CXDNwRla8 zlG$T6`x1(WH#7l0fi^LobqJW)4p7*#(H! z|AC(E&&`$tTf}s^Q|0R1 zy0F_f-oy!pw_Dy=^~89Kl!52taOoy!W0fB-^n{Y8m0g==B~l);m9E0PDQw#fEG#^} zitVDGIW|rf%L!}#^?g9NtgEIKhVWHIVMC`+1JsFCsaP zQ!yB_+=6K8g}(Iy3j+3IQpp_8Ue0W{7ax3AkO8$_O>6{fQ8T8Y-^XJhN)xa4nzaf9 zixEe*ZPzMyzFce|(O5d6@)V_mu5x0E(mIy(B1e&JXn?X_07*HbRpgx;mGaJXqE2S9 zWYf6u`=16$JZ;{DvxLw$Z(#6?@U*folaQgb3Zdu^KIIa1^AOu2Y#)S*KO3 z!{wlS-8G?Z)mAJSe>zzx^8D9-`M+{2S+brLf_!#V3Ru4|A~9HU6jc=cLL6i%&e^}t zNu;&i}o0uq$K-uN2HNbT5hQW&PRgiaA4axw71cwlDUI9NvaQa`(*H*|Q|tOLXxSD5-mhG(1rH_ko^V*6K;5 zY>3Q56ER1IeaZfE2rP@g7sMCEBEwV`-MV!t9l%>}%j}W0c@KOMCy~RU5TW7FL}iZg zCjajp+yyV)T{KefxBC(Q5JU`EhUJvrMGs1Cte8?5Sux|U1$_dMEoeOznD0{iw3s8Q)G`qlw4%!%#=I2f)5g*k(|f zb5slP+m4{(R3s4YKk zaYlw?FO_1lF3B}2`Hvk8<7v5IA2H>pWzddhwRbZKBbv2ejoG0X2YzJE%$&+q7n{Q} z!FQRR*PJW{Ng-eEa3CN|T?43u6%LNBmjY=KN}4*HcHy z`;wK{di-G0MJ1*0-z5x`mgD@Y+pfeuaVa~2u5bQX? zjIlDj9&q=>Uui_bZshtE)|srWvyQF7YPOka)(u1g{SuUv4YsMVuLh3o6X4IcYJ<}5 zeWXgI-H3k*EpWTmyox+bD&XpAEhUSI#Z>!^L9w2(bHCJ$TrP3x8JCVp>8SxuO3_T| zH%jjSYMdGeHBJrS#TovxJfn=N_U_6=JER#26lBgd^+B4txZ#wi8~!LfUJ&qpg}aD3 z5}bjh6lSz-h8WgiJIqVfhPO9c9Pd(OGW_*eWMpqrgcT%esU7jNQr9a);L7Kvz=dZT z{lANb>U~PlsjBc8`LdxmRYeRtrRam^z;sIwGy{@;WZivH`keni0{FE6@v9IZehfh4 zM=p27^7~33@c$!KJ+P4Ufrq5umQkb&Q20PqyJSVWl)>I*5o%lHSXJ9jsvSt#ssvwd zld3M9)FPAGDgy(zuyvh0Zas#5)IAhkw{Z1WmZ*~*;Xcgei)0N@`U{tyqx68R)eb3V zm_`iqQ{NdTtg;I8LrpuVX~uSXfSPs)**mrq4dm|-3k*=aAp(uea2Xe$8esz6SSAom zROnU*Bw1HB3q~qg1Ea6885V>^w1FR%^t23D0UOesoF!R{84?@Ji4326J40^=&>2*4 zX4P@@4~xeg8*I#(m!`sp8*e2KI>yv+ws_Wj*2ra9OP{TF@Qj>A?~9(Zo+TzXQR$02 z$kw{)+6tyiH^lKl*$g>TYFNGOqF940J8zft=C7WfhX~N%=*8NQBkA>O1Mbq8E9|-Y zdf{d@X5S*&%_`PC%Y{3zZMLwk;B1+4B`sG;OY-+Pzh!&0=lFu2R_Vc*qUAfHtNy5V z-y6s%lBYCGn>QvWK9RKN!Y78(u9-IbtF=q2FL1d=FWpQpN+;0$Sm|3_BwqE2Rl_k< zpFj@}n4V)78jIK*Gd{-Fg_`CDQgb;hMDgcF7TYa}>V@)%mGpr1cWxZ3k@=5D zq_4q2tYCR@0ncV!{#eD+>kS@-Rs{0g(OkxQ7O7`ZMk~#zfKz+9Vkmnu@^3uwJs$W+ zYxLh>^!Q#toIP(mpU$6NmsR!dCi*A~+uKICxYyeZi+d7sC>~=ipKu@0xeM;nH}2di zX5~WZJ}ypW5>M?ccQDJRnB_YNbVQ(I1qcG2Z2jL;Ew(0Qs5W7n>Tx+E<&12vW305E zzTQp}#BAi58aq}fRPH$l7;L{eAt%dZI>$J0@!8!Z7`vwu=@>iKv$Ca99Nqi{h6N# z+2E&=W&`CTsZaXahTdm2#R28_j`X#CX5cJCLEb0Q*C&Q~xD#0iuo?axOBl{_z`~sv zUA#?A2gKLI1UbJLK?D6N$WKW?ZCsrV{ao6I*k3z$fm?QJP&&KW&E;MYaxt1xDZF1E z3AQV(@#iyguAbKo8PSE~SC!S$}<9HMW_QWYCUqTUy|5vk5Qgz>F0 zafVd9RgHO%<^q5H`A5OsJu{M8$x@0=`8~5}4`+j-K8Frd;((j{Lf$TXyrt3!6UGnw z(YZaf`AdxA$-mX<3Jc&Bzww0MxRGHRfP0o@B7q|VbbJ+^XI0dR-9!26T~GoWSlhra=9!kDJ!y$Ap|ER{q6 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js b/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js deleted file mode 100644 index 58d9b03..0000000 --- a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/Bzak7iHL.js";import{o as ut}from"../chunks/DeTA_5mp.js";import{p as gt,s as T,c as Q,t as u,a as ft,d,e as s,h as $,g as t,r as e,O as ht}from"../chunks/nyjtQ1Ok.js";import{d as bt,s as l,a as yt}from"../chunks/C4L78yoI.js";import{i as R}from"../chunks/B17metm1.js";import{e as U,i as D}from"../chunks/BilMa3tw.js";import{a as o,f as n}from"../chunks/B0IenmM-.js";import{s as q}from"../chunks/BgOFZ9jq.js";import{a as Z}from"../chunks/BcuCGYSa.js";var wt=n(""),Rt=n('

'),Nt=n('
'),Ot=n('

Use "Remind me..." in conversation to create intentions.

'),St=n(' '),kt=n(' '),$t=n('

'),zt=n('
'),Ct=n('

No predictions yet. Use Vestige more to train the predictive model.

'),It=n(" "),Pt=n(' '),Tt=n('

'),Ut=n('
'),Dt=n('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){gt(et,!0);let z=T(Q([])),j=T(Q([])),A=T(!0),N=T("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={critical:"text-decay",high:"text-amber-400",normal:"text-dim",low:"text-muted"},rt={time:"⏰",context:"◎",event:"⚡"};ut(async()=>{await B()});async function B(){$(A,!0);try{const[r,i]=await Promise.all([Z.intentions(t(N)),Z.predict()]);$(z,r.intentions||[],!0),$(j,i.predictions||[],!0)}catch{}finally{$(A,!1)}}async function it(r){$(N,r,!0),await B()}function F(r){if(!r)return"";try{return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return r}}var L=Dt(),G=s(L),H=d(s(G),2),dt=s(H);e(H),e(G);var M=d(G,2),Y=d(s(M),2);U(Y,20,()=>["active","fulfilled","snoozed","cancelled","all"],D,(r,i)=>{var v=wt(),a=s(v,!0);e(v),u(x=>{q(v,1,`px-3 py-1.5 rounded-xl text-xs transition ${t(N)===i?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),l(a,x)},[()=>i.charAt(0).toUpperCase()+i.slice(1)]),yt("click",v,()=>it(i)),o(r,v)}),e(Y);var lt=d(Y,2);{var vt=r=>{var i=Nt();U(i,20,()=>Array(4),D,(v,a)=>{var x=Rt();o(v,x)}),e(i),o(r,i)},ot=r=>{var i=Ot(),v=d(s(i),2),a=s(v);e(v),ht(2),e(i),u(()=>l(a,`No ${t(N)==="all"?"":t(N)+" "}intentions.`)),o(r,i)},nt=r=>{var i=zt();U(i,21,()=>t(z),D,(v,a)=>{var x=$t(),f=s(x),h=s(f),C=s(h,!0);e(h);var g=d(h,2),O=s(g),I=s(O,!0);e(O);var b=d(O,2),y=s(b),P=s(y,!0);e(y);var w=d(y,2),E=s(w);e(w);var S=d(w,2),c=s(S);e(S);var p=d(S,2);{var k=m=>{var _=St(),W=s(_);e(_),u(X=>l(W,`deadline: ${X??""}`),[()=>F(t(a).deadline)]),o(m,_)};R(p,m=>{t(a).deadline&&m(k)})}var V=d(p,2);{var mt=m=>{var _=kt(),W=s(_);e(_),u(X=>l(W,`snoozed until ${X??""}`),[()=>F(t(a).snoozed_until)]),o(m,_)};R(V,m=>{t(a).snoozed_until&&m(mt)})}e(b),e(g);var K=d(g,2),_t=s(K,!0);e(K),e(f),e(x),u((m,_)=>{l(C,rt[t(a).trigger_type]||"◇"),l(I,t(a).content),q(y,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[t(a).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),l(P,t(a).status),q(w,1,`text-[10px] ${(st[t(a).priority]||"text-muted")??""}`),l(E,`${t(a).priority??""} priority`),l(c,`${t(a).trigger_type??""}: ${m??""}`),l(_t,_)},[()=>t(a).trigger_value.length>40?t(a).trigger_value.slice(0,37)+"...":t(a).trigger_value,()=>F(t(a).created_at)]),o(v,x)}),e(i),o(r,i)};R(lt,r=>{t(A)?r(vt):t(z).length===0?r(ot,1):r(nt,!1)})}e(M);var J=d(M,2),pt=d(s(J),2);{var xt=r=>{var i=Ct();o(r,i)},ct=r=>{var i=Ut();U(i,21,()=>t(j),D,(v,a,x)=>{var f=Tt(),h=s(f);h.textContent=x+1;var C=d(h,2),g=s(C),O=s(g,!0);e(g);var I=d(g,2),b=s(I),y=s(b,!0);e(b);var P=d(b,2);{var w=c=>{var p=It(),k=s(p);e(p),u(V=>l(k,`${V??""}% retention`),[()=>(Number(t(a).retention)*100).toFixed(0)]),o(c,p)};R(P,c=>{t(a).retention&&c(w)})}var E=d(P,2);{var S=c=>{var p=Pt(),k=s(p);e(p),u(()=>l(k,`${t(a).predictedNeed??""} need`)),o(c,p)};R(E,c=>{t(a).predictedNeed&&c(S)})}e(I),e(C),e(f),u(()=>{l(O,t(a).content),l(y,t(a).nodeType)}),o(v,f)}),e(i),o(r,i)};R(pt,r=>{t(j).length===0?r(xt):r(ct,!1)})}e(J),e(L),u(()=>l(dt,`${t(z).length??""} intentions`)),o(tt,L),ft()}bt(["click"]);export{Wt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br b/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.br deleted file mode 100644 index 584d9376fddb964d3fca31257d34717e8e1cb1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2196 zcmV;F2y6En_!l6Y18&O<&wgKXT^)s@LWoQ#6dKfYDoZd6>jgDcQmRyy>KNHk+brJa3!teV1GF&G4B(MWHG|G=Ve$ zfBU~>PO^W}i;l;bREIK=C-eXOo0qv(vqxWAO{+VTzDH?YMFvYykvtp8zJNX$2yUJ`w@WGYi5bFN7 z&&TWJvj_rbmP7nYj%r8iL^zoxZu-}T%h7i)Y9U~Ig4_P%;o{FuTz?nAg0H{BP4y4E zufZ34hptH&xjDTB|UT*l8&% z!yq$+%&Q?x^7QV9G4Y8=?@g&hu-LzjBp8zd&jhj-e%JK;ww>3uk3W%C$lz-cO(JF% zi4fbqM?tvuoTN^7_f41Ca`5+8@La=n#Pv`kin8f2_!fjO)QN;H%ig=K!m1@PA|-%t zc)ktm`2 z%GXnJ6c1u96x7siK~vfvnGrsMzsXj-fk_-p8=Q}HNk5kiRM+&4K8r0wPfC`%%qcW& z@SQBi7I$8$W9)%PL*}IwKk&KaezcPdcRN5ige6aR_T(Rn(9}fuz08`n-Kl-Lw|pLeJ@ zBfDCR3J$IobUvn;l1ev@p4^Kqtj%%$l}1hnC!p+ z!<~Fp(S8?|{+3Wm6AtXYnkTzIopX9iHF|qA6+C)Bjav$l+cpOBA|P|y|C*bO&$|-V z7}t}55?z-j=>7C1OWD$$4mIa&&)RIp`k#CpepAgaQci8B0nuU0wQ37NXk_^p(7f!l zh@DgPG;F_qW*4+|GS4h8)$NGgl^3O%wJ7R76IY5jRF{s@IR3`SY5Mqtu46P}dd?0C-{KA<-&5P_(|E1^BA6 z2O5YXrw0tf&0P^EfRP;ga~#T+hsR?(IB(I7Ata}C0drA+CFYfLAc;AejzkXsx1ZNvSnIP3eTJUi zbj})UvG5h&oi~r}=H&+IiRfth2TBQY+DY>PUMt4sg>*&)0hoUap4`_Iv6#)TuAEII zI(K3C5GSj{ooMJ#se8^kIXm%PuolssxA-fHPD=Lz$M+;PmZ%gu%!f zHw<8dGU#}~>`g=lJi^F`!XE()u8M_gXlbo-S;NO-8&^(D>ohoSdXPO~*k;JO; zG(=~`rNA=XP^BZcvb^WT7rz|NLTo&Ty(1pBdZx@Xds{&>T#M;mLfxz;gNS@Qr0C83 zzr1_Om8TTo$Q0dAXZEC&C=#BOV$GM4qM~DBf`J%21Z5WtnEtnwl18Xu8Pvz>e_0*o zv0AsgZXv~wTYiKtuJiR=xx=5URqz}Y^eV5?gTC;TiyQ~KttLSs4W>(7^|JK9`Ib=%v$h&VyfSUROi*@Xslr{YtCz=X WrF}u*;^EX;)g7nTYE)Z?JJu&vnL$nf diff --git a/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz b/apps/dashboard/build/_app/immutable/nodes/7.404BTmXF.js.gz deleted file mode 100644 index 7959a81a1d4a1f66096f8a5ba1bea6752927174e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2501 zcmV;$2|D&4iwFP!000026SY`Na~ru4zUNoKD8&oJ7>bnSM?`@tTYhO*ueD@*ZIwy} zXFv|5c^Lp7Bbw*ECC9DGE%zMqoBT^sjTsJyq!g3>?px4~Jiw zbq<(-L(j5+NjNhsgu@!^!@)8Q2g#1%5U%W&YPJhho!?>IRNQ%6f1}Rt%c^GKmkpx`AW= zbp_c!e*O8cS6^3Le_lcQgS|JOPK84bg+?RG6M}cT18dWygLc--Gfde#So&!vP($QL z!WfQ2uk{4=;oLKWu8kzp=^zPY;Ef|B5)}(8y=)K}i90*%ff{yxqU>nJjmd;Bz1-WV zp^jHjR*tRb%fw2JvfOKJAa^HFG48D3w#E^PyWS>BGvOLvoEG7jOe6~%p0}FW_@azNOA&khC>>#72Usw@zK5yfyI{4plE2K`x~o=;3G793 zjFgqJ@r)JPqQ1zy%|*<}dxk>qS>+?@qi)|Dh04nH^Jb&Db%APb%Bo!rj8(mScIlW$ zeFyYRs8w?9HC+%zjg}~REflN78v$miY$h(8!9P5!>~ciT$4HCJ#j^p`1;M$5%@T)h zyS#7K(ar<+SMZ-j@na9SB*6Kr`}v8on|t-m-jDj`*?()B&D-1NUsc;Ir5$&UQj}>K zDBp=5<aPSS?h7Y$z-E5EcU&EjG%2F@F}yfGInEkv+)>r{1lYk52G6P=n&7A*2;d7{g;s#$A}bDGE~b8ybZ&L7z}4vP>oh z-yKmUm{wh#4{n2I)_a1wsSc#}?CiwkiO7sxZ#B{XJ2|e7GC)UC2Iiib`4|d|@^pY= z=QEKqK#3gNrGz|K5`MckNStQSM@y__($Y!a5^33kCT&O3q8oljekJD@l(MV&>2rQY z9yBRC;%5X4S4m9UewrAIgyoas)^-_hk-B26bo=#GE+u!fiCJ$D^;8teptRP~7saS5 z&T3}m4Y2Y>;>(&ZetU|cOMHxzKxSXEVc463)6w##v5Ls z`pRM!t7Ks1{Kj+^PPwI?PT_OofWNeavNzn21Ipg=fEeR_WJERmQ0V8DG@-WdvrOte zVI-lCRKrBdm!w56D9bIuex&?s%!V$L$`VB>ONnMfI)xH^DoPMp9zeoryGWSjy3C#8 zN0vZ2)T|uOwH7(qqLAbv6SE|b`8xonWC%RLw<>m0bjs4Y!(%AM(A8QwS-8TKRS7NG zD2)dMwu8XG9HsNTyAtnWybafnFv8Q?2ig}p-!!RjdQ(Nwa#2`vvl_t~Fzazc#*~HJ zkRD}w+>o#oO;{wW&jS(y?_+LApR#>!$Z-idE+AbVkYj-4+>kD1C)|*{gyaQe!~>E8 zT-0{jwE_ZwvHBl{9a z5x|S%Hd>qfw!4d+n4E}S6H5eb%m5&ml*H_kPTTKD#=!dm;NioVT+=CaJ^q0QB&)c@ zwnpaqZZc)dqCsL+bQhr#bm>5gtUk}n+syVVh}8sB{7e&E3R|eaSCiDT z7Twk)vF@P^ayl%O^fM30At))cZgBlfEAfx(V`i_IfyDsw>nrb92GG@P0I~6G1oikC zbWbsR+F=7~wO5FZj~}%hmA%>c>2pK&$|+PzyVU*uO!r-G$bLD6N=UbWobZ5js~ASy zFBxQf9~fM7Lo$G8&>|n8f3KnVA6$w5jI=CA?yPyq(EwiVii%XL^e?TZdq%xhV;PWU zQ6QgXt|TYSpS5#k@$jKfMzbmNiU;JRB6(UPd9q5fcvxK5bXpMXVp*0KZ2dX~^>*OK${E#QK-<=Fjj{L%da@27E=CNi

U~e`4<2H(iP*0 diff --git a/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js b/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js new file mode 100644 index 0000000..66661b0 --- /dev/null +++ b/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js @@ -0,0 +1 @@ +import"../chunks/Bzak7iHL.js";import{o as gt}from"../chunks/DeTA_5mp.js";import{p as yt,s as D,c as Q,t as u,a as bt,d as o,e as n,h as N,g as r,r as a,O as ht}from"../chunks/nyjtQ1Ok.js";import{d as wt,s as d,a as Rt}from"../chunks/C4L78yoI.js";import{i as R}from"../chunks/B17metm1.js";import{e as L,i as U}from"../chunks/BilMa3tw.js";import{a as l,f as v}from"../chunks/B0IenmM-.js";import{s as W}from"../chunks/BgOFZ9jq.js";import{a as Z}from"../chunks/BcuCGYSa.js";var St=v(""),$t=v('

'),Ot=v('
'),Pt=v('

Use "Remind me..." in conversation to create intentions.

'),Nt=v(' '),It=v(' '),Tt=v('

'),kt=v('
'),zt=v('

No predictions yet. Use Vestige more to train the predictive model.

'),Dt=v(" "),Lt=v(' '),Ut=v('

'),Ct=v('
'),At=v('

Intentions & Predictions

Prospective Memory

"Remember to do X when Y happens"

Predicted Needs

What you might need next
');function Wt(tt,et){yt(et,!0);let I=D(Q([])),C=D(Q([])),A=D(!0),S=D("active");const at={active:"text-synapse-glow bg-synapse/10 border-synapse/30",fulfilled:"text-recall bg-recall/10 border-recall/30",cancelled:"text-dim bg-white/[0.03] border-subtle/20",snoozed:"text-dream-glow bg-dream/10 border-dream/30"},st={4:"critical",3:"high",2:"normal",1:"low"},rt={4:"text-decay",3:"text-amber-400",2:"text-dim",1:"text-muted"},it={time:"⏰",context:"◎",event:"⚡",manual:"◇"};function nt(s){let t;try{const e=JSON.parse(s.trigger_data||"{}");if(typeof e.condition=="string"&&e.condition)t=e.condition;else if(typeof e.topic=="string"&&e.topic)t=e.topic;else if(typeof e.at=="string"&&e.at)try{t=new Date(e.at).toLocaleDateString("en-US",{month:"short",day:"numeric"})}catch{t=e.at}else if(typeof e.in_minutes=="number")t=`in ${e.in_minutes} min`;else if(typeof e.inMinutes=="number")t=`in ${e.inMinutes} min`;else if(typeof e.codebase=="string"&&e.codebase){const i=typeof e.filePattern=="string"&&e.filePattern?`/${e.filePattern}`:"";t=`${e.codebase}${i}`}else t=s.trigger_type}catch{t=s.trigger_type}return t.length>40?t.slice(0,37)+"...":t}gt(async()=>{await X()});async function X(){N(A,!0);try{const[s,t]=await Promise.all([Z.intentions(r(S)),Z.predict()]);N(I,s.intentions||[],!0),N(C,t.predictions||[],!0)}catch{}finally{N(A,!1)}}async function ot(s){N(S,s,!0),await X()}function M(s){if(!s)return"";try{return new Date(s).toLocaleDateString("en-US",{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return s}}var j=At(),F=n(j),q=o(n(F),2),dt=n(q);a(q),a(F);var Y=o(F,2),E=o(n(Y),2);L(E,20,()=>["active","fulfilled","snoozed","cancelled","all"],U,(s,t)=>{var e=St(),i=n(e,!0);a(e),u(p=>{W(e,1,`px-3 py-1.5 rounded-xl text-xs transition ${r(S)===t?"bg-synapse/20 text-synapse-glow border border-synapse/40":"glass-subtle text-dim hover:bg-white/[0.03]"}`),d(i,p)},[()=>t.charAt(0).toUpperCase()+t.slice(1)]),Rt("click",e,()=>ot(t)),l(s,e)}),a(E);var lt=o(E,2);{var vt=s=>{var t=Ot();L(t,20,()=>Array(4),U,(e,i)=>{var p=$t();l(e,p)}),a(t),l(s,t)},ct=s=>{var t=Pt(),e=o(n(t),2),i=n(e);a(e),ht(2),a(t),u(()=>d(i,`No ${r(S)==="all"?"":r(S)+" "}intentions.`)),l(s,t)},pt=s=>{var t=kt();L(t,21,()=>r(I),U,(e,i)=>{var p=Tt(),g=n(p),y=n(g),T=n(y,!0);a(y);var f=o(y,2),$=n(f),k=n($,!0);a($);var b=o($,2),h=n(b),z=n(h,!0);a(h);var w=o(h,2),G=n(w);a(w);var O=o(w,2),x=n(O);a(O);var c=o(O,2);{var P=m=>{var _=Nt(),J=n(_);a(_),u(V=>d(J,`deadline: ${V??""}`),[()=>M(r(i).deadline)]),l(m,_)};R(c,m=>{r(i).deadline&&m(P)})}var B=o(c,2);{var ut=m=>{var _=It(),J=n(_);a(_),u(V=>d(J,`snoozed until ${V??""}`),[()=>M(r(i).snoozed_until)]),l(m,_)};R(B,m=>{r(i).snoozed_until&&m(ut)})}a(b),a(f);var K=o(f,2),ft=n(K,!0);a(K),a(g),a(p),u((m,_)=>{d(T,it[r(i).trigger_type]||"◇"),d(k,r(i).content),W(h,1,`px-2 py-0.5 text-[10px] rounded-lg border ${(at[r(i).status]||"text-dim bg-white/[0.03] border-subtle/20")??""}`),d(z,r(i).status),W(w,1,`text-[10px] ${(rt[r(i).priority]||"text-muted")??""}`),d(G,`${(st[r(i).priority]||"normal")??""} priority`),d(x,`${r(i).trigger_type??""}: ${m??""}`),d(ft,_)},[()=>nt(r(i)),()=>M(r(i).created_at)]),l(e,p)}),a(t),l(s,t)};R(lt,s=>{r(A)?s(vt):r(I).length===0?s(ct,1):s(pt,!1)})}a(Y);var H=o(Y,2),xt=o(n(H),2);{var mt=s=>{var t=zt();l(s,t)},_t=s=>{var t=Ct();L(t,21,()=>r(C),U,(e,i,p)=>{var g=Ut(),y=n(g);y.textContent=p+1;var T=o(y,2),f=n(T),$=n(f,!0);a(f);var k=o(f,2),b=n(k),h=n(b,!0);a(b);var z=o(b,2);{var w=x=>{var c=Dt(),P=n(c);a(c),u(B=>d(P,`${B??""}% retention`),[()=>(Number(r(i).retention)*100).toFixed(0)]),l(x,c)};R(z,x=>{r(i).retention&&x(w)})}var G=o(z,2);{var O=x=>{var c=Lt(),P=n(c);a(c),u(()=>d(P,`${r(i).predictedNeed??""} need`)),l(x,c)};R(G,x=>{r(i).predictedNeed&&x(O)})}a(k),a(T),a(g),u(()=>{d($,r(i).content),d(h,r(i).nodeType)}),l(e,g)}),a(t),l(s,t)};R(xt,s=>{r(C).length===0?s(mt):s(_t,!1)})}a(H),a(j),u(()=>d(dt,`${r(I).length??""} intentions`)),l(tt,j),bt()}wt(["click"]);export{Wt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.br b/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.br new file mode 100644 index 0000000000000000000000000000000000000000..1c40ec80934bdb9190044c1e8d72e49579261166 GIT binary patch literal 2403 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 V&)j^zPm)}FF}$k>)%E6k`3K1PtBL>s literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.gz b/apps/dashboard/build/_app/immutable/nodes/7.DgTyksQL.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..b834c346d6e9841ef1f0047c1033f59fb3302e6e GIT binary patch literal 2728 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/version.json b/apps/dashboard/build/_app/version.json index d4514a1..f8aa517 100644 --- a/apps/dashboard/build/_app/version.json +++ b/apps/dashboard/build/_app/version.json @@ -1 +1 @@ -{"version":"1776204719942"} \ No newline at end of file +{"version":"1776554482425"} \ No newline at end of file diff --git a/apps/dashboard/build/_app/version.json.br b/apps/dashboard/build/_app/version.json.br index 565d48d6180f757fc87c487bbffbd78796932621..c5080ed280b82d72136265df163a5b1cdea5a268 100644 GIT binary patch literal 29 lcmb1^V)$`1H>dWvx5?t##j9KvMx1nvj}N)D%|xV^9RR_D47mUR literal 31 ncmb1^V)(&YlDtxXN%fKDon4WgYD`!8E?UTVt0tE=onZz5!Yd3m diff --git a/apps/dashboard/build/_app/version.json.gz b/apps/dashboard/build/_app/version.json.gz index 19c9eb7d8fbdc5107f6687fdd4f160cc498fb42e..b6eb8f1e5cb50d57ef4bb1b6a455caf58e0c6119 100644 GIT binary patch delta 25 gcmdPbpCBz_YHGOAz{t=jbQLRu#nYenq!}0(09t_uLI3~& delta 25 gcmdPbpCBz_WMF8%Ws8Yn&?;7jCoKItq!}0(09~R700000 diff --git a/apps/dashboard/build/index.html b/apps/dashboard/build/index.html index 7ad805c..50414ea 100644 --- a/apps/dashboard/build/index.html +++ b/apps/dashboard/build/index.html @@ -11,13 +11,13 @@ - - + + - + - + @@ -33,7 +33,7 @@
+ +
+
+ FSRS accessibility +
+ {#each STATES as state (state)} +
+ + {state} + + {MEMORY_STATE_DESCRIPTIONS[state].match(/\(([^)]+)\)/)?.[1] ?? ''} + +
+ {/each} +
diff --git a/apps/dashboard/src/lib/graph/nodes.ts b/apps/dashboard/src/lib/graph/nodes.ts index b8af78e..9cf9e0c 100644 --- a/apps/dashboard/src/lib/graph/nodes.ts +++ b/apps/dashboard/src/lib/graph/nodes.ts @@ -2,6 +2,65 @@ import * as THREE from 'three'; import type { GraphNode } from '$types'; import { NODE_TYPE_COLORS } from '$types'; +// ============================================================================ +// v2.0.8: Memory state coloring (FSRS accessibility bucket) +// ============================================================================ +// +// Every knowledge_node has an FSRS accessibility score computed from +// (retention × 0.5 + retrieval × 0.3 + storage × 0.2). That score gates which +// memories surface in search and drives the Active / Dormant / Silent / +// Unavailable lifecycle documented by Bjork & Bjork 1992 dual-strength model. +// +// The backend computes all three channels, but `GraphNode` only carries +// `retention` — which is already the dominant weight (0.5 of 1.0). Using +// retention alone as a proxy is a known approximation; the buckets line up +// with the same thresholds `execute_system_status` uses server-side, so the +// visual labelling matches what `/api/stats` reports in its +// `stateDistribution` block. + +export type MemoryState = 'active' | 'dormant' | 'silent' | 'unavailable'; + +/// Map an FSRS retention score to its accessibility bucket. +/// +/// Thresholds match `execute_system_status` at the backend so the 3D graph's +/// colours line up with the numbers reported by `/api/stats`. +export function getMemoryState(retention: number): MemoryState { + if (retention >= 0.7) return 'active'; + if (retention >= 0.4) return 'dormant'; + if (retention >= 0.1) return 'silent'; + return 'unavailable'; +} + +/// FSRS state palette. Distinct from NODE_TYPE_COLORS so the two modes can +/// coexist in the UI without overloading a single colour channel. +export const MEMORY_STATE_COLORS: Record = { + active: '#10b981', // emerald — easily retrievable + dormant: '#f59e0b', // amber — retrievable with effort + silent: '#8b5cf6', // violet — difficult, needs cues + unavailable: '#6b7280', // slate — needs reinforcement +}; + +export const MEMORY_STATE_DESCRIPTIONS: Record = { + active: 'Easily retrievable (retention ≥ 70%)', + dormant: 'Retrievable with effort (40–70%)', + silent: 'Difficult, needs cues (10–40%)', + unavailable: 'Needs reinforcement (< 10%)', +}; + +/// Color mode controls whether node spheres are tinted by node type +/// (fact / concept / event / …) or by FSRS memory state. +/// Type mode is the long-standing default; state mode is the v2.0.8 addition. +export type ColorMode = 'type' | 'state'; + +/// Pick a hex colour for a node given the active colour mode. +/// Falls back to the grey `unavailable` tone if the node's type is unknown. +export function getNodeColor(node: GraphNode, mode: ColorMode): string { + if (mode === 'state') { + return MEMORY_STATE_COLORS[getMemoryState(node.retention)]; + } + return NODE_TYPE_COLORS[node.type] || '#8B95A5'; +} + // Shared radial-gradient texture used for every node's glow Sprite. // Without a map, THREE.Sprite renders as a flat coloured plane — additive- // blending + UnrealBloomPass then amplifies its square edges into the @@ -80,6 +139,9 @@ export class NodeManager { labelSprites = new Map(); hoveredNode: string | null = null; selectedNode: string | null = null; + /// v2.0.8: colour nodes by FSRS memory state (active/dormant/silent/unavailable) + /// instead of node type. Switched at runtime via `setColorMode`. + colorMode: ColorMode = 'type'; private materializingNodes: MaterializingNode[] = []; private dissolvingNodes: DissolvingNode[] = []; @@ -89,6 +151,38 @@ export class NodeManager { this.group = new THREE.Group(); } + /// Switch the active colour mode and re-tint every live node in place. + /// Safe to call mid-animation — the mesh + glow materials are mutable. + /// Suppressed nodes keep their 20% opacity / zero-emissive treatment + /// since that is a separate visual channel (v2.0.5 SIF). + setColorMode(mode: ColorMode) { + if (this.colorMode === mode) return; + this.colorMode = mode; + for (const [id, mesh] of this.meshMap) { + const retention = (mesh.userData.retention as number | undefined) ?? 0; + const type = (mesh.userData.type as string | undefined) ?? 'fact'; + const stubNode = { + id, + label: '', + type, + retention, + tags: [], + createdAt: '', + updatedAt: '', + isCenter: false, + } as GraphNode; + const hex = getNodeColor(stubNode, mode); + const newColor = new THREE.Color(hex); + const mat = mesh.material as THREE.MeshStandardMaterial; + mat.color.copy(newColor); + mat.emissive.copy(newColor); + const glow = this.glowMap.get(id); + if (glow) { + (glow.material as THREE.SpriteMaterial).color.copy(newColor); + } + } + } + createNodes(nodes: GraphNode[]): Map { const phi = (1 + Math.sqrt(5)) / 2; const count = nodes.length; @@ -119,7 +213,9 @@ export class NodeManager { private createNodeMeshes(node: GraphNode, pos: THREE.Vector3, initialScale: number) { const size = 0.5 + node.retention * 2; - const color = NODE_TYPE_COLORS[node.type] || '#8B95A5'; + // v2.0.8: respect the active colour mode. Newly-added nodes during the + // same session follow the mode toggled at the UI layer. + const color = getNodeColor(node, this.colorMode); // v2.0.5 Active Forgetting: suppressed memories dim to 20% opacity // and lose their emissive glow, mimicking inhibitory-control silencing. diff --git a/apps/dashboard/src/routes/(app)/graph/+page.svelte b/apps/dashboard/src/routes/(app)/graph/+page.svelte index 060684b..28842a2 100644 --- a/apps/dashboard/src/routes/(app)/graph/+page.svelte +++ b/apps/dashboard/src/routes/(app)/graph/+page.svelte @@ -4,10 +4,12 @@ import Graph3D from '$components/Graph3D.svelte'; import RetentionCurve from '$components/RetentionCurve.svelte'; import TimeSlider from '$components/TimeSlider.svelte'; + import MemoryStateLegend from '$components/MemoryStateLegend.svelte'; import { api } from '$stores/api'; import { eventFeed } from '$stores/websocket'; import type { GraphResponse, GraphNode, GraphEdge, Memory } from '$types'; import type { GraphMutation } from '$lib/graph/events'; + import type { ColorMode } from '$lib/graph/nodes'; import { filterByDate } from '$lib/graph/temporal'; let graphData: GraphResponse | null = $state(null); @@ -19,6 +21,10 @@ let maxNodes = $state(150); let temporalEnabled = $state(false); let temporalDate = $state(new Date()); + // v2.0.8: colour spheres by node type (default) or by FSRS memory state + // (Active / Dormant / Silent / Unavailable). Legend overlay renders when + // state mode is active. + let colorMode: ColorMode = $state('type'); // Live counts that update on mutations let liveNodeCount = $state(0); @@ -158,6 +164,7 @@ centerId={graphData.center_id} events={$eventFeed} {isDreaming} + {colorMode} onSelect={onNodeSelect} onGraphMutation={handleGraphMutation} /> @@ -182,6 +189,32 @@
+ +
+ + +
+ esc
'),dt=b('
',1);function Et(f,h){je(h,!0);const S=()=>y(Ze,"$page",u),K=()=>y(Je,"$isConnected",u),L=()=>y(Pe,"$memoryCount",u),z=()=>y(Be,"$avgRetention",u),T=()=>y(Ue,"$uptimeSeconds",u),C=()=>y(he,"$suppressedCount",u),[u,q]=ge();let p=X(!1),g=X(""),E=X(void 0);Ne(()=>{xe.connect();function t(e){if((e.metaKey||e.ctrlKey)&&e.key==="k"){e.preventDefault(),c(p,!r(p)),c(g,""),r(p)&&requestAnimationFrame(()=>{var i;return(i=r(E))==null?void 0:i.focus()});return}if(e.key==="Escape"&&r(p)){c(p,!1);return}if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)return;if(e.key==="/"){e.preventDefault();const i=document.querySelector('input[type="text"]');i==null||i.focus();return}const o={g:"/graph",m:"/memories",t:"/timeline",f:"/feed",e:"/explore",i:"/intentions",s:"/stats"}[e.key.toLowerCase()];o&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&(e.preventDefault(),fe(`${_}${o}`))}return window.addEventListener("keydown",t),()=>{xe.disconnect(),window.removeEventListener("keydown",t)}});const I=[{href:"/graph",label:"Graph",icon:"◎",shortcut:"G"},{href:"/memories",label:"Memories",icon:"◈",shortcut:"M"},{href:"/timeline",label:"Timeline",icon:"◷",shortcut:"T"},{href:"/feed",label:"Feed",icon:"◉",shortcut:"F"},{href:"/explore",label:"Explore",icon:"◬",shortcut:"E"},{href:"/intentions",label:"Intentions",icon:"◇",shortcut:"I"},{href:"/stats",label:"Stats",icon:"◫",shortcut:"S"},{href:"/settings",label:"Settings",icon:"⚙",shortcut:","}],_e=I.slice(0,5);function se(t,e){const d=e.startsWith(_)?e.slice(_.length)||"/":e;return t==="/graph"?d==="/"||d==="/graph":d.startsWith(t)}let N=Y(()=>r(g)?I.filter(t=>t.label.toLowerCase().includes(r(g).toLowerCase())):I);function re(t){c(p,!1),c(g,""),fe(`${_}${t}`)}var ne=dt(),G=n(be(ne),6),R=s(G),oe=s(R),H=n(oe,2);Z(H,21,()=>I,ee,(t,e)=>{const d=Y(()=>se(r(e).href,S().url.pathname));var o=at(),i=s(o),w=s(i,!0);a(i);var x=n(i,2),A=s(x,!0);a(x);var j=n(x,2),l=s(j,!0);a(j),a(o),F(()=>{te(o,"href",`${_??""}${r(e).href??""}`),ae(o,1,`flex items-center gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 text-sm +import"../chunks/Bzak7iHL.js";import{o as Ne}from"../chunks/DWVWfZUn.js";import{f as be,d as n,e as s,r as a,t as F,p as je,a as De,h as c,g as r,s as X,u as Y,O as ze}from"../chunks/VE8Jor13.js";import{s as v,d as Ge,a as k}from"../chunks/DHnEMX8z.js";import{i as M}from"../chunks/JkhlGLjU.js";import{e as Z,i as ee}from"../chunks/ByItJEsC.js";import{c as Re,a as m,f as b}from"../chunks/7UNxJI5L.js";import{s as He}from"../chunks/BZYVQ1d5.js";import{s as te,r as Oe}from"../chunks/Cu3VmnGp.js";import{s as ae}from"../chunks/BR2EHpd7.js";import{b as Ve}from"../chunks/BRHZEveZ.js";import{b as We}from"../chunks/DHakDdar.js";import{a as y,s as ge}from"../chunks/AcZBvMXu.js";import{s as Qe,g as fe}from"../chunks/BOu53idK.js";import{b as _}from"../chunks/UvrLlSZu.js";import{s as he,w as xe,u as Ue,a as Be,i as Je,m as Pe,f as Xe}from"../chunks/XIUN5r_Y.js";import"../chunks/CrlWs-6R.js";const Ye=()=>{const f=Qe;return{page:{subscribe:f.page.subscribe},navigating:{subscribe:f.navigating.subscribe},updated:f.updated}},Ze={subscribe(f){return Ye().page.subscribe(f)}};var et=b('
');function tt(f){const h=()=>y(he,"$suppressedCount",S),[S,K]=ge();var L=Re(),z=be(L);{var T=C=>{var u=et(),q=n(s(u),2),p=s(q);a(q),a(u),F(()=>v(p,`Actively forgetting ${h()??""} ${h()===1?"memory":"memories"}`)),m(C,u)};M(z,C=>{h()>0&&C(T)})}m(f,L),K()}var at=b(' '),st=b('
'),rt=b(''),nt=b(' '),ot=b(''),it=b('
No matches
'),lt=b('
esc
'),dt=b('
',1);function Et(f,h){je(h,!0);const S=()=>y(Ze,"$page",u),K=()=>y(Je,"$isConnected",u),L=()=>y(Pe,"$memoryCount",u),z=()=>y(Be,"$avgRetention",u),T=()=>y(Ue,"$uptimeSeconds",u),C=()=>y(he,"$suppressedCount",u),[u,q]=ge();let p=X(!1),g=X(""),E=X(void 0);Ne(()=>{xe.connect();function t(e){if((e.metaKey||e.ctrlKey)&&e.key==="k"){e.preventDefault(),c(p,!r(p)),c(g,""),r(p)&&requestAnimationFrame(()=>{var i;return(i=r(E))==null?void 0:i.focus()});return}if(e.key==="Escape"&&r(p)){c(p,!1);return}if(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement)return;if(e.key==="/"){e.preventDefault();const i=document.querySelector('input[type="text"]');i==null||i.focus();return}const o={g:"/graph",m:"/memories",t:"/timeline",f:"/feed",e:"/explore",i:"/intentions",s:"/stats"}[e.key.toLowerCase()];o&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&(e.preventDefault(),fe(`${_}${o}`))}return window.addEventListener("keydown",t),()=>{xe.disconnect(),window.removeEventListener("keydown",t)}});const I=[{href:"/graph",label:"Graph",icon:"◎",shortcut:"G"},{href:"/memories",label:"Memories",icon:"◈",shortcut:"M"},{href:"/timeline",label:"Timeline",icon:"◷",shortcut:"T"},{href:"/feed",label:"Feed",icon:"◉",shortcut:"F"},{href:"/explore",label:"Explore",icon:"◬",shortcut:"E"},{href:"/intentions",label:"Intentions",icon:"◇",shortcut:"I"},{href:"/stats",label:"Stats",icon:"◫",shortcut:"S"},{href:"/settings",label:"Settings",icon:"⚙",shortcut:","}],_e=I.slice(0,5);function se(t,e){const d=e.startsWith(_)?e.slice(_.length)||"/":e;return t==="/graph"?d==="/"||d==="/graph":d.startsWith(t)}let N=Y(()=>r(g)?I.filter(t=>t.label.toLowerCase().includes(r(g).toLowerCase())):I);function re(t){c(p,!1),c(g,""),fe(`${_}${t}`)}var ne=dt(),G=n(be(ne),6),R=s(G),oe=s(R),H=n(oe,2);Z(H,21,()=>I,ee,(t,e)=>{const d=Y(()=>se(r(e).href,S().url.pathname));var o=at(),i=s(o),w=s(i,!0);a(i);var x=n(i,2),A=s(x,!0);a(x);var j=n(x,2),l=s(j,!0);a(j),a(o),F(()=>{te(o,"href",`${_??""}${r(e).href??""}`),ae(o,1,`flex items-center gap-3 px-3 py-2.5 rounded-lg transition-all duration-200 text-sm ${r(d)?"bg-synapse/15 text-synapse-glow border border-synapse/30 shadow-[0_0_12px_rgba(99,102,241,0.15)] nav-active-border":"text-dim hover:text-text hover:bg-white/[0.03] border border-transparent"}`),v(w,r(e).icon),v(A,r(e).label),v(l,r(e).shortcut)}),m(t,o)}),a(H);var O=n(H,2),ye=s(O);a(O);var ie=n(O,2),V=s(ie),le=s(V),de=n(le,2),we=s(de,!0);a(de),a(V);var W=n(V,2),Q=s(W),$e=s(Q);a(Q);var U=n(Q,2),ke=s(U);a(U);var Fe=n(U,2);{var Ce=t=>{var e=st(),d=s(e);a(e),F(o=>v(d,`up ${o??""}`),[()=>Xe(T())]),m(t,e)};M(Fe,t=>{T()>0&&t(Ce)})}a(W);var Ee=n(W,2);{var Ae=t=>{var e=rt(),d=s(e);tt(d),a(e),m(t,e)};M(Ee,t=>{C()>0&&t(Ae)})}a(ie),a(R);var B=n(R,2),pe=s(B),Me=s(pe);He(Me,()=>h.children),a(pe),a(B);var ce=n(B,2),ve=s(ce),ue=s(ve);Z(ue,17,()=>_e,ee,(t,e)=>{const d=Y(()=>se(r(e).href,S().url.pathname));var o=nt(),i=s(o),w=s(i,!0);a(i);var x=n(i,2),A=s(x,!0);a(x),a(o),F(()=>{te(o,"href",`${_??""}${r(e).href??""}`),ae(o,1,`flex flex-col items-center gap-0.5 px-3 py-2 rounded-lg transition-all min-w-[3.5rem] ${r(d)?"text-synapse-glow":"text-muted"}`),v(w,r(e).icon),v(A,r(e).label)}),m(t,o)});var Se=n(ue,2);a(ve),a(ce),a(G);var Ke=n(G,2);{var Le=t=>{var e=lt(),d=s(e),o=s(d),i=n(s(o),2);Oe(i),We(i,l=>c(E,l),()=>r(E)),ze(2),a(o);var w=n(o,2),x=s(w);Z(x,17,()=>r(N),ee,(l,$)=>{var D=ot(),J=s(D),Te=s(J,!0);a(J);var P=n(J,2),qe=s(P,!0);a(P);var me=n(P,2),Ie=s(me,!0);a(me),a(D),F(()=>{v(Te,r($).icon),v(qe,r($).label),v(Ie,r($).shortcut)}),k("click",D,()=>re(r($).href)),m(l,D)});var A=n(x,2);{var j=l=>{var $=it();m(l,$)};M(A,l=>{r(N).length===0&&l(j)})}a(w),a(d),a(e),k("keydown",e,l=>{l.key==="Escape"&&c(p,!1)}),k("click",e,l=>{l.target===l.currentTarget&&c(p,!1)}),k("keydown",i,l=>{l.key==="Enter"&&r(N).length>0&&re(r(N)[0].href)}),Ve(i,()=>r(g),l=>c(g,l)),m(t,e)};M(Ke,t=>{r(p)&&t(Le)})}F(t=>{te(oe,"href",`${_??""}/graph`),ae(le,1,`w-2 h-2 rounded-full ${K()?"bg-recall animate-pulse-glow":"bg-decay"}`),v(we,K()?"Connected":"Offline"),v($e,`${L()??""} memories`),v(ke,`${t??""}% retention`)},[()=>(z()*100).toFixed(0)]),k("click",ye,()=>{c(p,!0),c(g,""),requestAnimationFrame(()=>{var t;return(t=r(E))==null?void 0:t.focus()})}),k("click",Se,()=>{c(p,!0),c(g,""),requestAnimationFrame(()=>{var t;return(t=r(E))==null?void 0:t.focus()})}),m(f,ne),De(),q()}Ge(["click","keydown"]);export{Et as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/0.Dfz0v1Cj.js.br b/apps/dashboard/build/_app/immutable/nodes/0.Dfz0v1Cj.js.br new file mode 100644 index 0000000000000000000000000000000000000000..7debc809424ca20005feb8ceaa91b39c00ddf992 GIT binary patch literal 3248 zcmV;h3{UeLZY3hBL^Z%U;I_>05KUi?7^8F@QnNKL9U;lArK$N&J}*IOLts}*+s*S|Kq2mcpYnA!?= zX<545%ucqqkk{ns0p@)m$n49N7-ZQ4Ia&9OuBwuCZU{sBtBzoNF2kvIxWm2w7zxoy#41kl|IG!m=`D&U7nVGO>WrVrZayzN$`&~1%KTWAr}#n z2@)x;q-EO&Dt1BpMuHp3M95rnSx7IgsyC)jZs+)PB}3HxrFk{PA>7*Y#95r*{=&je zYNNTP{#koFf$U4k^h&rG=G=I1I>KVph7fryUG$jQxY_KM&BoONVo0RWQ+$i{Xqr5`zI68FC$p!1SJ3(~MiZzW5FQ7)4C8ER z?mP1w;RBM&z=tXSU4A3GX~%C+R*)!#m!!ZpL7kh#dTDy%)W?tKfXvQc zOuAREpNktZrc?Ay{Jvh>P6-gqiN%5jFnISbWRq_nxOOWd?snFA6l96cU8q;fvhFY2;QDXh@YZZq@XuoS$;n7(;PB>gpKOHOo#8w^MkrphKPN4uzB?dX1Bh-`>+KOC9klr;wSf6m?rl>L2$5N>Q4Y z0UkH>hZ#9mBWe8^>+15L*_EmE`k-_#ziebG^%w{-EXkev z4l04;ms5bDxZSoeb}IS+U)qiqfCA_ckK79)0_-|4*@uNvcIqsxjY>5(un_gN%{qC~ zvWUGJB!ntBuaa6nG2Ugii>ufm^cgWk{PoZnBe+|0(%?~lTA|3d#|zI4vd3guY5}yI zW`$ZBs6F4`&!mHruU0!%dwO>WgWcq0LQ@`Msv4rnT!^VGcwh6Iy5PU(; zbL(DBrmtD7G#lr^98vYIKy{tw-dQMAlShvlw^X9PPq$|m7^2cHxW_e!tTU*>jpfi% z+|yd)@ZO^$(NXy5ny8>b_zQ%{Eclq#g-5^?^zzBBAU;pZWDl zwe&S9gHqrVwrHV8ysT-{bDO_%0-tYSA!Ak9I+%sReyjTPnt;>lSb2A=k&K%Q`P#QJ zdQ|26jMy(si`9o9cNE*b>V`h*X_mg>@MpP5D;>jn8}Rrtsy8W4+<_B@=`2GsBS+{f zO_SG;(>?g#u6$Y+>#sv$-3)FKL=zWsi|RM};@%7LLj=!mqGuFbKOl>T1yx5bNWLlW zq{G@}r7Nh}A2n%2G?lrnC={0RI`PpJ)^d^WrH8jjUorptj!WC!cUAKnn zExmLF4O$JRrtQ6LGU|HTsLkrQ_3Ih_9HcBL;!>btr=@*6*NhmyO)QgAhdR!mc zLe3-_mzP@#ZpN~C&8eeq^h_fkzx8A^Zg`F&3nPD^P{MFRz#f+HzID2T$fQFq?=*!d z^~MFm0U6$m>$PrVs**p&GD5t@|H^KeJw#DQ#N5ep@p>das07 z?7QVcR~PI3ypqkIx;6d6dVcq?cVLJw7ztDf@>cT;#x}PS#OAOQuOa524Fjx2A6~z6q4(FuWFgLHreDX!A zRi6ASGQ0LEsn(p$th_7bkBrlP7hr=_Y8g_uS_A?ByeDBA!8H$92x`Ltb%X{TVb4a3 zz5~oAI3j~Kc<=53K6dOFF+-KKn@?{#z@z?iP5SNA%IzN<_X1O^dE<1zy@=fw?YLVh z&51x;Yovr-O<_M&dh~7@h(U4RQI8NgjhPM9<1oG&<6n&v&Wz>GUpqoaJZt~>FttCj^gD*gR9L7qVT%SBwHO(N40jYKMADV}Ruo#8C zs|G$EdJB~N@m$2i{@1$e2gd1nd9uTV=0K-Aofh<>l};Jci!u%e8&JXSTHT|NJ_Ig< zpr(QJ3eU|b<-B8^3NfVcm3f3Z0!2^O^8;ym53U!RGg9`yb-VAao2Di^3RWnHH28qN(4ony;C(TLjl47EU**99Wyj)By^>9cML#WK~ zQS}HPl5Y$3n3I!P5#I?r#27$A^DP-MpLHoky76-++ehp@+&-F)S| zG_p12kyWhS;Y+xs#j;r>$$yjYU4S`e1e3__p1~oqs?fsTMn&kAHF>Xq;aCx+DM%tK zFRQQUy8DYGQ6bB$Z4m;|jO=_&`X(w}vry5OO|whT>Nop&Ov=7&3}Y@fZvT``2Vb+t zn36&5QNIh*^2#@!+4Eco<+OGK>{bBXHdUMgTa3iUf;aS#>g0v3`O8JBjmD?9Dw7rl z(a<4eK%8i1m)q?KTV^%ICFSkAhxVu?neRPvS4g#Um?=HEB3*g^>oBsPLs?E%&-F1N z{qCwl43Y)=!gi0bijPpxt|`I9eo@3C0w$fBE%2`3snK4Tg5=YC=c3Fd#hyjP1*U87 zl}_0vkwFVO^%WUc&8+cw=UEJr2%OC?eM-)X@4ekA%a^`Y4QUFMz>>A+LsRn|^V=}q z%Dcr@F}dJLITicIbSr>97{_)Q{=Rabp-I4yJ4jh&lyzv6c(-kNgR(<%a`>N*D*R(H id`alA3BV3Or->B|n!vUP@npYcN#VRNdK0tRQ~wPrz+hwm literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/0.Dfz0v1Cj.js.gz b/apps/dashboard/build/_app/immutable/nodes/0.Dfz0v1Cj.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..299a0605665f782252ba2702295407d7f0f0265e GIT binary patch literal 3746 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 M0_ZRt0C}}wNB{r; literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js b/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js similarity index 81% rename from apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js rename to apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js index 237541d..23bb534 100644 --- a/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js +++ b/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js @@ -1 +1 @@ -import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{p as h,f as g,t as d,a as l,d as v,e as s,r as o}from"../chunks/VE8Jor13.js";import{s as p}from"../chunks/DHnEMX8z.js";import{a as _,f as x}from"../chunks/7UNxJI5L.js";import{i as $}from"../chunks/jyeIy8pa.js";import{p as m}from"../chunks/FMdNDkar.js";import{s as k}from"../chunks/00s_zK56.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=x("

",1);function D(f,n){h(n,!1),$();var t=E(),r=g(t),c=s(r,!0);o(r);var a=v(r,2),u=s(a,!0);o(a),d(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),_(f,t),l()}export{D as component}; +import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{p as h,f as g,t as d,a as l,d as v,e as s,r as o}from"../chunks/VE8Jor13.js";import{s as p}from"../chunks/DHnEMX8z.js";import{a as _,f as x}from"../chunks/7UNxJI5L.js";import{i as $}from"../chunks/jyeIy8pa.js";import{p as m}from"../chunks/UvrLlSZu.js";import{s as k}from"../chunks/BOu53idK.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=x("

",1);function D(f,n){h(n,!1),$();var t=E(),r=g(t),c=s(r,!0);o(r);var a=v(r,2),u=s(a,!0);o(a),d(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),_(f,t),l()}export{D as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js.br b/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js.br new file mode 100644 index 0000000000000000000000000000000000000000..742b9dd2202596fbbdd86ca0330bbab21c2ce23e GIT binary patch literal 350 zcmV-k0ipgIrvd;JAxY<&P4_HQQnV$9@OlO02cr8w)iXejG+;r>S=OS25*uSvt6#CN z)&f?kq1e1Oo41WhOD=hNP@VYqYrS4y(i7K;`iG@p&5iTxo*At%3BjY#ev7)Z$9v_s zg{ZBQ+CZZiWD>w88B$UpqR{gi6Cd>=uP2L3FC31ki0Dfr$LH?J&HJLH1ozJZVm=9( zzue}R7t?FXAZ`@IER>64;R}?{>mV;_cx^v@CRD_0aSrd2>DZ93^e5n#ZIM@+5`WFI zp0a$WNAw!vt2^^lRchBX%<93-=|M!(8yj3?sI5=3Y)EOdeKxF?A^AkV{xdt(k#3Kl)GeG7+C=&=gB}XHqgwF~u1SA;%`EDh)RhSPF w8799$@*yEmxUs+xIX_(Ny;PnJR!R?spRqyu1C?SV8?aGwr&7m8Y=#YM0caAVhX4Qo literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js.gz b/apps/dashboard/build/_app/immutable/nodes/1.Ch7DMSq8.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..0ba3c9b1c19268c359fc7235d341e2c56266af5e GIT binary patch literal 398 zcmV;90df8xiwFP!000026J?NHPunmQhVS_mrsCpQI!h^tQ7yQWSStZzo3x1yaf3|a zG$x5{`6DVs`R|j{UPR%>uXWz%e9FdX>t{(a&&r@GH@|-8)up_-PhQ?e@6##?Cg)z{Nmh!iI@FZx zC2hGS8@7YlRk>J^tNHMn_%o{+E@)Z=m3gTZSwn$}b|ol0UQj#%IwX6x0g9Gw!Bfnb z1B=I}G}U1DK4&dhJfj$x1Ag#0#T5v_zE6+-18lIZ=%@k!01N8ESO5S3 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js.br b/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js.br deleted file mode 100644 index a5ca9964fbbe01e54b5adf0e16c77a07f700bc14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmV-q0h|6Crvd$OGuhs%qsiD}sHk-GNN=q(zc~G7B_ivR-)o@R7Aga^57IeM!zT%5F zCLuV>!#`2(?EXk!H1Xn+-N2y&Owu4E6V7CTpxjHOiH~}b-$iemzR$s?7#}Xg^jb$B5ZONzd;v%~cc4HrxPY8qYghugOrY^IIclI2pVeMyNG1UC z;X`a|u@nsQOn!ru!im7*-U379{BW^HsXVI8P_h#D CNUSsf diff --git a/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js.gz b/apps/dashboard/build/_app/immutable/nodes/1.Cp5C3gY-.js.gz deleted file mode 100644 index 276264ecf5ddf631a463adb2aaad0cbc92e92066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)Q!iwFP!000026J?OgPUA2XhW9*$saPCKXVMk~R0J0ZTEu-Z(hTe>lQ@k@ zVq3OTl}34Y81=sKUy$@RER2LNN3?vUAWMrBO8 zQdsysDi%wO=;?}6n#PpUlGgj8?4VxWoZ0HtDKrm9Vi1%=n19*3mdvl0EB`p_Fw4$U zLF=}V%c8wC>`Dz%OM%D{w~5*&1wqwBx$J!7U89*!yn7(!4V>6u0YlAQt1@Qa+3iXsgs+Lh(R<^_1!M5(S(h9qb4~aFl z$rq9ctK$DY;wgA~hxdCtAvGG8q-j<)ox0lWwTJ6kynm&wO}1j*?#!*Ui{d+I2aLc* zdaMn~K<>+PS^u0=D7BY{fe$wyoZmK|XqJ!RKzIpr+1~lbeWM|i7cb>p=DGdt536F5 zb*CyPP(>XP4C!D9vUo|ECWJn}NRnh11G-7rV7R_P#g7gge~R;wQU-)FN9f4^rn}DH VRVXzouH3kN_y<0dNdrg$006#$X?Xwu diff --git a/apps/dashboard/build/_app/immutable/nodes/3.3JRFbDhf.js b/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js similarity index 80% rename from apps/dashboard/build/_app/immutable/nodes/3.3JRFbDhf.js rename to apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js index 2ab1a1a..2431e9e 100644 --- a/apps/dashboard/build/_app/immutable/nodes/3.3JRFbDhf.js +++ b/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js @@ -1 +1 @@ -import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{o as p}from"../chunks/DWVWfZUn.js";import{p as r,a as t}from"../chunks/VE8Jor13.js";import{i as a}from"../chunks/jyeIy8pa.js";import{g as m}from"../chunks/00s_zK56.js";function u(i,o){r(o,!1),p(()=>m("/graph",{replaceState:!0})),a(),t()}export{u as component}; +import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{o as p}from"../chunks/DWVWfZUn.js";import{p as r,a as t}from"../chunks/VE8Jor13.js";import{i as a}from"../chunks/jyeIy8pa.js";import{g as m}from"../chunks/BOu53idK.js";function u(i,o){r(o,!1),p(()=>m("/graph",{replaceState:!0})),a(),t()}export{u as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js.br b/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js.br new file mode 100644 index 0000000000000000000000000000000000000000..16af3e7c95df15cc50ee9a20e249aa7c979556db GIT binary patch literal 176 zcmV;h08jrLM*%=&aZZ1uwyN}m>?Gk zZVP#@x_iT}H6XPVh#YadsB2OXR87n;UaKLohjilI1F2}>#0H~C)^O1Tz@xDSsPg-L ep<=Qh{cLLQlhq94A_W{SXU2ts@N#l08{`0$I96)_ literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js.gz b/apps/dashboard/build/_app/immutable/nodes/3.BaQEyQZ-.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..00b82acc7b88dd3d96fef47e6f07c94a7d60b323 GIT binary patch literal 218 zcmV<0044t)iwFP!000026J5>Cio!4y1>n6;QM*bY(~gKgC^L(Wf{ucqXkm7jn%bzz z4QT?SrSC3r6}mc$^Bs`FB*I)Lt3}K5TbzT26n_42I!AcnMv3eem^Tsv(pYFJ)I|J2x7N^X4r} zrwS`jMUDuDv@rx(e?XZggnoTX5~mjfx{6t2xV}Td4;Cz+^*>um84$`Wp)LP^-#LF* Upwy_ivhBS00vsz@;79=g0P@jZ8vpt in i?Cc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var zt=(i,t,e)=>Pc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Ll,a as Ul}from"../chunks/DWVWfZUn.js";import{p as fs,I as Dc,a as ps,e as At,d as Dt,O as Lc,r as bt,t as on,g as V,u as ei,f as Il,s as De,h as te,c as Uc}from"../chunks/VE8Jor13.js";import{s as me,d as Nl,a as Ge}from"../chunks/DHnEMX8z.js";import{i as Zn}from"../chunks/JkhlGLjU.js";import{e as cr,i as sa}from"../chunks/ByItJEsC.js";import{a as we,f as Ue,c as Ic}from"../chunks/7UNxJI5L.js";import{s as Pe,r as Fl}from"../chunks/Cu3VmnGp.js";import{s as Er}from"../chunks/BR2EHpd7.js";import{s as $a}from"../chunks/ussr1V5_.js";import{b as Ol}from"../chunks/BRHZEveZ.js";import{b as Bl}from"../chunks/B5Pq2mnD.js";import{s as Nc,a as Fc}from"../chunks/AcZBvMXu.js";import{b as Oc}from"../chunks/FMdNDkar.js";import{b as Bc}from"../chunks/DHakDdar.js";import{p as cs}from"../chunks/ykT2B6d3.js";import{N as zl}from"../chunks/BNytumrp.js";import"../chunks/CrlWs-6R.js";import{i as zc}from"../chunks/jyeIy8pa.js";import{a as Zi}from"../chunks/DcQGRi49.js";import{e as kc}from"../chunks/XIUN5r_Y.js";/** +var Cc=Object.defineProperty;var Pc=(i,t,e)=>t in i?Cc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var zt=(i,t,e)=>Pc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Ll,a as Ul}from"../chunks/DWVWfZUn.js";import{p as fs,I as Dc,a as ps,e as At,d as Dt,O as Lc,r as bt,t as on,g as V,u as ei,f as Il,s as De,h as te,c as Uc}from"../chunks/VE8Jor13.js";import{s as me,d as Nl,a as Ge}from"../chunks/DHnEMX8z.js";import{i as Zn}from"../chunks/JkhlGLjU.js";import{e as cr,i as sa}from"../chunks/ByItJEsC.js";import{a as we,f as Ue,c as Ic}from"../chunks/7UNxJI5L.js";import{s as Pe,r as Fl}from"../chunks/Cu3VmnGp.js";import{s as Er}from"../chunks/BR2EHpd7.js";import{s as $a}from"../chunks/ussr1V5_.js";import{b as Ol}from"../chunks/BRHZEveZ.js";import{b as Bl}from"../chunks/B5Pq2mnD.js";import{s as Nc,a as Fc}from"../chunks/AcZBvMXu.js";import{b as Oc}from"../chunks/UvrLlSZu.js";import{b as Bc}from"../chunks/DHakDdar.js";import{p as cs}from"../chunks/ykT2B6d3.js";import{N as zl}from"../chunks/BNytumrp.js";import"../chunks/CrlWs-6R.js";import{i as zc}from"../chunks/jyeIy8pa.js";import{a as Zi}from"../chunks/DcQGRi49.js";import{e as kc}from"../chunks/XIUN5r_Y.js";/** * @license * Copyright 2010-2024 Three.js Authors * SPDX-License-Identifier: MIT diff --git a/apps/dashboard/build/_app/immutable/nodes/6.20aay-57.js.br b/apps/dashboard/build/_app/immutable/nodes/6.20aay-57.js.br new file mode 100644 index 0000000000000000000000000000000000000000..59094ca525619e2ac37627cdd1d735fe9927d66f GIT binary patch literal 121250 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

80zSW@qvR_a14^4g^l!l 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 literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/6.Dxyv36u8.js.br b/apps/dashboard/build/_app/immutable/nodes/6.Dxyv36u8.js.br deleted file mode 100644 index 60bb0d99feaaecb4e348a2e59d716b6afcbf428d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121262 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

Gb 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 diff --git a/apps/dashboard/build/_app/version.json b/apps/dashboard/build/_app/version.json index 79d7193..7335c9c 100644 --- a/apps/dashboard/build/_app/version.json +++ b/apps/dashboard/build/_app/version.json @@ -1 +1 @@ -{"version":"1776649505514"} \ No newline at end of file +{"version":"1776650393863"} \ No newline at end of file diff --git a/apps/dashboard/build/_app/version.json.br b/apps/dashboard/build/_app/version.json.br index 33fd4b9afd6ae171ff901ee91d5bd57953201a84..1705c2d16fe20585ec0959eef2c94554f7baf6c7 100644 GIT binary patch literal 29 lcmb1^V))_eKkb)u(tP=yvsSq*j5z5SAHPI5wBUx4900hk3}pZS literal 29 lcmb1^V)$`1H>dWvSHR+Ly{m*;lT_JjYY)D2dAv!}1^~pC4Tb;! diff --git a/apps/dashboard/build/_app/version.json.gz b/apps/dashboard/build/_app/version.json.gz index ce3cd2d88b05171bff5af87912ca6300658f216c..c36c6441bb6e559fd31eb1d17bbb98ab2149b5dd 100644 GIT binary patch delta 24 fcmdPbpCBV_YOu{@n}KoIDprP@tZc^83=9kaQ)vag delta 24 fcmdPbpCBW=(Ztli)YK$!6)Qu<+=El485kG

+ + + + + + + + + + + + + + + + + + + + + + + + + {#each ripples as r, i (i)} + + {/each} + + + {#each activeEdges as e, i (i)} + {@const pt = edgePoint(e)} + {#if pt} + + {/if} + {/each} + + + {#each activeNodes as n (n.id)} + {@const color = nodeColor(n.nodeType, n.isSource)} + {@const r = n.isSource + ? SOURCE_RADIUS * (0.7 + 0.3 * n.activation) + : NEIGHBOUR_RADIUS_BASE * (0.5 + 0.8 * n.activation)} + + + + + + + + {#if n.isSource && n.label} + + {n.label.length > 40 ? n.label.slice(0, 40) + '…' : n.label} + + {/if} + + {/each} + diff --git a/apps/dashboard/src/lib/components/AmbientAwarenessStrip.svelte b/apps/dashboard/src/lib/components/AmbientAwarenessStrip.svelte new file mode 100644 index 0000000..4b9453b --- /dev/null +++ b/apps/dashboard/src/lib/components/AmbientAwarenessStrip.svelte @@ -0,0 +1,312 @@ + + + +
+ +
+ + + + + {$memoryCount} + memories + · + + {retentionPct}% + + avg retention +
+ + + + +
+ {#if atRiskCount !== null && atRiskCount > 0} + {atRiskCount} + at risk + {:else if atRiskCount === 0} + 0 + at risk + {:else} + + at risk + {/if} +
+ + + + + + + + + + + + + + + {#if dreamState.isDreaming} + +
+ + + + + DREAMING... +
+ {/if} + + +
+ + + {#if suppressionFlash} + + {/if} +
+ + diff --git a/apps/dashboard/src/lib/components/ContradictionArcs.svelte b/apps/dashboard/src/lib/components/ContradictionArcs.svelte new file mode 100644 index 0000000..2969beb --- /dev/null +++ b/apps/dashboard/src/lib/components/ContradictionArcs.svelte @@ -0,0 +1,421 @@ + + +
+ + + { hoverNode = null; hoverArc = null; }} + onclick={handleBgClick} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {#each layout.arcs as arc (arc.pairIndex)} + {@const op = pairOpacity(arc.pairIndex, focusedPairIndex)} + {@const isFocused = focusedPairIndex === arc.pairIndex} + + + + { e.stopPropagation(); handleArcClick(arc.pairIndex); }} + onmouseenter={() => (hoverArc = arc)} + onmouseleave={() => (hoverArc = null)} + aria-label="contradiction {arc.pairIndex + 1}: {arc.topic}" + role="button" + tabindex="0" + onkeydown={(e) => { if (e.key === 'Enter') handleArcClick(arc.pairIndex); }} + /> + + + {/each} + + + {#each layout.nodes as node, i (node.memoryId + '-' + node.side + '-' + i)} + {@const op = pairOpacity(node.pairIndex, focusedPairIndex)} + {@const isFocused = focusedPairIndex === node.pairIndex} + {@const r = nodeRadius(node.trust)} + {@const fill = nodeColor(node.type)} + + + + (hoverNode = node)} + onmouseleave={() => (hoverNode = null)} + onclick={(e) => { e.stopPropagation(); handleArcClick(node.pairIndex); }} + role="button" + tabindex="0" + aria-label="memory {truncate(node.preview, 40)}" + onkeydown={(e) => { if (e.key === 'Enter') handleArcClick(node.pairIndex); }} + /> + + {#if isFocused} + {truncate(node.preview, 40)} + {/if} + {/each} + + + + + SEVERITY + + strong (>0.7) + + moderate (0.5-0.7) + + mild (0.3-0.5) + + + + + {#if hoverNode} +
+
+
+ {hoverNode.type ?? 'memory'} + trust {(hoverNode.trust * 100).toFixed(0)}% +
+
{hoverNode.preview}
+ {#if hoverNode.created} +
created {hoverNode.created}
+ {/if} + {#if hoverNode.tags && hoverNode.tags.length > 0} +
+ {hoverNode.tags.slice(0, 4).join(' · ')} +
+ {/if} +
+ {:else if hoverArc} +
+
+
+ {hoverArc.severity} conflict +
+
topic: {hoverArc.topic}
+
+ similarity {(hoverArc.similarity * 100).toFixed(0)}% · {hoverArc.dateDiff}d apart +
+
+ {/if} +
+ + diff --git a/apps/dashboard/src/lib/components/DreamInsightCard.svelte b/apps/dashboard/src/lib/components/DreamInsightCard.svelte new file mode 100644 index 0000000..6024015 --- /dev/null +++ b/apps/dashboard/src/lib/components/DreamInsightCard.svelte @@ -0,0 +1,211 @@ + + + +
+ + diff --git a/apps/dashboard/src/lib/components/DreamStageReplay.svelte b/apps/dashboard/src/lib/components/DreamStageReplay.svelte new file mode 100644 index 0000000..b407191 --- /dev/null +++ b/apps/dashboard/src/lib/components/DreamStageReplay.svelte @@ -0,0 +1,539 @@ + + + +
+ +
+
+
+ {current.num} +
+
+
{current.name}
+
{current.desc}
+
+
+ +
+ + +
+ + {#if stageIdx === 5} +
+ Episodic + hippocampus +
+
+ Semantic + cortex +
+
+ {/if} + + + + + + {#each cards as card (card.id)} +
+
+
+
+
+
+
+ {/each} + + + {#if stageIdx === 1} + + {/if} +
+ + +
+ {#if stageIdx === 1} + Replaying {dreamResult?.memoriesReplayed ?? cardCount} memories + {:else if stageIdx === 2} + New connections found: {dreamResult?.stats?.newConnectionsFound ?? connectionCount} + {:else if stageIdx === 3} + Strengthened: {dreamResult?.stats?.memoriesStrengthened ?? strengthenedCount} + {:else if stageIdx === 4} + Compressed: {dreamResult?.stats?.memoriesCompressed ?? prunedCount} + {:else if stageIdx === 5} + Connections persisted: {dreamResult?.connectionsPersisted ?? 0} + Insights: {dreamResult?.stats?.insightsGenerated ?? 0} + {/if} +
+
+ + diff --git a/apps/dashboard/src/lib/components/DuplicateCluster.svelte b/apps/dashboard/src/lib/components/DuplicateCluster.svelte new file mode 100644 index 0000000..f414ec5 --- /dev/null +++ b/apps/dashboard/src/lib/components/DuplicateCluster.svelte @@ -0,0 +1,192 @@ + + + +{#if memories.length > 0 && winner} +
+ +
+
+
+ + {(similarity * 100).toFixed(1)}% + + {similarityBandLabel(similarity)} + · {memories.length} memories +
+
+
+
+
+ + + + Suggested: {suggestedAction === 'merge' ? 'Merge' : 'Review'} + +
+ + +
+ {#each memories as memory (memory.id)} +
+ + + +
+ +
+ {memory.nodeType} + {#if memory.id === winner.id} + + WINNER + + {/if} + {#each safeTags(memory.tags, 4) as tag} + {tag} + {/each} +
+ + +

+ {expanded ? memory.content : previewContent(memory.content)} +

+ + + {#if formatDate(memory.createdAt)} +
+ {formatDate(memory.createdAt)} +
+ {/if} +
+ + +
+
+
+
+ + {(memory.retention * 100).toFixed(0)}% + +
+
+ {/each} +
+ + +
+ + + +
+
+{/if} diff --git a/apps/dashboard/src/lib/components/EvidenceCard.svelte b/apps/dashboard/src/lib/components/EvidenceCard.svelte new file mode 100644 index 0000000..e845666 --- /dev/null +++ b/apps/dashboard/src/lib/components/EvidenceCard.svelte @@ -0,0 +1,157 @@ + + +
+ +
+
+ + {meta.icon}{meta.label} + + {#if nodeType} + + {nodeType} + + {/if} +
+ #{shortId} +
+ + +

{preview}

+ + +
+
+ Trust + {trustPct.toFixed(0)}% +
+
+
+
+
+ + +
+ {formatDate(date)} + FSRS · reps × retention +
+
+ + diff --git a/apps/dashboard/src/lib/components/FSRSCalendar.svelte b/apps/dashboard/src/lib/components/FSRSCalendar.svelte new file mode 100644 index 0000000..053dc5e --- /dev/null +++ b/apps/dashboard/src/lib/components/FSRSCalendar.svelte @@ -0,0 +1,344 @@ + + +
+ +
+
+ Avg retention of memories due — last 2 weeks → next 4 +
+ retention + today +
+
+ +
+ + +
+ {#each DOW_LABELS as label} +
{label}
+ {/each} +
+ + +
+ {#each cells as cell (cell.key)} + {@const colors = cellColor(cell)} + + {/each} +
+ + +
+ + + Overdue + + + + Due today + + + + Within 7 days + + + + Future (8+ days) + +
+ + + {#if selectedCell && selectedCell.memories.length > 0} +
+
+
+

{fullDate(selectedCell.date)}

+

+ {selectedCell.memories.length} memor{selectedCell.memories.length === 1 ? 'y' : 'ies'} due + · avg retention {(selectedCell.avgRetention * 100).toFixed(0)}% +

+
+ +
+
+ {#each selectedCell.memories.slice(0, 100) as m (m.id)} +
+ +
+

{m.content}

+
+ {m.nodeType} + {#if m.reviewCount !== undefined} + · {m.reviewCount} review{m.reviewCount === 1 ? '' : 's'} + {/if} + {#each m.tags.slice(0, 2) as tag} + {tag} + {/each} +
+
+
+
+
+
+ {(m.retentionStrength * 100).toFixed(0)}% +
+
+ {/each} + {#if selectedCell.memories.length > 100} +

+ +{selectedCell.memories.length - 100} more +

+ {/if} +
+
+ {/if} +
+ + diff --git a/apps/dashboard/src/lib/components/Graph3D.svelte b/apps/dashboard/src/lib/components/Graph3D.svelte index a9960a2..7a55436 100644 --- a/apps/dashboard/src/lib/components/Graph3D.svelte +++ b/apps/dashboard/src/lib/components/Graph3D.svelte @@ -11,6 +11,7 @@ import { mapEventToEffects, type GraphMutationContext, type GraphMutation } from '$lib/graph/events'; import { createNebulaBackground, updateNebula } from '$lib/graph/shaders/nebula.frag'; import { createPostProcessing, updatePostProcessing, type PostProcessingStack } from '$lib/graph/shaders/post-processing'; + import { graphState } from '$lib/stores/graph-state.svelte'; import type * as THREE from 'three'; interface Props { @@ -59,8 +60,13 @@ let nebulaMaterial: THREE.ShaderMaterial; let postStack: PostProcessingStack; - // Event tracking - let processedEventCount = 0; + // Event tracking — we track the last-processed event by reference identity + // rather than by count, because the WebSocket store PREPENDS new events + // at index 0 and CAPS the array at MAX_EVENTS, so a numeric high-water + // mark would drift out of alignment (and did for ~3 versions — v2.3 + // demo uncovered this while trying to fire multiple MemoryCreated events + // in sequence). + let lastProcessedEvent: VestigeEvent | null = null; // Internal tracking: initial nodes + live-added nodes let allNodes: GraphNode[] = []; @@ -116,9 +122,23 @@ if (ctx) disposeScene(ctx); }); + // 120Hz Governor. All physics and effect counters are frame-based + // (orb.age++, forceSim.tick, materialization frames). On a ProMotion + // display the browser drives rAF at 120 FPS, which would double-speed + // every ritual. Clamping to ~60 FPS keeps the visual timing identical + // across displays without rewriting every counter to use delta time. + // The `- (dt % 16)` carry avoids long-term drift. + let govLastTime = 0; + function animate() { animationId = requestAnimationFrame(animate); - const time = performance.now() * 0.001; + const now = performance.now(); + if (govLastTime === 0) govLastTime = now; + const dt = now - govLastTime; + if (dt < 16) return; + govLastTime = now - (dt % 16); + + const time = now * 0.001; // Force simulation forceSim.tick(edges); @@ -132,7 +152,7 @@ // Animate particles.animate(time); - nodeManager.animate(time, allNodes, ctx.camera); + nodeManager.animate(time, allNodes, ctx.camera, graphState.brightness); // Dream mode dreamMode.setActive(isDreaming); @@ -157,10 +177,33 @@ } function processEvents() { - if (!events || events.length <= processedEventCount) return; + if (!events || events.length === 0) return; - const newEvents = events.slice(processedEventCount); - processedEventCount = events.length; + // Walk the feed from newest (index 0) backward until we hit the last + // event we already processed. Everything between is fresh. This is + // robust against both (a) prepend ordering and (b) the MAX_EVENTS cap + // dropping old entries off the tail. + const fresh: VestigeEvent[] = []; + for (const e of events) { + if (e === lastProcessedEvent) break; + fresh.push(e); + } + if (fresh.length === 0) return; + + // Event Horizon Guard. If the last-processed reference fell off the + // end of the capped array (burst of >MAX_EVENTS events in one tick), + // the walk above consumed the ENTIRE buffer — we'd try to animate + // 200 simultaneous births and melt the GPU. Detect the overflow and + // drop this batch on the floor; state is already current via + // lastProcessedEvent pointing forward. + if (fresh.length === events.length && events.length >= 200) { + // eslint-disable-next-line no-console + console.warn('[vestige] Event horizon overflow: dropping visuals for', fresh.length, 'events'); + lastProcessedEvent = events[0]; + return; + } + + lastProcessedEvent = events[0]; const mutationCtx: GraphMutationContext = { effects, @@ -180,8 +223,11 @@ }, }; - for (const event of newEvents) { - mapEventToEffects(event, mutationCtx, allNodes); + // Process oldest-first so cause precedes effect (e.g. MemoryCreated + // fires before a ConnectionDiscovered that references the new node). + // `fresh` is newest-first from the walk above, so iterate reversed. + for (let i = fresh.length - 1; i >= 0; i--) { + mapEventToEffects(fresh[i], mutationCtx, allNodes); } } diff --git a/apps/dashboard/src/lib/components/ImportanceRadar.svelte b/apps/dashboard/src/lib/components/ImportanceRadar.svelte new file mode 100644 index 0000000..92cf1b3 --- /dev/null +++ b/apps/dashboard/src/lib/components/ImportanceRadar.svelte @@ -0,0 +1,174 @@ + + + + + {#each RINGS as ring} + + {/each} + + + {#each AXIS_ORDER as axis} + {@const [x, y] = pointAt(1, axis.angle)} + + {/each} + + + + + + {#if size !== 'sm'} + {#each AXIS_ORDER as axis} + {@const [px, py] = pointAt(values[axis.key] * animProgress, axis.angle)} + + {/each} + {/if} + + + {#if showLabels} + {#each AXIS_ORDER as axis} + {@const pos = labelPos(axis.angle)} + + {(values[axis.key] * 100).toFixed(0)}% + + + {AXIS_LABELS[axis.key]} + + {/each} + {/if} + diff --git a/apps/dashboard/src/lib/components/InsightToast.svelte b/apps/dashboard/src/lib/components/InsightToast.svelte new file mode 100644 index 0000000..f941911 --- /dev/null +++ b/apps/dashboard/src/lib/components/InsightToast.svelte @@ -0,0 +1,253 @@ + + + +
+ {#each $toasts as t (t.id)} + + {/each} +
+ + diff --git a/apps/dashboard/src/lib/components/MemoryAuditTrail.svelte b/apps/dashboard/src/lib/components/MemoryAuditTrail.svelte new file mode 100644 index 0000000..4a4e8f3 --- /dev/null +++ b/apps/dashboard/src/lib/components/MemoryAuditTrail.svelte @@ -0,0 +1,185 @@ + + +
+ {#if loading} +
+ {#each Array(5) as _} +
+ {/each} +
+ {:else if errored} +

Audit trail failed to load.

+ {:else if !memoryId} +

No memory selected.

+ {:else if events.length === 0} +

No audit events recorded yet.

+ {:else} +
    + {#each visibleEvents as ev, i (ev.timestamp + i)} + {@const m = META[ev.action]} + {@const delta = formatRetentionDelta(ev.old_value, ev.new_value)} +
  1. + + + + +
    +
    +
    + {m.label} + {#if ev.triggered_by} + {ev.triggered_by} + {/if} +
    + + {relativeTime(ev.timestamp)} + +
    + {#if delta} +
    + retention {delta} +
    + {/if} + {#if ev.reason} +
    {ev.reason}
    + {/if} +
    +
  2. + {/each} +
+ + {#if hiddenCount > 0} + + {/if} + {/if} +
+ + diff --git a/apps/dashboard/src/lib/components/PatternTransferHeatmap.svelte b/apps/dashboard/src/lib/components/PatternTransferHeatmap.svelte new file mode 100644 index 0000000..263661d --- /dev/null +++ b/apps/dashboard/src/lib/components/PatternTransferHeatmap.svelte @@ -0,0 +1,251 @@ + + + +
+ + + + +
+
+ {mobileList.length} transfer pair{mobileList.length === 1 ? '' : 's'} · tap to filter +
+ {#if mobileList.length === 0} +
+ No cross-project transfers recorded yet. +
+ {:else} + {#each mobileList as row (row.from + '->' + row.to)} + + {/each} + {/if} +
+
diff --git a/apps/dashboard/src/lib/components/ReasoningChain.svelte b/apps/dashboard/src/lib/components/ReasoningChain.svelte new file mode 100644 index 0000000..61ea92d --- /dev/null +++ b/apps/dashboard/src/lib/components/ReasoningChain.svelte @@ -0,0 +1,259 @@ + + +
+ {#each STAGES as stage, i (stage.key)} +
+ + {#if i < STAGES.length - 1} +
+ {/if} + + +
+ {stage.icon} +
+ +
+
+ 0{i + 1} + {stage.label} +
+

{hintFor(stage.key, stage.base)}

+
+ + +
+ {/each} +
+ + diff --git a/apps/dashboard/src/lib/components/ThemeToggle.svelte b/apps/dashboard/src/lib/components/ThemeToggle.svelte new file mode 100644 index 0000000..25539a5 --- /dev/null +++ b/apps/dashboard/src/lib/components/ThemeToggle.svelte @@ -0,0 +1,175 @@ + + + + + + diff --git a/apps/dashboard/src/lib/components/__tests__/ActivationNetwork.test.ts b/apps/dashboard/src/lib/components/__tests__/ActivationNetwork.test.ts new file mode 100644 index 0000000..a1641c1 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/ActivationNetwork.test.ts @@ -0,0 +1,464 @@ +/** + * Unit tests for Spreading Activation helpers. + * + * Pure-logic coverage only — the SVG render layer is not exercised here + * (no jsdom). The six concerns we test are the ones that actually decide + * whether the burst looks right: + * + * 1. Per-tick decay math (Collins & Loftus 1975, 0.93/frame) + * 2. Compound decay after N ticks + * 3. Threshold filter (activation < 0.05 → invisible) + * 4. Concentric-ring placement around a source (8-per-ring, even angles) + * 5. Color mapping (source → synapse-glow, unknown type → fallback) + * 6. Staggered edge delay (rank ordering, ring-2 bonus) + * 7. Event-feed filter (only NEW ActivationSpread events since lastSeen) + * + * The test environment is Node (vitest `environment: 'node'`) — the same + * harness the graph + dream helper tests use. + */ +import { describe, it, expect } from 'vitest'; +import { + DECAY, + FALLBACK_COLOR, + MIN_VISIBLE, + RING_GAP, + RING_1_CAPACITY, + SOURCE_COLOR, + STAGGER_PER_RANK, + STAGGER_RING_2_BONUS, + activationColor, + applyDecay, + compoundDecay, + computeRing, + edgeStagger, + filterNewSpreadEvents, + initialActivation, + isVisible, + layoutNeighbours, + ringPositions, + ticksUntilInvisible, +} from '../activation-helpers'; +import { NODE_TYPE_COLORS, type VestigeEvent } from '$types'; + +// --------------------------------------------------------------------------- +// 1. Decay math — single tick +// --------------------------------------------------------------------------- + +describe('applyDecay (Collins & Loftus 1975, 0.93/frame)', () => { + it('multiplies activation by 0.93 per tick', () => { + expect(applyDecay(1)).toBeCloseTo(0.93, 10); + }); + + it('matches the documented constant', () => { + expect(DECAY).toBe(0.93); + }); + + it('returns 0 for zero / negative / non-finite input', () => { + expect(applyDecay(0)).toBe(0); + expect(applyDecay(-0.5)).toBe(0); + expect(applyDecay(Number.NaN)).toBe(0); + expect(applyDecay(Number.POSITIVE_INFINITY)).toBe(0); + }); + + it('preserves strict monotonic decrease', () => { + let a = 1; + let prev = a; + for (let i = 0; i < 50; i++) { + a = applyDecay(a); + if (a === 0) break; + expect(a).toBeLessThan(prev); + prev = a; + } + }); +}); + +// --------------------------------------------------------------------------- +// 2. Compound decay — N ticks +// --------------------------------------------------------------------------- + +describe('compoundDecay', () => { + it('0 ticks returns the input unchanged', () => { + expect(compoundDecay(0.8, 0)).toBe(0.8); + }); + + it('N ticks equals applyDecay called N times', () => { + let iterative = 1; + for (let i = 0; i < 10; i++) iterative = applyDecay(iterative); + expect(compoundDecay(1, 10)).toBeCloseTo(iterative, 10); + }); + + it('5 ticks from 1.0 lands in the 0.69..0.70 band', () => { + // 0.93^5 ≈ 0.6957 + const result = compoundDecay(1, 5); + expect(result).toBeGreaterThan(0.69); + expect(result).toBeLessThan(0.7); + }); + + it('treats negative tick counts as no-op', () => { + expect(compoundDecay(0.5, -3)).toBe(0.5); + }); +}); + +// --------------------------------------------------------------------------- +// 3. Threshold filter — fade/remove below MIN_VISIBLE +// --------------------------------------------------------------------------- + +describe('isVisible / MIN_VISIBLE threshold', () => { + it('MIN_VISIBLE is exactly 0.05', () => { + expect(MIN_VISIBLE).toBe(0.05); + }); + + it('returns true at exactly the threshold (inclusive floor)', () => { + expect(isVisible(0.05)).toBe(true); + }); + + it('returns false just below the threshold', () => { + expect(isVisible(0.0499)).toBe(false); + }); + + it('returns false for zero / negative / NaN', () => { + expect(isVisible(0)).toBe(false); + expect(isVisible(-0.1)).toBe(false); + expect(isVisible(Number.NaN)).toBe(false); + }); + + it('returns true for typical full-activation source', () => { + expect(isVisible(1)).toBe(true); + }); +}); + +describe('ticksUntilInvisible', () => { + it('returns 0 when input is already at/below MIN_VISIBLE', () => { + expect(ticksUntilInvisible(MIN_VISIBLE)).toBe(0); + expect(ticksUntilInvisible(0.03)).toBe(0); + expect(ticksUntilInvisible(0)).toBe(0); + }); + + it('produces a count that actually crosses the threshold', () => { + const n = ticksUntilInvisible(1); + expect(n).toBeGreaterThan(0); + // After n ticks we should be BELOW the threshold... + expect(compoundDecay(1, n)).toBeLessThan(MIN_VISIBLE); + // ...but one fewer tick should still be visible. + expect(compoundDecay(1, n - 1)).toBeGreaterThanOrEqual(MIN_VISIBLE); + }); + + it('takes ~42 ticks for a full-strength burst to fade to threshold', () => { + // log(0.05) / log(0.93) ≈ 41.27 → ceil → 42 + expect(ticksUntilInvisible(1)).toBe(42); + }); +}); + +// --------------------------------------------------------------------------- +// 4. Ring placement +// --------------------------------------------------------------------------- + +describe('computeRing', () => { + it('ranks 0..7 land on ring 1', () => { + for (let r = 0; r < RING_1_CAPACITY; r++) { + expect(computeRing(r)).toBe(1); + } + }); + + it('rank 8 and beyond land on ring 2', () => { + expect(computeRing(RING_1_CAPACITY)).toBe(2); + expect(computeRing(15)).toBe(2); + expect(computeRing(99)).toBe(2); + }); +}); + +describe('ringPositions (concentric circle layout)', () => { + it('returns an empty array for count 0', () => { + expect(ringPositions(0, 0, 0, 1)).toEqual([]); + }); + + it('places 4 nodes on ring 1 at radius RING_GAP, evenly spaced', () => { + const pts = ringPositions(0, 0, 4, 1, 0); + expect(pts).toHaveLength(4); + // First point at angle 0 → (RING_GAP, 0) + expect(pts[0].x).toBeCloseTo(RING_GAP, 6); + expect(pts[0].y).toBeCloseTo(0, 6); + // Every point sits on the circle of the correct radius. + for (const p of pts) { + const dist = Math.hypot(p.x, p.y); + expect(dist).toBeCloseTo(RING_GAP, 6); + } + }); + + it('places ring 2 at 2× RING_GAP from center', () => { + const pts = ringPositions(0, 0, 3, 2, 0); + for (const p of pts) { + expect(Math.hypot(p.x, p.y)).toBeCloseTo(RING_GAP * 2, 6); + } + }); + + it('honours the center (cx, cy)', () => { + const pts = ringPositions(500, 280, 2, 1, 0); + // With angleOffset=0 and 2 points, the two angles are 0 and π. + expect(pts[0].x).toBeCloseTo(500 + RING_GAP, 6); + expect(pts[0].y).toBeCloseTo(280, 6); + expect(pts[1].x).toBeCloseTo(500 - RING_GAP, 6); + expect(pts[1].y).toBeCloseTo(280, 6); + }); + + it('applies angleOffset to every point', () => { + const unrot = ringPositions(0, 0, 3, 1, 0); + const rot = ringPositions(0, 0, 3, 1, Math.PI / 2); + for (let i = 0; i < 3; i++) { + // Rotation preserves distance from center. + expect(Math.hypot(rot[i].x, rot[i].y)).toBeCloseTo( + Math.hypot(unrot[i].x, unrot[i].y), + 6, + ); + } + // And the first rotated point should now be near (0, RING_GAP) rather + // than (RING_GAP, 0). + expect(rot[0].x).toBeCloseTo(0, 6); + expect(rot[0].y).toBeCloseTo(RING_GAP, 6); + }); +}); + +describe('layoutNeighbours (spills overflow to ring 2)', () => { + it('returns one point per neighbour', () => { + expect(layoutNeighbours(0, 0, 15, 0)).toHaveLength(15); + expect(layoutNeighbours(0, 0, 3, 0)).toHaveLength(3); + expect(layoutNeighbours(0, 0, 0, 0)).toHaveLength(0); + }); + + it('first 8 neighbours are on ring 1 (radius RING_GAP)', () => { + const pts = layoutNeighbours(0, 0, 15, 0); + for (let i = 0; i < RING_1_CAPACITY; i++) { + expect(Math.hypot(pts[i].x, pts[i].y)).toBeCloseTo(RING_GAP, 6); + } + }); + + it('neighbour 9..N are on ring 2 (radius 2*RING_GAP)', () => { + const pts = layoutNeighbours(0, 0, 15, 0); + for (let i = RING_1_CAPACITY; i < 15; i++) { + expect(Math.hypot(pts[i].x, pts[i].y)).toBeCloseTo(RING_GAP * 2, 6); + } + }); +}); + +describe('initialActivation', () => { + it('rank 0 gets the highest activation', () => { + const a0 = initialActivation(0, 10); + const a1 = initialActivation(1, 10); + expect(a0).toBeGreaterThan(a1); + }); + + it('ring-2 ranks get a 0.75 ring penalty', () => { + // Rank 7 (last of ring 1) vs rank 8 (first of ring 2) — the jump in + // activation between them should include the 0.75 ring factor. + const ring1Last = initialActivation(7, 16); + const ring2First = initialActivation(8, 16); + expect(ring2First).toBeLessThan(ring1Last * 0.78); + }); + + it('returns values in (0, 1]', () => { + for (let i = 0; i < 20; i++) { + const a = initialActivation(i, 20); + expect(a).toBeGreaterThan(0); + expect(a).toBeLessThanOrEqual(1); + } + }); + + it('returns 0 for invalid inputs', () => { + expect(initialActivation(-1, 10)).toBe(0); + expect(initialActivation(0, 0)).toBe(0); + expect(initialActivation(Number.NaN, 10)).toBe(0); + }); +}); + +// --------------------------------------------------------------------------- +// 5. Color mapping +// --------------------------------------------------------------------------- + +describe('activationColor', () => { + it('source nodes always use SOURCE_COLOR (synapse-glow)', () => { + expect(activationColor('fact', true)).toBe(SOURCE_COLOR); + expect(activationColor('concept', true)).toBe(SOURCE_COLOR); + // Even if nodeType is garbage, source overrides. + expect(activationColor('garbage-type', true)).toBe(SOURCE_COLOR); + }); + + it('fact → NODE_TYPE_COLORS.fact (#00A8FF)', () => { + expect(activationColor('fact', false)).toBe(NODE_TYPE_COLORS.fact); + expect(activationColor('fact', false)).toBe('#00A8FF'); + }); + + it('every known node type resolves to its palette entry', () => { + for (const type of Object.keys(NODE_TYPE_COLORS)) { + expect(activationColor(type, false)).toBe(NODE_TYPE_COLORS[type]); + } + }); + + it('unknown node type falls back to FALLBACK_COLOR (soft steel)', () => { + expect(activationColor('not-a-real-type', false)).toBe(FALLBACK_COLOR); + expect(FALLBACK_COLOR).toBe('#8B95A5'); + }); + + it('null/undefined/empty nodeType also falls back', () => { + expect(activationColor(null, false)).toBe(FALLBACK_COLOR); + expect(activationColor(undefined, false)).toBe(FALLBACK_COLOR); + expect(activationColor('', false)).toBe(FALLBACK_COLOR); + }); +}); + +// --------------------------------------------------------------------------- +// 6. Staggered edge delay +// --------------------------------------------------------------------------- + +describe('edgeStagger', () => { + it('rank 0 has zero delay (first edge lights up immediately)', () => { + expect(edgeStagger(0)).toBe(0); + }); + + it('ring-1 edges are STAGGER_PER_RANK apart', () => { + expect(edgeStagger(1)).toBe(STAGGER_PER_RANK); + expect(edgeStagger(2)).toBe(STAGGER_PER_RANK * 2); + expect(edgeStagger(7)).toBe(STAGGER_PER_RANK * 7); + }); + + it('ring-2 edges add STAGGER_RING_2_BONUS on top of rank×stagger', () => { + expect(edgeStagger(8)).toBe(8 * STAGGER_PER_RANK + STAGGER_RING_2_BONUS); + expect(edgeStagger(12)).toBe(12 * STAGGER_PER_RANK + STAGGER_RING_2_BONUS); + }); + + it('monotonically non-decreasing', () => { + let prev = -1; + for (let i = 0; i < 20; i++) { + const s = edgeStagger(i); + expect(s).toBeGreaterThanOrEqual(prev); + prev = s; + } + }); + + it('produces 15 distinct delays for a typical 15-neighbour burst', () => { + const delays = Array.from({ length: 15 }, (_, i) => edgeStagger(i)); + expect(new Set(delays).size).toBe(15); + }); +}); + +// --------------------------------------------------------------------------- +// 7. Event-feed filter +// --------------------------------------------------------------------------- + +function spreadEvent( + source_id: string, + target_ids: string[], +): VestigeEvent { + return { type: 'ActivationSpread', data: { source_id, target_ids } }; +} + +describe('filterNewSpreadEvents', () => { + it('returns [] on empty feed', () => { + expect(filterNewSpreadEvents([], null)).toEqual([]); + }); + + it('returns all ActivationSpread payloads when lastSeen is null', () => { + const feed = [ + spreadEvent('a', ['b', 'c']), + spreadEvent('d', ['e']), + ]; + const out = filterNewSpreadEvents(feed, null); + expect(out).toHaveLength(2); + }); + + it('returns in oldest-first order (feed itself is newest-first)', () => { + const newest = spreadEvent('new', ['n1']); + const older = spreadEvent('old', ['o1']); + const out = filterNewSpreadEvents([newest, older], null); + expect(out[0].source_id).toBe('old'); + expect(out[1].source_id).toBe('new'); + }); + + it('stops at the lastSeen reference (object identity)', () => { + const oldest = spreadEvent('o', ['x']); + const middle = spreadEvent('m', ['y']); + const newest = spreadEvent('n', ['z']); + // Feed is prepended, so order is [newest, middle, oldest] + const feed = [newest, middle, oldest]; + const out = filterNewSpreadEvents(feed, middle); + // Only `newest` is fresh — middle and oldest were already processed. + expect(out).toHaveLength(1); + expect(out[0].source_id).toBe('n'); + }); + + it('returns [] if lastSeen is already the newest event', () => { + const e = spreadEvent('a', ['b']); + const out = filterNewSpreadEvents([e], e); + expect(out).toEqual([]); + }); + + it('ignores non-ActivationSpread events', () => { + const feed: VestigeEvent[] = [ + { type: 'MemoryCreated', data: { id: 'x' } }, + spreadEvent('a', ['b']), + { type: 'Heartbeat', data: {} }, + ]; + const out = filterNewSpreadEvents(feed, null); + expect(out).toHaveLength(1); + expect(out[0].source_id).toBe('a'); + }); + + it('skips malformed ActivationSpread events (missing / wrong-type fields)', () => { + const feed: VestigeEvent[] = [ + { type: 'ActivationSpread', data: {} }, // missing both + { type: 'ActivationSpread', data: { source_id: 'a' } }, // no targets + { type: 'ActivationSpread', data: { target_ids: ['b'] } }, // no source + { + type: 'ActivationSpread', + data: { source_id: 'a', target_ids: 'not-an-array' }, + }, + { + type: 'ActivationSpread', + data: { source_id: 'a', target_ids: [123, null, 'x'] }, + }, + ]; + const out = filterNewSpreadEvents(feed, null); + // Only the last one survives, with numeric/null targets filtered out. + expect(out).toHaveLength(1); + expect(out[0].source_id).toBe('a'); + expect(out[0].target_ids).toEqual(['x']); + }); + + it('preserves target array contents faithfully', () => { + const feed = [spreadEvent('src', ['t1', 't2', 't3'])]; + const out = filterNewSpreadEvents(feed, null); + expect(out[0].target_ids).toEqual(['t1', 't2', 't3']); + }); + + it('does not mutate its inputs', () => { + const feed = [spreadEvent('a', ['b', 'c'])]; + const snapshot = JSON.stringify(feed); + filterNewSpreadEvents(feed, null); + expect(JSON.stringify(feed)).toBe(snapshot); + }); +}); + +// --------------------------------------------------------------------------- +// Sanity: exported constants are the values the docstring promises +// --------------------------------------------------------------------------- + +describe('exported constants (contract pinning)', () => { + it('RING_1_CAPACITY is 8', () => { + expect(RING_1_CAPACITY).toBe(8); + }); + + it('STAGGER_PER_RANK is 4 frames', () => { + expect(STAGGER_PER_RANK).toBe(4); + }); + + it('STAGGER_RING_2_BONUS is 12 frames', () => { + expect(STAGGER_RING_2_BONUS).toBe(12); + }); + + it('RING_GAP is 140px', () => { + expect(RING_GAP).toBe(140); + }); + + it('SOURCE_COLOR is synapse-glow #818cf8', () => { + expect(SOURCE_COLOR).toBe('#818cf8'); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/AmbientAwarenessStrip.test.ts b/apps/dashboard/src/lib/components/__tests__/AmbientAwarenessStrip.test.ts new file mode 100644 index 0000000..e159e82 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/AmbientAwarenessStrip.test.ts @@ -0,0 +1,439 @@ +import { describe, it, expect } from 'vitest'; +import { + ACTIVITY_BUCKET_COUNT, + ACTIVITY_BUCKET_MS, + ACTIVITY_WINDOW_MS, + bucketizeActivity, + dreamInsightsCount, + findRecentDream, + formatAgo, + hasRecentSuppression, + isDreaming, + parseEventTimestamp, + type EventLike, +} from '../awareness-helpers'; + +// Fixed "now" — March 1 2026 12:00:00 UTC. All tests are clock-free. +const NOW = Date.parse('2026-03-01T12:00:00.000Z'); + +function mkEvent( + type: string, + data: Record = {}, +): EventLike { + return { type, data }; +} + +// ───────────────────────────────────────────────────────────────────────── +// parseEventTimestamp +// ───────────────────────────────────────────────────────────────────────── +describe('parseEventTimestamp', () => { + it('parses ISO-8601 string', () => { + const e = mkEvent('Foo', { timestamp: '2026-03-01T12:00:00.000Z' }); + expect(parseEventTimestamp(e)).toBe(NOW); + }); + + it('parses numeric ms (> 1e12)', () => { + const e = mkEvent('Foo', { timestamp: NOW }); + expect(parseEventTimestamp(e)).toBe(NOW); + }); + + it('parses numeric seconds (<= 1e12) by scaling x1000', () => { + const secs = Math.floor(NOW / 1000); + const e = mkEvent('Foo', { timestamp: secs }); + // Allow floating precision — must land in same second + const result = parseEventTimestamp(e); + expect(result).not.toBeNull(); + expect(Math.abs((result as number) - NOW)).toBeLessThan(1000); + }); + + it('falls back to `at` field', () => { + const e = mkEvent('Foo', { at: '2026-03-01T12:00:00.000Z' }); + expect(parseEventTimestamp(e)).toBe(NOW); + }); + + it('falls back to `occurred_at` field', () => { + const e = mkEvent('Foo', { occurred_at: '2026-03-01T12:00:00.000Z' }); + expect(parseEventTimestamp(e)).toBe(NOW); + }); + + it('prefers `timestamp` over `at` over `occurred_at`', () => { + const e = mkEvent('Foo', { + timestamp: '2026-03-01T12:00:00.000Z', + at: '2020-01-01T00:00:00.000Z', + occurred_at: '2019-01-01T00:00:00.000Z', + }); + expect(parseEventTimestamp(e)).toBe(NOW); + }); + + it('returns null for missing data', () => { + expect(parseEventTimestamp({ type: 'Foo' })).toBeNull(); + }); + + it('returns null for empty data object', () => { + expect(parseEventTimestamp(mkEvent('Foo', {}))).toBeNull(); + }); + + it('returns null for bad ISO string', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: 'not-a-date' }))).toBeNull(); + }); + + it('returns null for non-finite number (NaN)', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: Number.NaN }))).toBeNull(); + }); + + it('returns null for non-finite number (Infinity)', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: Number.POSITIVE_INFINITY }))).toBeNull(); + }); + + it('returns null for null timestamp', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: null as unknown as string }))).toBeNull(); + }); + + it('returns null for non-string non-number timestamp (object)', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: {} as unknown as string }))).toBeNull(); + }); + + it('returns null for a boolean timestamp', () => { + expect(parseEventTimestamp(mkEvent('Foo', { timestamp: true as unknown as string }))).toBeNull(); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// bucketizeActivity +// ───────────────────────────────────────────────────────────────────────── +describe('bucketizeActivity', () => { + it('returns 10 buckets of 30s each covering a 5-min window', () => { + expect(ACTIVITY_BUCKET_COUNT).toBe(10); + expect(ACTIVITY_BUCKET_MS).toBe(30_000); + expect(ACTIVITY_WINDOW_MS).toBe(300_000); + const result = bucketizeActivity([], NOW); + expect(result).toHaveLength(10); + expect(result.every((b) => b.count === 0 && b.ratio === 0)).toBe(true); + }); + + it('assigns newest event to the last bucket (index 9)', () => { + const e = mkEvent('MemoryCreated', { timestamp: NOW - 100 }); + const result = bucketizeActivity([e], NOW); + expect(result[9].count).toBe(1); + expect(result[9].ratio).toBe(1); + for (let i = 0; i < 9; i++) expect(result[i].count).toBe(0); + }); + + it('assigns oldest-edge event to bucket 0', () => { + // Exactly 5 min ago → at start boundary → floor((0)/30s) = 0 + const e = mkEvent('MemoryCreated', { timestamp: NOW - ACTIVITY_WINDOW_MS + 1 }); + const result = bucketizeActivity([e], NOW); + expect(result[0].count).toBe(1); + }); + + it('drops events older than 5 min (clock skew / pre-history)', () => { + const e = mkEvent('MemoryCreated', { timestamp: NOW - ACTIVITY_WINDOW_MS - 1 }); + const result = bucketizeActivity([e], NOW); + expect(result.every((b) => b.count === 0)).toBe(true); + }); + + it('drops future events (negative clock skew)', () => { + const e = mkEvent('MemoryCreated', { timestamp: NOW + 5_000 }); + const result = bucketizeActivity([e], NOW); + expect(result.every((b) => b.count === 0)).toBe(true); + }); + + it('drops Heartbeat events as noise', () => { + const e = mkEvent('Heartbeat', { timestamp: NOW - 100 }); + const result = bucketizeActivity([e], NOW); + expect(result.every((b) => b.count === 0)).toBe(true); + }); + + it('drops events with unparseable timestamps', () => { + const e = mkEvent('MemoryCreated', { timestamp: 'garbage' }); + const result = bucketizeActivity([e], NOW); + expect(result.every((b) => b.count === 0)).toBe(true); + }); + + it('distributes events across buckets and computes correct ratios', () => { + const events = [ + // Bucket 9 (newest 30s): 3 events + mkEvent('MemoryCreated', { timestamp: NOW - 5_000 }), + mkEvent('MemoryCreated', { timestamp: NOW - 10_000 }), + mkEvent('MemoryCreated', { timestamp: NOW - 15_000 }), + // Bucket 8: 1 event (31s - 60s ago) + mkEvent('MemoryCreated', { timestamp: NOW - 35_000 }), + // Bucket 0 (oldest): 1 event (270s - 300s ago) + mkEvent('MemoryCreated', { timestamp: NOW - 290_000 }), + ]; + const result = bucketizeActivity(events, NOW); + expect(result[9].count).toBe(3); + expect(result[8].count).toBe(1); + expect(result[0].count).toBe(1); + expect(result[9].ratio).toBe(1); + expect(result[8].ratio).toBeCloseTo(1 / 3, 5); + expect(result[0].ratio).toBeCloseTo(1 / 3, 5); + }); + + it('handles events with numeric ms timestamp', () => { + const e = { type: 'MemoryCreated', data: { timestamp: NOW - 10_000 } }; + const result = bucketizeActivity([e], NOW); + expect(result[9].count).toBe(1); + }); + + it('works with a mixed real-world feed (200 events, some stale)', () => { + const events: EventLike[] = []; + for (let i = 0; i < 200; i++) { + const offset = i * 3_000; // one every 3s, oldest first + events.unshift(mkEvent('MemoryCreated', { timestamp: NOW - offset })); + } + // add 10 Heartbeats mid-stream + for (let i = 0; i < 10; i++) { + events.push(mkEvent('Heartbeat', { timestamp: NOW - i * 1_000 })); + } + const result = bucketizeActivity(events, NOW); + // 101 events fit in the [now-300s, now] window: offsets 0, 3s, 6s, …, 300s. + // Heartbeats excluded. Sum should be exactly 101. + const total = result.reduce((s, b) => s + b.count, 0); + expect(total).toBe(101); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// findRecentDream +// ───────────────────────────────────────────────────────────────────────── +describe('findRecentDream', () => { + it('returns null on empty feed', () => { + expect(findRecentDream([], NOW)).toBeNull(); + }); + + it('returns null when no DreamCompleted in feed', () => { + const feed = [ + mkEvent('MemoryCreated', { timestamp: NOW - 1000 }), + mkEvent('DreamStarted', { timestamp: NOW - 500 }), + ]; + expect(findRecentDream(feed, NOW)).toBeNull(); + }); + + it('returns the newest DreamCompleted within 24h', () => { + const fresh = mkEvent('DreamCompleted', { + timestamp: NOW - 60_000, + insights_generated: 7, + }); + const stale = mkEvent('DreamCompleted', { + timestamp: NOW - 2 * 24 * 60 * 60 * 1000, + }); + // Feed is newest-first + const result = findRecentDream([fresh, stale], NOW); + expect(result).toBe(fresh); + }); + + it('returns null when only DreamCompleted is older than 24h', () => { + const stale = mkEvent('DreamCompleted', { + timestamp: NOW - 25 * 60 * 60 * 1000, + }); + expect(findRecentDream([stale], NOW)).toBeNull(); + }); + + it('exactly 24h ago still counts (inclusive)', () => { + const edge = mkEvent('DreamCompleted', { + timestamp: NOW - 24 * 60 * 60 * 1000, + }); + expect(findRecentDream([edge], NOW)).toBe(edge); + }); + + it('stops at first DreamCompleted in newest-first feed', () => { + const newest = mkEvent('DreamCompleted', { timestamp: NOW - 1_000 }); + const older = mkEvent('DreamCompleted', { timestamp: NOW - 60_000 }); + expect(findRecentDream([newest, older], NOW)).toBe(newest); + }); + + it('falls back to nowMs for unparseable timestamps (treated as recent)', () => { + const e = mkEvent('DreamCompleted', { timestamp: 'bad' }); + expect(findRecentDream([e], NOW)).toBe(e); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// dreamInsightsCount +// ───────────────────────────────────────────────────────────────────────── +describe('dreamInsightsCount', () => { + it('returns null for null input', () => { + expect(dreamInsightsCount(null)).toBeNull(); + }); + + it('returns null when missing', () => { + expect(dreamInsightsCount(mkEvent('DreamCompleted', {}))).toBeNull(); + }); + + it('reads insights_generated (snake_case)', () => { + expect( + dreamInsightsCount(mkEvent('DreamCompleted', { insights_generated: 5 })), + ).toBe(5); + }); + + it('reads insightsGenerated (camelCase)', () => { + expect( + dreamInsightsCount(mkEvent('DreamCompleted', { insightsGenerated: 3 })), + ).toBe(3); + }); + + it('prefers snake_case when both present', () => { + expect( + dreamInsightsCount( + mkEvent('DreamCompleted', { insights_generated: 7, insightsGenerated: 99 }), + ), + ).toBe(7); + }); + + it('returns null for non-numeric value', () => { + expect( + dreamInsightsCount(mkEvent('DreamCompleted', { insights_generated: 'seven' as unknown as number })), + ).toBeNull(); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// isDreaming +// ───────────────────────────────────────────────────────────────────────── +describe('isDreaming', () => { + it('returns false for empty feed', () => { + expect(isDreaming([], NOW)).toBe(false); + }); + + it('returns false when no DreamStarted in feed', () => { + expect(isDreaming([mkEvent('MemoryCreated', { timestamp: NOW })], NOW)).toBe(false); + }); + + it('returns true for DreamStarted in last 5 min with no DreamCompleted', () => { + const feed = [mkEvent('DreamStarted', { timestamp: NOW - 60_000 })]; + expect(isDreaming(feed, NOW)).toBe(true); + }); + + it('returns false for DreamStarted older than 5 min with no DreamCompleted', () => { + const feed = [mkEvent('DreamStarted', { timestamp: NOW - 6 * 60 * 1000 })]; + expect(isDreaming(feed, NOW)).toBe(false); + }); + + it('returns false when DreamCompleted newer than DreamStarted', () => { + // Feed is newest-first: completed, then started + const feed = [ + mkEvent('DreamCompleted', { timestamp: NOW - 30_000 }), + mkEvent('DreamStarted', { timestamp: NOW - 60_000 }), + ]; + expect(isDreaming(feed, NOW)).toBe(false); + }); + + it('returns true when DreamCompleted is OLDER than DreamStarted (new cycle began)', () => { + // Newest-first: started is newer, and there's an older completed from a prior cycle + const feed = [ + mkEvent('DreamStarted', { timestamp: NOW - 30_000 }), + mkEvent('DreamCompleted', { timestamp: NOW - 10 * 60 * 1000 }), + ]; + expect(isDreaming(feed, NOW)).toBe(true); + }); + + it('boundary: DreamStarted exactly 5 min ago → still dreaming (>= check)', () => { + const feed = [mkEvent('DreamStarted', { timestamp: NOW - 5 * 60 * 1000 })]; + expect(isDreaming(feed, NOW)).toBe(true); + }); + + it('only considers FIRST DreamStarted / FIRST DreamCompleted (newest-first semantics)', () => { + const feed = [ + mkEvent('DreamStarted', { timestamp: NOW - 10_000 }), + mkEvent('DreamCompleted', { timestamp: NOW - 20_000 }), // older — prior cycle + mkEvent('DreamStarted', { timestamp: NOW - 30_000 }), // ignored + ]; + expect(isDreaming(feed, NOW)).toBe(true); + }); + + it('unparseable DreamStarted timestamp falls back to nowMs (counts as dreaming)', () => { + const feed = [mkEvent('DreamStarted', { timestamp: 'bad' })]; + expect(isDreaming(feed, NOW)).toBe(true); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// hasRecentSuppression +// ───────────────────────────────────────────────────────────────────────── +describe('hasRecentSuppression', () => { + it('returns false for empty feed', () => { + expect(hasRecentSuppression([], NOW)).toBe(false); + }); + + it('returns false when no MemorySuppressed in feed', () => { + const feed = [ + mkEvent('MemoryCreated', { timestamp: NOW }), + mkEvent('DreamStarted', { timestamp: NOW }), + ]; + expect(hasRecentSuppression(feed, NOW)).toBe(false); + }); + + it('returns true for MemorySuppressed within 10s', () => { + const feed = [mkEvent('MemorySuppressed', { timestamp: NOW - 5_000 })]; + expect(hasRecentSuppression(feed, NOW)).toBe(true); + }); + + it('returns false for MemorySuppressed older than 10s', () => { + const feed = [mkEvent('MemorySuppressed', { timestamp: NOW - 11_000 })]; + expect(hasRecentSuppression(feed, NOW)).toBe(false); + }); + + it('respects custom threshold', () => { + const feed = [mkEvent('MemorySuppressed', { timestamp: NOW - 8_000 })]; + expect(hasRecentSuppression(feed, NOW, 5_000)).toBe(false); + expect(hasRecentSuppression(feed, NOW, 10_000)).toBe(true); + }); + + it('stops at first MemorySuppressed (newest-first short-circuit)', () => { + const feed = [ + mkEvent('MemorySuppressed', { timestamp: NOW - 30_000 }), // first, outside window + mkEvent('MemorySuppressed', { timestamp: NOW - 1_000 }), // inside, but never checked + ]; + expect(hasRecentSuppression(feed, NOW)).toBe(false); + }); + + it('boundary: exactly at threshold counts (>= check)', () => { + const feed = [mkEvent('MemorySuppressed', { timestamp: NOW - 10_000 })]; + expect(hasRecentSuppression(feed, NOW, 10_000)).toBe(true); + }); + + it('unparseable timestamp falls back to nowMs (flash fires)', () => { + const feed = [mkEvent('MemorySuppressed', { timestamp: 'bad' })]; + expect(hasRecentSuppression(feed, NOW)).toBe(true); + }); + + it('ignores non-MemorySuppressed events before finding one', () => { + const feed = [ + mkEvent('MemoryCreated', { timestamp: NOW }), + mkEvent('DreamStarted', { timestamp: NOW }), + mkEvent('MemorySuppressed', { timestamp: NOW - 3_000 }), + ]; + expect(hasRecentSuppression(feed, NOW)).toBe(true); + }); +}); + +// ───────────────────────────────────────────────────────────────────────── +// formatAgo +// ───────────────────────────────────────────────────────────────────────── +describe('formatAgo', () => { + it('formats seconds', () => { + expect(formatAgo(5_000)).toBe('5s ago'); + expect(formatAgo(59_000)).toBe('59s ago'); + expect(formatAgo(0)).toBe('0s ago'); + }); + + it('formats minutes', () => { + expect(formatAgo(60_000)).toBe('1m ago'); + expect(formatAgo(59 * 60_000)).toBe('59m ago'); + }); + + it('formats hours', () => { + expect(formatAgo(60 * 60_000)).toBe('1h ago'); + expect(formatAgo(23 * 60 * 60_000)).toBe('23h ago'); + }); + + it('formats days', () => { + expect(formatAgo(24 * 60 * 60_000)).toBe('1d ago'); + expect(formatAgo(7 * 24 * 60 * 60_000)).toBe('7d ago'); + }); + + it('clamps negative input to 0', () => { + expect(formatAgo(-5_000)).toBe('0s ago'); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/ContradictionArcs.test.ts b/apps/dashboard/src/lib/components/__tests__/ContradictionArcs.test.ts new file mode 100644 index 0000000..5573d4c --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/ContradictionArcs.test.ts @@ -0,0 +1,326 @@ +/** + * Contradiction Constellation — pure-helper coverage. + * + * Runs in the vitest `node` environment (no jsdom). We only test the pure + * helpers extracted to `contradiction-helpers.ts`; the Svelte component is + * covered indirectly because every classification, opacity, radius, and + * color decision it renders routes through these functions. + */ +import { describe, it, expect } from 'vitest'; + +import { + severityColor, + severityLabel, + nodeColor, + nodeRadius, + clampTrust, + pairOpacity, + truncate, + uniqueMemoryCount, + avgTrustDelta, + NODE_COLORS, + KNOWN_NODE_TYPES, + NODE_COLOR_FALLBACK, + NODE_RADIUS_MIN, + NODE_RADIUS_RANGE, + SEVERITY_STRONG_COLOR, + SEVERITY_MODERATE_COLOR, + SEVERITY_MILD_COLOR, + UNFOCUSED_OPACITY, + type ContradictionLike, +} from '../contradiction-helpers'; + +// --------------------------------------------------------------------------- +// severityColor — strict-greater-than thresholds at 0.5 and 0.7. +// --------------------------------------------------------------------------- + +describe('severityColor', () => { + it('returns mild yellow at or below 0.5', () => { + expect(severityColor(0)).toBe(SEVERITY_MILD_COLOR); + expect(severityColor(0.29)).toBe(SEVERITY_MILD_COLOR); + expect(severityColor(0.3)).toBe(SEVERITY_MILD_COLOR); + expect(severityColor(0.5)).toBe(SEVERITY_MILD_COLOR); // boundary → lower band + }); + + it('returns moderate amber strictly above 0.5 and up to 0.7', () => { + expect(severityColor(0.51)).toBe(SEVERITY_MODERATE_COLOR); + expect(severityColor(0.6)).toBe(SEVERITY_MODERATE_COLOR); + expect(severityColor(0.7)).toBe(SEVERITY_MODERATE_COLOR); // boundary → lower band + }); + + it('returns strong red strictly above 0.7', () => { + expect(severityColor(0.71)).toBe(SEVERITY_STRONG_COLOR); + expect(severityColor(0.9)).toBe(SEVERITY_STRONG_COLOR); + expect(severityColor(1.0)).toBe(SEVERITY_STRONG_COLOR); + }); + + it('handles out-of-range numbers without crashing', () => { + expect(severityColor(-1)).toBe(SEVERITY_MILD_COLOR); + expect(severityColor(1.5)).toBe(SEVERITY_STRONG_COLOR); + }); +}); + +// --------------------------------------------------------------------------- +// severityLabel — matches severityColor thresholds. +// --------------------------------------------------------------------------- + +describe('severityLabel', () => { + it('labels mild at 0, 0.29, 0.3, 0.5', () => { + expect(severityLabel(0)).toBe('mild'); + expect(severityLabel(0.29)).toBe('mild'); + expect(severityLabel(0.3)).toBe('mild'); + expect(severityLabel(0.5)).toBe('mild'); + }); + + it('labels moderate at 0.51, 0.7', () => { + expect(severityLabel(0.51)).toBe('moderate'); + expect(severityLabel(0.7)).toBe('moderate'); + }); + + it('labels strong at 0.71, 1.0', () => { + expect(severityLabel(0.71)).toBe('strong'); + expect(severityLabel(1.0)).toBe('strong'); + }); + + it('covers all 8 ordered boundary cases from the audit', () => { + expect(severityLabel(0)).toBe('mild'); + expect(severityLabel(0.29)).toBe('mild'); + expect(severityLabel(0.3)).toBe('mild'); + expect(severityLabel(0.5)).toBe('mild'); + expect(severityLabel(0.51)).toBe('moderate'); + expect(severityLabel(0.7)).toBe('moderate'); + expect(severityLabel(0.71)).toBe('strong'); + expect(severityLabel(1.0)).toBe('strong'); + }); +}); + +// --------------------------------------------------------------------------- +// nodeColor — 8 known types plus fallback. +// --------------------------------------------------------------------------- + +describe('nodeColor', () => { + it('returns distinct colors for each of the 8 known node types', () => { + const colors = KNOWN_NODE_TYPES.map((t) => nodeColor(t)); + expect(colors.length).toBe(8); + expect(new Set(colors).size).toBe(8); // all distinct + }); + + it('matches the canonical palette exactly', () => { + expect(nodeColor('fact')).toBe(NODE_COLORS.fact); + expect(nodeColor('concept')).toBe(NODE_COLORS.concept); + expect(nodeColor('event')).toBe(NODE_COLORS.event); + expect(nodeColor('person')).toBe(NODE_COLORS.person); + expect(nodeColor('place')).toBe(NODE_COLORS.place); + expect(nodeColor('note')).toBe(NODE_COLORS.note); + expect(nodeColor('pattern')).toBe(NODE_COLORS.pattern); + expect(nodeColor('decision')).toBe(NODE_COLORS.decision); + }); + + it('falls back to violet for unknown / missing types', () => { + expect(nodeColor(undefined)).toBe(NODE_COLOR_FALLBACK); + expect(nodeColor(null)).toBe(NODE_COLOR_FALLBACK); + expect(nodeColor('')).toBe(NODE_COLOR_FALLBACK); + expect(nodeColor('bogus')).toBe(NODE_COLOR_FALLBACK); + expect(nodeColor('FACT')).toBe(NODE_COLOR_FALLBACK); // case-sensitive + }); + + it('violet fallback equals 0x8b5cf6', () => { + expect(NODE_COLOR_FALLBACK).toBe('#8b5cf6'); + }); +}); + +// --------------------------------------------------------------------------- +// nodeRadius + clampTrust — trust is defined on [0,1]. +// --------------------------------------------------------------------------- + +describe('nodeRadius', () => { + it('returns the minimum radius at trust=0', () => { + expect(nodeRadius(0)).toBe(NODE_RADIUS_MIN); + }); + + it('returns min + range at trust=1', () => { + expect(nodeRadius(1)).toBe(NODE_RADIUS_MIN + NODE_RADIUS_RANGE); + }); + + it('scales linearly in between', () => { + expect(nodeRadius(0.5)).toBeCloseTo(NODE_RADIUS_MIN + NODE_RADIUS_RANGE * 0.5); + }); + + it('clamps negative trust to 0 (minimum radius)', () => { + expect(nodeRadius(-0.5)).toBe(NODE_RADIUS_MIN); + expect(nodeRadius(-Infinity)).toBe(NODE_RADIUS_MIN); + }); + + it('clamps >1 trust to 1 (maximum radius)', () => { + expect(nodeRadius(2)).toBe(NODE_RADIUS_MIN + NODE_RADIUS_RANGE); + expect(nodeRadius(Infinity)).toBe(NODE_RADIUS_MIN); + // ^ Infinity isn't finite — falls back to min, matching "suppress suspicious data" + }); + + it('treats NaN as minimum (suppress bad data)', () => { + expect(nodeRadius(NaN)).toBe(NODE_RADIUS_MIN); + }); +}); + +describe('clampTrust', () => { + it('returns values inside [0,1] unchanged', () => { + expect(clampTrust(0)).toBe(0); + expect(clampTrust(0.5)).toBe(0.5); + expect(clampTrust(1)).toBe(1); + }); + + it('clamps negatives to 0 and >1 to 1', () => { + expect(clampTrust(-0.3)).toBe(0); + expect(clampTrust(1.3)).toBe(1); + }); + + it('collapses NaN / null / undefined / Infinity to 0', () => { + expect(clampTrust(NaN)).toBe(0); + expect(clampTrust(null)).toBe(0); + expect(clampTrust(undefined)).toBe(0); + expect(clampTrust(Infinity)).toBe(0); + expect(clampTrust(-Infinity)).toBe(0); + }); +}); + +// --------------------------------------------------------------------------- +// pairOpacity — trinary: no focus = 1, focused = 1, unfocused = 0.12. +// --------------------------------------------------------------------------- + +describe('pairOpacity', () => { + it('returns 1 when no pair is focused (null)', () => { + expect(pairOpacity(0, null)).toBe(1); + expect(pairOpacity(5, null)).toBe(1); + }); + + it('returns 1 when no pair is focused (undefined)', () => { + expect(pairOpacity(0, undefined)).toBe(1); + expect(pairOpacity(5, undefined)).toBe(1); + }); + + it('returns 1 for the focused pair', () => { + expect(pairOpacity(3, 3)).toBe(1); + expect(pairOpacity(0, 0)).toBe(1); + }); + + it('returns 0.12 for a non-focused pair when something is focused', () => { + expect(pairOpacity(0, 3)).toBe(UNFOCUSED_OPACITY); + expect(pairOpacity(7, 3)).toBe(UNFOCUSED_OPACITY); + }); + + it('does not explode for a stale focus index that matches nothing', () => { + // A focus index of 999 with only 5 pairs: every visible pair dims to 0.12. + // The missing pair renders nothing (silent no-op is correct). + for (let i = 0; i < 5; i++) { + expect(pairOpacity(i, 999)).toBe(UNFOCUSED_OPACITY); + } + }); +}); + +// --------------------------------------------------------------------------- +// truncate — length boundaries, empties, odd inputs. +// --------------------------------------------------------------------------- + +describe('truncate', () => { + it('returns strings shorter than max unchanged', () => { + expect(truncate('hi', 10)).toBe('hi'); + expect(truncate('abc', 5)).toBe('abc'); + }); + + it('returns empty strings unchanged', () => { + expect(truncate('', 5)).toBe(''); + expect(truncate('', 0)).toBe(''); + }); + + it('returns strings exactly at max unchanged', () => { + expect(truncate('12345', 5)).toBe('12345'); + expect(truncate('abcdef', 6)).toBe('abcdef'); + }); + + it('cuts strings longer than max, appending ellipsis within budget', () => { + expect(truncate('1234567890', 5)).toBe('1234…'); + expect(truncate('hello world', 6)).toBe('hello…'); + }); + + it('uses default max of 60', () => { + const long = 'a'.repeat(100); + const out = truncate(long); + expect(out.length).toBe(60); + expect(out.endsWith('…')).toBe(true); + }); + + it('null / undefined inputs return empty string', () => { + expect(truncate(null)).toBe(''); + expect(truncate(undefined)).toBe(''); + }); + + it('handles max=0 safely', () => { + expect(truncate('any string', 0)).toBe(''); + }); + + it('handles max=1 safely — one-char budget collapses to just the ellipsis', () => { + expect(truncate('abc', 1)).toBe('…'); + }); +}); + +// --------------------------------------------------------------------------- +// uniqueMemoryCount — union of memory_a_id + memory_b_id across pairs. +// --------------------------------------------------------------------------- + +describe('uniqueMemoryCount', () => { + const mkPair = (a: string, b: string): ContradictionLike => ({ + memory_a_id: a, + memory_b_id: b, + }); + + it('returns 0 for empty input', () => { + expect(uniqueMemoryCount([])).toBe(0); + }); + + it('counts both sides of every pair', () => { + expect(uniqueMemoryCount([mkPair('a', 'b')])).toBe(2); + expect(uniqueMemoryCount([mkPair('a', 'b'), mkPair('c', 'd')])).toBe(4); + }); + + it('deduplicates memories that appear in multiple pairs', () => { + // 'a' appears on both sides of two separate pairs. + expect(uniqueMemoryCount([mkPair('a', 'b'), mkPair('a', 'c')])).toBe(3); + expect(uniqueMemoryCount([mkPair('a', 'b'), mkPair('b', 'a')])).toBe(2); + }); + + it('handles a memory conflicting with itself (same id both sides)', () => { + expect(uniqueMemoryCount([mkPair('a', 'a')])).toBe(1); + }); + + it('ignores empty-string ids', () => { + expect(uniqueMemoryCount([mkPair('', '')])).toBe(0); + expect(uniqueMemoryCount([mkPair('a', '')])).toBe(1); + }); +}); + +// --------------------------------------------------------------------------- +// avgTrustDelta — safety against empty inputs. +// --------------------------------------------------------------------------- + +describe('avgTrustDelta', () => { + it('returns 0 on empty input (no NaN)', () => { + expect(avgTrustDelta([])).toBe(0); + }); + + it('computes mean absolute delta', () => { + const pairs = [ + { trust_a: 0.9, trust_b: 0.1 }, // 0.8 + { trust_a: 0.5, trust_b: 0.3 }, // 0.2 + ]; + expect(avgTrustDelta(pairs)).toBeCloseTo(0.5); + }); + + it('takes absolute value (order does not matter)', () => { + expect(avgTrustDelta([{ trust_a: 0.1, trust_b: 0.9 }])).toBeCloseTo(0.8); + expect(avgTrustDelta([{ trust_a: 0.9, trust_b: 0.1 }])).toBeCloseTo(0.8); + }); + + it('returns 0 when both sides are equal', () => { + expect(avgTrustDelta([{ trust_a: 0.5, trust_b: 0.5 }])).toBe(0); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/DreamInsightCard.test.ts b/apps/dashboard/src/lib/components/__tests__/DreamInsightCard.test.ts new file mode 100644 index 0000000..7d02844 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/DreamInsightCard.test.ts @@ -0,0 +1,258 @@ +/** + * Tests for DreamInsightCard helpers. + * + * Pure logic only — the Svelte template is a thin wrapper around these. + * Covers the boundaries of the gold-glow / muted novelty mapping, the + * formatting helpers, and the source-memory link scheme. + */ +import { describe, it, expect } from 'vitest'; + +import { + LOW_NOVELTY_THRESHOLD, + HIGH_NOVELTY_THRESHOLD, + clamp01, + noveltyBand, + formatDurationMs, + formatConfidencePct, + sourceMemoryHref, + firstSourceIds, + extraSourceCount, + shortMemoryId, +} from '../dream-helpers'; + +// --------------------------------------------------------------------------- +// clamp01 +// --------------------------------------------------------------------------- + +describe('clamp01', () => { + it.each<[number | null | undefined, number]>([ + [0, 0], + [1, 1], + [0.5, 0.5], + [-0.1, 0], + [-5, 0], + [1.1, 1], + [100, 1], + [null, 0], + [undefined, 0], + [Number.NaN, 0], + [Number.POSITIVE_INFINITY, 0], + [Number.NEGATIVE_INFINITY, 0], + ])('clamp01(%s) → %s', (input, expected) => { + expect(clamp01(input)).toBe(expected); + }); +}); + +// --------------------------------------------------------------------------- +// noveltyBand — the gold/muted visual classifier +// --------------------------------------------------------------------------- + +describe('noveltyBand — gold-glow / muted classification', () => { + it('has the documented thresholds', () => { + // These constants are contractual — the component's class bindings + // depend on them. If they change, the visual band shifts. + expect(LOW_NOVELTY_THRESHOLD).toBe(0.3); + expect(HIGH_NOVELTY_THRESHOLD).toBe(0.7); + }); + + it('classifies low-novelty (< 0.3) as muted', () => { + expect(noveltyBand(0)).toBe('low'); + expect(noveltyBand(0.1)).toBe('low'); + expect(noveltyBand(0.29)).toBe('low'); + expect(noveltyBand(0.2999)).toBe('low'); + }); + + it('classifies the boundary 0.3 exactly as neutral (NOT low)', () => { + // The component uses `novelty < 0.3`, strictly exclusive. + expect(noveltyBand(0.3)).toBe('neutral'); + }); + + it('classifies mid-range as neutral', () => { + expect(noveltyBand(0.3)).toBe('neutral'); + expect(noveltyBand(0.5)).toBe('neutral'); + expect(noveltyBand(0.7)).toBe('neutral'); + }); + + it('classifies the boundary 0.7 exactly as neutral (NOT high)', () => { + // The component uses `novelty > 0.7`, strictly exclusive. + expect(noveltyBand(0.7)).toBe('neutral'); + }); + + it('classifies high-novelty (> 0.7) as gold/high', () => { + expect(noveltyBand(0.71)).toBe('high'); + expect(noveltyBand(0.7001)).toBe('high'); + expect(noveltyBand(0.9)).toBe('high'); + expect(noveltyBand(1.0)).toBe('high'); + }); + + it('collapses null / undefined / NaN to the low band', () => { + expect(noveltyBand(null)).toBe('low'); + expect(noveltyBand(undefined)).toBe('low'); + expect(noveltyBand(Number.NaN)).toBe('low'); + }); + + it('clamps out-of-range values before classifying', () => { + // 2.0 clamps to 1.0 → high; -1 clamps to 0 → low. + expect(noveltyBand(2.0)).toBe('high'); + expect(noveltyBand(-1)).toBe('low'); + }); +}); + +// --------------------------------------------------------------------------- +// formatDurationMs +// --------------------------------------------------------------------------- + +describe('formatDurationMs', () => { + it('renders sub-second values with "ms" suffix', () => { + expect(formatDurationMs(0)).toBe('0ms'); + expect(formatDurationMs(1)).toBe('1ms'); + expect(formatDurationMs(500)).toBe('500ms'); + expect(formatDurationMs(999)).toBe('999ms'); + }); + + it('renders second-and-above values with "s" suffix, 2 decimals', () => { + expect(formatDurationMs(1000)).toBe('1.00s'); + expect(formatDurationMs(1500)).toBe('1.50s'); + expect(formatDurationMs(15000)).toBe('15.00s'); + expect(formatDurationMs(60000)).toBe('60.00s'); + }); + + it('rounds fractional millisecond values in the "ms" band', () => { + expect(formatDurationMs(0.4)).toBe('0ms'); + expect(formatDurationMs(12.7)).toBe('13ms'); + }); + + it('returns "0ms" for null / undefined / NaN / negative', () => { + expect(formatDurationMs(null)).toBe('0ms'); + expect(formatDurationMs(undefined)).toBe('0ms'); + expect(formatDurationMs(Number.NaN)).toBe('0ms'); + expect(formatDurationMs(-100)).toBe('0ms'); + expect(formatDurationMs(Number.POSITIVE_INFINITY)).toBe('0ms'); + }); +}); + +// --------------------------------------------------------------------------- +// formatConfidencePct +// --------------------------------------------------------------------------- + +describe('formatConfidencePct', () => { + it('renders 0 / 0.5 / 1 as whole-percent strings', () => { + expect(formatConfidencePct(0)).toBe('0%'); + expect(formatConfidencePct(0.5)).toBe('50%'); + expect(formatConfidencePct(1)).toBe('100%'); + }); + + it('rounds intermediate values', () => { + expect(formatConfidencePct(0.123)).toBe('12%'); + expect(formatConfidencePct(0.5049)).toBe('50%'); + expect(formatConfidencePct(0.505)).toBe('51%'); + expect(formatConfidencePct(0.999)).toBe('100%'); + }); + + it('clamps out-of-range input first', () => { + expect(formatConfidencePct(-0.5)).toBe('0%'); + expect(formatConfidencePct(2)).toBe('100%'); + }); + + it('handles null / undefined / NaN', () => { + expect(formatConfidencePct(null)).toBe('0%'); + expect(formatConfidencePct(undefined)).toBe('0%'); + expect(formatConfidencePct(Number.NaN)).toBe('0%'); + }); +}); + +// --------------------------------------------------------------------------- +// sourceMemoryHref +// --------------------------------------------------------------------------- + +describe('sourceMemoryHref — link format', () => { + it('builds the canonical /memories/:id path with no base', () => { + expect(sourceMemoryHref('abc123')).toBe('/memories/abc123'); + }); + + it('prepends the SvelteKit base path when provided', () => { + expect(sourceMemoryHref('abc123', '/dashboard')).toBe( + '/dashboard/memories/abc123', + ); + }); + + it('handles an empty base (default behaviour)', () => { + expect(sourceMemoryHref('abc', '')).toBe('/memories/abc'); + }); + + it('passes through full UUIDs untouched', () => { + const uuid = '550e8400-e29b-41d4-a716-446655440000'; + expect(sourceMemoryHref(uuid)).toBe(`/memories/${uuid}`); + }); +}); + +// --------------------------------------------------------------------------- +// firstSourceIds + extraSourceCount +// --------------------------------------------------------------------------- + +describe('firstSourceIds', () => { + it('returns [] for empty / null / undefined inputs', () => { + expect(firstSourceIds([])).toEqual([]); + expect(firstSourceIds(null)).toEqual([]); + expect(firstSourceIds(undefined)).toEqual([]); + }); + + it('returns the single element when array has one entry', () => { + expect(firstSourceIds(['a'])).toEqual(['a']); + }); + + it('returns the first 2 by default', () => { + expect(firstSourceIds(['a', 'b', 'c', 'd'])).toEqual(['a', 'b']); + }); + + it('honours a custom N', () => { + expect(firstSourceIds(['a', 'b', 'c', 'd'], 3)).toEqual(['a', 'b', 'c']); + expect(firstSourceIds(['a', 'b', 'c'], 5)).toEqual(['a', 'b', 'c']); + }); + + it('returns [] for non-positive N', () => { + expect(firstSourceIds(['a', 'b'], 0)).toEqual([]); + expect(firstSourceIds(['a', 'b'], -1)).toEqual([]); + }); +}); + +describe('extraSourceCount', () => { + it('returns 0 when there are no extras', () => { + expect(extraSourceCount([])).toBe(0); + expect(extraSourceCount(null)).toBe(0); + expect(extraSourceCount(['a'])).toBe(0); + expect(extraSourceCount(['a', 'b'])).toBe(0); + }); + + it('returns sources.length - shown when there are extras', () => { + expect(extraSourceCount(['a', 'b', 'c'])).toBe(1); + expect(extraSourceCount(['a', 'b', 'c', 'd', 'e'])).toBe(3); + }); + + it('honours a custom shown parameter', () => { + expect(extraSourceCount(['a', 'b', 'c', 'd', 'e'], 3)).toBe(2); + expect(extraSourceCount(['a', 'b'], 5)).toBe(0); + }); +}); + +// --------------------------------------------------------------------------- +// shortMemoryId +// --------------------------------------------------------------------------- + +describe('shortMemoryId', () => { + it('returns the full string when 8 chars or fewer', () => { + expect(shortMemoryId('abc')).toBe('abc'); + expect(shortMemoryId('12345678')).toBe('12345678'); + }); + + it('slices to 8 chars when longer', () => { + expect(shortMemoryId('123456789')).toBe('12345678'); + expect(shortMemoryId('550e8400-e29b-41d4-a716-446655440000')).toBe( + '550e8400', + ); + }); + + it('handles empty string defensively', () => { + expect(shortMemoryId('')).toBe(''); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/DreamStageReplay.test.ts b/apps/dashboard/src/lib/components/__tests__/DreamStageReplay.test.ts new file mode 100644 index 0000000..8d18e72 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/DreamStageReplay.test.ts @@ -0,0 +1,104 @@ +/** + * Tests for DreamStageReplay helpers. + * + * The Svelte component itself is rendered with CSS transforms + derived + * state. We can't mount it in Node without jsdom, so we test the PURE + * helpers it relies on — the same helpers also power the page's scrubber + * and the insight card. If `clampStage` is green, the scrubber can't go + * out of range; if `STAGE_NAMES` stays in sync with MemoryDreamer's 5 + * phases, the badge labels stay correct. + */ +import { describe, it, expect } from 'vitest'; + +import { + STAGE_COUNT, + STAGE_NAMES, + clampStage, + stageName, +} from '../dream-helpers'; + +describe('STAGE_NAMES — MemoryDreamer phase list', () => { + it('has exactly 5 stages matching MemoryDreamer.run()', () => { + expect(STAGE_COUNT).toBe(5); + expect(STAGE_NAMES).toHaveLength(5); + }); + + it('lists the phases in the canonical order', () => { + // Order is load-bearing: the stage replay animates in this sequence. + // Replay → Cross-reference → Strengthen → Prune → Transfer. + expect(STAGE_NAMES).toEqual([ + 'Replay', + 'Cross-reference', + 'Strengthen', + 'Prune', + 'Transfer', + ]); + }); +}); + +describe('clampStage — valid-range enforcement', () => { + it.each<[number, number]>([ + // Out-of-bounds low + [0, 1], + [-1, 1], + [-100, 1], + // In-range (exactly the valid stage indices) + [1, 1], + [2, 2], + [3, 3], + [4, 4], + [5, 5], + // Out-of-bounds high + [6, 5], + [7, 5], + [100, 5], + ])('clampStage(%s) → %s', (input, expected) => { + expect(clampStage(input)).toBe(expected); + }); + + it('floors fractional values before clamping', () => { + expect(clampStage(1.9)).toBe(1); + expect(clampStage(4.9)).toBe(4); + expect(clampStage(5.1)).toBe(5); + }); + + it('collapses NaN / Infinity / -Infinity to stage 1', () => { + expect(clampStage(Number.NaN)).toBe(1); + expect(clampStage(Number.POSITIVE_INFINITY)).toBe(1); + expect(clampStage(Number.NEGATIVE_INFINITY)).toBe(1); + }); + + it('returns a value usable as a 0-indexed STAGE_NAMES lookup', () => { + // The page uses `STAGE_NAMES[stageIdx - 1]`. Every clamped value + // must index a real name, not undefined. + for (const raw of [-5, 0, 1, 3, 5, 10, Number.NaN]) { + const idx = clampStage(raw); + expect(STAGE_NAMES[idx - 1]).toBeDefined(); + expect(typeof STAGE_NAMES[idx - 1]).toBe('string'); + } + }); +}); + +describe('stageName — resolves to the visible label', () => { + it('returns the matching name for every valid stage', () => { + expect(stageName(1)).toBe('Replay'); + expect(stageName(2)).toBe('Cross-reference'); + expect(stageName(3)).toBe('Strengthen'); + expect(stageName(4)).toBe('Prune'); + expect(stageName(5)).toBe('Transfer'); + }); + + it('falls back to the nearest valid name for out-of-range input', () => { + expect(stageName(0)).toBe('Replay'); + expect(stageName(-1)).toBe('Replay'); + expect(stageName(6)).toBe('Transfer'); + expect(stageName(100)).toBe('Transfer'); + }); + + it('never returns undefined, even for garbage input', () => { + for (const raw of [Number.NaN, Number.POSITIVE_INFINITY, -Number.MAX_VALUE]) { + expect(stageName(raw)).toBeDefined(); + expect(stageName(raw)).toMatch(/^[A-Z]/); + } + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/DuplicateCluster.test.ts b/apps/dashboard/src/lib/components/__tests__/DuplicateCluster.test.ts new file mode 100644 index 0000000..fac7c77 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/DuplicateCluster.test.ts @@ -0,0 +1,365 @@ +/** + * Pure-logic tests for the Memory Hygiene / Duplicate Detection UI. + * + * The Svelte components themselves are render-level code (no jsdom in this + * repo) — every ounce of behaviour worth testing is extracted into + * `duplicates-helpers.ts` and exercised here. If this file is green, the + * similarity bands, winner selection, suggested-action mapping, threshold + * filtering, cluster-identity keying, and the "safe render" helpers are all + * sound. + */ +import { describe, it, expect } from 'vitest'; + +import { + similarityBand, + similarityBandColor, + similarityBandLabel, + retentionColor, + pickWinner, + suggestedActionFor, + filterByThreshold, + clusterKey, + previewContent, + formatDate, + safeTags, +} from '../duplicates-helpers'; + +// --------------------------------------------------------------------------- +// Similarity band — boundaries at 0.92 (red) and 0.80 (amber). +// The boundary value MUST land in the higher band (>= semantics). +// --------------------------------------------------------------------------- +describe('similarityBand', () => { + it('0.92 exactly → near-identical (boundary)', () => { + expect(similarityBand(0.92)).toBe('near-identical'); + }); + + it('0.91 → strong (just below upper boundary)', () => { + expect(similarityBand(0.91)).toBe('strong'); + }); + + it('0.80 exactly → strong (boundary)', () => { + expect(similarityBand(0.8)).toBe('strong'); + }); + + it('0.79 → weak (just below strong boundary)', () => { + expect(similarityBand(0.79)).toBe('weak'); + }); + + it('0.50 → weak (well below)', () => { + expect(similarityBand(0.5)).toBe('weak'); + }); + + it('1.0 → near-identical', () => { + expect(similarityBand(1.0)).toBe('near-identical'); + }); + + it('0.0 → weak', () => { + expect(similarityBand(0.0)).toBe('weak'); + }); +}); + +describe('similarityBandColor', () => { + it('near-identical → decay var (red)', () => { + expect(similarityBandColor(0.95)).toBe('var(--color-decay)'); + }); + + it('strong → warning var (amber)', () => { + expect(similarityBandColor(0.85)).toBe('var(--color-warning)'); + }); + + it('weak → yellow-300 literal', () => { + expect(similarityBandColor(0.78)).toBe('#fde047'); + }); + + it('is consistent at boundary 0.92', () => { + expect(similarityBandColor(0.92)).toBe('var(--color-decay)'); + }); + + it('is consistent at boundary 0.80', () => { + expect(similarityBandColor(0.8)).toBe('var(--color-warning)'); + }); +}); + +describe('similarityBandLabel', () => { + it('labels near-identical', () => { + expect(similarityBandLabel(0.97)).toBe('Near-identical'); + }); + + it('labels strong', () => { + expect(similarityBandLabel(0.85)).toBe('Strong match'); + }); + + it('labels weak', () => { + expect(similarityBandLabel(0.75)).toBe('Weak match'); + }); +}); + +// --------------------------------------------------------------------------- +// Retention color — traffic-light: >0.7 green, >0.4 amber, else red. +// --------------------------------------------------------------------------- +describe('retentionColor', () => { + it('0.85 → green', () => expect(retentionColor(0.85)).toBe('#10b981')); + it('0.50 → amber', () => expect(retentionColor(0.5)).toBe('#f59e0b')); + it('0.30 → red', () => expect(retentionColor(0.3)).toBe('#ef4444')); + it('boundary 0.70 → amber (strict >)', () => expect(retentionColor(0.7)).toBe('#f59e0b')); + it('boundary 0.40 → red (strict >)', () => expect(retentionColor(0.4)).toBe('#ef4444')); + it('0.0 → red', () => expect(retentionColor(0)).toBe('#ef4444')); +}); + +// --------------------------------------------------------------------------- +// Winner selection — highest retention wins; ties → earliest index; empty +// list → null; NaN retentions never win. +// --------------------------------------------------------------------------- +describe('pickWinner', () => { + it('picks highest retention', () => { + const mem = [ + { id: 'a', retention: 0.3 }, + { id: 'b', retention: 0.9 }, + { id: 'c', retention: 0.5 }, + ]; + expect(pickWinner(mem)?.id).toBe('b'); + }); + + it('tie-break: earliest wins (stable)', () => { + const mem = [ + { id: 'a', retention: 0.8 }, + { id: 'b', retention: 0.8 }, + { id: 'c', retention: 0.7 }, + ]; + expect(pickWinner(mem)?.id).toBe('a'); + }); + + it('three-way tie: earliest wins', () => { + const mem = [ + { id: 'x', retention: 0.5 }, + { id: 'y', retention: 0.5 }, + { id: 'z', retention: 0.5 }, + ]; + expect(pickWinner(mem)?.id).toBe('x'); + }); + + it('all retention = 0: earliest wins (not null)', () => { + const mem = [ + { id: 'a', retention: 0 }, + { id: 'b', retention: 0 }, + ]; + expect(pickWinner(mem)?.id).toBe('a'); + }); + + it('single-member cluster: that member wins', () => { + const mem = [{ id: 'solo', retention: 0.42 }]; + expect(pickWinner(mem)?.id).toBe('solo'); + }); + + it('empty cluster: returns null', () => { + expect(pickWinner([])).toBeNull(); + }); + + it('NaN retention never wins over a real one', () => { + const mem = [ + { id: 'nan', retention: Number.NaN }, + { id: 'real', retention: 0.1 }, + ]; + expect(pickWinner(mem)?.id).toBe('real'); + }); + + it('all NaN retentions: earliest wins (stable fallback)', () => { + const mem = [ + { id: 'a', retention: Number.NaN }, + { id: 'b', retention: Number.NaN }, + ]; + expect(pickWinner(mem)?.id).toBe('a'); + }); +}); + +// --------------------------------------------------------------------------- +// Suggested action — >=0.92 merge, <0.85 review, 0.85..<0.92 null (caller +// honors upstream). +// --------------------------------------------------------------------------- +describe('suggestedActionFor', () => { + it('0.95 → merge', () => expect(suggestedActionFor(0.95)).toBe('merge')); + it('0.92 exactly → merge (boundary)', () => expect(suggestedActionFor(0.92)).toBe('merge')); + it('0.91 → null (ambiguous corridor)', () => expect(suggestedActionFor(0.91)).toBeNull()); + it('0.85 exactly → null (corridor bottom boundary)', () => + expect(suggestedActionFor(0.85)).toBeNull()); + it('0.849 → review (just below corridor)', () => + expect(suggestedActionFor(0.849)).toBe('review')); + it('0.70 → review', () => expect(suggestedActionFor(0.7)).toBe('review')); + it('0.0 → review', () => expect(suggestedActionFor(0)).toBe('review')); + it('1.0 → merge', () => expect(suggestedActionFor(1.0)).toBe('merge')); +}); + +// --------------------------------------------------------------------------- +// Threshold filter — strict >=. +// --------------------------------------------------------------------------- +describe('filterByThreshold', () => { + const clusters = [ + { similarity: 0.96, memories: [{ id: '1', retention: 1 }] }, + { similarity: 0.88, memories: [{ id: '2', retention: 1 }] }, + { similarity: 0.78, memories: [{ id: '3', retention: 1 }] }, + ]; + + it('0.80 keeps 0.96 and 0.88 (drops 0.78)', () => { + const out = filterByThreshold(clusters, 0.8); + expect(out.map((c) => c.similarity)).toEqual([0.96, 0.88]); + }); + + it('boundary: threshold = 0.88 keeps 0.88 (>=)', () => { + const out = filterByThreshold(clusters, 0.88); + expect(out.map((c) => c.similarity)).toEqual([0.96, 0.88]); + }); + + it('boundary: threshold = 0.881 drops 0.88', () => { + const out = filterByThreshold(clusters, 0.881); + expect(out.map((c) => c.similarity)).toEqual([0.96]); + }); + + it('0.95 (max) keeps only 0.96', () => { + const out = filterByThreshold(clusters, 0.95); + expect(out.map((c) => c.similarity)).toEqual([0.96]); + }); + + it('0.70 (min) keeps all three', () => { + const out = filterByThreshold(clusters, 0.7); + expect(out).toHaveLength(3); + }); + + it('empty input → empty output', () => { + expect(filterByThreshold([], 0.8)).toEqual([]); + }); +}); + +// --------------------------------------------------------------------------- +// Cluster identity — stable across order shuffles and re-fetches. +// --------------------------------------------------------------------------- +describe('clusterKey', () => { + it('identical member sets → identical keys (order-independent)', () => { + const a = [ + { id: 'a', retention: 0 }, + { id: 'b', retention: 0 }, + { id: 'c', retention: 0 }, + ]; + const b = [ + { id: 'c', retention: 0 }, + { id: 'a', retention: 0 }, + { id: 'b', retention: 0 }, + ]; + expect(clusterKey(a)).toBe(clusterKey(b)); + }); + + it('differing members → differing keys', () => { + const a = [ + { id: 'a', retention: 0 }, + { id: 'b', retention: 0 }, + ]; + const b = [ + { id: 'a', retention: 0 }, + { id: 'c', retention: 0 }, + ]; + expect(clusterKey(a)).not.toBe(clusterKey(b)); + }); + + it('does not mutate input order', () => { + const mem = [ + { id: 'z', retention: 0 }, + { id: 'a', retention: 0 }, + ]; + clusterKey(mem); + expect(mem.map((m) => m.id)).toEqual(['z', 'a']); + }); + + it('empty cluster → empty string', () => { + expect(clusterKey([])).toBe(''); + }); +}); + +// --------------------------------------------------------------------------- +// previewContent — trim + collapse whitespace + truncate at 80. +// --------------------------------------------------------------------------- +describe('previewContent', () => { + it('short content: unchanged', () => { + expect(previewContent('hello world')).toBe('hello world'); + }); + + it('collapses internal whitespace', () => { + expect(previewContent(' hello world ')).toBe('hello world'); + }); + + it('truncates with ellipsis', () => { + const long = 'a'.repeat(120); + const out = previewContent(long); + expect(out.length).toBe(81); // 80 + ellipsis + expect(out.endsWith('…')).toBe(true); + }); + + it('null-safe', () => { + expect(previewContent(null)).toBe(''); + expect(previewContent(undefined)).toBe(''); + }); + + it('honors custom max', () => { + expect(previewContent('abcdefghij', 5)).toBe('abcde…'); + }); +}); + +// --------------------------------------------------------------------------- +// formatDate — valid ISO → formatted; everything else → empty. +// --------------------------------------------------------------------------- +describe('formatDate', () => { + it('valid ISO → non-empty formatted string', () => { + const out = formatDate('2026-04-14T11:02:00Z'); + expect(out.length).toBeGreaterThan(0); + expect(out).not.toBe('Invalid Date'); + }); + + it('empty string → empty', () => { + expect(formatDate('')).toBe(''); + }); + + it('null → empty', () => { + expect(formatDate(null)).toBe(''); + }); + + it('undefined → empty', () => { + expect(formatDate(undefined)).toBe(''); + }); + + it('garbage string → empty (no "Invalid Date" leak)', () => { + expect(formatDate('not-a-date')).toBe(''); + }); + + it('non-string input → empty (defensive)', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(formatDate(12345 as any)).toBe(''); + }); +}); + +// --------------------------------------------------------------------------- +// safeTags — tolerant of undefined / non-array / empty. +// --------------------------------------------------------------------------- +describe('safeTags', () => { + it('normal array: slices to limit', () => { + expect(safeTags(['a', 'b', 'c', 'd', 'e'], 3)).toEqual(['a', 'b', 'c']); + }); + + it('undefined → []', () => { + expect(safeTags(undefined)).toEqual([]); + }); + + it('null → []', () => { + expect(safeTags(null)).toEqual([]); + }); + + it('empty array → []', () => { + expect(safeTags([])).toEqual([]); + }); + + it('non-array (defensive) → []', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect(safeTags('bad' as any)).toEqual([]); + }); + + it('honors default limit = 4', () => { + expect(safeTags(['a', 'b', 'c', 'd', 'e', 'f'])).toEqual(['a', 'b', 'c', 'd']); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/EvidenceCard.test.ts b/apps/dashboard/src/lib/components/__tests__/EvidenceCard.test.ts new file mode 100644 index 0000000..14a184d --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/EvidenceCard.test.ts @@ -0,0 +1,255 @@ +/** + * EvidenceCard — pure-logic coverage. + * + * The component itself mounts Svelte, which vitest cannot do in a node + * environment. Every piece of logic that was reachable via props has been + * extracted to `reasoning-helpers.ts`; this file exhaustively exercises + * those helpers through the same import surface EvidenceCard uses. If + * this file is green, the card's visual output is a 1:1 function of the + * helper output. + */ +import { describe, it, expect } from 'vitest'; + +import { + ROLE_META, + roleMetaFor, + trustColor, + trustPercent, + clampTrust, + nodeTypeColor, + formatDate, + shortenId, + CONFIDENCE_EMERALD, + CONFIDENCE_AMBER, + CONFIDENCE_RED, + DEFAULT_NODE_TYPE_COLOR, + type EvidenceRole, +} from '../reasoning-helpers'; +import { NODE_TYPE_COLORS } from '$types'; + +// ──────────────────────────────────────────────────────────────── +// clampTrust + trustPercent — numeric contract +// ──────────────────────────────────────────────────────────────── + +describe('clampTrust — 0-1 display range', () => { + it.each<[number, number]>([ + [0, 0], + [0.5, 0.5], + [1, 1], + [-0.1, 0], + [-1, 0], + [1.2, 1], + [999, 1], + ])('clamps %f → %f', (input, expected) => { + expect(clampTrust(input)).toBe(expected); + }); + + it('returns 0 for NaN (defensive — avoids NaN% in the UI)', () => { + expect(clampTrust(Number.NaN)).toBe(0); + }); + + it('returns 0 for non-finite inputs (+/-Infinity) — safe default', () => { + // Infinity indicates upstream garbage — degrade to empty bar rather + // than saturate the UI to 100%. + expect(clampTrust(-Infinity)).toBe(0); + expect(clampTrust(Infinity)).toBe(0); + }); + + it('is idempotent (clamp of clamp is the same)', () => { + for (const v of [-0.5, 0, 0.3, 0.75, 1, 2]) { + expect(clampTrust(clampTrust(v))).toBe(clampTrust(v)); + } + }); +}); + +describe('trustPercent — 0-100 rendering', () => { + it.each<[number, number]>([ + [0, 0], + [0.5, 50], + [1, 100], + [-0.1, 0], + [1.2, 100], + ])('converts trust %f → %f%%', (t, expected) => { + expect(trustPercent(t)).toBe(expected); + }); + + it('handles NaN without producing NaN', () => { + expect(trustPercent(Number.NaN)).toBe(0); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// trustColor — band boundaries for the card's trust bar +// ──────────────────────────────────────────────────────────────── + +describe('trustColor — boundary analysis', () => { + it.each<[number, string]>([ + // Emerald band: strictly > 0.75 → > 75% + [1.0, CONFIDENCE_EMERALD], + [0.9, CONFIDENCE_EMERALD], + [0.751, CONFIDENCE_EMERALD], + // Amber band: 0.40 ≤ t ≤ 0.75 + [0.75, CONFIDENCE_AMBER], // boundary — amber at exactly 75% + [0.5, CONFIDENCE_AMBER], + [0.4, CONFIDENCE_AMBER], // boundary — amber at exactly 40% + // Red band: < 0.40 + [0.399, CONFIDENCE_RED], + [0.2, CONFIDENCE_RED], + [0, CONFIDENCE_RED], + ])('trust %f → %s', (t, expected) => { + expect(trustColor(t)).toBe(expected); + }); + + it('clamps negative to red and super-high to emerald (defensive)', () => { + expect(trustColor(-0.5)).toBe(CONFIDENCE_RED); + expect(trustColor(1.5)).toBe(CONFIDENCE_EMERALD); + }); + + it('returns red for NaN (lowest-confidence fallback)', () => { + expect(trustColor(Number.NaN)).toBe(CONFIDENCE_RED); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// Role metadata — label + accent + icon +// ──────────────────────────────────────────────────────────────── + +describe('ROLE_META — completeness and shape', () => { + const roles: EvidenceRole[] = ['primary', 'supporting', 'contradicting', 'superseded']; + + it('defines an entry for every role', () => { + for (const r of roles) { + expect(ROLE_META[r]).toBeDefined(); + } + }); + + it.each(roles)('%s has non-empty label + icon', (r) => { + const meta = ROLE_META[r]; + expect(meta.label.length).toBeGreaterThan(0); + expect(meta.icon.length).toBeGreaterThan(0); + }); + + it('maps to the expected accent tokens used by Tailwind (synapse/recall/decay/muted)', () => { + expect(ROLE_META.primary.accent).toBe('synapse'); + expect(ROLE_META.supporting.accent).toBe('recall'); + expect(ROLE_META.contradicting.accent).toBe('decay'); + expect(ROLE_META.superseded.accent).toBe('muted'); + }); + + it('accents are unique across roles (each role is visually distinct)', () => { + const accents = roles.map((r) => ROLE_META[r].accent); + expect(new Set(accents).size).toBe(4); + }); + + it('icons are unique across roles', () => { + const icons = roles.map((r) => ROLE_META[r].icon); + expect(new Set(icons).size).toBe(4); + }); + + it('labels are human-readable (first letter capital, no accents on the word)', () => { + for (const r of roles) { + const label = ROLE_META[r].label; + expect(label[0]).toBe(label[0].toUpperCase()); + } + }); +}); + +describe('roleMetaFor — lookup with defensive fallback', () => { + it('returns the exact entry for a known role', () => { + expect(roleMetaFor('primary')).toBe(ROLE_META.primary); + expect(roleMetaFor('contradicting')).toBe(ROLE_META.contradicting); + }); + + it('falls back to Supporting when handed an unknown role (deep_reference could add new ones)', () => { + expect(roleMetaFor('unknown-role')).toBe(ROLE_META.supporting); + expect(roleMetaFor('')).toBe(ROLE_META.supporting); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// nodeTypeColor — palette lookup with fallback +// ──────────────────────────────────────────────────────────────── + +describe('nodeTypeColor — palette lookup', () => { + it('returns the fallback colour when nodeType is undefined/null/empty', () => { + expect(nodeTypeColor(undefined)).toBe(DEFAULT_NODE_TYPE_COLOR); + expect(nodeTypeColor(null)).toBe(DEFAULT_NODE_TYPE_COLOR); + expect(nodeTypeColor('')).toBe(DEFAULT_NODE_TYPE_COLOR); + }); + + it('returns the palette entry for every known NODE_TYPE_COLORS key', () => { + for (const [type, colour] of Object.entries(NODE_TYPE_COLORS)) { + expect(nodeTypeColor(type)).toBe(colour); + } + }); + + it('returns the fallback for an unknown nodeType', () => { + expect(nodeTypeColor('quantum-state')).toBe(DEFAULT_NODE_TYPE_COLOR); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// formatDate — invalid-date handling (the real bug fixed here) +// ──────────────────────────────────────────────────────────────── + +describe('formatDate — ISO parsing with graceful degradation', () => { + it('formats a valid ISO date into a locale string', () => { + const out = formatDate('2026-04-20T12:00:00.000Z', 'en-US'); + // Example: "Apr 20, 2026" + expect(out).toMatch(/2026/); + expect(out).toMatch(/Apr/); + }); + + it('returns em-dash for empty / null / undefined', () => { + expect(formatDate('')).toBe('—'); + expect(formatDate(null)).toBe('—'); + expect(formatDate(undefined)).toBe('—'); + expect(formatDate(' ')).toBe('—'); + }); + + it('returns the original string when the input is unparseable (never "Invalid Date")', () => { + // Regression: `new Date('not-a-date').toLocaleDateString()` returned + // the literal text "Invalid Date" — EvidenceCard rendered that. Now + // we surface the raw string so a reviewer can tell it was garbage. + const garbage = 'not-a-date'; + expect(formatDate(garbage)).toBe(garbage); + expect(formatDate(garbage)).not.toBe('Invalid Date'); + }); + + it('handles ISO dates without time component', () => { + const out = formatDate('2026-01-15', 'en-US'); + expect(out).toMatch(/2026/); + }); + + it('is pure — no global mutation between calls', () => { + const a = formatDate('2026-04-20T00:00:00.000Z', 'en-US'); + const b = formatDate('2026-04-20T00:00:00.000Z', 'en-US'); + expect(a).toBe(b); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// shortenId — UUID → #abcdef01 +// ──────────────────────────────────────────────────────────────── + +describe('shortenId — 8-char display prefix', () => { + it('returns an 8-char prefix for a standard UUID', () => { + expect(shortenId('a1b2c3d4-e5f6-0000-0000-000000000000')).toBe('a1b2c3d4'); + }); + + it('returns the full string when already ≤ 8 chars', () => { + expect(shortenId('abc')).toBe('abc'); + expect(shortenId('12345678')).toBe('12345678'); + }); + + it('handles null/undefined/empty gracefully', () => { + expect(shortenId(null)).toBe(''); + expect(shortenId(undefined)).toBe(''); + expect(shortenId('')).toBe(''); + }); + + it('respects a custom length parameter', () => { + expect(shortenId('abcdefghij', 4)).toBe('abcd'); + expect(shortenId('abcdefghij', 10)).toBe('abcdefghij'); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/FSRSCalendar.test.ts b/apps/dashboard/src/lib/components/__tests__/FSRSCalendar.test.ts new file mode 100644 index 0000000..0b61494 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/FSRSCalendar.test.ts @@ -0,0 +1,311 @@ +/** + * Tests for schedule / FSRS calendar helpers. These are the pure-logic core + * of the `schedule` page + `FSRSCalendar.svelte` component — the Svelte + * runtime is not exercised here (vitest runs `environment: node`, no jsdom). + */ +import { describe, it, expect } from 'vitest'; +import type { Memory } from '$types'; +import { + MS_DAY, + startOfDay, + daysBetween, + isoDate, + classifyUrgency, + daysUntilReview, + weekBucketRange, + avgRetention, + gridCellPosition, + gridStartForAnchor, + computeScheduleStats, +} from '../schedule-helpers'; + +function makeMemory(overrides: Partial = {}): Memory { + return { + id: 'm-' + Math.random().toString(36).slice(2, 8), + content: 'test memory', + nodeType: 'fact', + tags: [], + retentionStrength: 0.7, + storageStrength: 0.5, + retrievalStrength: 0.8, + createdAt: '2026-01-01T00:00:00Z', + updatedAt: '2026-01-01T00:00:00Z', + ...overrides, + }; +} + +// Fixed anchor: 2026-04-20 12:00 local so offsets don't straddle midnight +// in the default test runner's tz. All relative timestamps are derived from +// this anchor to keep tests tz-independent. +function anchor(): Date { + const d = new Date(2026, 3, 20, 12, 0, 0, 0); // Mon Apr 20 2026 12:00 local + return d; +} + +function offsetDays(base: Date, days: number, hour = 12): Date { + const d = new Date(base); + d.setDate(d.getDate() + days); + d.setHours(hour, 0, 0, 0); + return d; +} + +describe('startOfDay', () => { + it('zeros hours / minutes / seconds / ms', () => { + const d = new Date(2026, 3, 20, 14, 35, 27, 999); + const s = startOfDay(d); + expect(s.getHours()).toBe(0); + expect(s.getMinutes()).toBe(0); + expect(s.getSeconds()).toBe(0); + expect(s.getMilliseconds()).toBe(0); + expect(s.getFullYear()).toBe(2026); + expect(s.getMonth()).toBe(3); + expect(s.getDate()).toBe(20); + }); + + it('does not mutate its input', () => { + const input = new Date(2026, 3, 20, 14, 35); + const before = input.getTime(); + startOfDay(input); + expect(input.getTime()).toBe(before); + }); + + it('accepts an ISO string', () => { + const s = startOfDay('2026-04-20T14:35:00'); + expect(s.getHours()).toBe(0); + }); +}); + +describe('daysBetween', () => { + it('returns 0 for the same calendar day at different hours', () => { + const a = new Date(2026, 3, 20, 0, 0); + const b = new Date(2026, 3, 20, 23, 59); + expect(daysBetween(a, b)).toBe(0); + expect(daysBetween(b, a)).toBe(0); + }); + + it('returns positive for future, negative for past', () => { + const today = anchor(); + expect(daysBetween(offsetDays(today, 3), today)).toBe(3); + expect(daysBetween(offsetDays(today, -3), today)).toBe(-3); + }); + + it('is day-granular across the midnight boundary', () => { + const midnight = new Date(2026, 3, 20, 0, 0, 0, 0); + const justBefore = new Date(2026, 3, 19, 23, 59, 59, 999); + expect(daysBetween(midnight, justBefore)).toBe(1); + }); +}); + +describe('isoDate', () => { + it('formats as YYYY-MM-DD with zero-padding in LOCAL time', () => { + expect(isoDate(new Date(2026, 0, 5))).toBe('2026-01-05'); // jan 5 + expect(isoDate(new Date(2026, 11, 31))).toBe('2026-12-31'); + }); + + it('uses local day even for late-evening UTC-crossing timestamps', () => { + // This is the whole reason isoDate uses get* not getUTC*: calendar cells + // should match the user's perceived day. + const d = new Date(2026, 3, 20, 23, 30); // apr 20 23:30 local + expect(isoDate(d)).toBe('2026-04-20'); + }); +}); + +describe('classifyUrgency', () => { + const now = anchor(); + + it('returns "none" for missing nextReviewAt', () => { + expect(classifyUrgency(now, null)).toBe('none'); + expect(classifyUrgency(now, undefined)).toBe('none'); + expect(classifyUrgency(now, '')).toBe('none'); + }); + + it('returns "none" for unparseable ISO strings', () => { + expect(classifyUrgency(now, 'not-a-date')).toBe('none'); + }); + + it('classifies overdue when due date is strictly before today', () => { + expect(classifyUrgency(now, offsetDays(now, -1).toISOString())).toBe('overdue'); + expect(classifyUrgency(now, offsetDays(now, -5).toISOString())).toBe('overdue'); + }); + + it('classifies today when due date is the same calendar day', () => { + // Same day, earlier hour — still today, NOT overdue (day-granular). + const earlier = new Date(now); + earlier.setHours(3, 0); + expect(classifyUrgency(now, earlier.toISOString())).toBe('today'); + const later = new Date(now); + later.setHours(22, 0); + expect(classifyUrgency(now, later.toISOString())).toBe('today'); + }); + + it('classifies 1..=7 days out as "week"', () => { + expect(classifyUrgency(now, offsetDays(now, 1).toISOString())).toBe('week'); + expect(classifyUrgency(now, offsetDays(now, 7).toISOString())).toBe('week'); + }); + + it('classifies 8+ days out as "future"', () => { + expect(classifyUrgency(now, offsetDays(now, 8).toISOString())).toBe('future'); + expect(classifyUrgency(now, offsetDays(now, 30).toISOString())).toBe('future'); + }); + + it('boundary at midnight: 1 second after midnight tomorrow is "week" not "today"', () => { + const tomorrowMidnight = startOfDay(offsetDays(now, 1, 0)); + tomorrowMidnight.setSeconds(1); + expect(classifyUrgency(now, tomorrowMidnight.toISOString())).toBe('week'); + }); +}); + +describe('daysUntilReview', () => { + const now = anchor(); + + it('returns null for missing / invalid input', () => { + expect(daysUntilReview(now, null)).toBeNull(); + expect(daysUntilReview(now, undefined)).toBeNull(); + expect(daysUntilReview(now, 'garbage')).toBeNull(); + }); + + it('returns 0 for today', () => { + expect(daysUntilReview(now, now.toISOString())).toBe(0); + }); + + it('returns signed integer days', () => { + expect(daysUntilReview(now, offsetDays(now, 5).toISOString())).toBe(5); + expect(daysUntilReview(now, offsetDays(now, -3).toISOString())).toBe(-3); + }); +}); + +describe('weekBucketRange', () => { + it('returns Sunday→Sunday exclusive for any weekday', () => { + // Apr 20 2026 is a Monday. The week starts on Sunday Apr 19. + const mon = new Date(2026, 3, 20, 14, 0); + const { start, end } = weekBucketRange(mon); + expect(start.getDay()).toBe(0); // Sunday + expect(start.getDate()).toBe(19); + expect(end.getDate()).toBe(26); // next Sunday + expect(end.getTime() - start.getTime()).toBe(7 * MS_DAY); + }); + + it('for Sunday input, returns that same Sunday as start', () => { + const sun = new Date(2026, 3, 19, 10, 0); // Sun Apr 19 2026 + const { start } = weekBucketRange(sun); + expect(start.getDate()).toBe(19); + }); +}); + +describe('avgRetention', () => { + it('returns 0 for empty array (no NaN)', () => { + expect(avgRetention([])).toBe(0); + expect(Number.isNaN(avgRetention([]))).toBe(false); + }); + + it('returns the single value for a length-1 list', () => { + expect(avgRetention([makeMemory({ retentionStrength: 0.42 })])).toBeCloseTo(0.42); + }); + + it('returns the mean for a mixed list', () => { + const ms = [ + makeMemory({ retentionStrength: 0.2 }), + makeMemory({ retentionStrength: 0.8 }), + makeMemory({ retentionStrength: 0.5 }), + ]; + expect(avgRetention(ms)).toBeCloseTo(0.5); + }); + + it('tolerates missing retentionStrength (treat as 0)', () => { + const ms = [ + makeMemory({ retentionStrength: 1.0 }), + makeMemory({ retentionStrength: undefined as unknown as number }), + ]; + expect(avgRetention(ms)).toBeCloseTo(0.5); + }); +}); + +describe('gridCellPosition', () => { + it('maps row-major: index 0 → (0,0), index 7 → (1,0), index 41 → (5,6)', () => { + expect(gridCellPosition(0)).toEqual({ row: 0, col: 0 }); + expect(gridCellPosition(6)).toEqual({ row: 0, col: 6 }); + expect(gridCellPosition(7)).toEqual({ row: 1, col: 0 }); + expect(gridCellPosition(15)).toEqual({ row: 2, col: 1 }); + expect(gridCellPosition(41)).toEqual({ row: 5, col: 6 }); + }); + + it('returns null for out-of-range or non-integer indices', () => { + expect(gridCellPosition(-1)).toBeNull(); + expect(gridCellPosition(42)).toBeNull(); + expect(gridCellPosition(100)).toBeNull(); + expect(gridCellPosition(3.5)).toBeNull(); + }); +}); + +describe('gridStartForAnchor', () => { + it('returns a Sunday at or before anchor-14 days', () => { + // Apr 20 2026 (Mon) → anchor-14 = Apr 6 2026 (Mon) → back to Sun Apr 5. + const start = gridStartForAnchor(anchor()); + expect(start.getDay()).toBe(0); + expect(start.getFullYear()).toBe(2026); + expect(start.getMonth()).toBe(3); + expect(start.getDate()).toBe(5); + expect(start.getHours()).toBe(0); + }); + + it('includes today in the 6-week window (row 2 or 3)', () => { + const today = anchor(); + const start = gridStartForAnchor(today); + const delta = daysBetween(today, start); + expect(delta).toBeGreaterThanOrEqual(14); + expect(delta).toBeLessThan(42); + }); +}); + +describe('computeScheduleStats', () => { + const now = anchor(); + + it('zeros everything for an empty corpus', () => { + const s = computeScheduleStats(now, []); + expect(s).toEqual({ + overdue: 0, + dueToday: 0, + dueThisWeek: 0, + dueThisMonth: 0, + avgDays: 0, + }); + }); + + it('counts each bucket independently (today ⊂ week ⊂ month)', () => { + const ms = [ + makeMemory({ nextReviewAt: offsetDays(now, -2).toISOString() }), // overdue + makeMemory({ nextReviewAt: new Date(now).toISOString() }), // today + makeMemory({ nextReviewAt: offsetDays(now, 3).toISOString() }), // week + makeMemory({ nextReviewAt: offsetDays(now, 15).toISOString() }), // month + makeMemory({ nextReviewAt: offsetDays(now, 45).toISOString() }), // out of month + ]; + const s = computeScheduleStats(now, ms); + expect(s.overdue).toBe(1); + expect(s.dueToday).toBe(2); // overdue + today (delta <= 0) + expect(s.dueThisWeek).toBe(3); // overdue + today + week + expect(s.dueThisMonth).toBe(4); // overdue + today + week + month + }); + + it('skips memories without a nextReviewAt or with unparseable dates', () => { + const ms = [ + makeMemory({ nextReviewAt: undefined }), + makeMemory({ nextReviewAt: 'bogus' }), + makeMemory({ nextReviewAt: offsetDays(now, 2).toISOString() }), + ]; + const s = computeScheduleStats(now, ms); + expect(s.dueThisWeek).toBe(1); + }); + + it('computes average days across future-only memories', () => { + const ms = [ + makeMemory({ nextReviewAt: offsetDays(now, -5).toISOString() }), // excluded (past) + makeMemory({ nextReviewAt: offsetDays(now, 2).toISOString() }), + makeMemory({ nextReviewAt: offsetDays(now, 4).toISOString() }), + ]; + const s = computeScheduleStats(now, ms); + // avgDays is measured from today-at-midnight (not now-mid-day), so a + // review tomorrow at noon is 1.5 days out. Two memories at +2d and +4d + // (both hour=12) → (2.5 + 4.5) / 2 = 3.5. + expect(s.avgDays).toBeCloseTo(3.5, 2); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/ImportanceRadar.test.ts b/apps/dashboard/src/lib/components/__tests__/ImportanceRadar.test.ts new file mode 100644 index 0000000..bbda296 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/ImportanceRadar.test.ts @@ -0,0 +1,417 @@ +/** + * Unit tests for importance-helpers — the pure logic backing + * ImportanceRadar.svelte + importance/+page.svelte. + * + * Runs in the vitest `node` environment (no jsdom). We exercise: + * - Composite channel weighting (matches backend ImportanceSignals) + * - 4-axis radar vertex geometry (Novelty top / Arousal right / Reward + * bottom / Attention left) + * - Value clamping at the helper boundary (defensive against a mis- + * scaled /api/importance response) + * - Size-preset mapping (sm 80 / md 180 / lg 320) + * - Trending-memory importance proxy (retention × log(reviews) / √age) + * including the age=0 division-by-zero edge case. + */ + +import { describe, it, expect } from 'vitest'; +import { + clamp01, + clampChannels, + compositeScore, + CHANNEL_WEIGHTS, + sizePreset, + radarRadius, + radarVertices, + verticesToPath, + importanceProxy, + rankByProxy, + AXIS_ORDER, + SIZE_PX, + type ProxyMemoryLike, +} from '../importance-helpers'; + +// =========================================================================== +// clamp01 +// =========================================================================== + +describe('clamp01', () => { + it('passes in-range values through', () => { + expect(clamp01(0)).toBe(0); + expect(clamp01(0.5)).toBe(0.5); + expect(clamp01(1)).toBe(1); + }); + + it('clamps below zero to 0', () => { + expect(clamp01(-0.3)).toBe(0); + expect(clamp01(-100)).toBe(0); + }); + + it('clamps above one to 1', () => { + expect(clamp01(1.0001)).toBe(1); + expect(clamp01(42)).toBe(1); + }); + + it('folds null / undefined / NaN / Infinity to 0', () => { + expect(clamp01(null)).toBe(0); + expect(clamp01(undefined)).toBe(0); + expect(clamp01(NaN)).toBe(0); + expect(clamp01(Infinity)).toBe(0); + expect(clamp01(-Infinity)).toBe(0); + }); +}); + +describe('clampChannels', () => { + it('clamps every channel independently', () => { + expect(clampChannels({ novelty: 2, arousal: -1, reward: 0.5, attention: NaN })).toEqual({ + novelty: 1, + arousal: 0, + reward: 0.5, + attention: 0, + }); + }); + + it('fills missing channels with 0', () => { + expect(clampChannels({ novelty: 0.8 })).toEqual({ + novelty: 0.8, + arousal: 0, + reward: 0, + attention: 0, + }); + }); + + it('accepts null / undefined as "all zeros"', () => { + expect(clampChannels(null)).toEqual({ novelty: 0, arousal: 0, reward: 0, attention: 0 }); + expect(clampChannels(undefined)).toEqual({ + novelty: 0, + arousal: 0, + reward: 0, + attention: 0, + }); + }); +}); + +// =========================================================================== +// compositeScore — MUST match backend ImportanceSignals weights +// =========================================================================== + +describe('compositeScore', () => { + it('sums channel contributions with the documented weights', () => { + const c = { novelty: 1, arousal: 1, reward: 1, attention: 1 }; + // 0.25 + 0.30 + 0.25 + 0.20 = 1.00 + expect(compositeScore(c)).toBeCloseTo(1.0, 5); + }); + + it('is zero for all-zero channels', () => { + expect(compositeScore({ novelty: 0, arousal: 0, reward: 0, attention: 0 })).toBe(0); + }); + + it('weights match CHANNEL_WEIGHTS exactly (backend contract)', () => { + expect(CHANNEL_WEIGHTS).toEqual({ + novelty: 0.25, + arousal: 0.3, + reward: 0.25, + attention: 0.2, + }); + // Weights sum to 1 — any drift here and the "composite ∈ [0,1]" + // invariant falls over. + const sum = + CHANNEL_WEIGHTS.novelty + + CHANNEL_WEIGHTS.arousal + + CHANNEL_WEIGHTS.reward + + CHANNEL_WEIGHTS.attention; + expect(sum).toBeCloseTo(1.0, 10); + }); + + it('matches the exact weighted formula per channel', () => { + // 0.4·0.25 + 0.6·0.30 + 0.2·0.25 + 0.8·0.20 + // = 0.10 + 0.18 + 0.05 + 0.16 = 0.49 + expect( + compositeScore({ novelty: 0.4, arousal: 0.6, reward: 0.2, attention: 0.8 }), + ).toBeCloseTo(0.49, 5); + }); + + it('clamps inputs before weighting (never escapes [0,1])', () => { + // All over-max → should pin to 1, not to 2. + expect( + compositeScore({ novelty: 2, arousal: 2, reward: 2, attention: 2 }), + ).toBeCloseTo(1.0, 5); + // Negative channels count as 0. + expect( + compositeScore({ novelty: -1, arousal: -1, reward: -1, attention: -1 }), + ).toBe(0); + }); +}); + +// =========================================================================== +// Size preset +// =========================================================================== + +describe('sizePreset', () => { + it('maps the three documented presets', () => { + expect(sizePreset('sm')).toBe(80); + expect(sizePreset('md')).toBe(180); + expect(sizePreset('lg')).toBe(320); + }); + + it('exposes the SIZE_PX mapping for external consumers', () => { + expect(SIZE_PX).toEqual({ sm: 80, md: 180, lg: 320 }); + }); + + it('falls back to md (180) for unknown / missing keys', () => { + expect(sizePreset(undefined)).toBe(180); + expect(sizePreset('' as unknown as 'md')).toBe(180); + expect(sizePreset('xl' as unknown as 'md')).toBe(180); + }); +}); + +// =========================================================================== +// radarRadius — component padding rules +// =========================================================================== + +describe('radarRadius', () => { + it('applies the correct padding per preset', () => { + // sm: 80/2 - 4 = 36 + // md: 180/2 - 28 = 62 + // lg: 320/2 - 44 = 116 + expect(radarRadius('sm')).toBe(36); + expect(radarRadius('md')).toBe(62); + expect(radarRadius('lg')).toBe(116); + }); + + it('never returns a negative radius', () => { + // Can't construct a sub-zero radius via normal presets, but the + // helper floors at 0 defensively. + expect(radarRadius('md')).toBeGreaterThanOrEqual(0); + }); +}); + +// =========================================================================== +// radarVertices — 4 SVG polygon points on the fixed axis order +// =========================================================================== + +describe('radarVertices', () => { + it('emits vertices in Novelty→Arousal→Reward→Attention order', () => { + expect(AXIS_ORDER.map((a) => a.key)).toEqual([ + 'novelty', + 'arousal', + 'reward', + 'attention', + ]); + }); + + it('places a 0-valued channel at the centre', () => { + // Centre for md is (90, 90). novelty=0 means the top vertex sits AT + // the centre — the polygon pinches inward. + const v = radarVertices( + { novelty: 0, arousal: 0, reward: 0, attention: 0 }, + 'md', + ); + expect(v).toHaveLength(4); + for (const p of v) { + expect(p.x).toBeCloseTo(90, 5); + expect(p.y).toBeCloseTo(90, 5); + } + }); + + it('places a 1-valued channel on the correct axis edge', () => { + // Size md: cx=cy=90, r=62. + // Novelty (angle -π/2, top) → (90, 90 - 62) = (90, 28) + // Arousal (angle 0, right) → (90 + 62, 90) = (152, 90) + // Reward (angle π/2, bottom) → (90, 90 + 62) = (90, 152) + // Attention (angle π, left) → (90 - 62, 90) = (28, 90) + const v = radarVertices( + { novelty: 1, arousal: 1, reward: 1, attention: 1 }, + 'md', + ); + expect(v[0].x).toBeCloseTo(90, 5); + expect(v[0].y).toBeCloseTo(28, 5); + + expect(v[1].x).toBeCloseTo(152, 5); + expect(v[1].y).toBeCloseTo(90, 5); + + expect(v[2].x).toBeCloseTo(90, 5); + expect(v[2].y).toBeCloseTo(152, 5); + + expect(v[3].x).toBeCloseTo(28, 5); + expect(v[3].y).toBeCloseTo(90, 5); + }); + + it('scales vertex radial distance linearly with the channel value', () => { + // Arousal at 0.5 should land half-way from centre to the right edge. + const v = radarVertices( + { novelty: 0, arousal: 0.5, reward: 0, attention: 0 }, + 'md', + ); + // radius=62, so right vertex x = 90 + 62*0.5 = 121. + expect(v[1].x).toBeCloseTo(121, 5); + expect(v[1].y).toBeCloseTo(90, 5); + }); + + it('clamps out-of-range inputs rather than exiting the SVG box', () => { + // novelty=2 should pin to the edge (not overshoot to 90 - 124 = -34). + const v = radarVertices( + { novelty: 2, arousal: -0.5, reward: NaN, attention: Infinity }, + 'md', + ); + // Novelty pinned to edge (y=28), arousal/reward/attention at 0 land at centre. + expect(v[0].y).toBeCloseTo(28, 5); + expect(v[1].x).toBeCloseTo(90, 5); // arousal=0 → centre + expect(v[2].y).toBeCloseTo(90, 5); // reward=0 → centre + expect(v[3].x).toBeCloseTo(90, 5); // attention=0 → centre + }); + + it('respects the active size preset', () => { + // At sm (80px), radius=36. Novelty=1 → (40, 40-36) = (40, 4). + const v = radarVertices({ novelty: 1, arousal: 0, reward: 0, attention: 0 }, 'sm'); + expect(v[0].x).toBeCloseTo(40, 5); + expect(v[0].y).toBeCloseTo(4, 5); + }); +}); + +describe('verticesToPath', () => { + it('serialises to an SVG path with M/L commands and Z close', () => { + const path = verticesToPath([ + { x: 10, y: 20 }, + { x: 30, y: 40 }, + { x: 50, y: 60 }, + { x: 70, y: 80 }, + ]); + expect(path).toBe('M10.00,20.00 L30.00,40.00 L50.00,60.00 L70.00,80.00 Z'); + }); + + it('returns an empty string for no points', () => { + expect(verticesToPath([])).toBe(''); + }); +}); + +// =========================================================================== +// importanceProxy — "Top Important Memories This Week" ranking formula +// =========================================================================== + +describe('importanceProxy', () => { + // Anchor everything to a fixed "now" so recency math is deterministic. + const NOW = new Date('2026-04-20T12:00:00Z').getTime(); + + function mem(over: Partial): ProxyMemoryLike { + return { + retentionStrength: 0.5, + reviewCount: 0, + createdAt: new Date(NOW - 2 * 86_400_000).toISOString(), + ...over, + }; + } + + it('is zero for zero retention', () => { + expect(importanceProxy(mem({ retentionStrength: 0 }), NOW)).toBe(0); + }); + + it('treats missing reviewCount as 0 (not a crash)', () => { + const m = mem({ reviewCount: undefined, retentionStrength: 0.8 }); + const v = importanceProxy(m, NOW); + expect(v).toBeGreaterThan(0); + expect(Number.isFinite(v)).toBe(true); + }); + + it('matches the documented formula: retention × log1p(reviews+1) / √age', () => { + // createdAt = 4 days before NOW → ageDays = 4, √4 = 2. + // retention = 0.6, reviews = 3 → log1p(4) ≈ 1.6094 + // expected = 0.6 × 1.6094 / 2 ≈ 0.4828 + const m = mem({ + retentionStrength: 0.6, + reviewCount: 3, + createdAt: new Date(NOW - 4 * 86_400_000).toISOString(), + }); + const v = importanceProxy(m, NOW); + const expected = (0.6 * Math.log1p(4)) / 2; + expect(v).toBeCloseTo(expected, 6); + }); + + it('clamps age to 1 day for a memory created RIGHT NOW (div-by-zero guard)', () => { + // createdAt equals NOW → raw ageDays = 0. Without the clamp, the + // recency boost would divide by zero. We assert the helper returns + // a finite value equal to the "age=1" path. + const zeroAge = importanceProxy( + mem({ + retentionStrength: 0.5, + reviewCount: 0, + createdAt: new Date(NOW).toISOString(), + }), + NOW, + ); + const oneDayAge = importanceProxy( + mem({ + retentionStrength: 0.5, + reviewCount: 0, + createdAt: new Date(NOW - 1 * 86_400_000).toISOString(), + }), + NOW, + ); + expect(Number.isFinite(zeroAge)).toBe(true); + expect(zeroAge).toBeCloseTo(oneDayAge, 10); + }); + + it('also clamps future-dated memories to ageDays=1 rather than going negative', () => { + const future = importanceProxy( + mem({ + retentionStrength: 0.5, + reviewCount: 0, + createdAt: new Date(NOW + 7 * 86_400_000).toISOString(), + }), + NOW, + ); + expect(Number.isFinite(future)).toBe(true); + expect(future).toBeGreaterThan(0); + }); + + it('returns 0 for a malformed createdAt', () => { + const m = { + retentionStrength: 0.8, + reviewCount: 3, + createdAt: 'not-a-date', + }; + expect(importanceProxy(m, NOW)).toBe(0); + }); + + it('returns 0 when retentionStrength is non-finite', () => { + expect(importanceProxy(mem({ retentionStrength: NaN }), NOW)).toBe(0); + expect(importanceProxy(mem({ retentionStrength: Infinity }), NOW)).toBe(0); + }); + + it('ranks recent + high-retention memories ahead of stale ones', () => { + const fresh: ProxyMemoryLike = { + retentionStrength: 0.9, + reviewCount: 5, + createdAt: new Date(NOW - 1 * 86_400_000).toISOString(), + }; + const stale: ProxyMemoryLike = { + retentionStrength: 0.9, + reviewCount: 5, + createdAt: new Date(NOW - 100 * 86_400_000).toISOString(), + }; + expect(importanceProxy(fresh, NOW)).toBeGreaterThan(importanceProxy(stale, NOW)); + }); +}); + +describe('rankByProxy', () => { + const NOW = new Date('2026-04-20T12:00:00Z').getTime(); + + it('sorts descending by the proxy score', () => { + const items: (ProxyMemoryLike & { id: string })[] = [ + { id: 'stale', retentionStrength: 0.9, reviewCount: 5, createdAt: new Date(NOW - 100 * 86_400_000).toISOString() }, + { id: 'fresh', retentionStrength: 0.9, reviewCount: 5, createdAt: new Date(NOW - 1 * 86_400_000).toISOString() }, + { id: 'dead', retentionStrength: 0.0, reviewCount: 0, createdAt: new Date(NOW - 2 * 86_400_000).toISOString() }, + ]; + const ranked = rankByProxy(items, NOW); + expect(ranked.map((r) => r.id)).toEqual(['fresh', 'stale', 'dead']); + }); + + it('does not mutate the input array', () => { + const items: ProxyMemoryLike[] = [ + { retentionStrength: 0.1, reviewCount: 0, createdAt: new Date(NOW - 10 * 86_400_000).toISOString() }, + { retentionStrength: 0.9, reviewCount: 9, createdAt: new Date(NOW - 1 * 86_400_000).toISOString() }, + ]; + const before = items.slice(); + rankByProxy(items, NOW); + expect(items).toEqual(before); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/MemoryAuditTrail.test.ts b/apps/dashboard/src/lib/components/__tests__/MemoryAuditTrail.test.ts new file mode 100644 index 0000000..e105b83 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/MemoryAuditTrail.test.ts @@ -0,0 +1,298 @@ +/** + * MemoryAuditTrail — pure helper coverage. + * + * Runs in vitest's Node environment (no jsdom). Every assertion exercises + * a function in `audit-trail-helpers.ts` with fully deterministic inputs. + */ +import { describe, it, expect } from 'vitest'; + +import { + ALL_ACTIONS, + META, + VISIBLE_LIMIT, + formatRetentionDelta, + generateMockAuditTrail, + hashSeed, + makeRand, + relativeTime, + splitVisible, + type AuditAction, + type AuditEvent +} from '../audit-trail-helpers'; + +// Fixed reference point for all time-based tests. Millisecond precision so +// relative-time maths are exact, not drifting with wallclock time. +const NOW = Date.UTC(2026, 3, 20, 12, 0, 0); // 2026-04-20 12:00:00 UTC + +// --------------------------------------------------------------------------- +// hashSeed + makeRand +// --------------------------------------------------------------------------- +describe('hashSeed', () => { + it('is deterministic', () => { + expect(hashSeed('abc')).toBe(hashSeed('abc')); + expect(hashSeed('memory-42')).toBe(hashSeed('memory-42')); + }); + + it('different ids hash to different seeds', () => { + expect(hashSeed('a')).not.toBe(hashSeed('b')); + expect(hashSeed('memory-1')).not.toBe(hashSeed('memory-2')); + }); + + it('empty string hashes to 0', () => { + expect(hashSeed('')).toBe(0); + }); + + it('returns an unsigned 32-bit integer', () => { + // Stress: a long id should never produce a negative or non-integer seed. + const seed = hashSeed('a'.repeat(256)); + expect(Number.isInteger(seed)).toBe(true); + expect(seed).toBeGreaterThanOrEqual(0); + expect(seed).toBeLessThan(2 ** 32); + }); +}); + +describe('makeRand', () => { + it('is deterministic given the same seed', () => { + const a = makeRand(42); + const b = makeRand(42); + for (let i = 0; i < 20; i++) expect(a()).toBe(b()); + }); + + it('produces values strictly in [0, 1)', () => { + // Seed with UINT32_MAX to force the edge case that exposed the original + // `/ 0xffffffff` bug — the divisor must be 2^32, not 2^32 - 1. + const rand = makeRand(0xffffffff); + for (let i = 0; i < 5000; i++) { + const v = rand(); + expect(v).toBeGreaterThanOrEqual(0); + expect(v).toBeLessThan(1); + } + }); + + it('different seeds produce different sequences', () => { + const a = makeRand(1); + const b = makeRand(2); + expect(a()).not.toBe(b()); + }); +}); + +// --------------------------------------------------------------------------- +// Deterministic generator +// --------------------------------------------------------------------------- +describe('generateMockAuditTrail — determinism', () => { + it('same id + same now always yields the same sequence', () => { + const a = generateMockAuditTrail('memory-xyz', NOW); + const b = generateMockAuditTrail('memory-xyz', NOW); + expect(a).toEqual(b); + }); + + it('different ids yield different sequences', () => { + const a = generateMockAuditTrail('memory-a', NOW); + const b = generateMockAuditTrail('memory-b', NOW); + // Either different lengths or different event-by-event — anything but equal. + expect(a).not.toEqual(b); + }); + + it('empty id yields no events — the panel should never fabricate history', () => { + expect(generateMockAuditTrail('', NOW)).toEqual([]); + }); + + it('count fits the default 8-15 range', () => { + // Sample a handful of ids — the distribution should stay in range. + for (const id of ['a', 'abc', 'memory-1', 'memory-2', 'memory-3', 'x'.repeat(50)]) { + const events = generateMockAuditTrail(id, NOW); + expect(events.length).toBeGreaterThanOrEqual(8); + expect(events.length).toBeLessThanOrEqual(15); + } + }); + + it('first emitted event (newest-first order → last in array) is "created"', () => { + const events = generateMockAuditTrail('deterministic-id', NOW); + expect(events[events.length - 1].action).toBe('created'); + expect(events[events.length - 1].triggered_by).toBe('smart_ingest'); + }); + + it('emits events in newest-first order', () => { + const events = generateMockAuditTrail('order-check', NOW); + for (let i = 1; i < events.length; i++) { + const prev = new Date(events[i - 1].timestamp).getTime(); + const curr = new Date(events[i].timestamp).getTime(); + expect(prev).toBeGreaterThanOrEqual(curr); + } + }); + + it('all timestamps are valid ISO strings in the past relative to NOW', () => { + const events = generateMockAuditTrail('iso-check', NOW); + for (const ev of events) { + const t = new Date(ev.timestamp).getTime(); + expect(Number.isFinite(t)).toBe(true); + expect(t).toBeLessThanOrEqual(NOW); + } + }); + + it('respects countOverride — 16 events crosses the visibility threshold', () => { + const events = generateMockAuditTrail('big', NOW, 16); + expect(events).toHaveLength(16); + }); + + it('retention values never escape [0, 1]', () => { + for (const id of ['x', 'y', 'z', 'memory-big']) { + const events = generateMockAuditTrail(id, NOW, 30); + for (const ev of events) { + if (ev.old_value !== undefined) { + expect(ev.old_value).toBeGreaterThanOrEqual(0); + expect(ev.old_value).toBeLessThanOrEqual(1); + } + if (ev.new_value !== undefined) { + expect(ev.new_value).toBeGreaterThanOrEqual(0); + expect(ev.new_value).toBeLessThanOrEqual(1); + } + } + } + }); +}); + +// --------------------------------------------------------------------------- +// Relative time +// --------------------------------------------------------------------------- +describe('relativeTime — boundary cases', () => { + // Build an ISO timestamp `offsetMs` before NOW. + const ago = (offsetMs: number) => new Date(NOW - offsetMs).toISOString(); + + const cases: Array<[string, number, string]> = [ + ['0s ago', 0, '0s ago'], + ['59s ago', 59 * 1000, '59s ago'], + ['60s flips to 1m', 60 * 1000, '1m ago'], + ['59m ago', 59 * 60 * 1000, '59m ago'], + ['60m flips to 1h', 60 * 60 * 1000, '1h ago'], + ['23h ago', 23 * 3600 * 1000, '23h ago'], + ['24h flips to 1d', 24 * 3600 * 1000, '1d ago'], + ['6d ago', 6 * 86400 * 1000, '6d ago'], + ['7d ago', 7 * 86400 * 1000, '7d ago'], + ['29d ago', 29 * 86400 * 1000, '29d ago'], + ['30d flips to 1mo', 30 * 86400 * 1000, '1mo ago'], + ['365d → 12mo flips to 1y', 365 * 86400 * 1000, '1y ago'] + ]; + + for (const [name, offset, expected] of cases) { + it(name, () => { + expect(relativeTime(ago(offset), NOW)).toBe(expected); + }); + } + + it('future timestamps clamp to "0s ago"', () => { + const future = new Date(NOW + 60_000).toISOString(); + expect(relativeTime(future, NOW)).toBe('0s ago'); + }); +}); + +// --------------------------------------------------------------------------- +// Event type → marker mapping +// --------------------------------------------------------------------------- +describe('META — action to marker mapping', () => { + it('covers all 8 audit actions exactly', () => { + expect(Object.keys(META).sort()).toEqual([...ALL_ACTIONS].sort()); + expect(ALL_ACTIONS).toHaveLength(8); + }); + + it('every action has a distinct marker kind (8 kinds → 8 glyph shapes)', () => { + const kinds = ALL_ACTIONS.map((a) => META[a].kind); + expect(new Set(kinds).size).toBe(8); + }); + + it('every action has a non-empty label and hex color', () => { + for (const action of ALL_ACTIONS) { + const m = META[action]; + expect(m.label.length).toBeGreaterThan(0); + expect(m.color).toMatch(/^#[0-9a-f]{6}$/i); + } + }); +}); + +// --------------------------------------------------------------------------- +// Retention delta formatter +// --------------------------------------------------------------------------- +describe('formatRetentionDelta', () => { + it('returns null when both values are missing', () => { + expect(formatRetentionDelta(undefined, undefined)).toBeNull(); + }); + + it('returns "set X.XX" when only new is defined', () => { + expect(formatRetentionDelta(undefined, 0.5)).toBe('set 0.50'); + // Note: toFixed(2) uses float-to-string half-to-even; assert on values + // that round unambiguously rather than on IEEE-754 tie edges. + expect(formatRetentionDelta(undefined, 0.736)).toBe('set 0.74'); + }); + + it('returns "was X.XX" when only old is defined', () => { + expect(formatRetentionDelta(0.5, undefined)).toBe('was 0.50'); + }); + + it('returns "old → new" when both are defined', () => { + expect(formatRetentionDelta(0.5, 0.7)).toBe('0.50 → 0.70'); + expect(formatRetentionDelta(0.72, 0.85)).toBe('0.72 → 0.85'); + }); + + it('handles descending deltas without changing the arrow', () => { + // Suppression / demotion paths — old > new. + expect(formatRetentionDelta(0.8, 0.6)).toBe('0.80 → 0.60'); + }); + + it('rejects non-finite numbers', () => { + expect(formatRetentionDelta(NaN, 0.5)).toBe('set 0.50'); + expect(formatRetentionDelta(0.5, NaN)).toBe('was 0.50'); + expect(formatRetentionDelta(NaN, NaN)).toBeNull(); + }); +}); + +// --------------------------------------------------------------------------- +// splitVisible — 15-event cap +// --------------------------------------------------------------------------- +describe('splitVisible — collapse threshold', () => { + const makeEvents = (n: number): AuditEvent[] => + Array.from({ length: n }, (_, i) => ({ + action: 'accessed' as AuditAction, + timestamp: new Date(NOW - i * 60_000).toISOString() + })); + + it('VISIBLE_LIMIT is 15', () => { + expect(VISIBLE_LIMIT).toBe(15); + }); + + it('exactly 15 events → no toggle (hiddenCount 0)', () => { + const { visible, hiddenCount } = splitVisible(makeEvents(15), false); + expect(visible).toHaveLength(15); + expect(hiddenCount).toBe(0); + }); + + it('14 events → no toggle', () => { + const { visible, hiddenCount } = splitVisible(makeEvents(14), false); + expect(visible).toHaveLength(14); + expect(hiddenCount).toBe(0); + }); + + it('16 events collapsed → visible 15, hidden 1', () => { + const { visible, hiddenCount } = splitVisible(makeEvents(16), false); + expect(visible).toHaveLength(15); + expect(hiddenCount).toBe(1); + }); + + it('16 events expanded → visible 16, hidden reports overflow count (1)', () => { + const { visible, hiddenCount } = splitVisible(makeEvents(16), true); + expect(visible).toHaveLength(16); + expect(hiddenCount).toBe(1); + }); + + it('0 events → visible empty, hidden 0', () => { + const { visible, hiddenCount } = splitVisible(makeEvents(0), false); + expect(visible).toHaveLength(0); + expect(hiddenCount).toBe(0); + }); + + it('preserves newest-first order when truncating', () => { + const events = makeEvents(20); + const { visible } = splitVisible(events, false); + expect(visible[0]).toBe(events[0]); + expect(visible[14]).toBe(events[14]); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/PatternTransferHeatmap.test.ts b/apps/dashboard/src/lib/components/__tests__/PatternTransferHeatmap.test.ts new file mode 100644 index 0000000..c7b9ccf --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/PatternTransferHeatmap.test.ts @@ -0,0 +1,334 @@ +/** + * Unit tests for patterns-helpers — the pure logic backing + * PatternTransferHeatmap.svelte + patterns/+page.svelte. + * + * Runs in the vitest `node` environment (no jsdom). We never touch Svelte + * component internals here — only the exported helpers in patterns-helpers.ts. + * Component-level integration (click, hover, DOM wiring) is covered by the + * Playwright e2e suite; this file is pure-logic coverage of the contracts. + */ + +import { describe, it, expect } from 'vitest'; +import { + cellIntensity, + filterByCategory, + buildTransferMatrix, + matrixMaxCount, + flattenNonZero, + shortProjectName, + PATTERN_CATEGORIES, + type TransferPatternLike, +} from '../patterns-helpers'; + +// --------------------------------------------------------------------------- +// Test fixtures — mirror the mockFetchCrossProject shape in +// patterns/+page.svelte, but small enough to reason about by hand. +// --------------------------------------------------------------------------- + +const PROJECTS = ['vestige', 'nullgaze', 'injeranet'] as const; + +const PATTERNS: TransferPatternLike[] = [ + { + name: 'Result', + category: 'ErrorHandling', + origin_project: 'vestige', + transferred_to: ['nullgaze', 'injeranet'], + transfer_count: 2, + }, + { + name: 'Axum middleware', + category: 'ErrorHandling', + origin_project: 'nullgaze', + transferred_to: ['vestige'], + transfer_count: 1, + }, + { + name: 'proptest', + category: 'Testing', + origin_project: 'vestige', + transferred_to: ['nullgaze'], + transfer_count: 1, + }, + { + name: 'Self-reuse pattern', + category: 'Architecture', + origin_project: 'vestige', + transferred_to: ['vestige'], // diagonal — self-reuse + transfer_count: 1, + }, +]; + +// =========================================================================== +// cellIntensity — 0..1 opacity normaliser +// =========================================================================== + +describe('cellIntensity', () => { + it('returns 0 for a zero count', () => { + expect(cellIntensity(0, 10)).toBe(0); + }); + + it('returns 1 at max', () => { + expect(cellIntensity(10, 10)).toBe(1); + }); + + it('returns 1 when count exceeds max (defensive clamp)', () => { + expect(cellIntensity(15, 10)).toBe(1); + }); + + it('scales linearly between 0 and max', () => { + expect(cellIntensity(3, 10)).toBeCloseTo(0.3, 5); + expect(cellIntensity(5, 10)).toBeCloseTo(0.5, 5); + expect(cellIntensity(7, 10)).toBeCloseTo(0.7, 5); + }); + + it('returns 0 when max is 0 (div-by-zero guard)', () => { + expect(cellIntensity(5, 0)).toBe(0); + }); + + it('returns 0 for negative counts', () => { + expect(cellIntensity(-1, 10)).toBe(0); + }); + + it('returns 0 for NaN inputs', () => { + expect(cellIntensity(NaN, 10)).toBe(0); + expect(cellIntensity(5, NaN)).toBe(0); + }); + + it('returns 0 for Infinity inputs', () => { + expect(cellIntensity(Infinity, 10)).toBe(0); + expect(cellIntensity(5, Infinity)).toBe(0); + }); +}); + +// =========================================================================== +// filterByCategory — drives both heatmap + sidebar reflow +// =========================================================================== + +describe('filterByCategory', () => { + it("returns every pattern for 'All'", () => { + const out = filterByCategory(PATTERNS, 'All'); + expect(out).toHaveLength(PATTERNS.length); + // Should NOT return the same reference — helpers return a copy so + // callers can mutate freely. + expect(out).not.toBe(PATTERNS); + }); + + it('filters strictly by category equality', () => { + const errorOnly = filterByCategory(PATTERNS, 'ErrorHandling'); + expect(errorOnly).toHaveLength(2); + expect(errorOnly.every((p) => p.category === 'ErrorHandling')).toBe(true); + }); + + it('returns exactly one match for Testing', () => { + const testing = filterByCategory(PATTERNS, 'Testing'); + expect(testing).toHaveLength(1); + expect(testing[0].name).toBe('proptest'); + }); + + it('returns an empty array for a category with no patterns', () => { + const perf = filterByCategory(PATTERNS, 'Performance'); + expect(perf).toEqual([]); + }); + + it('returns an empty array for an unknown category string (no silent alias)', () => { + // This is the "unknown category fallback" contract — we do NOT + // quietly fall back to 'All'. An unknown category is a caller bug + // and yields an empty list so the empty-state UI renders. + expect(filterByCategory(PATTERNS, 'NotARealCategory')).toEqual([]); + expect(filterByCategory(PATTERNS, '')).toEqual([]); + }); + + it('accepts an empty input array for any category', () => { + expect(filterByCategory([], 'All')).toEqual([]); + expect(filterByCategory([], 'ErrorHandling')).toEqual([]); + expect(filterByCategory([], 'BogusCategory')).toEqual([]); + }); + + it('exposes all six supported categories', () => { + expect([...PATTERN_CATEGORIES]).toEqual([ + 'ErrorHandling', + 'AsyncConcurrency', + 'Testing', + 'Architecture', + 'Performance', + 'Security', + ]); + }); +}); + +// =========================================================================== +// buildTransferMatrix — directional N×N projects × projects grid +// =========================================================================== + +describe('buildTransferMatrix', () => { + it('constructs an N×N matrix over the projects axis', () => { + const m = buildTransferMatrix(PROJECTS, []); + for (const from of PROJECTS) { + for (const to of PROJECTS) { + expect(m[from][to]).toEqual({ count: 0, topNames: [] }); + } + } + }); + + it('aggregates transfer counts directionally', () => { + const m = buildTransferMatrix(PROJECTS, PATTERNS); + // vestige → nullgaze: Result + proptest = 2 + expect(m.vestige.nullgaze.count).toBe(2); + // vestige → injeranet: Result only = 1 + expect(m.vestige.injeranet.count).toBe(1); + // nullgaze → vestige: Axum middleware = 1 + expect(m.nullgaze.vestige.count).toBe(1); + // injeranet → anywhere: zero (no origin in injeranet in fixtures) + expect(m.injeranet.vestige.count).toBe(0); + expect(m.injeranet.nullgaze.count).toBe(0); + }); + + it('treats (A, B) and (B, A) as distinct directions (asymmetry confirmed)', () => { + // The component's doc-comment says "Rows = origin project · Columns = + // destination project" — the matrix MUST be directional. A copy-paste + // bug that aggregates both directions into the same cell would pass + // the "count" test above but fail this symmetry check. + const m = buildTransferMatrix(PROJECTS, PATTERNS); + expect(m.vestige.nullgaze.count).not.toBe(m.nullgaze.vestige.count); + }); + + it('records self-transfer on the diagonal', () => { + const m = buildTransferMatrix(PROJECTS, PATTERNS); + expect(m.vestige.vestige.count).toBe(1); + expect(m.vestige.vestige.topNames).toEqual(['Self-reuse pattern']); + }); + + it('captures top pattern names per cell, capped at 3', () => { + const manyPatterns: TransferPatternLike[] = Array.from({ length: 5 }, (_, i) => ({ + name: `pattern-${i}`, + category: 'ErrorHandling', + origin_project: 'vestige', + transferred_to: ['nullgaze'], + transfer_count: 1, + })); + const m = buildTransferMatrix(['vestige', 'nullgaze'], manyPatterns); + expect(m.vestige.nullgaze.count).toBe(5); + expect(m.vestige.nullgaze.topNames).toHaveLength(3); + expect(m.vestige.nullgaze.topNames).toEqual(['pattern-0', 'pattern-1', 'pattern-2']); + }); + + it('silently drops patterns whose origin is not in the projects axis', () => { + const orphan: TransferPatternLike = { + name: 'Orphan', + category: 'Security', + origin_project: 'ghost-project', + transferred_to: ['vestige'], + transfer_count: 1, + }; + const m = buildTransferMatrix(PROJECTS, [orphan]); + // Nothing anywhere in the matrix should have ticked up. + const total = matrixMaxCount(PROJECTS, m); + expect(total).toBe(0); + // Matrix structure intact — no ghost key added. + expect((m as Record)['ghost-project']).toBeUndefined(); + }); + + it('silently drops transferred_to entries not in the projects axis', () => { + const strayDest: TransferPatternLike = { + name: 'StrayDest', + category: 'Security', + origin_project: 'vestige', + transferred_to: ['ghost-project', 'nullgaze'], + transfer_count: 2, + }; + const m = buildTransferMatrix(PROJECTS, [strayDest]); + // The known destination counts; the ghost doesn't. + expect(m.vestige.nullgaze.count).toBe(1); + expect((m.vestige as Record)['ghost-project']).toBeUndefined(); + }); + + it('respects a custom top-name cap', () => { + const pats: TransferPatternLike[] = [ + { + name: 'a', + category: 'Testing', + origin_project: 'vestige', + transferred_to: ['nullgaze'], + transfer_count: 1, + }, + { + name: 'b', + category: 'Testing', + origin_project: 'vestige', + transferred_to: ['nullgaze'], + transfer_count: 1, + }, + ]; + const m = buildTransferMatrix(['vestige', 'nullgaze'], pats, 1); + expect(m.vestige.nullgaze.topNames).toEqual(['a']); + }); +}); + +// =========================================================================== +// matrixMaxCount +// =========================================================================== + +describe('matrixMaxCount', () => { + it('returns 0 for an empty matrix (div-by-zero guard prerequisite)', () => { + const m = buildTransferMatrix(PROJECTS, []); + expect(matrixMaxCount(PROJECTS, m)).toBe(0); + }); + + it('returns the hottest cell count across all pairs', () => { + const m = buildTransferMatrix(PROJECTS, PATTERNS); + // vestige→nullgaze has 2; everything else is ≤1 + expect(matrixMaxCount(PROJECTS, m)).toBe(2); + }); + + it('tolerates missing rows without crashing', () => { + const partial: Record> = { + vestige: { vestige: { count: 3, topNames: [] } }, + }; + expect(matrixMaxCount(['vestige', 'absent'], partial)).toBe(3); + }); +}); + +// =========================================================================== +// flattenNonZero — mobile fallback feed +// =========================================================================== + +describe('flattenNonZero', () => { + it('returns only non-zero pairs, sorted by count descending', () => { + const m = buildTransferMatrix(PROJECTS, PATTERNS); + const rows = flattenNonZero(PROJECTS, m); + // Distinct non-zero cells in fixtures: + // vestige→nullgaze = 2 + // vestige→injeranet = 1 + // vestige→vestige = 1 + // nullgaze→vestige = 1 + expect(rows).toHaveLength(4); + expect(rows[0]).toMatchObject({ from: 'vestige', to: 'nullgaze', count: 2 }); + // Later rows all tied at 1 — we only verify the leader. + expect(rows.slice(1).every((r) => r.count === 1)).toBe(true); + }); + + it('returns an empty list when nothing is transferred', () => { + const m = buildTransferMatrix(PROJECTS, []); + expect(flattenNonZero(PROJECTS, m)).toEqual([]); + }); +}); + +// =========================================================================== +// shortProjectName +// =========================================================================== + +describe('shortProjectName', () => { + it('passes short names through unchanged', () => { + expect(shortProjectName('vestige')).toBe('vestige'); + expect(shortProjectName('')).toBe(''); + }); + + it('keeps names at the 12-char boundary', () => { + expect(shortProjectName('123456789012')).toBe('123456789012'); + }); + + it('truncates longer names to 11 chars + ellipsis', () => { + expect(shortProjectName('1234567890123')).toBe('12345678901…'); + expect(shortProjectName('super-long-project-name')).toBe('super-long-…'); + }); +}); diff --git a/apps/dashboard/src/lib/components/__tests__/ReasoningChain.test.ts b/apps/dashboard/src/lib/components/__tests__/ReasoningChain.test.ts new file mode 100644 index 0000000..f3c5307 --- /dev/null +++ b/apps/dashboard/src/lib/components/__tests__/ReasoningChain.test.ts @@ -0,0 +1,193 @@ +/** + * ReasoningChain — pure-logic coverage. + * + * ReasoningChain renders the 8-stage cognitive pipeline. Its rendered output + * is a pure function of a handful of primitive props — confidence colours, + * intent-hint selection, and the stage hint resolver. All of that logic + * lives in `reasoning-helpers.ts` and is exercised here without mounting + * Svelte. + */ +import { describe, it, expect } from 'vitest'; + +import { + confidenceColor, + confidenceLabel, + intentHintFor, + INTENT_HINTS, + CONFIDENCE_EMERALD, + CONFIDENCE_AMBER, + CONFIDENCE_RED, + type IntentKey, +} from '../reasoning-helpers'; + +// ──────────────────────────────────────────────────────────────── +// confidenceColor — the spec-critical boundary table +// ──────────────────────────────────────────────────────────────── + +describe('confidenceColor — band boundaries (>75 emerald, 40-75 amber, <40 red)', () => { + it.each<[number, string]>([ + // Emerald band: strictly greater than 75 + [100, CONFIDENCE_EMERALD], + [99.99, CONFIDENCE_EMERALD], + [80, CONFIDENCE_EMERALD], + [76, CONFIDENCE_EMERALD], + [75.01, CONFIDENCE_EMERALD], + // Amber band: 40 <= c <= 75 + [75, CONFIDENCE_AMBER], // exactly 75 → amber (page spec: `>75` emerald) + [60, CONFIDENCE_AMBER], + [50, CONFIDENCE_AMBER], + [40.01, CONFIDENCE_AMBER], + [40, CONFIDENCE_AMBER], // exactly 40 → amber (page spec: `>=40` amber) + // Red band: strictly less than 40 + [39.99, CONFIDENCE_RED], + [20, CONFIDENCE_RED], + [0.01, CONFIDENCE_RED], + [0, CONFIDENCE_RED], + ])('confidence %f → %s', (c, expected) => { + expect(confidenceColor(c)).toBe(expected); + }); + + it('clamps negative to red (defensive — confidence should never be negative)', () => { + expect(confidenceColor(-10)).toBe(CONFIDENCE_RED); + }); + + it('over-100 stays emerald (defensive — confidence should never exceed 100)', () => { + expect(confidenceColor(150)).toBe(CONFIDENCE_EMERALD); + }); + + it('NaN → red (worst-case band)', () => { + expect(confidenceColor(Number.NaN)).toBe(CONFIDENCE_RED); + }); + + it('is pure — same input yields same output', () => { + for (const c of [0, 39.99, 40, 75, 75.01, 100]) { + expect(confidenceColor(c)).toBe(confidenceColor(c)); + } + }); + + it('never returns an empty string or undefined', () => { + for (const c of [-1, 0, 20, 40, 75, 76, 100, 200, Number.NaN]) { + const colour = confidenceColor(c); + expect(typeof colour).toBe('string'); + expect(colour.length).toBeGreaterThan(0); + } + }); +}); + +describe('confidenceLabel — human text per band', () => { + it.each<[number, string]>([ + [100, 'HIGH CONFIDENCE'], + [76, 'HIGH CONFIDENCE'], + [75.01, 'HIGH CONFIDENCE'], + [75, 'MIXED SIGNAL'], + [60, 'MIXED SIGNAL'], + [40, 'MIXED SIGNAL'], + [39.99, 'LOW CONFIDENCE'], + [0, 'LOW CONFIDENCE'], + ])('confidence %f → %s', (c, expected) => { + expect(confidenceLabel(c)).toBe(expected); + }); + + it('NaN → LOW CONFIDENCE (safe default)', () => { + expect(confidenceLabel(Number.NaN)).toBe('LOW CONFIDENCE'); + }); + + it('agrees with confidenceColor across the spec boundary sweep', () => { + // Sanity: if the label is HIGH, the colour must be emerald, etc. + const cases: Array<[number, string, string]> = [ + [100, 'HIGH CONFIDENCE', CONFIDENCE_EMERALD], + [76, 'HIGH CONFIDENCE', CONFIDENCE_EMERALD], + [75, 'MIXED SIGNAL', CONFIDENCE_AMBER], + [40, 'MIXED SIGNAL', CONFIDENCE_AMBER], + [39.99, 'LOW CONFIDENCE', CONFIDENCE_RED], + [0, 'LOW CONFIDENCE', CONFIDENCE_RED], + ]; + for (const [c, label, colour] of cases) { + expect(confidenceLabel(c)).toBe(label); + expect(confidenceColor(c)).toBe(colour); + } + }); +}); + +// ──────────────────────────────────────────────────────────────── +// Intent classification — visual hint mapping +// ──────────────────────────────────────────────────────────────── + +describe('INTENT_HINTS — one hint per deep_reference intent', () => { + const intents: IntentKey[] = [ + 'FactCheck', + 'Timeline', + 'RootCause', + 'Comparison', + 'Synthesis', + ]; + + it('defines a hint for every intent the backend emits', () => { + for (const i of intents) { + expect(INTENT_HINTS[i]).toBeDefined(); + } + }); + + it.each(intents)('%s hint has label + icon + description', (i) => { + const hint = INTENT_HINTS[i]; + expect(hint.label).toBe(i); // label doubles as canonical id + expect(hint.icon.length).toBeGreaterThan(0); + expect(hint.description.length).toBeGreaterThan(0); + }); + + it('icons are unique across intents (so the eye can distinguish them)', () => { + const icons = intents.map((i) => INTENT_HINTS[i].icon); + expect(new Set(icons).size).toBe(intents.length); + }); + + it('descriptions are distinct across intents', () => { + const descs = intents.map((i) => INTENT_HINTS[i].description); + expect(new Set(descs).size).toBe(intents.length); + }); +}); + +describe('intentHintFor — lookup with safe fallback', () => { + it('returns the exact entry for a known intent', () => { + expect(intentHintFor('FactCheck')).toBe(INTENT_HINTS.FactCheck); + expect(intentHintFor('Timeline')).toBe(INTENT_HINTS.Timeline); + expect(intentHintFor('RootCause')).toBe(INTENT_HINTS.RootCause); + expect(intentHintFor('Comparison')).toBe(INTENT_HINTS.Comparison); + expect(intentHintFor('Synthesis')).toBe(INTENT_HINTS.Synthesis); + }); + + it('falls back to Synthesis for unknown intent (most generic classification)', () => { + expect(intentHintFor('Prediction')).toBe(INTENT_HINTS.Synthesis); + expect(intentHintFor('nonsense')).toBe(INTENT_HINTS.Synthesis); + }); + + it('falls back to Synthesis for null / undefined / empty string', () => { + expect(intentHintFor(null)).toBe(INTENT_HINTS.Synthesis); + expect(intentHintFor(undefined)).toBe(INTENT_HINTS.Synthesis); + expect(intentHintFor('')).toBe(INTENT_HINTS.Synthesis); + }); + + it('is case-sensitive — backend emits Title-case strings and we honour that', () => { + // If case-folding becomes desirable, this test will force the + // change to be explicit rather than accidental. + expect(intentHintFor('factcheck')).toBe(INTENT_HINTS.Synthesis); + expect(intentHintFor('FACTCHECK')).toBe(INTENT_HINTS.Synthesis); + }); +}); + +// ──────────────────────────────────────────────────────────────── +// Stage-count invariant — the component renders exactly 8 stages +// ──────────────────────────────────────────────────────────────── + +describe('Cognitive pipeline shape', () => { + it('confidence colour constants are all distinct hex strings', () => { + const set = new Set([ + CONFIDENCE_EMERALD.toLowerCase(), + CONFIDENCE_AMBER.toLowerCase(), + CONFIDENCE_RED.toLowerCase(), + ]); + expect(set.size).toBe(3); + for (const c of set) { + expect(c).toMatch(/^#[0-9a-f]{6}$/); + } + }); +}); diff --git a/apps/dashboard/src/lib/components/activation-helpers.ts b/apps/dashboard/src/lib/components/activation-helpers.ts new file mode 100644 index 0000000..e330910 --- /dev/null +++ b/apps/dashboard/src/lib/components/activation-helpers.ts @@ -0,0 +1,237 @@ +/** + * activation-helpers — Pure logic for the Spreading Activation Live View. + * + * Extracted from ActivationNetwork.svelte + activation/+page.svelte so the + * decay / geometry / event-filtering rules can be exercised in the Vitest + * `node` environment without jsdom. Every helper in this module is a pure + * function of its inputs; no DOM, no timers, no Svelte runes. + * + * The constants in this module are the single source of truth — the Svelte + * component re-exports / re-uses them rather than hard-coding its own. + * + * References + * ---------- + * - Collins & Loftus 1975 — spreading activation with exponential decay + * - Anderson 1983 (ACT-R) — activation threshold for availability + */ +import { NODE_TYPE_COLORS } from '$types'; +import type { VestigeEvent } from '$types'; + +/** Per-tick multiplicative decay factor (Collins & Loftus 1975). */ +export const DECAY = 0.93; + +/** Activation below this floor is invisible / garbage-collected. */ +export const MIN_VISIBLE = 0.05; + +/** Fallback node colour when NODE_TYPE_COLORS has no entry for the type. */ +export const FALLBACK_COLOR = '#8B95A5'; + +/** Source node colour (synapse-glow). Distinct from any node-type colour. */ +export const SOURCE_COLOR = '#818cf8'; + +/** Radial spacing between concentric rings (px). */ +export const RING_GAP = 140; + +/** Max neighbours that fit on ring 1 before spilling to ring 2. */ +export const RING_1_CAPACITY = 8; + +/** Edge draw stagger — frames of delay per rank inside a ring. */ +export const STAGGER_PER_RANK = 4; + +/** Extra stagger added to ring-2 edges so they light up after ring 1. */ +export const STAGGER_RING_2_BONUS = 12; + +// --------------------------------------------------------------------------- +// Decay math +// --------------------------------------------------------------------------- + +/** + * Apply a single tick of exponential decay. Clamps negative input to 0 so a + * corrupt state never produces a creeping-positive value on the next tick. + */ +export function applyDecay(activation: number): number { + if (!Number.isFinite(activation) || activation <= 0) return 0; + return activation * DECAY; +} + +/** + * Compound decay over N ticks. N < 0 is treated as 0 (no change). + * Equivalent to calling `applyDecay` N times. + */ +export function compoundDecay(activation: number, ticks: number): number { + if (!Number.isFinite(activation) || activation <= 0) return 0; + if (!Number.isFinite(ticks) || ticks <= 0) return activation; + return activation * DECAY ** ticks; +} + +/** True if the node's activation is at or above the visibility floor. */ +export function isVisible(activation: number): boolean { + if (!Number.isFinite(activation)) return false; + return activation >= MIN_VISIBLE; +} + +/** + * How many ticks until `initial` decays below `MIN_VISIBLE`. Useful in tests + * and for sizing animation budgets. Initial <= threshold returns 0. + */ +export function ticksUntilInvisible(initial: number): number { + if (!Number.isFinite(initial) || initial <= MIN_VISIBLE) return 0; + // initial * DECAY^n < MIN_VISIBLE → n > log(MIN_VISIBLE/initial) / log(DECAY) + const n = Math.log(MIN_VISIBLE / initial) / Math.log(DECAY); + return Math.ceil(n); +} + +// --------------------------------------------------------------------------- +// Ring placement — concentric circles around a source +// --------------------------------------------------------------------------- + +export interface Point { + x: number; + y: number; +} + +/** + * Classify a neighbour's 0-indexed rank into a ring number. + * Ranks 0..RING_1_CAPACITY-1 → ring 1; rest → ring 2. + */ +export function computeRing(rank: number): 1 | 2 { + if (!Number.isFinite(rank) || rank < RING_1_CAPACITY) return 1; + return 2; +} + +/** + * Evenly distribute `count` positions on a circle of radius `ring * RING_GAP` + * centred at (cx, cy). `angleOffset` rotates the whole ring so overlapping + * bursts don't perfectly collide. Zero count returns `[]`. + */ +export function ringPositions( + cx: number, + cy: number, + count: number, + ring: number, + angleOffset = 0, +): Point[] { + if (!Number.isFinite(count) || count <= 0) return []; + const radius = RING_GAP * ring; + const positions: Point[] = []; + for (let i = 0; i < count; i++) { + const angle = angleOffset + (i / count) * Math.PI * 2; + positions.push({ + x: cx + Math.cos(angle) * radius, + y: cy + Math.sin(angle) * radius, + }); + } + return positions; +} + +/** + * Given the full neighbour list, produce a flat array of Points — ring 1 + * first, ring 2 after. The resulting length === neighbours.length. + */ +export function layoutNeighbours( + cx: number, + cy: number, + neighbourCount: number, + angleOffset = 0, +): Point[] { + const ring1 = Math.min(neighbourCount, RING_1_CAPACITY); + const ring2 = Math.max(0, neighbourCount - RING_1_CAPACITY); + return [ + ...ringPositions(cx, cy, ring1, 1, angleOffset), + ...ringPositions(cx, cy, ring2, 2, angleOffset), + ]; +} + +// --------------------------------------------------------------------------- +// Initial activation by rank +// --------------------------------------------------------------------------- + +/** + * Seed activation for a neighbour at 0-indexed `rank` given `total`. + * Higher-ranked (earlier) neighbours get stronger initial activation. + * Ring-2 neighbours get a 0.75× ring-factor penalty on top of the rank factor. + * Returns a value in (0, 1]. + */ +export function initialActivation(rank: number, total: number): number { + if (!Number.isFinite(total) || total <= 0) return 0; + if (!Number.isFinite(rank) || rank < 0) return 0; + const rankFactor = 1 - (rank / total) * 0.35; + const ringFactor = computeRing(rank) === 1 ? 1 : 0.75; + return Math.min(1, rankFactor * ringFactor); +} + +// --------------------------------------------------------------------------- +// Edge stagger +// --------------------------------------------------------------------------- + +/** + * Delay (in animation frames) before the edge at rank `i` starts drawing. + * Ring 1 edges light up first, then ring 2 after a bonus delay. + */ +export function edgeStagger(rank: number): number { + if (!Number.isFinite(rank) || rank < 0) return 0; + const r = Math.floor(rank); + const base = r * STAGGER_PER_RANK; + return computeRing(r) === 1 ? base : base + STAGGER_RING_2_BONUS; +} + +// --------------------------------------------------------------------------- +// Color mapping +// --------------------------------------------------------------------------- + +/** + * Colour for a node on the activation canvas. + * - source nodes always use SOURCE_COLOR (synapse-glow) + * - known node types use NODE_TYPE_COLORS + * - unknown node types fall back to FALLBACK_COLOR (soft steel) + */ +export function activationColor( + nodeType: string | null | undefined, + isSource: boolean, +): string { + if (isSource) return SOURCE_COLOR; + if (!nodeType) return FALLBACK_COLOR; + return NODE_TYPE_COLORS[nodeType] ?? FALLBACK_COLOR; +} + +// --------------------------------------------------------------------------- +// Event-feed filtering — "only fire on NEW ActivationSpread events" +// --------------------------------------------------------------------------- + +export interface SpreadPayload { + source_id: string; + target_ids: string[]; +} + +/** + * Extract ActivationSpread payloads from a websocket event feed. The feed + * is prepended (newest at index 0, oldest at the end). Stop as soon as we + * hit the reference of `lastSeen` — events at or past that point were + * already processed by a prior tick. + * + * Returned payloads are in OLDEST-FIRST order so downstream callers can + * fire them in the same narrative order they occurred. + * + * Payloads missing required fields are silently skipped. + */ +export function filterNewSpreadEvents( + feed: readonly VestigeEvent[], + lastSeen: VestigeEvent | null, +): SpreadPayload[] { + if (!feed || feed.length === 0) return []; + const fresh: SpreadPayload[] = []; + for (const ev of feed) { + if (ev === lastSeen) break; + if (ev.type !== 'ActivationSpread') continue; + const data = ev.data as { source_id?: unknown; target_ids?: unknown }; + if (typeof data.source_id !== 'string') continue; + if (!Array.isArray(data.target_ids)) continue; + const targets = data.target_ids.filter( + (t): t is string => typeof t === 'string', + ); + if (targets.length === 0) continue; + fresh.push({ source_id: data.source_id, target_ids: targets }); + } + // Reverse so oldest-first. + return fresh.reverse(); +} diff --git a/apps/dashboard/src/lib/components/audit-trail-helpers.ts b/apps/dashboard/src/lib/components/audit-trail-helpers.ts new file mode 100644 index 0000000..2dbca23 --- /dev/null +++ b/apps/dashboard/src/lib/components/audit-trail-helpers.ts @@ -0,0 +1,293 @@ +/** + * Pure helpers for MemoryAuditTrail. + * + * Extracted for isolated unit testing in a Node (vitest) environment — + * no DOM, no Svelte runtime, no fetch. Every function in this module is + * deterministic given its inputs. + */ + +export type AuditAction = + | 'created' + | 'accessed' + | 'promoted' + | 'demoted' + | 'edited' + | 'suppressed' + | 'dreamed' + | 'reconsolidated'; + +export interface AuditEvent { + action: AuditAction; + timestamp: string; // ISO + old_value?: number; + new_value?: number; + reason?: string; + triggered_by?: string; +} + +export type MarkerKind = + | 'dot' + | 'arrow-up' + | 'arrow-down' + | 'pencil' + | 'x' + | 'star' + | 'circle-arrow' + | 'ring'; + +export interface Meta { + label: string; + color: string; // hex for dot + glow + glyph: string; // optional inline symbol + kind: MarkerKind; +} + +/** + * Event type → visual metadata. Each action maps to a UNIQUE marker `kind` + * so the 8 event types are visually distinguishable without relying on the + * colour palette alone (accessibility). + */ +export const META: Record = { + created: { label: 'Created', color: '#10b981', glyph: '', kind: 'ring' }, + accessed: { label: 'Accessed', color: '#3b82f6', glyph: '', kind: 'dot' }, + promoted: { label: 'Promoted', color: '#10b981', glyph: '', kind: 'arrow-up' }, + demoted: { label: 'Demoted', color: '#f59e0b', glyph: '', kind: 'arrow-down' }, + edited: { label: 'Edited', color: '#facc15', glyph: '', kind: 'pencil' }, + suppressed: { label: 'Suppressed', color: '#a855f7', glyph: '', kind: 'x' }, + dreamed: { label: 'Dreamed', color: '#c084fc', glyph: '', kind: 'star' }, + reconsolidated: { label: 'Reconsolidated', color: '#ec4899', glyph: '', kind: 'circle-arrow' } +}; + +export const VISIBLE_LIMIT = 15; + +/** + * All 8 `AuditAction` values, in the canonical order. Used both by the + * event generator (`actionPool`) and by tests that verify uniqueness of + * the marker mapping. + */ +export const ALL_ACTIONS: readonly AuditAction[] = [ + 'created', + 'accessed', + 'promoted', + 'demoted', + 'edited', + 'suppressed', + 'dreamed', + 'reconsolidated' +] as const; + +/** + * Hash a string id into a 32-bit unsigned seed. Stable across runs. + */ +export function hashSeed(id: string): number { + let seed = 0; + for (let i = 0; i < id.length; i++) seed = (seed * 31 + id.charCodeAt(i)) >>> 0; + return seed; +} + +/** + * Linear congruential PRNG bound to a mutable seed. Returns a function + * that yields floats in `[0, 1)` — critically, NEVER 1.0, so callers + * can safely use `Math.floor(rand() * arr.length)` without off-by-one. + */ +export function makeRand(initialSeed: number): () => number { + let seed = initialSeed >>> 0; + return () => { + seed = (seed * 1664525 + 1013904223) >>> 0; + // Divide by 2^32, not 2^32 - 1 — the latter can yield exactly 1.0 + // when seed is UINT32_MAX, breaking array-index math. + return seed / 0x100000000; + }; +} + +/** + * Deterministic mock audit-trail generator. Same `memoryId` + `nowMs` + * ALWAYS yields the same event sequence (critical for snapshot stability + * and for tests). An empty `memoryId` yields no events — the audit trail + * panel should never invent history for a non-existent memory. + * + * `countOverride` lets tests force a specific number of events (e.g. + * to cross the 15-event visibility threshold, which the default range + * 8-15 cannot do). + */ +export function generateMockAuditTrail( + memoryId: string, + nowMs: number = Date.now(), + countOverride?: number +): AuditEvent[] { + if (!memoryId) return []; + + const rand = makeRand(hashSeed(memoryId)); + const count = countOverride ?? 8 + Math.floor(rand() * 8); // default 8-15 events + if (count <= 0) return []; + + const out: AuditEvent[] = []; + + const createdAt = nowMs - (14 + rand() * 21) * 86_400_000; // 14-35 days ago + out.push({ + action: 'created', + timestamp: new Date(createdAt).toISOString(), + reason: 'smart_ingest · prediction-error gate opened', + triggered_by: 'smart_ingest' + }); + + let t = createdAt; + let retention = 0.5 + rand() * 0.2; + const actionPool: AuditAction[] = [ + 'accessed', + 'accessed', + 'accessed', + 'accessed', + 'promoted', + 'demoted', + 'edited', + 'dreamed', + 'reconsolidated', + 'suppressed' + ]; + + for (let i = 1; i < count; i++) { + t += rand() * 5 * 86_400_000 + 3_600_000; // 1h-5d between events + const action = actionPool[Math.floor(rand() * actionPool.length)]; + const ev: AuditEvent = { action, timestamp: new Date(t).toISOString() }; + + switch (action) { + case 'accessed': { + const old = retention; + retention = Math.min(1, retention + rand() * 0.04 + 0.01); + ev.old_value = old; + ev.new_value = retention; + ev.triggered_by = rand() > 0.5 ? 'search' : 'deep_reference'; + break; + } + case 'promoted': { + const old = retention; + retention = Math.min(1, retention + 0.1); + ev.old_value = old; + ev.new_value = retention; + ev.reason = 'confirmed helpful by user'; + ev.triggered_by = 'memory(action=promote)'; + break; + } + case 'demoted': { + const old = retention; + retention = Math.max(0, retention - 0.15); + ev.old_value = old; + ev.new_value = retention; + ev.reason = 'user flagged as outdated'; + ev.triggered_by = 'memory(action=demote)'; + break; + } + case 'edited': { + ev.reason = 'content refined, FSRS state preserved'; + ev.triggered_by = 'memory(action=edit)'; + break; + } + case 'suppressed': { + const old = retention; + retention = Math.max(0, retention - 0.08); + ev.old_value = old; + ev.new_value = retention; + ev.reason = 'top-down inhibition (Anderson 2025)'; + ev.triggered_by = 'suppress(dashboard)'; + break; + } + case 'dreamed': { + const old = retention; + retention = Math.min(1, retention + 0.05); + ev.old_value = old; + ev.new_value = retention; + ev.reason = 'replayed during dream consolidation'; + ev.triggered_by = 'dream()'; + break; + } + case 'reconsolidated': { + ev.reason = 'edited within 5-min labile window (Nader)'; + ev.triggered_by = 'reconsolidation-manager'; + break; + } + case 'created': + // Created is only emitted once, as the first event. If the pool + // ever yields it again, treat it as a no-op access marker with + // no retention change — defensive, not expected. + ev.triggered_by = 'smart_ingest'; + break; + } + + out.push(ev); + } + + // Newest first for display. + return out.reverse(); +} + +/** + * Humanised relative time. Uses supplied `nowMs` for deterministic tests; + * defaults to `Date.now()` in production. + * + * Boundaries (strictly `<`, so 60s flips to "1m", 60m flips to "1h", etc.): + * <60s → "Ns ago" + * <60m → "Nm ago" + * <24h → "Nh ago" + * <30d → "Nd ago" + * <12mo → "Nmo ago" + * else → "Ny ago" + * + * Future timestamps (nowMs < then) clamp to "0s ago" rather than returning + * a negative string — the audit trail is a past-only view. + */ +export function relativeTime(iso: string, nowMs: number = Date.now()): string { + const then = new Date(iso).getTime(); + const diff = Math.max(0, nowMs - then); + const s = Math.floor(diff / 1000); + if (s < 60) return `${s}s ago`; + const m = Math.floor(s / 60); + if (m < 60) return `${m}m ago`; + const h = Math.floor(m / 60); + if (h < 24) return `${h}h ago`; + const d = Math.floor(h / 24); + if (d < 30) return `${d}d ago`; + const mo = Math.floor(d / 30); + if (mo < 12) return `${mo}mo ago`; + const y = Math.floor(mo / 12); + return `${y}y ago`; +} + +/** + * Retention delta formatter. Behaviour: + * (undef, undef) → null — no retention movement on this event + * (undef, 0.72) → "set 0.72" — initial value, no prior state + * (0.50, undef) → "was 0.50" — retention cleared (rare) + * (0.50, 0.72) → "0.50 → 0.72" + * + * The `retention ` prefix is left to the caller so tests can compare the + * core formatted value precisely. + */ +export function formatRetentionDelta( + oldValue: number | undefined, + newValue: number | undefined +): string | null { + const hasOld = typeof oldValue === 'number' && Number.isFinite(oldValue); + const hasNew = typeof newValue === 'number' && Number.isFinite(newValue); + if (!hasOld && !hasNew) return null; + if (!hasOld && hasNew) return `set ${newValue!.toFixed(2)}`; + if (hasOld && !hasNew) return `was ${oldValue!.toFixed(2)}`; + return `${oldValue!.toFixed(2)} → ${newValue!.toFixed(2)}`; +} + +/** + * Split an event list into (visible, hiddenCount) per the 15-event cap. + * Exactly 15 events → no toggle (hiddenCount = 0). 16+ → toggle. + */ +export function splitVisible( + events: AuditEvent[], + showAll: boolean +): { visible: AuditEvent[]; hiddenCount: number } { + if (showAll || events.length <= VISIBLE_LIMIT) { + return { visible: events, hiddenCount: Math.max(0, events.length - VISIBLE_LIMIT) }; + } + return { + visible: events.slice(0, VISIBLE_LIMIT), + hiddenCount: events.length - VISIBLE_LIMIT + }; +} diff --git a/apps/dashboard/src/lib/components/awareness-helpers.ts b/apps/dashboard/src/lib/components/awareness-helpers.ts new file mode 100644 index 0000000..d60a4a6 --- /dev/null +++ b/apps/dashboard/src/lib/components/awareness-helpers.ts @@ -0,0 +1,192 @@ +/** + * Pure helpers for AmbientAwarenessStrip.svelte. + * + * Extracted so the time-window, event-scan, and timestamp-parsing logic can + * be unit tested in the vitest `node` environment without jsdom, Svelte + * rendering, or fake timers bleeding into runes. + * + * Contracts + * --------- + * - `parseEventTimestamp`: handles (a) numeric ms (>1e12), (b) numeric seconds + * (<=1e12), (c) ISO-8601 string, (d) invalid/absent → null. + * - `bucketizeActivity`: given ms timestamps + `now`, returns 10 counts for a + * 5-min trailing window. Bucket 0 = oldest 30s, bucket 9 = newest 30s. + * Events outside [now-5m, now] are dropped (clock skew). + * - `findRecentDream`: returns the newest-indexed (feed is newest-first) + * DreamCompleted whose parsed timestamp is within 24h, else null. If the + * timestamp is unparseable, `now` is used as the fallback (matches the + * component's behavior). + * - `isDreaming`: a DreamStarted within the last 5 min NOT followed by a + * newer DreamCompleted. Mirrors the component's derived block exactly. + * - `hasRecentSuppression`: any MemorySuppressed event with a parsed + * timestamp within `thresholdMs` of `now`. Feed is assumed newest-first — + * we break as soon as we pass the threshold, matching component behavior. + * + * All helpers are null-safe and treat unparseable timestamps consistently + * (fall back to `now`, matching the on-screen "something just happened" feel). + */ + +export interface EventLike { + type: string; + data?: Record; +} + +/** + * Parse a VestigeEvent timestamp, checking `data.timestamp`, then `data.at`, + * then `data.occurred_at`. Supports ms-since-epoch numbers, seconds-since-epoch + * numbers, and ISO-8601 strings. Returns null for absent / invalid input. + * + * Numeric heuristic: values > 1e12 are treated as ms (2001+), values <= 1e12 + * are treated as seconds. `1e12 ms` ≈ Sept 2001, so any real ms timestamp + * lands safely on the "ms" side. + */ +export function parseEventTimestamp(event: EventLike): number | null { + const d = event.data; + if (!d || typeof d !== 'object') return null; + const raw = + (d.timestamp as string | number | undefined) ?? + (d.at as string | number | undefined) ?? + (d.occurred_at as string | number | undefined); + if (raw === undefined || raw === null) return null; + if (typeof raw === 'number') { + if (!Number.isFinite(raw)) return null; + return raw > 1e12 ? raw : raw * 1000; + } + if (typeof raw !== 'string') return null; + const ms = Date.parse(raw); + return Number.isFinite(ms) ? ms : null; +} + +export const ACTIVITY_BUCKET_COUNT = 10; +export const ACTIVITY_BUCKET_MS = 30_000; +export const ACTIVITY_WINDOW_MS = ACTIVITY_BUCKET_COUNT * ACTIVITY_BUCKET_MS; + +export interface ActivityBucket { + count: number; + ratio: number; +} + +/** + * Bucket event timestamps into 10 × 30s buckets for a 5-min trailing window. + * Events with `type === 'Heartbeat'` are skipped (noise). Events whose + * timestamp is out of window (clock skew / pre-history) are dropped. + * + * Returned `ratio` is `count / max(1, maxBucketCount)` — so a sparkline with + * zero events has all-zero ratios (no division by zero) and a sparkline with + * a single spike peaks at 1.0. + */ +export function bucketizeActivity( + events: EventLike[], + nowMs: number, +): ActivityBucket[] { + const start = nowMs - ACTIVITY_WINDOW_MS; + const counts = new Array(ACTIVITY_BUCKET_COUNT).fill(0); + for (const e of events) { + if (e.type === 'Heartbeat') continue; + const t = parseEventTimestamp(e); + if (t === null || t < start || t > nowMs) continue; + const idx = Math.min( + ACTIVITY_BUCKET_COUNT - 1, + Math.floor((t - start) / ACTIVITY_BUCKET_MS), + ); + counts[idx] += 1; + } + const max = Math.max(1, ...counts); + return counts.map((count) => ({ count, ratio: count / max })); +} + +/** + * Find the most recent DreamCompleted within 24h of `nowMs`. + * Feed is assumed newest-first — we return the FIRST match. + * Unparseable timestamps fall back to `nowMs` (matches component behavior). + */ +export function findRecentDream( + events: EventLike[], + nowMs: number, +): EventLike | null { + const dayAgo = nowMs - 24 * 60 * 60 * 1000; + for (const e of events) { + if (e.type !== 'DreamCompleted') continue; + const t = parseEventTimestamp(e) ?? nowMs; + if (t >= dayAgo) return e; + return null; // newest-first: older ones definitely won't match + } + return null; +} + +/** + * Extract `insights_generated` / `insightsGenerated` from a DreamCompleted + * event payload. Returns null if missing or non-numeric. + */ +export function dreamInsightsCount(event: EventLike | null): number | null { + if (!event || !event.data) return null; + const d = event.data; + const raw = + typeof d.insights_generated === 'number' + ? d.insights_generated + : typeof d.insightsGenerated === 'number' + ? d.insightsGenerated + : null; + return raw !== null && Number.isFinite(raw) ? raw : null; +} + +/** + * A Dream is in flight if the newest DreamStarted is within 5 min of `nowMs` + * AND there is no DreamCompleted with a timestamp >= that DreamStarted. + * + * Feed is assumed newest-first. We scan once, grabbing the first Started and + * first Completed, then compare — matching the component's derived block. + */ +export function isDreaming(events: EventLike[], nowMs: number): boolean { + let started: EventLike | null = null; + let completed: EventLike | null = null; + for (const e of events) { + if (!started && e.type === 'DreamStarted') started = e; + if (!completed && e.type === 'DreamCompleted') completed = e; + if (started && completed) break; + } + if (!started) return false; + const startedAt = parseEventTimestamp(started) ?? nowMs; + const fiveMinAgo = nowMs - 5 * 60 * 1000; + if (startedAt < fiveMinAgo) return false; + if (!completed) return true; + const completedAt = parseEventTimestamp(completed) ?? nowMs; + return completedAt < startedAt; +} + +/** + * Format an "ago" duration compactly. Pure and deterministic. + * 0-59s → "Ns ago", 60-3599s → "Nm ago", <24h → "Nh ago", else "Nd ago". + * Negative input is clamped to 0. + */ +export function formatAgo(ms: number): string { + const clamped = Math.max(0, ms); + const s = Math.floor(clamped / 1000); + if (s < 60) return `${s}s ago`; + const m = Math.floor(s / 60); + if (m < 60) return `${m}m ago`; + const h = Math.floor(m / 60); + if (h < 24) return `${h}h ago`; + return `${Math.floor(h / 24)}d ago`; +} + +/** + * True if any MemorySuppressed event lies within `thresholdMs` of `nowMs`. + * Feed assumed newest-first — break as soon as we encounter one OUTSIDE + * the window (all older ones are definitely older). Unparseable timestamps + * fall back to `nowMs` so the flash fires — matches component behavior. + */ +export function hasRecentSuppression( + events: EventLike[], + nowMs: number, + thresholdMs: number = 10_000, +): boolean { + const cutoff = nowMs - thresholdMs; + for (const e of events) { + if (e.type !== 'MemorySuppressed') continue; + const t = parseEventTimestamp(e) ?? nowMs; + if (t >= cutoff) return true; + return false; // newest-first: older ones definitely won't match + } + return false; +} diff --git a/apps/dashboard/src/lib/components/contradiction-helpers.ts b/apps/dashboard/src/lib/components/contradiction-helpers.ts new file mode 100644 index 0000000..14ab90f --- /dev/null +++ b/apps/dashboard/src/lib/components/contradiction-helpers.ts @@ -0,0 +1,210 @@ +/** + * contradiction-helpers — Pure logic for the Contradiction Constellation UI. + * + * Extracted from ContradictionArcs.svelte + contradictions/+page.svelte so + * the math and classification live in one place and can be tested in the + * vitest `node` environment without jsdom / Svelte harnessing. + * + * Contracts + * --------- + * - Severity thresholds are STRICTLY exclusive: similarity > 0.7 → strong, + * similarity > 0.5 → moderate, else → mild. The boundary values 0.5 and + * 0.7 therefore fall into the LOWER band on purpose (so a similarity of + * exactly 0.7 is 'moderate', not 'strong'). + * - Node type palette has 8 known types; anything else — including + * `undefined`, `null`, empty string, or a typo — falls back to violet + * (#8b5cf6), matching the `concept` fallback tone used elsewhere. + * - Pair opacity is a trinary rule: no focus → 1, focused match → 1, + * focused non-match → 0.12. `null` and `undefined` both mean "no focus". + * - Trust is defined on [0,1]; `nodeRadius` clamps out-of-range values so + * a negative trust can't produce a sub-zero radius and a >1 trust can't + * balloon past the design maximum (14px). + * - `uniqueMemoryCount` unions memory_a_id + memory_b_id across the whole + * pair list; duplicated pairs do not double-count. + */ + +/** Shape used by the constellation. Mirrors ContradictionArcs.Contradiction. */ +export interface ContradictionLike { + memory_a_id: string; + memory_b_id: string; +} + +// --------------------------------------------------------------------------- +// Severity — similarity → colour + label. +// --------------------------------------------------------------------------- + +export type SeverityLabel = 'strong' | 'moderate' | 'mild'; + +/** Strong threshold. Similarity STRICTLY above this is red. */ +export const SEVERITY_STRONG_THRESHOLD = 0.7; +/** Moderate threshold. Similarity STRICTLY above this (and <= 0.7) is amber. */ +export const SEVERITY_MODERATE_THRESHOLD = 0.5; + +export const SEVERITY_STRONG_COLOR = '#ef4444'; +export const SEVERITY_MODERATE_COLOR = '#f59e0b'; +export const SEVERITY_MILD_COLOR = '#fde047'; + +/** + * Severity colour by similarity. Boundaries at 0.5 and 0.7 fall into the + * LOWER band (strictly-greater-than comparison). + * + * sim > 0.7 → '#ef4444' (strong / red) + * sim > 0.5 → '#f59e0b' (moderate / amber) + * otherwise → '#fde047' (mild / yellow) + */ +export function severityColor(sim: number): string { + if (sim > SEVERITY_STRONG_THRESHOLD) return SEVERITY_STRONG_COLOR; + if (sim > SEVERITY_MODERATE_THRESHOLD) return SEVERITY_MODERATE_COLOR; + return SEVERITY_MILD_COLOR; +} + +/** Severity label by similarity. Same thresholds as severityColor. */ +export function severityLabel(sim: number): SeverityLabel { + if (sim > SEVERITY_STRONG_THRESHOLD) return 'strong'; + if (sim > SEVERITY_MODERATE_THRESHOLD) return 'moderate'; + return 'mild'; +} + +// --------------------------------------------------------------------------- +// Node type palette. +// --------------------------------------------------------------------------- + +/** Fallback colour used when a memory's node_type is missing or unknown. */ +export const NODE_COLOR_FALLBACK = '#8b5cf6'; + +/** Canonical palette for the 8 known node types. */ +export const NODE_COLORS: Record = { + fact: '#3b82f6', + concept: '#8b5cf6', + event: '#f59e0b', + person: '#10b981', + place: '#06b6d4', + note: '#6b7280', + pattern: '#ec4899', + decision: '#ef4444', +}; + +/** Canonical list of known types (stable order — matches palette object). */ +export const KNOWN_NODE_TYPES = Object.freeze([ + 'fact', + 'concept', + 'event', + 'person', + 'place', + 'note', + 'pattern', + 'decision', +]) as readonly string[]; + +/** + * Map a (possibly undefined) node_type to a colour. Unknown / missing / + * empty / null strings fall back to violet (#8b5cf6). + */ +export function nodeColor(t?: string | null): string { + if (!t) return NODE_COLOR_FALLBACK; + return NODE_COLORS[t] ?? NODE_COLOR_FALLBACK; +} + +// --------------------------------------------------------------------------- +// Trust → node radius. +// --------------------------------------------------------------------------- + +/** Minimum circle radius at trust=0. */ +export const NODE_RADIUS_MIN = 5; +/** Additional radius at trust=1. `r = 5 + trust * 9`, so r ∈ [5, 14]. */ +export const NODE_RADIUS_RANGE = 9; + +/** + * Clamp `trust` to [0,1] before mapping to a radius so a bad FSRS value + * can't produce a sub-zero or oversize node. Non-finite values collapse + * to 0 (smallest radius — visually suppresses suspicious data). + */ +export function nodeRadius(trust: number): number { + if (!Number.isFinite(trust)) return NODE_RADIUS_MIN; + const t = trust < 0 ? 0 : trust > 1 ? 1 : trust; + return NODE_RADIUS_MIN + t * NODE_RADIUS_RANGE; +} + +/** Clamp trust to [0,1]. NaN/Infinity/undefined → 0. */ +export function clampTrust(trust: number | null | undefined): number { + if (trust === null || trust === undefined || !Number.isFinite(trust)) return 0; + if (trust < 0) return 0; + if (trust > 1) return 1; + return trust; +} + +// --------------------------------------------------------------------------- +// Focus / pair opacity. +// --------------------------------------------------------------------------- + +/** Opacity applied to a non-focused pair when any pair is focused. */ +export const UNFOCUSED_OPACITY = 0.12; + +/** + * Opacity for a pair given the current focus state. + * + * focus = null/undefined → 1 (nothing dimmed) + * focus === pairIndex → 1 (the focused pair is fully lit) + * focus !== pairIndex → 0.12 (dimmed) + * + * A focus index that doesn't match any rendered pair simply dims everything. + * That's the intended "silent no-op" for a stale focusedPairIndex. + */ +export function pairOpacity(pairIndex: number, focusedPairIndex: number | null | undefined): number { + if (focusedPairIndex === null || focusedPairIndex === undefined) return 1; + return focusedPairIndex === pairIndex ? 1 : UNFOCUSED_OPACITY; +} + +// --------------------------------------------------------------------------- +// Text truncation. +// --------------------------------------------------------------------------- + +/** + * Truncate a string to `max` characters with an ellipsis at the end. + * Shorter-or-equal strings return unchanged. Empty strings return unchanged. + * Non-string inputs collapse to '' rather than crashing. + * + * The ellipsis counts toward the length budget, so the cut-off content is + * `max - 1` characters, matching the component's inline truncate() helper. + */ +export function truncate(s: string | null | undefined, max = 60): string { + if (s === null || s === undefined) return ''; + if (typeof s !== 'string') return ''; + if (max <= 0) return ''; + if (s.length <= max) return s; + return s.slice(0, max - 1) + '…'; +} + +// --------------------------------------------------------------------------- +// Stats. +// --------------------------------------------------------------------------- + +/** + * Count unique memory IDs across a list of contradiction pairs. Each pair + * contributes memory_a_id and memory_b_id. Duplicates (e.g. one memory that + * appears in multiple conflicts) are counted once. + */ +export function uniqueMemoryCount(pairs: readonly ContradictionLike[]): number { + if (!pairs || pairs.length === 0) return 0; + const set = new Set(); + for (const p of pairs) { + if (p.memory_a_id) set.add(p.memory_a_id); + if (p.memory_b_id) set.add(p.memory_b_id); + } + return set.size; +} + +/** + * Average absolute trust delta across pairs. Returns 0 on empty input so + * the UI can render `0.00` instead of `NaN`. + */ +export function avgTrustDelta( + pairs: readonly { trust_a: number; trust_b: number }[], +): number { + if (!pairs || pairs.length === 0) return 0; + let sum = 0; + for (const p of pairs) { + sum += Math.abs((p.trust_a ?? 0) - (p.trust_b ?? 0)); + } + return sum / pairs.length; +} diff --git a/apps/dashboard/src/lib/components/dream-helpers.ts b/apps/dashboard/src/lib/components/dream-helpers.ts new file mode 100644 index 0000000..b740af5 --- /dev/null +++ b/apps/dashboard/src/lib/components/dream-helpers.ts @@ -0,0 +1,155 @@ +/** + * dream-helpers — Pure logic for Dream Cinema UI. + * + * Extracted so we can test it without jsdom / Svelte component harnessing. + * The Vitest setup for this package runs in a Node environment; every helper + * in this module is a pure function of its inputs, so it can be exercised + * directly in `__tests__/*.test.ts` alongside the graph helpers. + */ + +/** Stage 1..5 of the 5-phase consolidation cycle. */ +export const STAGE_COUNT = 5 as const; + +/** Display names for each stage index (1-indexed). */ +export const STAGE_NAMES = [ + 'Replay', + 'Cross-reference', + 'Strengthen', + 'Prune', + 'Transfer', +] as const; + +export type StageIndex = 1 | 2 | 3 | 4 | 5; + +/** + * Clamp an arbitrary integer to the valid 1..5 stage range. Accepts any + * number (NaN, Infinity, negatives, floats) and always returns an integer + * in [1,5]. NaN and non-finite values fall back to 1 — this matches the + * "start at stage 1" behaviour on a fresh dream. + */ +export function clampStage(n: number): StageIndex { + if (!Number.isFinite(n)) return 1; + const i = Math.floor(n); + if (i < 1) return 1; + if (i > STAGE_COUNT) return STAGE_COUNT; + return i as StageIndex; +} + +/** + * Get the human-readable stage name for a (possibly invalid) stage number. + * Uses `clampStage`, so out-of-range inputs return the nearest valid name. + */ +export function stageName(n: number): string { + return STAGE_NAMES[clampStage(n) - 1]; +} + +// --------------------------------------------------------------------------- +// Novelty classification — drives the gold-glow / muted styling on insight +// cards. Thresholds are STRICTLY exclusive so `0.3` and `0.7` map to the +// neutral band on purpose. See DreamInsightCard.svelte. +// --------------------------------------------------------------------------- + +export type NoveltyBand = 'high' | 'neutral' | 'low'; + +/** Upper bound for the muted "low novelty" band. Values BELOW this are low. */ +export const LOW_NOVELTY_THRESHOLD = 0.3; +/** Lower bound for the gold "high novelty" band. Values ABOVE this are high. */ +export const HIGH_NOVELTY_THRESHOLD = 0.7; + +/** + * Classify a novelty score into one of 3 visual bands. + * + * Thresholds are exclusive on both sides: + * novelty > 0.7 → 'high' (gold glow) + * novelty < 0.3 → 'low' (muted / desaturated) + * otherwise → 'neutral' + * + * `null` / `undefined` / `NaN` collapse to 0 → 'low'. + */ +export function noveltyBand(novelty: number | null | undefined): NoveltyBand { + const n = clamp01(novelty); + if (n > HIGH_NOVELTY_THRESHOLD) return 'high'; + if (n < LOW_NOVELTY_THRESHOLD) return 'low'; + return 'neutral'; +} + +/** Clamp a value into [0,1]. `null`/`undefined`/`NaN` → 0. */ +export function clamp01(n: number | null | undefined): number { + if (n === null || n === undefined || !Number.isFinite(n)) return 0; + if (n < 0) return 0; + if (n > 1) return 1; + return n; +} + +// --------------------------------------------------------------------------- +// Formatting helpers — mirror what the page + card render. Keeping these +// pure lets us test the exact output strings without rendering Svelte. +// --------------------------------------------------------------------------- + +/** + * Format a millisecond duration as a human-readable string. + * < 1000ms → "{n}ms" (e.g. "0ms", "500ms") + * ≥ 1000ms → "{n.nn}s" (e.g. "1.50s", "15.00s") + * Negative / NaN values collapse to "0ms". + */ +export function formatDurationMs(ms: number | null | undefined): string { + if (ms === null || ms === undefined || !Number.isFinite(ms) || ms < 0) { + return '0ms'; + } + if (ms < 1000) return `${Math.round(ms)}ms`; + return `${(ms / 1000).toFixed(2)}s`; +} + +/** + * Format a 0..1 confidence as a whole-percent string ("0%", "50%", "100%"). + * Values outside [0,1] clamp first. Uses `Math.round` so 0.505 → "51%". + */ +export function formatConfidencePct(confidence: number | null | undefined): string { + const c = clamp01(confidence); + return `${Math.round(c * 100)}%`; +} + +// --------------------------------------------------------------------------- +// Source memory link formatting. +// --------------------------------------------------------------------------- + +/** + * Build the href for a source memory link. We keep this behind a helper so + * the route format is tested in one place. `base` corresponds to SvelteKit's + * `$app/paths` base (may be ""). Invalid IDs still produce a URL — route + * handling is the page's responsibility, not ours. + */ +export function sourceMemoryHref(id: string, base = ''): string { + return `${base}/memories/${id}`; +} + +/** + * Return the first N source memory IDs from an insight's `sourceMemories` + * array, safely handling null / undefined / empty. Default N = 2, matching + * the card's "first 2 links" behaviour. + */ +export function firstSourceIds( + sources: readonly string[] | null | undefined, + n = 2, +): string[] { + if (!sources || sources.length === 0) return []; + return sources.slice(0, Math.max(0, n)); +} + +/** Count of sources beyond the first N. Used for the "(+N)" suffix. */ +export function extraSourceCount( + sources: readonly string[] | null | undefined, + shown = 2, +): number { + if (!sources) return 0; + return Math.max(0, sources.length - shown); +} + +/** + * Truncate a memory UUID for display on the chip. Matches the previous + * inline `shortId` logic: first 8 chars, or the whole string if shorter. + */ +export function shortMemoryId(id: string): string { + if (!id) return ''; + return id.length > 8 ? id.slice(0, 8) : id; +} diff --git a/apps/dashboard/src/lib/components/duplicates-helpers.ts b/apps/dashboard/src/lib/components/duplicates-helpers.ts new file mode 100644 index 0000000..3bbe0ed --- /dev/null +++ b/apps/dashboard/src/lib/components/duplicates-helpers.ts @@ -0,0 +1,149 @@ +/** + * Pure helpers for the Memory Hygiene / Duplicate Detection UI. + * + * Extracted from DuplicateCluster.svelte + duplicates/+page.svelte so the + * logic can be unit tested in the vitest `node` environment without jsdom. + * + * Contracts + * --------- + * - `similarityBand`: fixed thresholds at 0.92 (near-identical) and 0.80 + * (strong). Boundary values MATCH the higher band (>= semantics). + * - `pickWinner`: highest retention wins. Ties broken by earliest index + * (stable). Returns `null` on empty input — callers must guard. + * - `suggestedActionFor`: >= 0.92 → 'merge', < 0.85 → 'review'. The 0.85..0.92 + * corridor follows the upstream `suggestedAction` field from the MCP tool, + * so we only override the obvious cases. Default for the corridor is + * whatever the caller already had — this function returns null to signal + * "caller decides." + * - `filterByThreshold`: strict `>=` against the provided similarity. + * - `clusterKey`: stable identity across re-fetches — sorted member ids + * joined. Survives threshold changes that keep the same cluster members. + */ + +export type SimilarityBand = 'near-identical' | 'strong' | 'weak'; +export type SuggestedAction = 'merge' | 'review'; + +export interface ClusterMemoryLike { + id: string; + retention: number; + tags?: string[]; + createdAt?: string; +} + +export interface ClusterLike { + similarity: number; + memories: M[]; +} + +/** Color bands. Boundary at 0.92 → red. Boundary at 0.80 → amber. */ +export function similarityBand(similarity: number): SimilarityBand { + if (similarity >= 0.92) return 'near-identical'; + if (similarity >= 0.8) return 'strong'; + return 'weak'; +} + +export function similarityBandColor(similarity: number): string { + const band = similarityBand(similarity); + if (band === 'near-identical') return 'var(--color-decay)'; + if (band === 'strong') return 'var(--color-warning)'; + return '#fde047'; // yellow-300 — distinct from amber warning +} + +export function similarityBandLabel(similarity: number): string { + const band = similarityBand(similarity); + if (band === 'near-identical') return 'Near-identical'; + if (band === 'strong') return 'Strong match'; + return 'Weak match'; +} + +/** Retention color dot. Matches the traffic-light scheme. */ +export function retentionColor(retention: number): string { + if (retention > 0.7) return '#10b981'; + if (retention > 0.4) return '#f59e0b'; + return '#ef4444'; +} + +/** + * Pick the highest-retention memory. Stable tie-break: earliest wins. + * Returns `null` if the cluster is empty. Treats non-finite retention as + * -Infinity so a `retention=NaN` row never claims the throne. + */ +export function pickWinner(memories: M[]): M | null { + if (!memories || memories.length === 0) return null; + let best = memories[0]; + let bestScore = Number.isFinite(best.retention) ? best.retention : -Infinity; + for (let i = 1; i < memories.length; i++) { + const m = memories[i]; + const s = Number.isFinite(m.retention) ? m.retention : -Infinity; + if (s > bestScore) { + best = m; + bestScore = s; + } + } + return best; +} + +/** + * Suggested action inference. Returns null in the ambiguous 0.85..0.92 band + * so callers can honor an upstream suggestion from the backend. + */ +export function suggestedActionFor(similarity: number): SuggestedAction | null { + if (similarity >= 0.92) return 'merge'; + if (similarity < 0.85) return 'review'; + return null; +} + +/** + * Filter clusters by the >= threshold contract. Separate pure function so the + * mock fetch and any future real fetch both get the same semantics. + */ +export function filterByThreshold(clusters: C[], threshold: number): C[] { + return clusters.filter((c) => c.similarity >= threshold); +} + +/** + * Stable identity across re-fetches. Uses sorted member ids, so a cluster + * that loses/gains a member gets a new key (intentional — the cluster has + * changed). If you dismissed cluster [A,B,C] at 0.80 and refetch at 0.70 + * and it now contains [A,B,C,D], it reappears — correct behaviour: a new + * member deserves fresh attention. + */ +export function clusterKey(memories: M[]): string { + return memories + .map((m) => m.id) + .slice() + .sort() + .join('|'); +} + +/** + * Safe content preview — trims, collapses whitespace, truncates at 80 chars + * with an ellipsis. Null-safe. + */ +export function previewContent(content: string | null | undefined, max: number = 80): string { + if (!content) return ''; + const trimmed = content.trim().replace(/\s+/g, ' '); + return trimmed.length <= max ? trimmed : trimmed.slice(0, max) + '…'; +} + +/** + * Render an ISO date string safely — returns an empty string for missing, + * non-string, or invalid input so the DOM shows nothing rather than + * "Invalid Date". + */ +export function formatDate(iso: string | null | undefined): string { + if (!iso || typeof iso !== 'string') return ''; + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return ''; + return d.toLocaleDateString(undefined, { + year: 'numeric', + month: 'short', + day: 'numeric', + }); +} + +/** Safe tag slice — tolerates undefined or non-array inputs. */ +export function safeTags(tags: string[] | null | undefined, limit: number = 4): string[] { + if (!Array.isArray(tags)) return []; + return tags.slice(0, limit); +} diff --git a/apps/dashboard/src/lib/components/importance-helpers.ts b/apps/dashboard/src/lib/components/importance-helpers.ts new file mode 100644 index 0000000..8516fa5 --- /dev/null +++ b/apps/dashboard/src/lib/components/importance-helpers.ts @@ -0,0 +1,226 @@ +/** + * importance-helpers — Pure logic for the Importance Radar UI + * (importance/+page.svelte + ImportanceRadar.svelte). + * + * Extracted so the radar geometry and importance-proxy maths can be unit- + * tested in the vitest `node` environment without jsdom or Svelte harness. + * + * Contracts + * --------- + * - Backend channel weights (novelty 0.25, arousal 0.30, reward 0.25, + * attention 0.20) sum to 1.0 and mirror ImportanceSignals in vestige-core. + * - `clamp01` folds NaN/Infinity/nullish → 0 and clips [0,1]. + * - `radarVertices` emits 4 SVG polygon points in the fixed axis order + * Novelty (top) → Arousal (right) → Reward (bottom) → Attention (left). + * A zero value places the vertex at centre; a one value places it at the + * unit-ring edge. + * - `importanceProxy` is the SAME formula the page uses to rank the weekly + * list: retentionStrength × log1p(reviews + 1) / sqrt(max(1, ageDays)). + * Age is clamped to 1 so a freshly-created memory never divides by zero. + * - `sizePreset` maps 'sm'|'md'|'lg' to 80|180|320 and defaults to 'md' for + * any unknown size key — matching the component's default prop. + */ + +// -- Channel model ---------------------------------------------------------- + +export type ChannelKey = 'novelty' | 'arousal' | 'reward' | 'attention'; + +/** Weights applied server-side by ImportanceSignals. Must sum to 1.0. */ +export const CHANNEL_WEIGHTS: Readonly> = { + novelty: 0.25, + arousal: 0.3, + reward: 0.25, + attention: 0.2, +} as const; + +export interface Channels { + novelty: number; + arousal: number; + reward: number; + attention: number; +} + +/** Clamp a value to [0,1]. Null / undefined / NaN / Infinity → 0. */ +export function clamp01(v: number | null | undefined): number { + if (v === null || v === undefined) return 0; + if (!Number.isFinite(v)) return 0; + if (v < 0) return 0; + if (v > 1) return 1; + return v; +} + +/** Clamp every channel to [0,1]. Safe for partial / malformed inputs. */ +export function clampChannels(ch: Partial | null | undefined): Channels { + return { + novelty: clamp01(ch?.novelty), + arousal: clamp01(ch?.arousal), + reward: clamp01(ch?.reward), + attention: clamp01(ch?.attention), + }; +} + +/** + * Composite importance score — matches backend ImportanceSignals. + * + * composite = 0.25·novelty + 0.30·arousal + 0.25·reward + 0.20·attention + * + * Every input is clamped first so out-of-range channels never puncture the + * 0..1 composite range. The return value is guaranteed to be in [0,1]. + */ +export function compositeScore(ch: Partial | null | undefined): number { + const c = clampChannels(ch); + return ( + c.novelty * CHANNEL_WEIGHTS.novelty + + c.arousal * CHANNEL_WEIGHTS.arousal + + c.reward * CHANNEL_WEIGHTS.reward + + c.attention * CHANNEL_WEIGHTS.attention + ); +} + +// -- Size preset ------------------------------------------------------------ + +export type RadarSize = 'sm' | 'md' | 'lg'; + +export const SIZE_PX: Readonly> = { + sm: 80, + md: 180, + lg: 320, +} as const; + +/** + * Resolve a size preset key to its px value. Unknown / missing keys fall + * back to 'md' (180), matching the component's default prop. `sm` loses + * axis labels in the renderer but that's rendering concern, not ours. + */ +export function sizePreset(size: RadarSize | string | undefined): number { + if (size && (size === 'sm' || size === 'md' || size === 'lg')) { + return SIZE_PX[size]; + } + return SIZE_PX.md; +} + +// -- Geometry --------------------------------------------------------------- + +/** + * Fixed axis order. Angles use SVG conventions (y grows downward): + * Novelty → angle -π/2 (top) + * Arousal → angle 0 (right) + * Reward → angle π/2 (bottom) + * Attention → angle π (left) + */ +export const AXIS_ORDER: ReadonlyArray<{ key: ChannelKey; angle: number }> = [ + { key: 'novelty', angle: -Math.PI / 2 }, + { key: 'arousal', angle: 0 }, + { key: 'reward', angle: Math.PI / 2 }, + { key: 'attention', angle: Math.PI }, +] as const; + +export interface RadarPoint { + x: number; + y: number; +} + +/** + * Compute the effective drawable radius inside the SVG box. This mirrors the + * component's padding logic: + * sm → padding 4 (edge-to-edge, no labels) + * md → padding 28 + * lg → padding 44 + * Radius = size/2 − padding, floored at 0 (a radius below zero would draw + * an inverted polygon — defensive guard). + */ +export function radarRadius(size: RadarSize | string | undefined): number { + const px = sizePreset(size); + let padding: number; + switch (size) { + case 'lg': + padding = 44; + break; + case 'sm': + padding = 4; + break; + default: + padding = 28; + } + return Math.max(0, px / 2 - padding); +} + +/** + * Compute the 4 SVG polygon vertices for a set of channel values at a given + * radar size. Values are clamped to [0,1] first so out-of-range inputs can't + * escape the radar bounds. + * + * Ordering is FIXED and matches AXIS_ORDER: [novelty, arousal, reward, attention]. + * A zero value places the vertex at the centre (cx, cy); a one value places + * it at the unit-ring edge. + */ +export function radarVertices( + ch: Partial | null | undefined, + size: RadarSize | string | undefined = 'md', +): RadarPoint[] { + const px = sizePreset(size); + const r = radarRadius(size); + const cx = px / 2; + const cy = px / 2; + const values = clampChannels(ch); + return AXIS_ORDER.map(({ key, angle }) => { + const v = values[key]; + return { + x: cx + Math.cos(angle) * v * r, + y: cy + Math.sin(angle) * v * r, + }; + }); +} + +/** Serialise vertices to an SVG "M…L…L…L… Z" path, 2-decimal precision. */ +export function verticesToPath(points: RadarPoint[]): string { + if (points.length === 0) return ''; + return ( + points + .map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)},${p.y.toFixed(2)}`) + .join(' ') + ' Z' + ); +} + +// -- Trending-memory proxy -------------------------------------------------- + +export interface ProxyMemoryLike { + retentionStrength: number; + reviewCount?: number | null; + createdAt: string; +} + +/** + * Proxy score for the "Top Important Memories This Week" ranking. Exact + * formula from importance/+page.svelte: + * + * ageDays = max(1, (now - createdAt) / 86_400_000) + * reviews = reviewCount ?? 0 + * recencyBoost = 1 / sqrt(ageDays) + * proxy = retentionStrength × log1p(reviews + 1) × recencyBoost + * + * Edge cases: + * - createdAt is the current instant → ageDays clamps to 1 (no div-by-0) + * - createdAt is in the future → negative age also clamps to 1 + * - reviewCount null/undefined → treated as 0 + * - non-finite retentionStrength → returns 0 defensively + * + * `now` is injectable for deterministic tests. Defaults to `Date.now()`. + */ +export function importanceProxy(m: ProxyMemoryLike, now: number = Date.now()): number { + if (!m || !Number.isFinite(m.retentionStrength)) return 0; + const created = new Date(m.createdAt).getTime(); + if (!Number.isFinite(created)) return 0; + const ageDays = Math.max(1, (now - created) / 86_400_000); + const reviews = m.reviewCount ?? 0; + const recencyBoost = 1 / Math.sqrt(ageDays); + return m.retentionStrength * Math.log1p(reviews + 1) * recencyBoost; +} + +/** Sort memories by the proxy, descending. Stable via `.sort` on a copy. */ +export function rankByProxy( + memories: readonly M[], + now: number = Date.now(), +): M[] { + return memories.slice().sort((a, b) => importanceProxy(b, now) - importanceProxy(a, now)); +} diff --git a/apps/dashboard/src/lib/components/patterns-helpers.ts b/apps/dashboard/src/lib/components/patterns-helpers.ts new file mode 100644 index 0000000..ac498de --- /dev/null +++ b/apps/dashboard/src/lib/components/patterns-helpers.ts @@ -0,0 +1,178 @@ +/** + * patterns-helpers — Pure logic for the Cross-Project Intelligence UI + * (patterns/+page.svelte + PatternTransferHeatmap.svelte). + * + * Extracted so the behaviour can be unit-tested in the vitest `node` + * environment without jsdom or Svelte component harnessing. Every helper + * in this module is a pure function of its inputs. + * + * Contracts + * --------- + * - `cellIntensity`: returns opacity in [0,1] from count / max. count=0 → 0, + * count>=max → 1. `max<=0` collapses to 0 (avoids div-by-zero — the + * component uses `max || 1` for the same reason). + * - `filterByCategory`: 'All' passes every pattern through. An unknown + * category string (not one of the 6 + 'All') returns an empty array — + * there is no hidden alias fallback. + * - `buildTransferMatrix`: directional. `matrix[origin][dest]` counts how + * many patterns originated in `origin` and were transferred to `dest`. + * `origin === dest` captures self-transfer (a project reusing its own + * pattern — rare but real per the component's doc comment). + */ + +export const PATTERN_CATEGORIES = [ + 'ErrorHandling', + 'AsyncConcurrency', + 'Testing', + 'Architecture', + 'Performance', + 'Security', +] as const; + +export type PatternCategory = (typeof PATTERN_CATEGORIES)[number]; +export type CategoryFilter = 'All' | PatternCategory; + +export interface TransferPatternLike { + name: string; + category: PatternCategory; + origin_project: string; + transferred_to: string[]; + transfer_count: number; +} + +/** + * Normalise a raw transfer count to a 0..1 opacity/intensity value against a + * known max. Used by the heatmap cell colour ramp. + * + * count <= 0 → 0 (dead cell) + * count >= max > 0 → 1 (hottest cell) + * otherwise → count / max + * + * Non-finite / negative inputs collapse to 0. When `max <= 0` the result is + * always 0 — the component's own guard (`maxCount || 1`) means this branch + * is unreachable in practice, but defensive anyway. + */ +export function cellIntensity(count: number, max: number): number { + if (!Number.isFinite(count) || count <= 0) return 0; + if (!Number.isFinite(max) || max <= 0) return 0; + if (count >= max) return 1; + return count / max; +} + +/** + * Filter a pattern list by the active category tab. + * 'All' → full pass-through (same reference-equal array is + * NOT guaranteed; callers must not rely on identity) + * one of the 6 enums → strict equality on `category` + * unknown string → empty array (no silent alias; caller bug) + */ +export function filterByCategory

( + patterns: readonly P[], + category: CategoryFilter | string, +): P[] { + if (category === 'All') return patterns.slice(); + if (!(PATTERN_CATEGORIES as readonly string[]).includes(category)) { + return []; + } + return patterns.filter((p) => p.category === category); +} + +/** Cell in the directional N×N transfer matrix. */ +export interface TransferCell { + count: number; + topNames: string[]; +} + +/** Dense row-major directional matrix: matrix[origin][destination]. */ +export type TransferMatrix = Record>; + +/** + * Build the directional transfer matrix from patterns + the known projects + * axis. Mirrors `PatternTransferHeatmap.svelte`'s `$derived` logic. + * + * - Every (from, to) pair in `projects × projects` gets a zero cell. + * - Each pattern P contributes `+1` to `matrix[P.origin][dest]` for every + * `dest` in `P.transferred_to` that also appears in `projects`. + * - Patterns whose origin isn't in `projects` are silently skipped — that + * matches the component's `if (!m[from]) continue` guard. + * - `topNames` holds up to 3 pattern names per cell in insertion order. + */ +export function buildTransferMatrix( + projects: readonly string[], + patterns: readonly TransferPatternLike[], + topNameCap = 3, +): TransferMatrix { + const m: TransferMatrix = {}; + for (const from of projects) { + m[from] = {}; + for (const to of projects) { + m[from][to] = { count: 0, topNames: [] }; + } + } + for (const p of patterns) { + const from = p.origin_project; + if (!m[from]) continue; + for (const to of p.transferred_to) { + if (!m[from][to]) continue; + m[from][to].count += 1; + m[from][to].topNames.push(p.name); + } + } + const cap = Math.max(0, topNameCap); + for (const from of projects) { + for (const to of projects) { + m[from][to].topNames = m[from][to].topNames.slice(0, cap); + } + } + return m; +} + +/** + * Maximum single-cell transfer count across the matrix. Floors at 0 for an + * empty matrix, which callers should treat as "scale by 1" to avoid a div- + * by-zero in the colour ramp. + */ +export function matrixMaxCount( + projects: readonly string[], + matrix: TransferMatrix, +): number { + let max = 0; + for (const from of projects) { + const row = matrix[from]; + if (!row) continue; + for (const to of projects) { + const cell = row[to]; + if (cell && cell.count > max) max = cell.count; + } + } + return max; +} + +/** + * Flatten a matrix into sorted-desc rows for the mobile fallback. Only + * non-zero pairs are emitted, matching the component. + */ +export function flattenNonZero( + projects: readonly string[], + matrix: TransferMatrix, +): Array<{ from: string; to: string; count: number; topNames: string[] }> { + const rows: Array<{ from: string; to: string; count: number; topNames: string[] }> = []; + for (const from of projects) { + for (const to of projects) { + const cell = matrix[from]?.[to]; + if (cell && cell.count > 0) { + rows.push({ from, to, count: cell.count, topNames: cell.topNames }); + } + } + } + return rows.sort((a, b) => b.count - a.count); +} + +/** + * Truncate long project names for axis labels. Match the component's + * `shortProject` behaviour: keep ≤12 chars, otherwise 11-char prefix + ellipsis. + */ +export function shortProjectName(name: string): string { + if (!name) return ''; + return name.length > 12 ? name.slice(0, 11) + '…' : name; +} diff --git a/apps/dashboard/src/lib/components/reasoning-helpers.ts b/apps/dashboard/src/lib/components/reasoning-helpers.ts new file mode 100644 index 0000000..83b90d1 --- /dev/null +++ b/apps/dashboard/src/lib/components/reasoning-helpers.ts @@ -0,0 +1,229 @@ +/** + * reasoning-helpers — Pure logic for the Reasoning Theater UI. + * + * Extracted so we can test it without jsdom / Svelte component harnessing. + * The Vitest setup for this package runs in a Node environment; every helper + * in this module is a pure function of its inputs, so it can be exercised + * directly in `__tests__/*.test.ts` alongside the graph helpers. + */ +import { NODE_TYPE_COLORS } from '$types'; + +// ──────────────────────────────────────────────────────────────── +// Shared palette — keep in sync with Tailwind @theme values. +// ──────────────────────────────────────────────────────────────── + +export const CONFIDENCE_EMERALD = '#10b981'; +export const CONFIDENCE_AMBER = '#f59e0b'; +export const CONFIDENCE_RED = '#ef4444'; + +/** Fallback colour when a node-type has no mapping. */ +export const DEFAULT_NODE_TYPE_COLOR = '#8B95A5'; + +// ──────────────────────────────────────────────────────────────── +// Roles +// ──────────────────────────────────────────────────────────────── + +export type EvidenceRole = 'primary' | 'supporting' | 'contradicting' | 'superseded'; + +export interface RoleMeta { + label: string; + /** Tailwind / CSS colour token — see app.css. */ + accent: 'synapse' | 'recall' | 'decay' | 'muted'; + icon: string; +} + +export const ROLE_META: Record = { + primary: { label: 'Primary', accent: 'synapse', icon: '◈' }, + supporting: { label: 'Supporting', accent: 'recall', icon: '◇' }, + contradicting: { label: 'Contradicting', accent: 'decay', icon: '⚠' }, + superseded: { label: 'Superseded', accent: 'muted', icon: '⊘' }, +}; + +/** Look up role metadata with a defensive fallback. */ +export function roleMetaFor(role: EvidenceRole | string): RoleMeta { + return (ROLE_META as Record)[role] ?? ROLE_META.supporting; +} + +// ──────────────────────────────────────────────────────────────── +// Intent classification (deep_reference `intent` field) +// ──────────────────────────────────────────────────────────────── + +export type IntentKey = + | 'FactCheck' + | 'Timeline' + | 'RootCause' + | 'Comparison' + | 'Synthesis'; + +export interface IntentHint { + label: string; + icon: string; + description: string; +} + +export const INTENT_HINTS: Record = { + FactCheck: { + label: 'FactCheck', + icon: '◆', + description: 'Direct verification of a single claim.', + }, + Timeline: { + label: 'Timeline', + icon: '↗', + description: 'Ordered evolution of a fact over time.', + }, + RootCause: { + label: 'RootCause', + icon: '⚡', + description: 'Why did this happen — causal chain.', + }, + Comparison: { + label: 'Comparison', + icon: '⬡', + description: 'Contrasting two or more options side-by-side.', + }, + Synthesis: { + label: 'Synthesis', + icon: '❖', + description: 'Cross-memory composition into a new insight.', + }, +}; + +/** + * Map an arbitrary intent string to a hint. Unknown intents degrade to + * Synthesis, which is the most generic classification. + */ +export function intentHintFor(intent: string | undefined | null): IntentHint { + if (!intent) return INTENT_HINTS.Synthesis; + const key = intent as IntentKey; + return INTENT_HINTS[key] ?? INTENT_HINTS.Synthesis; +} + +// ──────────────────────────────────────────────────────────────── +// Confidence bands +// ──────────────────────────────────────────────────────────────── + +/** + * Confidence colour band. + * + * > 75 → emerald (HIGH) + * 40-75 → amber (MIXED) + * < 40 → red (LOW) + * + * Boundaries: 75 is amber (strictly greater than 75 is emerald), 40 is amber + * (>=40 is amber). Any non-finite input (NaN) is treated as lowest confidence + * and returns red. + */ +export function confidenceColor(c: number): string { + if (!Number.isFinite(c)) return CONFIDENCE_RED; + if (c > 75) return CONFIDENCE_EMERALD; + if (c >= 40) return CONFIDENCE_AMBER; + return CONFIDENCE_RED; +} + +/** Human-readable label for a confidence score (0-100). */ +export function confidenceLabel(c: number): string { + if (!Number.isFinite(c)) return 'LOW CONFIDENCE'; + if (c > 75) return 'HIGH CONFIDENCE'; + if (c >= 40) return 'MIXED SIGNAL'; + return 'LOW CONFIDENCE'; +} + +/** + * Convert a 0-1 trust score to the same confidence band. + * + * Thresholds: >0.75 emerald, 0.40-0.75 amber, <0.40 red. + * Matches `confidenceColor` semantics so the trust bar on an evidence card + * and the confidence meter on the page agree at the boundaries. + */ +export function trustColor(t: number): string { + if (!Number.isFinite(t)) return CONFIDENCE_RED; + return confidenceColor(t * 100); +} + +/** Clamp a trust score into the display range [0, 1]. */ +export function clampTrust(t: number): number { + if (!Number.isFinite(t)) return 0; + if (t < 0) return 0; + if (t > 1) return 1; + return t; +} + +/** Trust as a 0-100 percentage suitable for width / label rendering. */ +export function trustPercent(t: number): number { + return clampTrust(t) * 100; +} + +// ──────────────────────────────────────────────────────────────── +// Node-type colouring +// ──────────────────────────────────────────────────────────────── + +/** Resolve a node-type colour with a soft-steel fallback. */ +export function nodeTypeColor(nodeType?: string | null): string { + if (!nodeType) return DEFAULT_NODE_TYPE_COLOR; + return NODE_TYPE_COLORS[nodeType] ?? DEFAULT_NODE_TYPE_COLOR; +} + +// ──────────────────────────────────────────────────────────────── +// Date formatting +// ──────────────────────────────────────────────────────────────── + +/** + * Format an ISO date string for EvidenceCard display. + * + * Handles three failure modes that `new Date(str)` alone does not: + * 1. Empty / null / undefined → returns '—' + * 2. Unparseable string (NaN) → returns the original string unchanged + * 3. Non-ISO but parseable → best-effort locale format + * + * The previous try/catch-only approach silently rendered the literal text + * "Invalid Date" because `Date` never throws on bad input — it produces a + * valid object whose getTime() is NaN. + */ +export function formatDate( + iso: string | null | undefined, + locale?: string, +): string { + if (iso == null) return '—'; + if (typeof iso !== 'string' || iso.trim() === '') return '—'; + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return iso; + try { + return d.toLocaleDateString(locale, { + month: 'short', + day: 'numeric', + year: 'numeric', + }); + } catch { + return iso; + } +} + +/** Compact month/day formatter for the evolution timeline. */ +export function formatShortDate( + iso: string | null | undefined, + locale?: string, +): string { + if (iso == null) return '—'; + if (typeof iso !== 'string' || iso.trim() === '') return '—'; + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return iso; + try { + return d.toLocaleDateString(locale, { month: 'short', day: 'numeric' }); + } catch { + return iso; + } +} + +// ──────────────────────────────────────────────────────────────── +// Short-id for #abcdef01 style display +// ──────────────────────────────────────────────────────────────── + +/** + * Return the first 8 characters of an id, or the full string if shorter. + * Never throws on null/undefined — returns '' so the caller can render '#'. + */ +export function shortenId(id: string | null | undefined, length = 8): string { + if (!id) return ''; + return id.length > length ? id.slice(0, length) : id; +} diff --git a/apps/dashboard/src/lib/components/schedule-helpers.ts b/apps/dashboard/src/lib/components/schedule-helpers.ts new file mode 100644 index 0000000..93ca985 --- /dev/null +++ b/apps/dashboard/src/lib/components/schedule-helpers.ts @@ -0,0 +1,161 @@ +/** + * Pure helpers for the FSRS review schedule page + calendar. + * + * Extracted from `FSRSCalendar.svelte` and `routes/(app)/schedule/+page.svelte` + * so that bucket / grid / urgency / retention math can be tested in isolation + * (vitest `environment: node`, no jsdom required). + */ +import type { Memory } from '$types'; + +export const MS_DAY = 24 * 60 * 60 * 1000; + +/** + * Zero-out the time component of a date, returning a NEW Date at local + * midnight. Used for day-granular bucketing so comparisons are stable across + * any hour-of-day the user loads the page. + */ +export function startOfDay(d: Date | string): Date { + const x = typeof d === 'string' ? new Date(d) : new Date(d); + x.setHours(0, 0, 0, 0); + return x; +} + +/** + * Signed integer count of whole local days between two timestamps, normalized + * to midnight. Positive means `a` is in the future relative to `b`, negative + * means `a` is in the past. Zero means same calendar day. + */ +export function daysBetween(a: Date, b: Date): number { + return Math.floor((startOfDay(a).getTime() - startOfDay(b).getTime()) / MS_DAY); +} + +/** YYYY-MM-DD in LOCAL time (not UTC) so calendar cells align with user's day. */ +export function isoDate(d: Date): string { + const y = d.getFullYear(); + const m = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + return `${y}-${m}-${day}`; +} + +/** + * Urgency bucket for a review date relative to "now". Used by the right-hand + * list and the calendar cell color. Day-granular (not hour-granular) so a + * memory due at 23:59 today does not suddenly become "in 1d" at 00:01 + * tomorrow UX-wise — it becomes "overdue" cleanly at midnight. + * + * - `none` — no valid `nextReviewAt` + * - `overdue` — due date's calendar day is strictly before today + * - `today` — due date's calendar day is today + * - `week` — due in 1..=7 whole days + * - `future` — due in 8+ whole days + */ +export type Urgency = 'none' | 'overdue' | 'today' | 'week' | 'future'; + +export function classifyUrgency(now: Date, nextReviewAt: string | null | undefined): Urgency { + if (!nextReviewAt) return 'none'; + const d = new Date(nextReviewAt); + if (Number.isNaN(d.getTime())) return 'none'; + const delta = daysBetween(d, now); + if (delta < 0) return 'overdue'; + if (delta === 0) return 'today'; + if (delta <= 7) return 'week'; + return 'future'; +} + +/** + * Signed whole-day count from today → due date. Negative means overdue by + * |n| days; zero means today; positive means n days out. Returns `null` + * if the ISO string is invalid or missing. + */ +export function daysUntilReview(now: Date, nextReviewAt: string | null | undefined): number | null { + if (!nextReviewAt) return null; + const d = new Date(nextReviewAt); + if (Number.isNaN(d.getTime())) return null; + return daysBetween(d, now); +} + +/** + * The [start, end) window for the week containing `d`, starting Sunday at + * local midnight. End is the following Sunday at local midnight — exclusive. + */ +export function weekBucketRange(d: Date): { start: Date; end: Date } { + const start = startOfDay(d); + start.setDate(start.getDate() - start.getDay()); // back to Sunday + const end = new Date(start); + end.setDate(end.getDate() + 7); + return { start, end }; +} + +/** + * Mean retention strength across a list of memories. Returns 0 for an empty + * list (never NaN) so the sidebar can safely render "0%". + */ +export function avgRetention(memories: Memory[]): number { + if (memories.length === 0) return 0; + let sum = 0; + for (const m of memories) sum += m.retentionStrength ?? 0; + return sum / memories.length; +} + +/** + * Given a day-index `i` into a 42-cell calendar grid (6 rows × 7 cols), return + * its row / column. The grid is laid out row-major: cell 0 = row 0 col 0, + * cell 7 = row 1 col 0, cell 41 = row 5 col 6. Returns `null` for indices + * outside `[0, 42)`. + */ +export function gridCellPosition(i: number): { row: number; col: number } | null { + if (!Number.isInteger(i) || i < 0 || i >= 42) return null; + return { row: Math.floor(i / 7), col: i % 7 }; +} + +/** + * The inverse: given a calendar anchor date (today), compute the Sunday + * at-or-before `anchor - 14 days` that seeds row 0 of the 6×7 grid. Pure, + * deterministic, local-time. + */ +export function gridStartForAnchor(anchor: Date): Date { + const base = startOfDay(anchor); + base.setDate(base.getDate() - 14); + base.setDate(base.getDate() - base.getDay()); // back to Sunday + return base; +} + +/** + * Bucket counts used by the sidebar stats block. Day-granular, consistent + * with `classifyUrgency`. + */ +export interface ScheduleStats { + overdue: number; + dueToday: number; + dueThisWeek: number; + dueThisMonth: number; + avgDays: number; +} + +export function computeScheduleStats(now: Date, scheduled: Memory[]): ScheduleStats { + let overdue = 0; + let dueToday = 0; + let dueThisWeek = 0; + let dueThisMonth = 0; + let sumDays = 0; + let futureCount = 0; + const today = startOfDay(now); + for (const m of scheduled) { + if (!m.nextReviewAt) continue; + const d = new Date(m.nextReviewAt); + if (Number.isNaN(d.getTime())) continue; + const delta = daysBetween(d, now); + if (delta < 0) overdue++; + if (delta <= 0) dueToday++; + if (delta <= 7) dueThisWeek++; + if (delta <= 30) dueThisMonth++; + if (delta >= 0) { + // Use hour-resolution days-until for the average so "due in 2.3 days" + // is informative even when bucketing is day-granular elsewhere. + sumDays += (d.getTime() - today.getTime()) / MS_DAY; + futureCount++; + } + } + const avgDays = futureCount > 0 ? sumDays / futureCount : 0; + return { overdue, dueToday, dueThisWeek, dueThisMonth, avgDays }; +} diff --git a/apps/dashboard/src/lib/graph/__tests__/effects.test.ts b/apps/dashboard/src/lib/graph/__tests__/effects.test.ts index 9c80986..e495046 100644 --- a/apps/dashboard/src/lib/graph/__tests__/effects.test.ts +++ b/apps/dashboard/src/lib/graph/__tests__/effects.test.ts @@ -497,4 +497,505 @@ describe('EffectManager', () => { expect(effects.pulseEffects.length).toBe(0); }); }); + + describe('createBirthOrb (v2.3 Memory Birth Ritual)', () => { + // Build a camera with a Quaternion for createBirthOrb's view-space + // projection. The three-mock's applyQuaternion is identity, so the + // start position collapses to `camera.position + (0, 0, -distance)`. + function makeCamera() { + return { + position: new Vector3(0, 30, 80), + quaternion: new (class { + x = 0; y = 0; z = 0; w = 1; + })(), + } as any; + } + + it('adds exactly 2 sprites to the scene on spawn', () => { + const cam = makeCamera(); + const baseline = scene.children.length; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + expect(scene.children.length).toBe(baseline + 2); + }); + + it('both sprite and core use additive blending', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0xff8800) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + const core = scene.children[1] as any; + // AdditiveBlending constant from three-mock is 2 + expect(halo.material.blending).toBe(2); + expect(core.material.blending).toBe(2); + // depthTest:false is passed to the SpriteMaterial constructor in + // effects.ts so the orb stays visible through other nodes. The + // three-mock's SpriteMaterial constructor does not persist this + // param, so we can't assert it at the instance level here; the + // production behavior is covered by ui-fixes.test.ts source grep. + expect(halo.material.transparent).toBe(true); + expect(core.material.transparent).toBe(true); + }); + + it('positions the orb at camera-relative cosmic center on spawn', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {}, + { distanceFromCamera: 40 } + ); + const halo = scene.children[0] as any; + const core = scene.children[1] as any; + // mock applyQuaternion is identity, so startPos = camera.pos + (0,0,-40) + expect(halo.position.x).toBeCloseTo(0); + expect(halo.position.y).toBeCloseTo(30); + expect(halo.position.z).toBeCloseTo(40); // 80 + (-40) + expect(core.position.x).toBeCloseTo(halo.position.x); + expect(core.position.y).toBeCloseTo(halo.position.y); + expect(core.position.z).toBeCloseTo(halo.position.z); + }); + + it('gestation phase: position stays at startPos for all 48 frames', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(100, 100, 100) as any, // far-away target + () => {} + ); + const halo = scene.children[0] as any; + const startX = halo.position.x; + const startY = halo.position.y; + const startZ = halo.position.z; + + for (let f = 0; f < 48; f++) { + effects.update(nodeMeshMap, cam); + expect(halo.position.x).toBeCloseTo(startX); + expect(halo.position.y).toBeCloseTo(startY); + expect(halo.position.z).toBeCloseTo(startZ); + } + }); + + it('gestation phase: opacity rises from 0 toward 0.95', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + const core = scene.children[1] as any; + + // Spawn opacity + expect(halo.material.opacity).toBe(0); + expect(core.material.opacity).toBe(0); + + effects.update(nodeMeshMap, cam); // age 1 + const earlyHaloOp = halo.material.opacity; + expect(earlyHaloOp).toBeGreaterThan(0); + expect(earlyHaloOp).toBeLessThan(0.2); + + // Run to end of gestation + for (let f = 0; f < 47; f++) effects.update(nodeMeshMap, cam); + expect(halo.material.opacity).toBeCloseTo(0.95, 1); + expect(core.material.opacity).toBeCloseTo(1.0, 1); + // Monotonic-ish growth: late gestation > early gestation + expect(halo.material.opacity).toBeGreaterThan(earlyHaloOp); + }); + + it('gestation phase: sprite scale grows substantially', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + + effects.update(nodeMeshMap, cam); // age 1 + const earlyScale = halo.scale.x; + + for (let f = 0; f < 47; f++) effects.update(nodeMeshMap, cam); // age 48 + const lateScale = halo.scale.x; + + // Halo grows from ~0.5 toward ~5 during gestation (with pulse variation). + expect(lateScale).toBeGreaterThan(earlyScale); + expect(lateScale).toBeGreaterThan(2); + }); + + it('gestation phase: halo color tints toward event color', () => { + const cam = makeCamera(); + const eventColor = new Color(0xff0000); // pure red + effects.createBirthOrb( + cam, + eventColor as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + + effects.update(nodeMeshMap, cam); // age 1 — factor ≈ 0.72 + const earlyR = halo.material.color.r; + + for (let f = 0; f < 47; f++) effects.update(nodeMeshMap, cam); // age 48 — factor = 1.0 + const lateR = halo.material.color.r; + + // Red channel should approach the event color's red (1.0) from a dimmer value + expect(lateR).toBeGreaterThan(earlyR); + expect(lateR).toBeCloseTo(1.0, 1); + // Green/blue stay at 0 (event color is pure red) + expect(halo.material.color.g).toBeCloseTo(0); + expect(halo.material.color.b).toBeCloseTo(0); + }); + + it('flight phase: Bezier arc passes ABOVE the linear midpoint at t=0.5', () => { + const cam = makeCamera(); + // startPos = (0, 30, 40), target = (0, 0, 0) + // linear midpoint y = 15; control point y = 15 + 30 + dist*0.15 = 52.5 + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + + // Drive past gestation (48) + half of flight (45) = 93 frames → t=0.5 + for (let f = 0; f < 93; f++) effects.update(nodeMeshMap, cam); + + // Linear midpoint y is 15; Bezier midpoint should be notably higher. + expect(halo.position.y).toBeGreaterThan(15); + // And not as high as the control point itself (52.5) — Bezier + // passes through midpoint-ish at t=0.5, biased upward by the arc. + expect(halo.position.y).toBeLessThan(52.5); + }); + + it('flight phase: orb moves from startPos toward target', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + const halo = scene.children[0] as any; + + // End of gestation + for (let f = 0; f < 48; f++) effects.update(nodeMeshMap, cam); + const gestZ = halo.position.z; + + // One tick into flight + effects.update(nodeMeshMap, cam); + const earlyFlightZ = halo.position.z; + + // Near end of flight + for (let f = 0; f < 88; f++) effects.update(nodeMeshMap, cam); + const lateFlightZ = halo.position.z; + + // Z moves from 40 toward 0 + expect(earlyFlightZ).toBeLessThan(gestZ); + expect(lateFlightZ).toBeLessThan(earlyFlightZ); + expect(lateFlightZ).toBeLessThan(5); // close to target z=0 + }); + + it('dynamic target tracking: changing getTargetPos mid-flight redirects the orb', () => { + const cam = makeCamera(); + let target = new Vector3(0, 0, 0); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => target as any, + () => {} + ); + const halo = scene.children[0] as any; + + // Drive to mid-flight (gestation 48 + 30 flight frames = 78) + for (let f = 0; f < 78; f++) effects.update(nodeMeshMap, cam); + const xBeforeRedirect = halo.position.x; + + // Redirect target far to the +X side + target = new Vector3(200, 0, 0); + + // A few more flight frames — orb should track the new target + for (let f = 0; f < 10; f++) effects.update(nodeMeshMap, cam); + const xAfterRedirect = halo.position.x; + + // With the original target at (0,0,0), x stays near 0 throughout. + // After redirect, x should swing toward the new target's +200. + expect(xAfterRedirect).toBeGreaterThan(xBeforeRedirect + 5); + }); + + it('onArrive fires exactly once at frame 139 (totalFrames + 1)', () => { + const cam = makeCamera(); + let arriveCount = 0; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => { + arriveCount++; + } + ); + + // Drive through gestation (48) + flight (90) = 138 frames. Should NOT have fired. + for (let f = 0; f < 138; f++) effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(0); + + // Frame 139 — fires onArrive + effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(1); + + // Drive many more frames — must stay at 1 + for (let f = 0; f < 50; f++) effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(1); + }); + + it('post-arrival fade: orb disposes from scene after ~8 fade frames', () => { + const cam = makeCamera(); + const baseline = scene.children.length; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + expect(scene.children.length).toBe(baseline + 2); + + // Gestation + flight + arrive + fade = 138 + 1 + 8 = 147 frames + for (let f = 0; f < 150; f++) effects.update(nodeMeshMap, cam); + + // Both orb sprites should be gone + expect(scene.children.length).toBe(baseline); + }); + + it('onArrive callback wrapped in try/catch so a throw does not crash the loop', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => { + throw new Error('caller blew up'); + } + ); + + // Should not throw — the production code swallows arrival-callback errors. + expect(() => { + for (let f = 0; f < 160; f++) effects.update(nodeMeshMap, cam); + }).not.toThrow(); + }); + + it('Sanhedrin Shatter: onArrive NEVER fires when target vanishes mid-flight', () => { + const cam = makeCamera(); + let arriveCount = 0; + let target: Vector3 | undefined = new Vector3(0, 0, 0); + + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => target as any, + () => { + arriveCount++; + } + ); + + // Finish gestation (48 frames) with target present + for (let f = 0; f < 48; f++) effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(0); + + // Stop hook yanks the target mid-flight + target = undefined; + + // Run enough frames to cover the entire orb lifecycle + for (let f = 0; f < 200; f++) effects.update(nodeMeshMap, cam); + + // onArrive must NEVER fire on aborted orbs + expect(arriveCount).toBe(0); + }); + + it('Sanhedrin Shatter: implosion is spawned when target vanishes mid-flight', () => { + const cam = makeCamera(); + let target: Vector3 | undefined = new Vector3(0, 0, 0); + + const baseline = scene.children.length; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => target as any, + () => {} + ); + // baseline + 2 sprites + expect(scene.children.length).toBe(baseline + 2); + + // Finish gestation + for (let f = 0; f < 48; f++) effects.update(nodeMeshMap, cam); + + // Yank target → abort triggers on next tick + target = undefined; + const beforeAbort = scene.children.length; + effects.update(nodeMeshMap, cam); + // Scene should have grown by at least 1 (the implosion particles) + expect(scene.children.length).toBeGreaterThan(beforeAbort); + }); + + it('Sanhedrin Shatter: halo turns blood-red on abort', () => { + const cam = makeCamera(); + let target: Vector3 | undefined = new Vector3(0, 0, 0); + + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, // cyan — NOT red + () => target as any, + () => {} + ); + const halo = scene.children[0] as any; + + // Finish gestation + for (let f = 0; f < 48; f++) effects.update(nodeMeshMap, cam); + + // Sanity: halo is NOT red yet (event color cyan has r≈0) + expect(halo.material.color.r).toBeLessThan(0.5); + + // Yank target; abort triggers next tick + target = undefined; + effects.update(nodeMeshMap, cam); + + // Halo should now be blood red (1.0, 0.15, 0.2) + expect(halo.material.color.r).toBeGreaterThan(0.9); + expect(halo.material.color.g).toBeLessThan(0.3); + expect(halo.material.color.b).toBeLessThan(0.3); + }); + + it('Sanhedrin Shatter: orb eventually disposes from scene', () => { + const cam = makeCamera(); + let target: Vector3 | undefined = new Vector3(0, 0, 0); + + const baseline = scene.children.length; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => target as any, + () => {} + ); + + // Finish gestation + for (let f = 0; f < 48; f++) effects.update(nodeMeshMap, cam); + // Yank target + target = undefined; + + // Drive a long time — orb + implosion should both dispose + // (orb fade ~8 frames, implosion lifetime ~80 frames) + for (let f = 0; f < 200; f++) effects.update(nodeMeshMap, cam); + + expect(scene.children.length).toBe(baseline); + }); + + it('dispose() removes active birth orbs from the scene', () => { + const cam = makeCamera(); + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => {} + ); + effects.createBirthOrb( + cam, + new Color(0xff00ff) as any, + () => new Vector3(10, 10, 10) as any, + () => {} + ); + // 4 sprites in scene (2 per orb) + expect(scene.children.length).toBeGreaterThanOrEqual(4); + + effects.dispose(); + + // All orb sprites should be gone + expect(scene.children.length).toBe(0); + }); + + it('multiple orbs in flight: all 3 onArrive callbacks fire exactly once each', () => { + const cam = makeCamera(); + let c1 = 0, c2 = 0, c3 = 0; + + effects.createBirthOrb( + cam, + new Color(0xff0000) as any, + () => new Vector3(10, 0, 0) as any, + () => { c1++; } + ); + effects.createBirthOrb( + cam, + new Color(0x00ff00) as any, + () => new Vector3(-10, 0, 0) as any, + () => { c2++; } + ); + effects.createBirthOrb( + cam, + new Color(0x0000ff) as any, + () => new Vector3(0, 0, -10) as any, + () => { c3++; } + ); + + // Drive past arrival (139) with margin + for (let f = 0; f < 160; f++) effects.update(nodeMeshMap, cam); + + expect(c1).toBe(1); + expect(c2).toBe(1); + expect(c3).toBe(1); + }); + + it('custom gestation/flight frame counts are honored', () => { + const cam = makeCamera(); + let arriveCount = 0; + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(0, 0, 0) as any, + () => { arriveCount++; }, + { gestationFrames: 10, flightFrames: 20 } + ); + + // Before frame 31 — no arrival + for (let f = 0; f < 30; f++) effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(0); + + // Frame 31 — fires + effects.update(nodeMeshMap, cam); + expect(arriveCount).toBe(1); + }); + + it('zero-alloc invariant (advisory): flight phase runs without throwing across many orbs', () => { + // Advisory test — vitest has no allocator introspection, but the + // inline algebraic Bezier eval in effects.ts is intentionally zero- + // allocation per frame (no `new Vector3`, no `new QuadraticBezierCurve3`). + // Here we just smoke-test that running many orbs across the full + // flight phase does not throw and completes cleanly. + const cam = makeCamera(); + for (let k = 0; k < 6; k++) { + effects.createBirthOrb( + cam, + new Color(0x00ffd1) as any, + () => new Vector3(k * 5, 0, 0) as any, + () => {} + ); + } + expect(() => { + for (let f = 0; f < 150; f++) effects.update(nodeMeshMap, cam); + }).not.toThrow(); + // All orbs should have cleaned up + expect(scene.children.length).toBe(0); + }); + }); }); diff --git a/apps/dashboard/src/lib/graph/__tests__/events.test.ts b/apps/dashboard/src/lib/graph/__tests__/events.test.ts index 5ffe198..c4061a1 100644 --- a/apps/dashboard/src/lib/graph/__tests__/events.test.ts +++ b/apps/dashboard/src/lib/graph/__tests__/events.test.ts @@ -10,7 +10,7 @@ import { NodeManager } from '../nodes'; import { EdgeManager } from '../edges'; import { EffectManager } from '../effects'; import { ForceSimulation } from '../force-sim'; -import { Vector3, Scene } from './three-mock'; +import { Vector3, Scene, RingGeometry, Mesh, Points, Sprite } from './three-mock'; import { makeNode, makeEdge, makeEvent, resetNodeCounter } from './helpers'; import type { GraphNode, VestigeEvent } from '$types'; @@ -155,7 +155,7 @@ describe('Event-to-Mutation Pipeline', () => { expect(distToN1).toBeLessThan(20); }); - it('triggers rainbow burst effect', () => { + it('spawns a v2.3 birth orb in the scene', () => { const childrenBefore = scene.children.length; mapEventToEffects( @@ -168,16 +168,19 @@ describe('Event-to-Mutation Pipeline', () => { allNodes ); - // Scene should have new particles (rainbow burst + shockwave + possibly more) - expect(scene.children.length).toBeGreaterThan(childrenBefore); + // Birth orb adds a halo sprite + bright core sprite to the scene + // immediately. The arrival-cascade effects (rainbow burst, shockwaves, + // ripple wave) are deferred to the orb's onArrive callback — covered + // by the "fires arrival cascade after ritual" test below. + expect(scene.children.length).toBeGreaterThanOrEqual(childrenBefore + 2); }); - it('triggers double shockwave (second delayed)', () => { + it('fires the arrival cascade after the birth ritual completes', () => { vi.useFakeTimers(); mapEventToEffects( makeEvent('MemoryCreated', { - id: 'double-shock', + id: 'cascade-check', content: 'test', node_type: 'fact', }), @@ -185,13 +188,23 @@ describe('Event-to-Mutation Pipeline', () => { allNodes ); - const initialChildren = scene.children.length; + const afterSpawn = scene.children.length; - // Advance past the setTimeout - vi.advanceTimersByTime(200); + // Drive the effects update loop past the full ritual duration + // (gestation 48 + flight 90 = 138 frames). Each tick is one frame; + // we run 150 to give onArrive room to fire. + for (let i = 0; i < 150; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } - // Second shockwave should have been added - expect(scene.children.length).toBeGreaterThan(initialChildren); + // Advance the setTimeout that schedules the delayed second shockwave. + vi.advanceTimersByTime(250); + + // The arrival cascade should have added a rainbow burst, shockwave, + // ripple wave, and delayed second shockwave to the scene. Even after + // the orb fades out and is removed, the burst particles persist long + // enough that children.length should exceed the post-spawn count. + expect(scene.children.length).toBeGreaterThan(afterSpawn); vi.useRealTimers(); }); @@ -861,4 +874,270 @@ describe('Event-to-Mutation Pipeline', () => { expect(mutations.some((m) => m.type === 'edgeAdded')).toBe(true); }); }); + + describe('v2.3 Birth Ritual wiring', () => { + /** Count shockwave rings currently in the scene by their RingGeometry. */ + function countRings(s: InstanceType): number { + let n = 0; + for (const child of s.children) { + if (child instanceof Mesh && child.geometry instanceof RingGeometry) n++; + } + return n; + } + + /** Count Points children — rainbow bursts, spawn bursts, implosions. */ + function countPoints(s: InstanceType): number { + let n = 0; + for (const child of s.children) if (child instanceof Points) n++; + return n; + } + + /** Count Sprite children — birth orb adds a halo + core sprite. */ + function countSprites(s: InstanceType): number { + let n = 0; + for (const child of s.children) if (child instanceof Sprite) n++; + return n; + } + + it('node mesh is hidden immediately after MemoryCreated dispatch', () => { + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'ritual-create', + content: 'fresh memory', + node_type: 'fact', + }), + ctx, + allNodes + ); + + // Ritual path: mesh/glow/label are all .visible = false until + // igniteNode fires on orb arrival. + const mesh = nodeManager.meshMap.get('ritual-create')!; + const glow = nodeManager.glowMap.get('ritual-create')!; + const label = nodeManager.labelSprites.get('ritual-create')!; + expect(mesh.visible).toBe(false); + expect(glow.visible).toBe(false); + expect(label.visible).toBe(false); + + // Pending sentinel is stamped on userData. + expect(mesh.userData.birthRitualPending).toBeDefined(); + }); + + it('does NOT fire burst/ripple/shockwave at spawn (only the birth orb)', () => { + const ringsBefore = countRings(scene); + const pointsBefore = countPoints(scene); + const spritesBefore = countSprites(scene); + + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'spawn-quiet', + content: 'test', + node_type: 'fact', + }), + ctx, + allNodes + ); + + // Birth orb adds exactly 2 sprites (halo + core). NodeManager's + // addNode also adds a glow Sprite + label Sprite to the NodeManager + // GROUP, not to the scene — so spritesBefore -> after delta is +2. + expect(countSprites(scene) - spritesBefore).toBe(2); + + // No arrival-cascade effects yet: no shockwave rings, no rainbow + // burst/spawn burst/ripple particles. + expect(countRings(scene)).toBe(ringsBefore); + expect(countPoints(scene)).toBe(pointsBefore); + }); + + it('drives through the full ritual: onArrive fires, node becomes visible, scale grows', () => { + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'full-ritual', + content: 'visible after arrival', + node_type: 'fact', + }), + ctx, + allNodes + ); + + const mesh = nodeManager.meshMap.get('full-ritual')!; + expect(mesh.visible).toBe(false); + + // Drive the effects update loop past the full ritual duration + // (gestation 48 + flight 90 = 138 frames). After frame 138 the + // orb fires onArrive which ignites the node and queues materialization. + for (let i = 0; i < 140; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } + + // Node is now visible and sentinel is cleared. + expect(mesh.visible).toBe(true); + expect(mesh.userData.birthRitualPending).toBeUndefined(); + + // Run node animation a few frames to let materialization scale grow. + // Note: onArrive bumped scale by 1.8x (from 0.001 -> 0.0018), then + // materialization easeOutElastic pulls it toward targetScale. + for (let f = 0; f < 10; f++) { + nodeManager.animate(f * 0.016, allNodes, camera); + } + expect(mesh.scale.x).toBeGreaterThan(0.001); + }); + + it("Newton's Cradle — target mesh scale is multiplied by 1.8x on arrival", () => { + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'newton-cradle', + content: 'recoil test', + node_type: 'fact', + }), + ctx, + allNodes + ); + + const mesh = nodeManager.meshMap.get('newton-cradle')!; + // Pre-arrival: scale is the addNode initial 0.001. + expect(mesh.scale.x).toBeCloseTo(0.001, 6); + + // Drive just to the moment onArrive fires. Gestation (48) + + // flight (90) = 138 frames. Arrival bumps scale by 1.8x BEFORE + // materialization has run any ticks, so the scale should be + // exactly 0.001 * 1.8 = 0.0018 at that instant. We check right + // after onArrive (frame 139) — but effects.update progresses the + // orb's age counter by one each call, and on the tick where + // orb.age > totalFrames, onArrive fires. We then must NOT tick + // nodeManager.animate (or materialization would diverge the scale). + for (let i = 0; i < 140; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } + + // onArrive fired. Scale was 0.001, got multiplied by 1.8 -> 0.0018. + // Materialization is queued but hasn't run yet (no animate() calls). + expect(mesh.scale.x).toBeCloseTo(0.0018, 6); + }); + + it('dual shockwave — arrival cascade adds TWO RingGeometry meshes, not one', () => { + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'dual-shock', + content: 'layered crash', + node_type: 'fact', + }), + ctx, + allNodes + ); + + const ringsBefore = countRings(scene); + + // Drive past full ritual so onArrive fires. + for (let i = 0; i < 140; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } + + // Both shockwaves fire synchronously in the onArrive callback + // (the previous setTimeout-delayed second shockwave was dropped + // because it could outlive the scene on route change). + const ringsAfter = countRings(scene); + expect(ringsAfter - ringsBefore).toBe(2); + }); + + it('re-reads position on arrival — fires cascade at force-sim-moved position', () => { + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'moving-target', + content: 'follow the node', + node_type: 'fact', + }), + ctx, + allNodes + ); + + // Grab the spawn position, then mutate it to simulate the force + // simulation pushing the node during the ritual. + const movedPos = new Vector3(123, 456, -789); + nodeManager.positions.set('moving-target', movedPos); + + // Drive past full ritual. + for (let i = 0; i < 140; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } + + // The onArrive callback re-reads nodeManager.positions and fires + // the cascade at the LIVE position. The two shockwave Ring meshes + // should have been created at movedPos. Find them and check. + const rings = scene.children.filter( + (c) => c instanceof Mesh && c.geometry instanceof RingGeometry + ); + expect(rings.length).toBeGreaterThanOrEqual(2); + // Rings for this node: their .position copies from arrivePos at + // spawn time inside createShockwave. + const atMovedPos = rings.filter( + (r) => r.position.x === 123 && r.position.y === 456 && r.position.z === -789 + ); + expect(atMovedPos.length).toBe(2); + }); + + it('Sanhedrin abort path — removeNode before arrival prevents the regular cascade', () => { + // Spy on the three arrival-cascade emitters so we can assert + // they were NEVER called when the target is vetoed mid-ritual. + const burstSpy = vi.spyOn(effects, 'createRainbowBurst'); + const shockwaveSpy = vi.spyOn(effects, 'createShockwave'); + const rippleSpy = vi.spyOn(effects, 'createRippleWave'); + + mapEventToEffects( + makeEvent('MemoryCreated', { + id: 'vetoed', + content: 'about to be shattered', + node_type: 'fact', + }), + ctx, + allNodes + ); + + // The orb's getTargetPos() closure reads + // nodeManager.positions.get('vetoed'). Dropping the position + // directly simulates the "target gone" state that the Sanhedrin + // veto produces after dissolution completes — without needing to + // drive the full 60-frame dissolution animation. + nodeManager.positions.delete('vetoed'); + expect(nodeManager.positions.has('vetoed')).toBe(false); + + // Snapshot the orb reference before the update loop disposes it. + // The abort branch flips `aborted` and tints the halo red; we + // assert on those fields after the ritual unwinds. + const orbs = (effects as any).birthOrbs as Array<{ + sprite: { material: { color: any } }; + core: { material: { color: any } }; + aborted: boolean; + }>; + expect(orbs.length).toBe(1); + const orbRef = orbs[0]; + + // Drive effects past the full ritual. During flight the orb will + // see getTargetPos() === undefined, enter the Sanhedrin branch, + // call createImplosion (anti-birth visual) and SKIP onArrive — + // so the regular rainbow-burst + dual-shockwave + ripple cascade + // never fires. + for (let i = 0; i < 200; i++) { + effects.update(nodeManager.meshMap, camera, nodeManager.positions); + } + + // Core assertion: the three regular-cascade emitters were never + // invoked for the vetoed node. + expect(burstSpy).not.toHaveBeenCalled(); + expect(shockwaveSpy).not.toHaveBeenCalled(); + expect(rippleSpy).not.toHaveBeenCalled(); + + // Also confirm the orb actually took the abort branch, not the + // gestation-only no-op path (otherwise this test would pass for + // the wrong reason). The aborted flag is set exactly once inside + // the Sanhedrin branch. + expect(orbRef.aborted).toBe(true); + expect(orbRef.sprite.material.color.r).toBeCloseTo(1.0, 3); + expect(orbRef.sprite.material.color.g).toBeCloseTo(0.15, 3); + + burstSpy.mockRestore(); + shockwaveSpy.mockRestore(); + rippleSpy.mockRestore(); + }); + }); }); diff --git a/apps/dashboard/src/lib/graph/__tests__/nodes.test.ts b/apps/dashboard/src/lib/graph/__tests__/nodes.test.ts index 3d533f8..26b997f 100644 --- a/apps/dashboard/src/lib/graph/__tests__/nodes.test.ts +++ b/apps/dashboard/src/lib/graph/__tests__/nodes.test.ts @@ -453,4 +453,201 @@ describe('NodeManager', () => { // The dispose method clears materializingNodes, dissolvingNodes, growingNodes }); }); + + describe('Birth Ritual integration', () => { + it('addNode with isBirthRitual:true hides mesh, glow, and label immediately', () => { + const node = makeNode({ id: 'ritual-1' }); + manager.addNode(node, new Vector3(5, 5, 5), { isBirthRitual: true }); + + const mesh = manager.meshMap.get('ritual-1')!; + const glow = manager.glowMap.get('ritual-1')!; + const label = manager.labelSprites.get('ritual-1')!; + + expect(mesh.visible).toBe(false); + expect(glow.visible).toBe(false); + expect(label.visible).toBe(false); + }); + + it('addNode with isBirthRitual:true stores a pending sentinel on mesh.userData', () => { + const node = makeNode({ id: 'ritual-sentinel', retention: 0.75 }); + manager.addNode(node, new Vector3(0, 0, 0), { isBirthRitual: true }); + + const mesh = manager.meshMap.get('ritual-sentinel')!; + const pending = mesh.userData.birthRitualPending as any; + expect(pending).toBeDefined(); + expect(pending.totalFrames).toBe(30); + // targetScale = 0.5 + retention * 2 = 0.5 + 0.75 * 2 = 2.0 + expect(pending.targetScale).toBeCloseTo(2.0, 3); + }); + + it('addNode with isBirthRitual:true does NOT enqueue materialization', () => { + const ritualNode = makeNode({ id: 'ritual-pending', retention: 0.8 }); + manager.addNode(ritualNode, new Vector3(10, 10, 10), { isBirthRitual: true }); + + // In the real runtime the ritual-pending node is .visible=false + // AND is not yet in the GraphNode[] list — it only gets added to + // the visible node list once igniteNode flips its visibility and + // materialization kicks in. So we pass an empty `nodes` array to + // animate(), which also exercises that the breathing loop skips + // meshes absent from the nodes array. + const camera = { position: new Vector3(0, 30, 80) } as any; + for (let f = 0; f < 40; f++) { + manager.animate(f * 0.016, [], camera); + } + + const mesh = manager.meshMap.get('ritual-pending')!; + // Materialization queue never pushed — a regular materializing + // node would be at scale ≈ targetScale = 2.1 by frame 40. The + // ritual-pending node stays at its addNode initial 0.001 because + // no animation loop is mutating its scale. + expect(mesh.scale.x).toBeCloseTo(0.001, 3); + + // Stronger invariant — the sentinel is still there, confirming + // the node never got handed off to the materialization queue. + expect(mesh.userData.birthRitualPending).toBeDefined(); + }); + + it('addNode without opts proceeds with normal materialization (old behavior)', () => { + const node = makeNode({ id: 'normal-spawn' }); + manager.addNode(node, new Vector3(1, 2, 3)); + + const mesh = manager.meshMap.get('normal-spawn')!; + const glow = manager.glowMap.get('normal-spawn')!; + const label = manager.labelSprites.get('normal-spawn')!; + + // Default mesh.visible is true in three-mock (Object3D has no explicit field). + // Key invariant: visible is NOT explicitly false like the ritual path. + expect(mesh.visible).not.toBe(false); + expect(glow.visible).not.toBe(false); + expect(label.visible).not.toBe(false); + + // And no pending sentinel + expect(mesh.userData.birthRitualPending).toBeUndefined(); + + // Animation should proceed — scale grows via easeOutElastic + const camera = { position: new Vector3(0, 30, 80) } as any; + for (let f = 0; f < 20; f++) { + manager.animate(f * 0.016, [node], camera); + } + expect(mesh.scale.x).toBeGreaterThan(0.1); + }); + + it('igniteNode flips all three visibility flags and queues materialization', () => { + const node = makeNode({ id: 'to-ignite', retention: 0.6 }); + manager.addNode(node, new Vector3(0, 0, 0), { isBirthRitual: true }); + + // Pre-ignite: hidden + const mesh = manager.meshMap.get('to-ignite')!; + const glow = manager.glowMap.get('to-ignite')!; + const label = manager.labelSprites.get('to-ignite')!; + expect(mesh.visible).toBe(false); + + manager.igniteNode('to-ignite'); + + // Post-ignite: visible + expect(mesh.visible).toBe(true); + expect(glow.visible).toBe(true); + expect(label.visible).toBe(true); + + // Sentinel is gone + expect(mesh.userData.birthRitualPending).toBeUndefined(); + + // Materialization was queued — drive animation and the scale + // should grow past the initial 0.001. + const camera = { position: new Vector3(0, 30, 80) } as any; + for (let f = 0; f < 15; f++) { + manager.animate(f * 0.016, [node], camera); + } + expect(mesh.scale.x).toBeGreaterThan(0.1); + }); + + it('igniteNode called twice is idempotent (second call is a no-op)', () => { + const node = makeNode({ id: 'double-ignite', retention: 0.5 }); + manager.addNode(node, new Vector3(0, 0, 0), { isBirthRitual: true }); + + manager.igniteNode('double-ignite'); + // Capture scale after one round of animation + const camera = { position: new Vector3(0, 30, 80) } as any; + for (let f = 0; f < 10; f++) { + manager.animate(f * 0.016, [node], camera); + } + const scaleAfterFirst = manager.meshMap.get('double-ignite')!.scale.x; + + // Second ignite — should NOT push a duplicate materialization entry. + // If it did, the extra entry (starting at frame 0) would restart + // the scale back near 0.001 or at least visibly reset it. + manager.igniteNode('double-ignite'); + for (let f = 0; f < 5; f++) { + manager.animate((f + 10) * 0.016, [node], camera); + } + const scaleAfterSecond = manager.meshMap.get('double-ignite')!.scale.x; + + // Scale after second ignite should be greater than or roughly equal + // to scale after first, NOT reset toward 0.001. A duplicate entry + // starting at frame 0 would pull the mesh back near zero on the + // very first subsequent animate() tick via mn.mesh.scale.setScalar. + expect(scaleAfterSecond).toBeGreaterThanOrEqual(scaleAfterFirst * 0.5); + }); + + it('igniteNode on a regular (non-ritual) node is a no-op', () => { + const node = makeNode({ id: 'regular', retention: 0.5 }); + manager.addNode(node, new Vector3(0, 0, 0)); + // Regular addNode already queued materialization. Capture state. + const mesh = manager.meshMap.get('regular')!; + const visBefore = mesh.visible; + + // Call igniteNode — there's no pending sentinel, should short-circuit. + expect(() => manager.igniteNode('regular')).not.toThrow(); + + // No pending sentinel means the function returns early after the + // sentinel check, so nothing about the mesh changes. + expect(mesh.visible).toBe(visBefore); + expect(mesh.userData.birthRitualPending).toBeUndefined(); + }); + + it('igniteNode on unknown id is a no-op (no throw)', () => { + expect(() => manager.igniteNode('does-not-exist')).not.toThrow(); + expect(manager.meshMap.has('does-not-exist')).toBe(false); + }); + + it('position is stored in positions map even when the node is invisible', () => { + const node = makeNode({ id: 'invisible-but-positioned' }); + const spawnPos = new Vector3(42, -17, 8); + manager.addNode(node, spawnPos, { isBirthRitual: true }); + + // Force simulation + orb getTargetPos() both rely on positions + // being live immediately — the ritual only hides visuals, not + // physics state. + const stored = manager.positions.get('invisible-but-positioned'); + expect(stored).toBeDefined(); + expect(stored!.x).toBe(42); + expect(stored!.y).toBe(-17); + expect(stored!.z).toBe(8); + + // And the mesh itself is still hidden + expect(manager.meshMap.get('invisible-but-positioned')!.visible).toBe(false); + }); + + it('removeNode during pending ritual cancels without materialization', () => { + // Sanhedrin abort path at the NodeManager level: a ritual-pending + // node gets removed before igniteNode fires. The remove path + // should still work (dissolution queue takes over) and igniteNode + // called later must not resurrect it. + const node = makeNode({ id: 'aborted-ritual' }); + manager.addNode(node, new Vector3(0, 0, 0), { isBirthRitual: true }); + + manager.removeNode('aborted-ritual'); + + // Dissolution progresses past totalFrames = 60 and clears state. + const camera = { position: new Vector3(0, 30, 80) } as any; + for (let f = 0; f < 65; f++) { + manager.animate(f * 0.016, [node], camera); + } + + expect(manager.meshMap.has('aborted-ritual')).toBe(false); + + // And a late igniteNode call on the dead id is a safe no-op. + expect(() => manager.igniteNode('aborted-ritual')).not.toThrow(); + }); + }); }); diff --git a/apps/dashboard/src/lib/graph/__tests__/three-mock.ts b/apps/dashboard/src/lib/graph/__tests__/three-mock.ts index b665ed7..e6afd57 100644 --- a/apps/dashboard/src/lib/graph/__tests__/three-mock.ts +++ b/apps/dashboard/src/lib/graph/__tests__/three-mock.ts @@ -93,6 +93,52 @@ export class Vector3 { this.z = s; return this; } + + addVectors(a: Vector3, b: Vector3) { + this.x = a.x + b.x; + this.y = a.y + b.y; + this.z = a.z + b.z; + return this; + } + + applyQuaternion(_q: Quaternion) { + // Mock: identity transform. Tests don't care about actual + // camera-relative positioning; production uses real THREE math. + return this; + } +} + +export class Quaternion { + x = 0; + y = 0; + z = 0; + w = 1; +} + +export class QuadraticBezierCurve3 { + v0: Vector3; + v1: Vector3; + v2: Vector3; + constructor(v0: Vector3, v1: Vector3, v2: Vector3) { + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + } + getPoint(t: number): Vector3 { + // Standard quadratic Bezier evaluation, faithful enough for tests + // that only care that points land on the curve. + const one = 1 - t; + return new Vector3( + one * one * this.v0.x + 2 * one * t * this.v1.x + t * t * this.v2.x, + one * one * this.v0.y + 2 * one * t * this.v1.y + t * t * this.v2.y, + one * one * this.v0.z + 2 * one * t * this.v1.z + t * t * this.v2.z + ); + } +} + +export class Texture { + needsUpdate = false; + dispose() {} } export class Vector2 { @@ -157,6 +203,20 @@ export class Color { offsetHSL(_h: number, _s: number, _l: number) { return this; } + + multiplyScalar(s: number) { + this.r *= s; + this.g *= s; + this.b *= s; + return this; + } + + setRGB(r: number, g: number, b: number) { + this.r = r; + this.g = g; + this.b = b; + return this; + } } export class BufferAttribute { @@ -329,6 +389,8 @@ export class SpriteMaterial extends BaseMaterial { export class Object3D { position = new Vector3(); scale = new Vector3(1, 1, 1); + quaternion = new Quaternion(); + renderOrder = 0; userData: Record = {}; children: Object3D[] = []; parent: Object3D | null = null; @@ -428,6 +490,9 @@ export function installThreeMock() { Vector3, Vector2, Color, + Quaternion, + QuadraticBezierCurve3, + Texture, BufferAttribute, BufferGeometry, SphereGeometry, diff --git a/apps/dashboard/src/lib/graph/effects.ts b/apps/dashboard/src/lib/graph/effects.ts index 1402476..ccae736 100644 --- a/apps/dashboard/src/lib/graph/effects.ts +++ b/apps/dashboard/src/lib/graph/effects.ts @@ -1,4 +1,5 @@ import * as THREE from 'three'; +import { getGlowTexture } from './nodes'; export interface PulseEffect { nodeId: string; @@ -49,6 +50,33 @@ interface ConnectionFlash { intensity: number; } +// v2.3 Memory Birth Ritual. The orb gestates at a camera-relative "cosmic +// center" point for `gestationFrames`, then flies along a dynamic quadratic +// Bezier curve to the live position of its target node for `flightFrames`, +// then calls `onArrive` and disposes itself. The target position is +// resolved via `getTargetPos` on every frame so the force simulation can +// move the node during the flight and the orb stays glued to it. +interface BirthOrb { + sprite: THREE.Sprite; + core: THREE.Sprite; + startPos: THREE.Vector3; + getTargetPos: () => THREE.Vector3 | undefined; + color: THREE.Color; + age: number; + gestationFrames: number; + flightFrames: number; + arriveFired: boolean; + onArrive: () => void; + /** Last known target position. If the target disappears mid-flight we keep + * using this snapshot so the orb still lands somewhere sensible. */ + lastTargetPos: THREE.Vector3; + /** v2.3: Sanhedrin-Shatter state. Set true when getTargetPos returns + * undefined after gestation — the Stop hook deleted the target node + * mid-ritual, so we short-circuit the arrival cascade and implode + * the orb in place as the "cognitive immune system" visual. */ + aborted: boolean; +} + export class EffectManager { pulseEffects: PulseEffect[] = []; private spawnBursts: SpawnBurst[] = []; @@ -57,6 +85,7 @@ export class EffectManager { private implosions: ImplosionEffect[] = []; private shockwaves: Shockwave[] = []; private connectionFlashes: ConnectionFlash[] = []; + private birthOrbs: BirthOrb[] = []; private scene: THREE.Scene; constructor(scene: THREE.Scene) { @@ -231,6 +260,89 @@ export class EffectManager { this.connectionFlashes.push({ line, intensity: 1.0 }); } + /** + * v2.3 Memory Birth Ritual. Spawn a glowing orb at a point in front of the + * camera ("cosmic center"), gestate for ~800ms, then arc along a quadratic + * Bezier curve to the live position of the target node, which is resolved + * on every frame via `getTargetPos`. On arrival, `onArrive` fires — caller + * is responsible for adding the real node to the graph and triggering + * arrival-time bursts. + * + * The target getter can return undefined if the node has been removed + * mid-flight; the orb then flies to the last known target position so the + * burst still fires somewhere coherent rather than snapping to origin. + */ + createBirthOrb( + camera: THREE.Camera, + color: THREE.Color, + getTargetPos: () => THREE.Vector3 | undefined, + onArrive: () => void, + opts: { gestationFrames?: number; flightFrames?: number; distanceFromCamera?: number } = {} + ) { + const gestationFrames = opts.gestationFrames ?? 48; // ~800ms + const flightFrames = opts.flightFrames ?? 90; // ~1500ms + const distanceFromCamera = opts.distanceFromCamera ?? 40; + + // Place the orb slightly in front of the camera, in view-space, + // projected back into world coordinates. This way the orb always + // appears "right in front of the user's face" regardless of where + // the camera has been orbited to. + const startPos = new THREE.Vector3(0, 0, -distanceFromCamera) + .applyQuaternion(camera.quaternion) + .add(camera.position); + + // Outer glow halo + const haloMat = new THREE.SpriteMaterial({ + map: getGlowTexture(), + color: color.clone(), + transparent: true, + opacity: 0.0, + blending: THREE.AdditiveBlending, + depthWrite: false, + depthTest: false, // always visible, even through other nodes + }); + const sprite = new THREE.Sprite(haloMat); + sprite.position.copy(startPos); + sprite.scale.set(0.5, 0.5, 1); + sprite.renderOrder = 999; + + // Inner bright core — stays hot white during gestation, tints at launch + const coreMat = new THREE.SpriteMaterial({ + map: getGlowTexture(), + color: new THREE.Color(0xffffff), + transparent: true, + opacity: 0.0, + blending: THREE.AdditiveBlending, + depthWrite: false, + depthTest: false, + }); + const core = new THREE.Sprite(coreMat); + core.position.copy(startPos); + core.scale.set(0.2, 0.2, 1); + core.renderOrder = 1000; + + this.scene.add(sprite); + this.scene.add(core); + + // Snapshot the current target so we have a fallback. + const initialTarget = getTargetPos()?.clone() ?? startPos.clone(); + + this.birthOrbs.push({ + sprite, + core, + startPos, + getTargetPos, + color: color.clone(), + age: 0, + gestationFrames, + flightFrames, + arriveFired: false, + onArrive, + lastTargetPos: initialTarget, + aborted: false, + }); + } + update( nodeMeshMap: Map, camera: THREE.Camera, @@ -431,6 +543,122 @@ export class EffectManager { } (flash.line.material as THREE.LineBasicMaterial).opacity = flash.intensity; } + + // v2.3 Birth orbs — gestate at cosmic center, then arc to live node + // position along a quadratic Bezier curve. Target position is + // re-resolved every frame so the force simulation can move the + // destination during flight without the orb losing its mark. + for (let i = this.birthOrbs.length - 1; i >= 0; i--) { + const orb = this.birthOrbs[i]; + orb.age++; + const totalFrames = orb.gestationFrames + orb.flightFrames; + + const haloMat = orb.sprite.material as THREE.SpriteMaterial; + const coreMat = orb.core.material as THREE.SpriteMaterial; + + // Refresh the live target snapshot. If the target getter returns + // undefined DURING flight (not just at spawn), the node was + // aborted mid-ritual — typically a Sanhedrin veto deleting a + // hallucination node while the orb was still in transit. Trigger + // the anti-birth: turn red, implode in place, stop tracking. + const live = orb.getTargetPos(); + if (live) { + orb.lastTargetPos.copy(live); + } else if (orb.age > orb.gestationFrames && !orb.aborted) { + orb.aborted = true; + // Fire an implosion where the orb currently is, then splice + // out on the next tick by jumping age to the end of life. + const pos = orb.sprite.position; + haloMat.color.setRGB(1.0, 0.15, 0.2); // blood red + coreMat.color.setRGB(1.0, 0.6, 0.6); + this.createImplosion(pos, new THREE.Color(0xff2533)); + orb.arriveFired = true; + orb.age = totalFrames + 1; + } + + if (orb.age <= orb.gestationFrames) { + // Gestation phase — pulse brighter + grow from a tiny spark + // into a full orb. Sits still at the cosmic center. + const t = orb.age / orb.gestationFrames; + const ease = 1 - Math.pow(1 - t, 3); // easeOutCubic + const pulse = 0.85 + Math.sin(orb.age * 0.35) * 0.15; + const haloScale = 0.5 + ease * 4.5 * pulse; + const coreScale = 0.2 + ease * 1.8 * pulse; + orb.sprite.scale.set(haloScale, haloScale, 1); + orb.core.scale.set(coreScale, coreScale, 1); + haloMat.opacity = ease * 0.95; + coreMat.opacity = ease; + // Subtle warm-up — core white, halo tints toward the event + // color as gestation completes. + haloMat.color.copy(orb.color).multiplyScalar(0.7 + ease * 0.3); + orb.sprite.position.copy(orb.startPos); + orb.core.position.copy(orb.startPos); + } else if (orb.age <= totalFrames) { + // Flight phase — inline quadratic Bezier eval. Zero-alloc: + // no new Vector3 or QuadraticBezierCurve3 per frame, which + // would flood the GC when several orbs are in flight. + const t = (orb.age - orb.gestationFrames) / orb.flightFrames; + const ease = t < 0.5 + ? 2 * t * t + : 1 - Math.pow(-2 * t + 2, 2) / 2; // easeInOutQuad + + const s = orb.startPos; + const tgt = orb.lastTargetPos; + const dx = tgt.x - s.x; + const dy = tgt.y - s.y; + const dz = tgt.z - s.z; + const dist = Math.sqrt(dx * dx + dy * dy + dz * dz); + const cx = (s.x + tgt.x) * 0.5; + const cy = (s.y + tgt.y) * 0.5 + 30 + dist * 0.15; + const cz = (s.z + tgt.z) * 0.5; + + const oneMinusE = 1 - ease; + const w0 = oneMinusE * oneMinusE; + const w1 = 2 * oneMinusE * ease; + const w2 = ease * ease; + const px = w0 * s.x + w1 * cx + w2 * tgt.x; + const py = w0 * s.y + w1 * cy + w2 * tgt.y; + const pz = w0 * s.z + w1 * cz + w2 * tgt.z; + + orb.sprite.position.set(px, py, pz); + orb.core.position.set(px, py, pz); + + // Trail effect — shrink + brighten as it approaches target + const shrink = 1 - ease * 0.35; + orb.sprite.scale.setScalar(5 * shrink); + orb.core.scale.setScalar(2 * shrink); + haloMat.opacity = 0.95; + coreMat.opacity = 1.0; + // Shift halo fully to the event color during flight + haloMat.color.copy(orb.color); + } else if (!orb.arriveFired) { + // Docking — fire the arrival callback once. Let the caller + // trigger burst/ripple effects at the exact target point. + orb.arriveFired = true; + try { + orb.onArrive(); + } catch (e) { + // Effects must never take down the render loop. + // eslint-disable-next-line no-console + console.warn('[birth-orb] onArrive threw', e); + } + // Fade the orb out over a few more frames instead of popping. + } else { + // Post-arrival fade (8 frames ≈ 130ms) + const fadeAge = orb.age - totalFrames; + const fade = Math.max(0, 1 - fadeAge / 8); + haloMat.opacity = 0.95 * fade; + coreMat.opacity = 1.0 * fade; + orb.sprite.scale.setScalar(5 * (1 + (1 - fade) * 2)); + if (fade <= 0) { + this.scene.remove(orb.sprite); + this.scene.remove(orb.core); + haloMat.dispose(); + coreMat.dispose(); + this.birthOrbs.splice(i, 1); + } + } + } } dispose() { @@ -464,6 +692,12 @@ export class EffectManager { flash.line.geometry.dispose(); (flash.line.material as THREE.Material).dispose(); } + for (const orb of this.birthOrbs) { + this.scene.remove(orb.sprite); + this.scene.remove(orb.core); + (orb.sprite.material as THREE.Material).dispose(); + (orb.core.material as THREE.Material).dispose(); + } this.pulseEffects = []; this.spawnBursts = []; this.rainbowBursts = []; @@ -471,5 +705,6 @@ export class EffectManager { this.implosions = []; this.shockwaves = []; this.connectionFlashes = []; + this.birthOrbs = []; } } diff --git a/apps/dashboard/src/lib/graph/events.ts b/apps/dashboard/src/lib/graph/events.ts index b13ce22..31fd3cc 100644 --- a/apps/dashboard/src/lib/graph/events.ts +++ b/apps/dashboard/src/lib/graph/events.ts @@ -125,25 +125,59 @@ export function mapEventToEffects( // Find spawn position near related nodes const spawnPos = findSpawnPosition(newNode, allNodes, nodePositions); - // Add to all managers - const pos = nodeManager.addNode(newNode, spawnPos); + // Reserve the physics slot but hide the node until the orb docks. + // `isBirthRitual:true` skips the 30-frame materialization push, so + // the mesh/glow/label stay invisible; `igniteNode` below flips + // visibility and kicks off the elastic scale-up AT the exact + // millisecond the orb lands — not 100 frames before. + const pos = nodeManager.addNode(newNode, spawnPos, { isBirthRitual: true }); forceSim.addNode(data.id, pos); // FIFO eviction liveSpawnedNodes.push(data.id); evictOldestLiveNode(ctx, allNodes); - // Spectacular effects: rainbow burst + double shockwave + ripple wave + // v2.3 Memory Birth Ritual — cosmic-center orb, Bezier flight, + // arrival burst cascade. The burst/ripple/shockwave cascade + // fires on arrival at the docking target, not at spawn, so the + // eye tracks the orb in and the visuals peak on contact. const color = new THREE.Color(NODE_TYPE_COLORS[newNode.type] || '#00ffd1'); - effects.createRainbowBurst(spawnPos, color); - effects.createShockwave(spawnPos, color, camera); - // Second shockwave, hue-shifted, delayed via smaller initial scale const hueShifted = color.clone(); hueShifted.offsetHSL(0.15, 0, 0); - setTimeout(() => { - effects.createShockwave(spawnPos, hueShifted, camera); - }, 166); // ~10 frames at 60fps - effects.createRippleWave(spawnPos); + + effects.createBirthOrb( + camera, + color, + // Re-resolve the live target position every frame — the node + // is being pushed around by the force sim during flight. + // Returning undefined here signals "node was aborted" and + // triggers the Sanhedrin-Shatter anti-birth in effects.ts. + () => nodeManager.positions.get(newNode.id), + () => { + // Dock. Ignite the node (flips visibility + starts + // materialization) and fire the arrival cascade at the + // node's CURRENT position — the force sim may have moved + // the target during the ritual, so we re-read positions. + nodeManager.igniteNode(newNode.id); + const arrivePos = nodeManager.positions.get(newNode.id) ?? spawnPos; + + // Newton's Cradle — kinetic transfer into the graph. + // Bump the mesh scale on impact so the easeOutElastic + // materialization + force-sim springs physically recoil + // instead of the orb docking silently. + const mesh = nodeManager.meshMap.get(newNode.id); + if (mesh) mesh.scale.multiplyScalar(1.8); + + effects.createRainbowBurst(arrivePos, color); + effects.createShockwave(arrivePos, color, camera); + // Fire BOTH shockwaves immediately (different scales / + // colors for layered crash feel). The previous 166ms + // setTimeout could outlive the scene on route change + // and throw an unhandled rejection. + effects.createShockwave(arrivePos, hueShifted, camera); + effects.createRippleWave(arrivePos); + } + ); onMutation({ type: 'nodeAdded', node: newNode }); break; diff --git a/apps/dashboard/src/lib/graph/nodes.ts b/apps/dashboard/src/lib/graph/nodes.ts index 0fef301..b075851 100644 --- a/apps/dashboard/src/lib/graph/nodes.ts +++ b/apps/dashboard/src/lib/graph/nodes.ts @@ -67,7 +67,7 @@ export function getNodeColor(node: GraphNode, mode: ColorMode): string { // hard-edged "glowing cubes" artefact reported in issue #31. Using a // soft radial gradient gives a real round halo and lets bloom do its job. let sharedGlowTexture: THREE.Texture | null = null; -function getGlowTexture(): THREE.Texture { +export function getGlowTexture(): THREE.Texture { if (sharedGlowTexture) return sharedGlowTexture; const size = 128; const canvas = document.createElement('canvas'); @@ -271,7 +271,11 @@ export class NodeManager { return { mesh, glow: sprite, label: labelSprite, size }; } - addNode(node: GraphNode, initialPosition?: THREE.Vector3): THREE.Vector3 { + addNode( + node: GraphNode, + initialPosition?: THREE.Vector3, + options: { isBirthRitual?: boolean } = {} + ): THREE.Vector3 { const pos = initialPosition?.clone() ?? new THREE.Vector3( @@ -289,17 +293,62 @@ export class NodeManager { (glow.material as THREE.SpriteMaterial).opacity = 0; (label.material as THREE.SpriteMaterial).opacity = 0; + if (options.isBirthRitual) { + // v2.3 Birth Ritual: reserve the physics slot but don't show + // anything until the orb docks. Hiding via .visible keeps the + // force simulation + positions map fully active, so getTargetPos() + // can still resolve the live destination for the orb. `igniteNode` + // below flips visibility and kicks off the materialization anim. + mesh.visible = false; + glow.visible = false; + label.visible = false; + mesh.userData.birthRitualPending = { + totalFrames: 30, + targetScale: 0.5 + node.retention * 2, + }; + } else { + this.materializingNodes.push({ + id: node.id, + frame: 0, + totalFrames: 30, + mesh, + glow, + label, + targetScale: 0.5 + node.retention * 2, + }); + } + + return pos; + } + + /** + * v2.3 Birth Ritual docking. Flip visibility and hand the node over to + * the materialization queue so it springs up via easeOutElastic at the + * exact moment the orb hits. No-op if the node wasn't created with + * `isBirthRitual:true` or was already ignited. + */ + igniteNode(id: string) { + const mesh = this.meshMap.get(id); + const glow = this.glowMap.get(id); + const label = this.labelSprites.get(id); + if (!mesh || !glow || !label) return; + const pending = mesh.userData.birthRitualPending as + | { totalFrames: number; targetScale: number } + | undefined; + if (!pending) return; + mesh.visible = true; + glow.visible = true; + label.visible = true; + delete mesh.userData.birthRitualPending; this.materializingNodes.push({ - id: node.id, + id, frame: 0, - totalFrames: 30, + totalFrames: pending.totalFrames, mesh, glow, label, - targetScale: 0.5 + node.retention * 2, + targetScale: pending.targetScale, }); - - return pos; } removeNode(id: string) { @@ -446,7 +495,12 @@ export class NodeManager { }); } - animate(time: number, nodes: GraphNode[], camera: THREE.PerspectiveCamera) { + animate( + time: number, + nodes: GraphNode[], + camera: THREE.PerspectiveCamera, + brightness: number = 1.0 + ) { // Materialization animations — elastic scale-up from 0 for (let i = this.materializingNodes.length - 1; i >= 0; i--) { const mn = this.materializingNodes[i]; @@ -552,16 +606,38 @@ export class NodeManager { 1 + Math.sin(time * 1.5 + nodes.indexOf(node) * 0.5) * 0.15 * node.retention; mesh.scale.setScalar(breathe); + // Distance compensation: FogExp2 attenuates exponentially with camera + // distance, so nodes past ~80 units go nearly black unless we push + // emissive harder. Boost runs 1.0x at <60 units → ~2.4x at 200 units. + // Combined with the user brightness multiplier this gives a visible + // floor at every zoom level without blowing out close-up highlights. + const pos = this.positions.get(id); + const dist = pos ? camera.position.distanceTo(pos) : 0; + const distanceBoost = 1 + Math.min(1.4, Math.max(0, (dist - 60) / 100)); + const mat = mesh.material as THREE.MeshStandardMaterial; if (id === this.hoveredNode) { - mat.emissiveIntensity = 1.0; + mat.emissiveIntensity = 1.0 * brightness; } else if (id === this.selectedNode) { - mat.emissiveIntensity = 0.8; + mat.emissiveIntensity = 0.8 * brightness; } else { const baseIntensity = 0.3 + node.retention * 0.5; const breatheIntensity = baseIntensity + Math.sin(time * (0.8 + node.retention * 0.7)) * 0.1 * node.retention; - mat.emissiveIntensity = breatheIntensity; + mat.emissiveIntensity = breatheIntensity * brightness * distanceBoost; + } + + // Opacity also gets the distance boost (capped at 1.0) so the node + // body stays visible against the dark void at far zoom. + const baseOpacity = 0.3 + node.retention * 0.7; + mat.opacity = Math.min(1.0, baseOpacity * brightness * distanceBoost); + + // Mirror the boost onto the glow sprite so the halo tracks the core. + const glow = this.glowMap.get(id); + if (glow) { + const glowMat = glow.material as THREE.SpriteMaterial; + const baseGlow = 0.3 + node.retention * 0.35; + glowMat.opacity = Math.min(0.95, baseGlow * brightness * distanceBoost); } }); diff --git a/apps/dashboard/src/lib/graph/scene.ts b/apps/dashboard/src/lib/graph/scene.ts index 6f05cca..00713d7 100644 --- a/apps/dashboard/src/lib/graph/scene.ts +++ b/apps/dashboard/src/lib/graph/scene.ts @@ -90,8 +90,15 @@ export function createScene(container: HTMLDivElement): SceneContext { controls.dampingFactor = 0.05; controls.rotateSpeed = 0.5; controls.zoomSpeed = 0.8; - controls.minDistance = 10; - controls.maxDistance = 500; + // Distance clamps — the camera starts at ~86 units from origin + // (position.set(0, 30, 80)). The graph's force-directed layout seats + // most nodes within a ~120-unit radius. 500 was dramatically out of + // scale — the user could zoom out until every node was one pixel on + // a black starfield (issue reported 2026-04-23). 180 keeps the full + // graph in frame with nodes still readable; 12 prevents zooming inside + // a node and losing orientation. + controls.minDistance = 12; + controls.maxDistance = 180; controls.autoRotate = true; controls.autoRotateSpeed = 0.3; diff --git a/apps/dashboard/src/lib/stores/__tests__/theme.test.ts b/apps/dashboard/src/lib/stores/__tests__/theme.test.ts new file mode 100644 index 0000000..46d8e33 --- /dev/null +++ b/apps/dashboard/src/lib/stores/__tests__/theme.test.ts @@ -0,0 +1,496 @@ +/** + * Unit tests for the theme store. + * + * Scope: pure-store behavior — setter validation, cycle order, derived + * resolution, localStorage persistence + fallback, matchMedia listener + * wiring, idempotent style injection, SSR safety. + * + * Environment notes: + * - Vitest runs in Node (no jsdom). We fabricate the window / document / + * localStorage / matchMedia globals the store touches, then mock + * `$app/environment` so `browser` flips between true and false per + * test group. SSR tests leave `browser` false and verify no globals + * are touched. + * - The store caches module-level state (mediaQuery, listener, + * resolvedUnsub). We `vi.resetModules()` before every test so each + * loadTheme() returns a pristine instance. + */ +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { get } from 'svelte/store'; + +// --- Controllable `browser` flag ------------------------------------------ +// vi.mock is hoisted — we reference a module-level `browserFlag` the tests +// mutate between blocks. Casting via globalThis keeps the hoist happy. +const browserState = { value: true }; +vi.mock('$app/environment', () => ({ + get browser() { + return browserState.value; + }, +})); + +// --- Fabricated DOM / storage / matchMedia -------------------------------- +// Each test's setup wires these onto globalThis so the store's `browser` +// branch can read them. They are intentionally minimal — only the methods +// theme.ts actually calls are implemented. + +type FakeMediaListener = (e: { matches: boolean }) => void; + +interface FakeMediaQueryList { + matches: boolean; + addEventListener: (type: 'change', listener: FakeMediaListener) => void; + removeEventListener: (type: 'change', listener: FakeMediaListener) => void; + // Test-only helpers + _emit: (matches: boolean) => void; + _listenerCount: () => number; +} + +function createFakeMediaQuery(initialMatches: boolean): FakeMediaQueryList { + const listeners = new Set(); + return { + matches: initialMatches, + addEventListener: (_type, listener) => { + listeners.add(listener); + }, + removeEventListener: (_type, listener) => { + listeners.delete(listener); + }, + _emit(matches: boolean) { + this.matches = matches; + for (const l of listeners) l({ matches }); + }, + _listenerCount() { + return listeners.size; + }, + }; +} + +interface FakeStorageBehavior { + throwOnGet?: boolean; + throwOnSet?: boolean; + corruptRaw?: string | null; +} + +function installFakeLocalStorage(behavior: FakeStorageBehavior = {}) { + const store = new Map(); + if (behavior.corruptRaw !== undefined && behavior.corruptRaw !== null) { + store.set('vestige.theme', behavior.corruptRaw); + } + const fake = { + getItem: (key: string) => { + if (behavior.throwOnGet) throw new Error('SecurityError: storage disabled'); + return store.has(key) ? store.get(key)! : null; + }, + setItem: (key: string, value: string) => { + if (behavior.throwOnSet) throw new Error('QuotaExceededError'); + store.set(key, value); + }, + removeItem: (key: string) => { + store.delete(key); + }, + clear: () => store.clear(), + key: () => null, + length: 0, + _store: store, // test-only peek + }; + vi.stubGlobal('localStorage', fake); + return fake; +} + +/** + * Install a fake `document` with only the APIs theme.ts calls: + * - getElementById (style-dedup check) + * - createElement('style') + * - head.appendChild + * - documentElement.dataset + * Returns handles so tests can inspect the head children and data-theme. + */ +function installFakeDocument() { + const headChildren: Array<{ id: string; textContent: string; tagName: string }> = []; + const docEl = { + dataset: {} as Record, + }; + const fakeDocument = { + getElementById: (id: string) => + headChildren.find((el) => el.id === id) ?? null, + createElement: (tag: string) => ({ + id: '', + textContent: '', + tagName: tag.toUpperCase(), + }), + head: { + appendChild: (el: { id: string; textContent: string; tagName: string }) => { + headChildren.push(el); + return el; + }, + }, + documentElement: docEl, + }; + vi.stubGlobal('document', fakeDocument); + return { fakeDocument, headChildren, docEl }; +} + +/** + * Install a fake `window` with just `matchMedia`. We keep the returned + * MQL handle so tests can emit change events. + */ +function installFakeWindow(initialPrefersDark: boolean) { + const mql = createFakeMediaQuery(initialPrefersDark); + const fakeWindow = { + matchMedia: vi.fn(() => mql), + }; + vi.stubGlobal('window', fakeWindow); + return { fakeWindow, mql }; +} + +/** + * Fresh module import. The theme store caches matchMedia/listener handles + * at module level, so every test that exercises initTheme wants a clean + * copy. Returns the full export surface. + */ +async function loadTheme() { + vi.resetModules(); + return await import('../theme'); +} + +// Baseline: every test starts with browser=true, fake window/doc/storage +// installed, and fresh module state. SSR-specific tests override these. +beforeEach(() => { + browserState.value = true; + installFakeDocument(); + installFakeWindow(true); // system prefers dark by default + installFakeLocalStorage(); +}); + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +// --------------------------------------------------------------------------- +// Export surface +// --------------------------------------------------------------------------- +describe('theme store — exports', () => { + it('exports theme writable, resolvedTheme derived, setTheme, cycleTheme, initTheme', async () => { + const mod = await loadTheme(); + expect(mod.theme).toBeDefined(); + expect(typeof mod.theme.subscribe).toBe('function'); + expect(typeof mod.theme.set).toBe('function'); + expect(mod.resolvedTheme).toBeDefined(); + expect(typeof mod.resolvedTheme.subscribe).toBe('function'); + // Derived stores do NOT expose .set — this guards against accidental + // conversion to a writable during refactors. + expect((mod.resolvedTheme as unknown as { set?: unknown }).set).toBeUndefined(); + expect(typeof mod.setTheme).toBe('function'); + expect(typeof mod.cycleTheme).toBe('function'); + expect(typeof mod.initTheme).toBe('function'); + }); + + it('theme defaults to dark before initTheme is called', async () => { + const mod = await loadTheme(); + expect(get(mod.theme)).toBe('dark'); + }); +}); + +// --------------------------------------------------------------------------- +// setTheme — input validation + persistence +// --------------------------------------------------------------------------- +describe('setTheme', () => { + it('accepts dark/light/auto and updates the store', async () => { + const { theme, setTheme } = await loadTheme(); + setTheme('light'); + expect(get(theme)).toBe('light'); + setTheme('auto'); + expect(get(theme)).toBe('auto'); + setTheme('dark'); + expect(get(theme)).toBe('dark'); + }); + + it('rejects invalid values — store is unchanged, localStorage untouched', async () => { + const { theme, setTheme } = await loadTheme(); + setTheme('light'); // seed a known value + const ls = installFakeLocalStorage(); + // Reset any prior writes so we only see what happens during the bad call. + ls._store.clear(); + + // Cast a bad value through the public API. + setTheme('midnight' as unknown as 'dark'); + expect(get(theme)).toBe('light'); // unchanged + expect(ls._store.has('vestige.theme')).toBe(false); + + setTheme('' as unknown as 'dark'); + setTheme(undefined as unknown as 'dark'); + setTheme(null as unknown as 'dark'); + expect(get(theme)).toBe('light'); + }); + + it('persists the valid value to localStorage under the vestige.theme key', async () => { + const ls = installFakeLocalStorage(); + const { setTheme } = await loadTheme(); + setTheme('auto'); + expect(ls._store.get('vestige.theme')).toBe('auto'); + }); + + it('swallows localStorage write errors (private mode / disabled storage)', async () => { + installFakeLocalStorage({ throwOnSet: true }); + const { theme, setTheme } = await loadTheme(); + // Must not throw. + expect(() => setTheme('light')).not.toThrow(); + // Store still updated even though persistence failed — UI should + // reflect the click; the next session will just start fresh. + expect(get(theme)).toBe('light'); + }); + + it('no-ops localStorage write when browser=false (SSR safety)', async () => { + browserState.value = false; + const ls = installFakeLocalStorage(); + const { theme, setTheme } = await loadTheme(); + setTheme('light'); + // Store update is still safe (pure JS object), but persistence is skipped. + expect(get(theme)).toBe('light'); + expect(ls._store.has('vestige.theme')).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// cycleTheme — dark → light → auto → dark +// --------------------------------------------------------------------------- +describe('cycleTheme', () => { + it('cycles dark → light', async () => { + const { theme, cycleTheme } = await loadTheme(); + // Default is 'dark'. + expect(get(theme)).toBe('dark'); + cycleTheme(); + expect(get(theme)).toBe('light'); + }); + + it('cycles light → auto', async () => { + const { theme, setTheme, cycleTheme } = await loadTheme(); + setTheme('light'); + cycleTheme(); + expect(get(theme)).toBe('auto'); + }); + + it('cycles auto → dark (closes the loop)', async () => { + const { theme, setTheme, cycleTheme } = await loadTheme(); + setTheme('auto'); + cycleTheme(); + expect(get(theme)).toBe('dark'); + }); + + it('full triple-click returns to the starting value', async () => { + const { theme, cycleTheme } = await loadTheme(); + const start = get(theme); + cycleTheme(); + cycleTheme(); + cycleTheme(); + expect(get(theme)).toBe(start); + }); + + it('persists each step to localStorage', async () => { + const ls = installFakeLocalStorage(); + const { cycleTheme } = await loadTheme(); + cycleTheme(); + expect(ls._store.get('vestige.theme')).toBe('light'); + cycleTheme(); + expect(ls._store.get('vestige.theme')).toBe('auto'); + cycleTheme(); + expect(ls._store.get('vestige.theme')).toBe('dark'); + }); +}); + +// --------------------------------------------------------------------------- +// resolvedTheme — derived from theme + systemPrefersDark +// --------------------------------------------------------------------------- +describe('resolvedTheme', () => { + it('dark → dark (independent of system preference)', async () => { + const { resolvedTheme, setTheme } = await loadTheme(); + setTheme('dark'); + expect(get(resolvedTheme)).toBe('dark'); + }); + + it('light → light (independent of system preference)', async () => { + const { resolvedTheme, setTheme } = await loadTheme(); + setTheme('light'); + expect(get(resolvedTheme)).toBe('light'); + }); + + it('auto + system prefers dark → dark', async () => { + const { mql } = installFakeWindow(true); + const { resolvedTheme, setTheme, initTheme } = await loadTheme(); + initTheme(); // primes systemPrefersDark from matchMedia + setTheme('auto'); + expect(mql.matches).toBe(true); + expect(get(resolvedTheme)).toBe('dark'); + }); + + it('auto + system prefers light → light', async () => { + installFakeWindow(false); + const { resolvedTheme, setTheme, initTheme } = await loadTheme(); + initTheme(); // primes systemPrefersDark=false + setTheme('auto'); + expect(get(resolvedTheme)).toBe('light'); + }); + + it('auto flips live when the matchMedia listener fires (OS changes scheme)', async () => { + const { mql } = installFakeWindow(true); + const { resolvedTheme, setTheme, initTheme } = await loadTheme(); + initTheme(); + setTheme('auto'); + expect(get(resolvedTheme)).toBe('dark'); + // OS user toggles to light mode — matchMedia fires 'change' with matches=false. + mql._emit(false); + expect(get(resolvedTheme)).toBe('light'); + // And back to dark. + mql._emit(true); + expect(get(resolvedTheme)).toBe('dark'); + }); +}); + +// --------------------------------------------------------------------------- +// initTheme — idempotence, teardown, localStorage hydration +// --------------------------------------------------------------------------- +describe('initTheme', () => { + it('returns a teardown function', async () => { + const { initTheme } = await loadTheme(); + const teardown = initTheme(); + expect(typeof teardown).toBe('function'); + teardown(); + }); + + it('injects exactly one diff --git a/apps/dashboard/src/routes/(app)/duplicates/+page.svelte b/apps/dashboard/src/routes/(app)/duplicates/+page.svelte new file mode 100644 index 0000000..f5e527b --- /dev/null +++ b/apps/dashboard/src/routes/(app)/duplicates/+page.svelte @@ -0,0 +1,387 @@ + + + +

+ +
+

+ Memory Hygiene — Duplicate Detection +

+

+ Cosine-similarity clustering over embeddings. Merges reinforce the winner's FSRS state; + losers inherit into the merged node. Dismissed clusters are hidden for this session only. +

+
+ + +
+ + + + +
+ {#if loading} + + Detecting… + {:else if error} + + Error + {:else} + + + {visibleClusters.length} + {visibleClusters.length === 1 ? 'cluster' : 'clusters'}, + {totalDuplicates} potential duplicate{totalDuplicates === 1 ? '' : 's'} + + {/if} +
+ + +
+ + + {#if error} +
+
Couldn't detect duplicates
+
{error}
+ +
+ {:else if loading} +
+ {#each Array(3) as _} +
+ {/each} +
+ {:else if visibleClusters.length === 0} +
+
·
+
+ No duplicates found above threshold. +
+
Memory is clean.
+
+ {:else} +
+ {#if overflowed} +
+ Showing first {CLUSTER_RENDER_CAP} of {visibleClusters.length} clusters. Raise the + threshold to narrow results. +
+ {/if} + {#each renderedClusters as { c, key } (key)} +
+ dismissCluster(key)} + onMerge={(winnerId, loserIds) => mergeCluster(key, winnerId, loserIds)} + /> +
+ {/each} +
+ {/if} +
+ + diff --git a/apps/dashboard/src/routes/(app)/graph/+page.svelte b/apps/dashboard/src/routes/(app)/graph/+page.svelte index 28842a2..a831cd3 100644 --- a/apps/dashboard/src/routes/(app)/graph/+page.svelte +++ b/apps/dashboard/src/routes/(app)/graph/+page.svelte @@ -7,6 +7,7 @@ import MemoryStateLegend from '$components/MemoryStateLegend.svelte'; import { api } from '$stores/api'; import { eventFeed } from '$stores/websocket'; + import { graphState } from '$stores/graph-state.svelte'; import type { GraphResponse, GraphNode, GraphEdge, Memory } from '$types'; import type { GraphMutation } from '$lib/graph/events'; import type { ColorMode } from '$lib/graph/nodes'; @@ -83,37 +84,81 @@ loading = true; error = ''; try { + const isDefault = !query && !centerId; graphData = await api.graph({ max_nodes: maxNodes, depth: 3, query: query || undefined, - center_id: centerId || undefined + center_id: centerId || undefined, + // Center on the newest memory by default. Prevents the old + // "most-connected" behaviour from clustering on historical + // hotspots and hiding today's memories behind the 150-node + // cap. Future UI toggle can flip this to 'connected'. + sort: isDefault ? 'recent' : undefined }); + + // Fallback: if the newest memory is isolated (1 node, 0 edges), + // fall back to the connected hotspot so the user sees context + // instead of a lonely orb. Only applies to the default load — + // explicit queries/centerId honor the user's choice even if the + // subgraph is sparse. + if ( + isDefault && + graphData && + graphData.nodeCount <= 1 && + graphData.edgeCount === 0 + ) { + const connected = await api.graph({ + max_nodes: maxNodes, + depth: 3, + sort: 'connected' + }); + if (connected && connected.nodeCount > graphData.nodeCount) { + graphData = connected; + } + } + if (graphData) { liveNodeCount = graphData.nodeCount; liveEdgeCount = graphData.edgeCount; } } catch (e) { - // Distinguish "cold-start / empty database" from "actual API failure". - // Before v2.0.7 both surfaced as "No memories yet..." which masked - // real errors (network down, dashboard disabled, 500s) and looked - // identical to a first-run install. Split the two so debugging - // isn't a guessing game. - // - // Sanitize the error string before rendering: strip filesystem - // paths and crate-file references (the backend occasionally wraps - // raw rusqlite / fs errors) and cap length at 200 chars so a - // stack-trace-sized error doesn't dominate the page. + // Distinguish three failure modes so the error message is actually + // helpful. Before: all failures (backend offline, empty DB, real + // 500) rendered identical cryptic text. That made the dashboard + // look broken on first-run or on backend-down, when the root + // cause is ALWAYS "the MCP server isn't running." + // (1) Backend offline — vite dev proxy returns 500 with no body + // (upstream EHOSTUNREACH / ECONNREFUSED). Surface clearly: + // tell the user to start vestige-mcp. + // (2) Empty database — fresh install, no memories yet. Happy + // first-run state, not an error. + // (3) Real backend error — a genuine 500 with a response body, + // or a 4xx with content. Show the sanitized upstream msg. const rawMsg = e instanceof Error ? e.message : String(e); const safeMsg = rawMsg .replace(/\/[\w./-]+\.(sqlite|rs|db|toml|lock)\b/g, '[path]') .slice(0, 200); + + // Network-level failure: fetch itself rejects (TypeError) OR vite + // proxy passes back a body-less 500 when upstream :3927 is + // unreachable. Both mean "backend offline." + const isBackendOffline = + e instanceof TypeError || + /failed to fetch|NetworkError|load failed/i.test(rawMsg) || + /^API 500:?\s*(Internal Server Error)?\s*$/i.test(rawMsg.trim()); + const isEmpty = (graphData?.nodeCount ?? 0) === 0 && /not found|404|empty|no memor/i.test(rawMsg); - error = isEmpty - ? 'No memories yet. Start using Vestige to populate your graph.' - : `Failed to load graph: ${safeMsg}`; + + if (isBackendOffline) { + error = 'OFFLINE'; + } else if (isEmpty) { + error = 'EMPTY'; + } else { + error = `Failed to load graph: ${safeMsg}`; + } } finally { loading = false; } @@ -149,6 +194,40 @@

Loading memory graph...

+ {:else if error === 'OFFLINE'} +
+
+
+

MCP Backend Offline

+

+ The Vestige MCP server isn't reachable on :3927. + The dashboard is running but has nothing to query. +

+
+
Start the backend:
+ nohup bash -c 'tail -f /dev/null | VESTIGE_DASHBOARD_ENABLED=true ~/.local/bin/vestige-mcp' > /tmp/vestige.log 2>&1 & +disown +
+
+ + + Try demos (no backend needed) + +
+
+
+ {:else if error === 'EMPTY'} +
+
+
+

Your Mind Awaits

+

No memories yet. Start using Vestige to populate your graph.

+
+
{:else if error}
@@ -224,6 +303,27 @@ + + + + ⌘/Ctrl + Enter + {#if scoreError} + {scoreError} + {/if} +
+
+ + +
+ {#if score} +
+
Composite
+
+ {(score.composite * 100).toFixed(0)}% +
+
+ {#key radarKey} + + {/key} + + + {#if score.composite > 0.6} +
+
✓ Save
+

+ Composite {(score.composite * 100).toFixed(0)}% > 60% threshold. + {#if topChannel} + Driven by {topChannel.key} — {CHANNEL_BLURBS[topChannel.key].high}. + {/if} +

+
+ {:else} +
+
⨯ Skip
+

+ Composite {(score.composite * 100).toFixed(0)}% < 60% threshold. + {#if weakestChannel} + Weakest channel: {weakestChannel} — {CHANNEL_BLURBS[weakestChannel].low}. + {/if} +

+
+ {/if} + {:else} +
+
+

Type some content above to score its importance.

+

+ Composite = 0.25·novelty + 0.30·arousal + 0.25·reward + 0.20·attention. + Threshold for save: 60%. +

+
+ {/if} +
+ + + + +
+
+
+

+ Top Important Memories This Week +

+

+ Ranked by retention × reviews ÷ age. Click any card to open it. +

+
+ +
+ + {#if loadingMemories} +
+ {#each Array(6) as _} +
+ {/each} +
+ {:else if memories.length === 0} +
+

No memories yet.

+
+ {:else} +
+ {#each memories as memory (memory.id)} + {@const ch = perMemoryScores[memory.id]} + + {/each} +
+ {/if} +
+ diff --git a/apps/dashboard/src/routes/(app)/memories/+page.svelte b/apps/dashboard/src/routes/(app)/memories/+page.svelte index e1000cd..03e9808 100644 --- a/apps/dashboard/src/routes/(app)/memories/+page.svelte +++ b/apps/dashboard/src/routes/(app)/memories/+page.svelte @@ -3,6 +3,7 @@ import { api } from '$stores/api'; import type { Memory } from '$types'; import { NODE_TYPE_COLORS } from '$types'; + import MemoryAuditTrail from '$lib/components/MemoryAuditTrail.svelte'; let memories: Memory[] = $state([]); let searchQuery = $state(''); @@ -11,6 +12,9 @@ let minRetention = $state(0); let loading = $state(true); let selectedMemory: Memory | null = $state(null); + // Which inner tab of the expanded card is active. Keyed by memory id so + // switching between cards remembers each one's last view independently. + let expandedTab: Record = $state({}); let debounceTimer: ReturnType; onMount(() => loadMemories()); @@ -116,13 +120,45 @@ {#if selectedMemory?.id === memory.id} + {@const activeTab = expandedTab[memory.id] ?? 'content'}
-

{memory.content}

-
-
Storage: {(memory.storageStrength * 100).toFixed(1)}%
-
Retrieval: {(memory.retrievalStrength * 100).toFixed(1)}%
-
Created: {new Date(memory.createdAt).toLocaleDateString()}
+ +
+ { e.stopPropagation(); expandedTab[memory.id] = 'content'; }} + onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); expandedTab[memory.id] = 'content'; } }} + class="px-3 py-1.5 rounded-lg cursor-pointer select-none transition + {activeTab === 'content' ? 'bg-synapse/20 text-synapse-glow border border-synapse/40' : 'bg-white/[0.03] text-dim hover:text-text border border-transparent'}" + >Content + { e.stopPropagation(); expandedTab[memory.id] = 'audit'; }} + onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.stopPropagation(); expandedTab[memory.id] = 'audit'; } }} + class="px-3 py-1.5 rounded-lg cursor-pointer select-none transition + {activeTab === 'audit' ? 'bg-synapse/20 text-synapse-glow border border-synapse/40' : 'bg-white/[0.03] text-dim hover:text-text border border-transparent'}" + >Audit Trail
+ + {#if activeTab === 'content'} +

{memory.content}

+
+
Storage: {(memory.storageStrength * 100).toFixed(1)}%
+
Retrieval: {(memory.retrievalStrength * 100).toFixed(1)}%
+
Created: {new Date(memory.createdAt).toLocaleDateString()}
+
+ {:else} +
e.stopPropagation()} + onkeydown={(e) => e.stopPropagation()} + > + +
+ {/if} +
{ e.stopPropagation(); api.memories.promote(memory.id); }} onkeydown={(e) => { if (e.key === 'Enter') { e.stopPropagation(); api.memories.promote(memory.id); } }} diff --git a/apps/dashboard/src/routes/(app)/patterns/+page.svelte b/apps/dashboard/src/routes/(app)/patterns/+page.svelte new file mode 100644 index 0000000..05fcbb0 --- /dev/null +++ b/apps/dashboard/src/routes/(app)/patterns/+page.svelte @@ -0,0 +1,567 @@ + + + +
+ +
+

Cross-Project Intelligence

+

Patterns learned here, applied there.

+
+ + +
+ + {#each CATEGORIES as cat (cat)} + + {/each} +
+ + {#if error} +
+
Couldn't load pattern transfers
+
{error}
+ +
+ {:else if loading} +
+
+
+
+ {:else} + +
+ +
+ + + {#if selectedCell} +
+
+ Filtered to + {selectedCell.from} + + {selectedCell.to} +
+ +
+ {/if} +
+ + + +
+ + +
+
+ {patternCount} + pattern{patternCount === 1 ? '' : 's'} across + {projectCount} + project{projectCount === 1 ? '' : 's'}, + {totalTransfers} + total transfer{totalTransfers === 1 ? '' : 's'} +
+
+ {activeCategory === 'All' ? 'All categories' : activeCategory} +
+
+ {/if} +
diff --git a/apps/dashboard/src/routes/(app)/reasoning/+page.svelte b/apps/dashboard/src/routes/(app)/reasoning/+page.svelte new file mode 100644 index 0000000..64f5ccf --- /dev/null +++ b/apps/dashboard/src/routes/(app)/reasoning/+page.svelte @@ -0,0 +1,668 @@ + + + + Reasoning Theater · Vestige + + +
+ +
+
+ +

Reasoning Theater

+ + deep_reference + +
+

+ Watch Vestige reason. Your query runs the 8-stage cognitive pipeline — broad retrieval, + spreading activation, FSRS trust scoring, intent classification, supersession, contradiction + analysis, relation assessment, template reasoning — and returns a pre-built answer with + trust-scored evidence. +

+
+ + +
+
+ + e.key === 'Enter' && ask()} + placeholder="Ask your memory anything..." + class="flex-1 bg-transparent text-bright text-lg placeholder:text-muted focus:outline-none font-mono" + /> + + +
+ + {#if !response && !loading} +
+ Try + {#each exampleQueries as ex} + + {/each} +
+ {/if} +
+ + + {#if error} +
+ Error: + {error} +
+ {/if} + + + {#if loading} +
+
+ + Running cognitive pipeline +
+ +
+ {/if} + + + {#if response && !loading} + {@const conf = response.confidence} + {@const confColor = confidenceColor(conf)} + + + {#if response.reasoning} +
+
+

+ + Reasoning +

+
+ intent: {response.intent} + · + {response.memoriesAnalyzed} analyzed + · + {conf}% {confidenceLabel(conf)} +
+
+
{response.reasoning}
+
+ {/if} + + +
+ +
+ Confidence +
+ + {conf}% + +
+ + {confidenceLabel(conf)} + + + + + + + + +
+ intent: {response.intent} + · + {response.memoriesAnalyzed} analyzed +
+
+ + +
+
+ Primary Source + + #{response.recommended.memory_id.slice(0, 8)} + +
+

{response.recommended.answer_preview}

+
+ + + Trust {(response.recommended.trust_score * 100).toFixed(0)}% + + · + {new Date(response.recommended.date).toLocaleDateString()} +
+
+
+ + +
+

+ + Cognitive Pipeline +

+
+ +
+
+ + +
+
+

+ + Evidence + ({response.evidence.length}) +

+
+ + primary + + + supporting + + + contradicting + + + superseded + +
+
+ +
+ {#each response.evidence as ev, i (ev.id)} + + {/each} + + + {#if arcs.length > 0} + + {/if} +
+
+ + + {#if response.contradictions.length > 0} +
+

+ + Contradictions Detected + ({response.contradictions.length}) +

+
+ {#each response.contradictions as c, i} +
+ +
+
+ #{c.a_id.slice(0, 8)} + + #{c.b_id.slice(0, 8)} +
+

{c.summary}

+
+ pair {i + 1} +
+ {/each} +
+
+ {/if} + + + {#if response.superseded.length > 0} +
+

+ + Superseded + ({response.superseded.length}) +

+
+ {#each response.superseded as s} +
+ #{s.old_id.slice(0, 8)} + + #{s.new_id.slice(0, 8)} + {s.reason} +
+ {/each} +
+
+ {/if} + + +
+ {#if response.evolution.length > 0} +
+

+ + Evolution +

+
+ {#each response.evolution as ev} +
+ + {new Date(ev.date).toLocaleDateString(undefined, { month: 'short', day: 'numeric' })} + + + {ev.summary} +
+ {/each} +
+
+ {/if} + + {#if response.related_insights.length > 0} +
+

+ + Related Insights +

+
+ {#each response.related_insights as ins} +

+ {ins} +

+ {/each} +
+
+ {/if} +
+ {/if} + + + {#if !response && !loading && !error} +
+
+

+ Ask anything. Vestige will run the full reasoning pipeline and show you its work. +

+

+ 8-stage pipeline: retrieval → rerank → activation → trust-score → supersession → + contradiction → relations → chain. Zero LLM calls, 100% local. +

+
+ {/if} +
+ + diff --git a/apps/dashboard/src/routes/(app)/schedule/+page.svelte b/apps/dashboard/src/routes/(app)/schedule/+page.svelte new file mode 100644 index 0000000..781b284 --- /dev/null +++ b/apps/dashboard/src/routes/(app)/schedule/+page.svelte @@ -0,0 +1,252 @@ + + +
+
+
+

Review Schedule

+

FSRS-6 next-review dates across your memory corpus

+
+
+ {#each FILTERS as f} + + {/each} +
+
+ + {#if !loading && !errored && truncated} +
+ Showing the first {memories.length.toLocaleString()} of {totalMemories.toLocaleString()} memories. + Schedule reflects this slice only. +
+ {/if} + + {#if loading} +
+
+
+
+ {#each Array(42) as _} +
+ {/each} +
+
+
+ {#each Array(5) as _} +
+ {/each} +
+
+ {:else if errored} +
+

API unavailable.

+

Could not fetch memories from /api/memories.

+
+ {:else if scheduled.length === 0} +
+
+

FSRS review schedule not yet populated.

+

+ None of your {memories.length} memor{memories.length === 1 ? 'y has' : 'ies have'} a + nextReviewAt timestamp yet. Run consolidation to compute + next-review dates via FSRS-6. +

+ +
+ {:else} +
+ +
+ +
+ + + +
+ {/if} +
diff --git a/apps/dashboard/src/routes/(app)/settings/+page.svelte b/apps/dashboard/src/routes/(app)/settings/+page.svelte index 90d141e..f7a82eb 100644 --- a/apps/dashboard/src/routes/(app)/settings/+page.svelte +++ b/apps/dashboard/src/routes/(app)/settings/+page.svelte @@ -1,7 +1,29 @@

sdqTL4p}1Ux;6I+5WPt%;na#UYs7k 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 z zL4{dI)2bb(<}accLKBcS@VFhDaOF<;3;_?MR>$M70;b>BxJ0jRZpq!tiq!9Y$K{FzhN6J{5GPH9;>1_A!MDp2!sFdOm!cb=qOroOGADVS%wm^IVuwcy z_PNETk?Of=FZr;t({g$MD?#(wEleRf?y*VqdG9WCr)DuqX05PXiv za-oeX+a>iRloNLQ&hUAGZ~uk_$?#87fdy9bh7e>^jvTeHLm-==GOUYf*xgV022qe( zP}B$n23&|xylbOl+#I*hMbVOEvn*MgLr=g+UfXv(O(l!7&z(aIx37Y?bXQxa(J3pE z`3>{Pq`2O&+MXlp9j|W zpWv!%u%v29H^2)zpz?}7CH??~ZjCe_k6oPDeOq&wsue=JA!b2*-~ zi~l9FJ!*V)n`#@XHCsOXP>3bIxoK?rJkJ>j-m~g!i0l|xn2cQJ34Ubg`k%w}s{Im(xjJ8&hUVQS?HCS2{;1)rC08nJ1G(h|ZNv>4PrnP;)BZEEF) zn6`bzRdJ&dG{T5R*2rCu=a#oP+WOGS@=Hxz4LBf$*Md{EnCc@kr7{?&%bSV-_1lDo ztl5H7k^DumBpFgG@<-1*b5);Y9% zZ60mS?HyGfyXqH5AOU|}3hr)kXtg@;2!}Bs5|B*!Q;1bGcyX{f<7UqicaP2Erl z3;H+rWRV;?{9zgTRR4&TRG(n_(|i3$?H6{OvuI;ngILe`O(TCRT>okd9!&Yug;!;Y zJ3yMqzZnpweO3V2_}m7V*E0>?xu%A;;n1ncM2%yiTzPl-VXRKjx^h+}+*Ik#zYOem zFzJo5Jlm^J2LAH=;nIjBkE6NYQ&&Hm804=NST}l0QTu$()>W#d`|Co?5q75hMgAVp zwPfkcc3kh+!D0`<4 zGKCry;#ezfY-ru0P_Y12%NXp{Tg8!pYmo86BxjB7bm@;Vw-sc#jXBbrK%GU@8D5V_IM2ZH zJkefOky5w-9d&ob515&5 zsewIPE_OJbGMuLwEJXr z87N%Lg^`m0^<3)GJEviyC1#Dha(Eb=IXPN(?kT36xHk?XfY|= z^%v2}R{i@F@%3L8YcJ3%XS)4)9 zP@0HEuUmuyhbar4kzV8!GSqSa6cLV$IN+r?3?fO4_7PMYgRu}AsfiQ_nO!mDDd`cm z(7h|jQV56znNL=edL{u@#v!H%+)JV>DYF%ggCL|$LJR1bi z_+DzegrD~{{Kx>%#6}-1wQC(19rU0ShJ`jtw%O4vl0aV#Fj)|3#-A8eY&p>|ws_^R zj6kydX32I+rci`R)T71nsK-m*g(zB4vMO3}%9l_RWwfyvWxPdLB&%Y|F{fAl1cWys z_4Z7nxYg?@O^U-n-oqWWbQ}5JJUWiTi6Ml6Wy&KKQ?!|zD3jUL*h+;Npi~Mc_9i1% zam=AUl;)DvY+E5VYB7hjhe(4-F9ZTOS}HgTW8stqlwA-hLX%V^i^xM_GY2+U8<0WK zR5&!144Y^s-8ToP31#qsYN?C-v6!S&^phD#lNo8o9UO+CkOONe!=|Vst^s9f(yU-D ztcbEmL(CU@11O_jD~b+>ddtDDkP=ZhU!%M)m3yYUD364MW390n)RvB zp-UF%wR{aQW9M&Pj-ld>Ot`??W!AkJacLcWUdHy&g8<=jO~{OS)ptDg4?_6nrR4p- z5B*JB*vv^O(yWq}Ni3UJ`b#&Krg*8wMHSm}$`MP{Qe&_NeLOP4B+|-qa;lIRWfN6u zc)1H`gUK+S*#vzB`swrg74byaD~@%#Xx1>mv4x+c4O~T2739cr?#6`QL5Bg}LWe3R zzfaaitiB~GaG-4BVdZ(hDa&r;Ba11%FZH&UHFdRyDk|RC1OrBu{g$;Cs$?(2ENY?g zSkdm5k4E+DU;=M;5I>z%b)3Q6Ma&m)g0vQ569ldL=w=z}l+K>{4xT|3%UX*=A*F|= zq!Xrv)TW^E!zlkK_@wErvi{-lxeleX%m<*a42OMieHz1lozLkWz#LNkHpvW;P*c|_ zgbeAS39upwr~e(%ghTREbucN_(HysK;Vh<)?9V>g2oDKR#}oHXhTz|z1eQWa9fFt2 zZM~MBVZ&u&G*at#C?h5;0>u0>yLQ&J#O%lmNKV zJo{EoBKwIK@M6?O_#NkHs0y{?xiqEsX2uCCQ`6$b9*41V*uq*zKx*v?wJu%3RC^R; zT%he)3+8!D3G9s%8x)GyuaU2UQF_-_^OjYy$JcV z6`?uwlDR#_{nV5dTzctx-VZ+2PXL_1r>5`QbS)Bi9xLr9tv3(gC-SgS{K**pL0eg$ z!m|gvPV*JJGLNqrW_DX+6}KUD`8iX-!qaEJ4NL{#je5Ip$ISsZJJ{A!-M0I*yIe)^ z5@&w*#?b!j3nr)mSNQ{t1O=Wsf0~cxpVc{8IwlDaV$u3e=)kq-W!J2Mm30Q>EOl|G zZ&AXe@+$#jVHCeA65SIfq6v}VTC>3W^^@I1wRD~M7dbcU!@x%Q%L;HP*1oP*{k{3y zi`Upm9y4(@B2_gU_OLk%CRP@9%EQ z^sj>%NVy!5Y8(oNO2Xb}R;5vJwNFY068~OewvWahHP^Ai`cT^T+nC3S_OB;uO3FX_ zjN6O=wpAAhIX&NDB|m`B&2=gfXC`6TFYiA&e<@-$COOS`^ZeM8y9A+&tw%$4tX|ij z5ZM@74<-^UeMq5%dWGik_C)hK?zH?eSSMqWVxzclB}s2uHFdx}sC3eiMz-sUrE~;+ zZdeIyiX??P58C*SCGOEM0#&K(`S?<{2KF5N@vmOb0bDxv7XQ zLFfUtl^x5fzs@vSl{WmAxPVyrWdXVHHMjml5{p!CWDY^eH?~QgYC61qA;mC|{@*2s z|4LVOV;%;UAv@g*zmx})7N8rucSktwxpO^Sz(jSP&)2G7T2#wIGT+Q)nNxHc2-foY zXN<}ozRSfhg|b8?)3Jqy>6#5%pYo7>0MesGo(!Cd2C8O^Q?g>SoVF;i<4^=#ND$w* z^3>a^+Vs>mT2pEB!UJQJ_3D`%wXLeb1KLMf1R<#{V$%`e#Jd>hwCIX_v%aWY#GZBR zhyZnsRTQc{5dk~(n@9YW)Zk2hr`v{l1}mlSK}~FF^ET6NN&}*2{{(MVlEb3hOa&Pw z$D#N(4UX4*XaNegHO3ezxtA4LH!N~AN)p;EWiJtO8AnldaZ>kAf^KB4ayv?x;_c{S z)Rv>^RiIpO9_K~djTR+S$J{1C7#syrI=})(!sA`Yv1VFm!;fk;;C%WODV2B3iUnN9 zNFUcZqYFn!oJ_0!X!YFdth-*L1V0na#op4_V@FM+mAxX?|Dbbn2%T)73aVK zDUH&>4u7R~d<+hILImNm3w0XCmvy~2!Zv#oNCtQ!V5JP7DZBATc9zAK?d7g|Z(^&e z2YA}CxQ1IKC3-dM*0Vm}u)||R`bj&z;9Zs(6jf(*Yo>z@O{g=F- z&?u+-g^gYF4qKJ(_x}F3_EQpt8zu)TT{L>ePE&i~t9jNgaF2dg+b^asvfvOLaA_W0 zqwdOa-MhBno?V@P=)x&z`fFFe?fTmQTo)ht!s=Sbz2!!x8@rbVPd zs7~?xSY8OWzJCFcm0>o8TV?iNN5)X?hlT2@rpRfZ+B+u`{W{srq`*Lq4s}G`0>3GZ z>#v~c4D)f&_U?P$*R}KGY>(F$TDgjwa$pE#P|%odV*$|091>Lno=;z6tT6Ecc705p zaf3iM`n9?hj;Z|b9Cn*l+J=?=F0-tYy>R8+DfFNh{^u$u!|YOgYqz%xWpa?wrzWXW z4C0Wak&MzdK{7xFgy@t22G~VD;kuu17fMpz=nx zW~khXacX;c?x}+ht@@7*B%FJY69roHnhJ&lC7zH`GfunjDL$BeD;rGHfFb&ni$Joh z#_$>>6~^TbqoheST+mP;T(D=drx>M;EFuQ2p1c(tSTA{!)FG_^)Lip@7R^Fi<60@( zK)x4%J9?81w=uYODH$VdZ%>@hMnL3W2>~fB4?{?L(~xB9lH%-egj~-z{5V}-qCc1|D z5y8O!)d%Q1iFSiCwX_}*)US4TdRn8yckGM`jt&TAvJwOph z_cC5^k!AEy$;nhy1cGun+Rzxa5R)MY2qOR+byUA3eF$YtPVt8No=;1NkbnmK_6(>* zzrW6qK|k5I`A8&9%A^#A{&89T7~H@C_n=Q51OPERe43<)@|)%LVccxaGGzR@fb1nZ zS40ZITb`0QU~rX~0jsgnYF&i?y0hM9vwIz$&*k)UUB~r!5ktVdD*)u*uu>*tjYG{9 zxJdE|5dZ}IAJTxlAd3czkE?ER6uS-h$bFg|jlN{n6Mxw;=J|-6`c&+um#kA`toHBk ze>e6ujZMS&RG##UFE?Y(0sdQ(X&^{;^M+0W->H}2G#&UW(_ugYD1r7gu0E}?Cs~wg z54zCq?kNckjM=bjx_gvk2mJiYG?pucMFgh1EEdJ9z*%6FBqE(~Z94X1Zp|E9dW^M} z)5{u5#U9u^`ort0Q4A{@VpFy)yxzvdZK~Tq=AWajwl`t`D#N?O4uoE9M$N=C^O;ns zsfZ2jzl8`nrijr|i+je+Z=bRko0AOQourq6Jrp*1wuDQD=RnoLHzauK_V z_x|W3e(sKu?InJL%YNHfIYHX&9w`Puev?q^r_Ynxu(t&+2|*zwE^tRm(Y>$J=ji|D z-nx}f5d_3%E1)dl_IJ^Npl3lo5bQLU4h7AjQ2{=Kj`B{hm?YS`fbn`;r%H0}>) z636{wNv7T`ZhzOlul-zqrRRGhztg7U;#nGgWJZ4+iLn#_ZyrdEP=vtv`p)D&<9mKe zUGR=R#m9o@^eHVv$7C)nUU0mic){`fv7*&$G*8N=3F(L^b_7(zmFcDNq|nQ9`&GRw zgE0_{6rfJ2@bcmHI>|P=eNY+@>;rC!!y5g~N!xVsMvm*L^LgZLZLWepTpw%lc_beR zf~J?3VenKiN|#-7ccx%_)RI1X@syN>Ok`JU+a4%}G!jv|iW0FDKUNS5EKA}OBZyKg zbsD9lG-E?IhBAC{hiao%p^Q{cdb31S_C9wssNQTW%O%F~sOIK_gW@PvEH~DvWis0- zah7|d@?=xeaOl9(akc3Bnm|vtIfRMh@#|n%*(FfQUvJK-9Vb!My5u}prV-U$#dM&0 zDNubRyHxzAr?9<=|HQ&#b)+n#w22RwHG<}kCgqn22x1pi)W8^A3_OIJ>g0pEh$B3)6=W5r#UUa9;C;}F%o zn2=&j=H(w}?q){ilnkRAr}{`Lq7`jQ+Rb}>04G(wj^^h?aC}H*C}L_7O3WFy7_I#y z(gsA)w4W+!@ZOc%8DuOB=fj1G`NYEHe6q|LJDDH@UJ%y81&LZ>L9#5#PIB+c)s|BR z+PlTCBQ54i8`lfn9DMr39P#wYIkL>z!ed0wKk-n>RXQOd_i4D0>82;Khg?Ma|HB8z zYc-zIB;_4er)k<*Fy(n1qW_X44ItmQj2%Bf*e#z05MSJPru6T#q!eua8rFvgb)Cyf zSEeo|vB5PAL+B%EF|qtII=D6p?LMZ%^M8^G2+mtbm)MfT@GC$*5o1cqxjH+>MO! z{#qOjwQ=4+``jvH)iL+JxcFKphHe-NF#5TC)xrLc3d-2(DklO;RbiaKmMau$VOT$p zm@=}uM-AA+3b~%Y#H4}?D7LGD?F#k5M1TAT8Hs4;5VJ!nWpO#e(ZepReNgIiHqmZy z%{0T>%4E=(tT5|U1~lc!SkV(uq@;n8?R4A!zn;9G?O#o6NBaOsVeS?Q?^%C)1yze@ zEjrJ(*+VZDhum2V5Ug9ll0(0ssfwnCFY4@_Z=&iEgRc$WugZR^#f{ItP)ByumS#ML zzZslBmMkWHxEXc6g)36@zZ3+hp&laL^M7+|e&PL=zqCI+IoJB>*OfVl6=utNgXQrJ zbwo0uL5GmnK~#;@hy)YaK@fqgwcOUlW`voh82&9?A^ZMEx>#1!JC7VI^YBV>zotc$ z)z-+xh)LgI@V%`jSu{-<(;mrmaz0R$LFbGs{cFy`uRd&Fz#gGA0(H|pJ+gW6CC+mL zBH-|9kr>o{>ZUpIhk0-F;s0bQ2JMP(9&_xoF^jC~w{+PnQxxTY_WP9lzHjTz=LwyV z7-4&qjG7Kf2@`0n%ZBv^Om0@W{eWNt+@LV`8|?wdYggI!I&+W}kQCN6(j(1<)4;OT zKyR;+(@DyNs79SF1f7#298l=c>c%R24okeGd8H;ogYE0bz%ZH7(UuB?lKQ!$<>S%OimdrpAH!3)%c#0ZBiW)MZk@;T5OH`x0wy~0M-aXWo zA}hjiL?n=dmn&Bxg@T;GS#V*0lpBo4O)NV`k6_?!z7KQ`T!?&QLnurkNkQ&1ZLX+?73V zd~%RRbo^#`$ro&Ecf2mxSG+QEmVC-Df+nz~nz+2ZzbqDaC=)mqIki-eu^^jcg`jR5 z&HGv^t4vf>R+d#>{Z`+|-|D+HKV@r08mAE59riu|e)df4Un`&!8Tcg^V;=-9(HG3i zXEdx$?8$q*2^7`bE*(ac)`&+NtX6-5g*C^6`7|*d_&V2>6t&3ww+%i^y>BS>#D{JG z$l1kJ6Z-DL?-N-7+p#F1Lv}zF;BMI)dhWgQh$=&~@^G_2!?^>s*-Q1zsPE$i2JF@V z>!i|Hk;UROcAA)o{EL`Y*HC}m6U&w+4Rg&8-x^KYG7&W$I~5d@M*atSC~?(%ve)VI z85Ov1WEsew&`cO#?7n{Lk@$>TM)z>oC`baUf~YDxz(GKSm&oaX6q)@wwvDg&j>l;+43CPE@(*0tZTr6ybKt4v4JfztMIi*)In5riMvcs^Yd+!g;i*J`GOc-NmKu@^bN&I%1qBN{ zzs!m?n!7qLx8Sj|s57H7MrzqBUC$j+A`8Emc}DRfxQmolXJ~JM$eiQ2ia6Veo&1Nr z;771WET!THTFtVQXhWcm>$H9s!2njolz?`&G2VZ}60>|urCdvfygGl{iu)^h@oKtI zxa|!~Sq3`&ak`h96ui_&i-;v70g>nC~?~cJK%8pn2msj61{i!g8Z;a1`u3UVEoL zSNi9Rbg3iA0`W+A^oK)Rp$q?B^!LmE#K-b15TCI}}Qm@!S zEop|0MCtgKI2)#|T#r++ZE|J&l!PY3&bI~cfj;i4?zcT19Fn!eaT0=)#;TCC6ytEt zjO;lhDt`9HNDTX_BjYL8D=Uzf*RX=jYjS*eRU`b?S80W>xXG(F$5kiN3%ou9Bfk1; z9rL~F`U$@JSM~z&Kpyp9Spf}ob^TLp|G4JT+zNeX>$DXM{P`n5Dkl)@oMp*7FXxhR zGy}(NA|Hou$j)(V$kmex)|ZCdjkBq0^Elep8V?mci|Sp7@*L2SIS-!r=K*n^6Zo!} z^@}GeKx)-I*>w51+L63I3L%eK3>!OPcEUbi-~^_QgZR+#4O4#8<%P?&ac_oX37hwusPkKeMkz_EHlR9!6?jGm4Xwq)~ zT92Gg3&BwtT)Z^@uIf`Z{9|W&Gy`oy2m2IK{h>m%tUHwca3B5G1$g}daOA98U<;EW zE1=Iu71UYzql_M5z?$>Lkcy&n6)r@_zyMW1s=sAluC|(G{-F?YXp!2hF#%Kx;PXR%u~$va?QLF+?1YLP8e!FN`@PrK)eA z-n$6&?ZK9>C7tbHVfhRsrPdjj`q{^MCMvLa!jeXa`-uP>2-9Y)XZOoYry6Z`kCj%v z2yIPah5)JMXH#~m^l$}fmu`vxUVlUdVqu!VfgW53sfGzQ7N zr&#Kf*(=Ni|4c}}l_LKxO^cVQ80Z;oVp8jg%9APJlhBXTBd4LT>r4N>sgv4$pMClo zCRE8;Y>(gU(sh)u7+6GIpGe&$k$2}xalkwKuZn2-yfX$`%LmKT57vox6m`ga`9Rex z7haBRjqBg(RPVlVfL1ZiBacC8zgnK_uCtYn5j zZ*F`K zECFu18lbFzxO+xv3uBII{W5sz!)TwjF-486DFf$TD+S;{#yMMMM}U@GH&b$C=iBPH z-;{cj*Ui#RPVjF@!HjPh=pBYo0Bhp)j~st}X#8~^@&9NXka#J7Jv@K4obGch#YxTY zZ*od>&ZqWcFs?ZtZ1O$tCgt_{v!nqE)dzf_0Mw%20`9&G4ne3WeQ*^TM*)T^-8?~h zZIu;^ofKDXADxerY}N#6Fl?vpf+(7-xf1hK+U(I&fiBDKSita=*b1g&(jIIAl2X&w zi@Rx4jXC_w-$8ntjgBg9r;yfuP$dkm}2A_;lfPZJyMXGTh3<*_GfFh2{|?1np4xn1D0M4wlIAHN8f|lIc+{Xo3{|K0Jx_n z8od03MzzfVwVVGRtx=lr?Yy=oxLh6_D#6(yd(Av5vctS`BY^$u{=V+-(Qo05OcHxoR!m}*6HUeMJ?7YU4=|iuIfikzMSDm#qU~)(NDY2GoLcV_T{#E2gG`oP za#W>U6t-8)_@m@JdfLcVT_kOoR(!T)F7pSdkmEo7FeXRkji$`X(`sSJ7YJPPK1V-W<2k zT&aD|cH&?Mj&S>I?Ep|emwzlauTtUr>%NgL1%Ge$?t6~QUvz4}yq|>f@wKIa4U%FL z;}qtZgHK;ON!b$@{s*u`x6l9N(QO-@l<%NU3=Pk3U9|(xI!{g6^%B7bIdcyXr_JEV z_aliNjqPdHX!;v`)_;_g|J9+$9{2bGYi8h|Xs1F=ag7%o<;ZtWrl7(`f8AZUir%vT z8}LBTE#$8rm%lMDyuujQm6t51DAS|`b3 z+s_s^4$kO`g;82Hzg z(zbSq>9n7HQ2l)EjdBg(2kh0&Aoucfm(W`k-P5q3kwx>uj-Vrie;@J$V6uZN4JPy7 zOn#At8;(v)XncKx7-6Al-}CSiW*5B^lu9B!!7TPqNtfAE076kYcv<(OB&aVky`q1b zy+5ALi9ZS!j(b+C=u!YmSTTZg>{v(}--)aYIS|zB5dq$B?zp{UW{II)aPAe>@`4>? zxnO^omjHwXHme1;)B@{ts@&Z32>D-t&&z}1o$Oos+MeeDuOj9Cu#=^CtmOyP{f`5@ z!IZoAMo~M)FT@7==d}md!rd5^zq(&s08Tn+&Qu9?QVRnK338f0NL)v+Yuzw1MQ1wS zAn&*P#^_m>jncLXckpXYqsw_R-F5j~*oB&pf5pc?2&4-8Q160JXnD0WU z$%v6s>fiG_y(<_xh0Ae9;s97w*7F|^aN&-G5;5MJT{!aUM(df?hwey2@rOQAwSfP> zmte&fY>Fk_@f1>n9c&Bg-J@i=U_6NS80`v(fRBxX+`QT=vdO+9jBUh_M6_^B9J@Qr zYjO??W8}VmyiEihocQJ@fwjewJdK9N#5cE~w`I0I3Pj>@e1<;a zN$gVQGW$leH&GJT6$oHWx6|Y1pj*K&OL~>V{*iDv6yeGo67`41syC|ZvTuphMDW#U z06oqamI<#~qo~0SC=$eBFnFce@_F5{BG|*B=B`2l|X5C7=_Gjej+s{@PPJ4@1HdbEZNJKc< zhXnxQs~oGuCw)9L^U`^67~IT2o`&&F&jm}v1ETPlV^Wt&EJt-kgrc=l2Be|Or z^956aEtC*_P$_omC6+~mMB0K8U$GbvHU+Sz^{&1?kpK8|$oPKrf~Cwqa-0f$x&F&X zPb_-B{vo67L-O)45%S>+ayfVi6X-`z{B!+(@#W!L%Kk?$pu$HkD5Tsk>eHGth9JzB z4rzMQL*?n?F9OWx>k}2a zMX&n)#yjyQiVx@JHd4Dv(p--Q?P|ZbbcMI|-)VXqG~h7?j((BWQ}m%qm>f-N3WKM3 zL#6ak|00g?&2QVdOTqMeo|u5o*KGQ0Y9Uh?uNe0^b7r$}t6;sY+{ zAnkZinSVzok!jZo&Fof6-NIfo7n{Z8XljqEdo5;-X@K!u zWF68;%6$(a+HoVUryc24+B#O_3c<^ngy#W5m<74|rZTx3VmURpDAGsAjSJry{TDxTnE2ZW| zwhGZ&qq)aa1nhp=Y@lAbDZ#vVgAn1K_u#F2s+ayrQ{Z2pDkb~-xy*h^q%A=<1z8C) z=<}JqRjw)&Kdm`LGIV{gBx-V6(Nu6-uram}id_sOkkjlRiDy*_6Xa_`dA@Hf>~$q@ z_v2ps0KL(#fpJi)#=L8{5ek|uCue}kQHtCp^>%#F{6(sI$yVl1$Xq|nQ@`jG=EqEX}dn$s8X|PV>V*RX<7P(D}ZzT?w(vN^mTp~`Zm88`dpgAG^h=L zjHAF1aslQpX6UN?(GCF^3=7HVN5<-xk!nRq(bRUUSnz9=7yMQ=YdjApqEIU0g^**y z*SwH9!PU&JQzL(QAUZy|1wBD0%lzHZ_)TEzPrA&V#5dj zW*C_7u6~qN09Dv0JC07%vaAPAh#k-sjo-4hZwE7hOM3Xk^(XcCn76Zg0)ci zAF)53SJu46h2j@;v^s;S?@B07V#>Wska(PoL=h&*_{CmvQ#W$$sf+Wr_yb^o#~ z0$=gNZqqwccAIpj1&$jXBUT!%>a)Wbl$1F*3AtCOBfW_vHCrehypU8hE| zCeUKqO8~_TGYTE5Am(@%)9v2u+WoX3y)t)i=!$&H_V3?zS4!~e-sWmm5Gmk+9h1($ z*_&vmXX0a&6DW;%V3Uv&8cA1;KXo@w+gmoQ4rg=n>Jb>E9CtNcB4!HiR6x;~Sx0w) z0Zl+1JXEM<{X!1c$5ai7*J{B~I>b@nmp-9B5P_NG%4v$}%C^E&4rN-hBM^XKxU(YV zcZ+`Nja%QidtAKc7Dr&mTj5%DNLdm+;iAqu%)xOUP%G=vHaI~gyeN;bHC;!R>xy-9 z5Gae9ywO1EV)U!QapSt!7aJ!+k&qVeo^40x$&IaL3Tjq*P6@CZt4o(_OP`tneMY)8 zsmt2BFoV3>_WDiqZGLzIpj>eF>;eHmE-5^&Ej<(so+3)cBCG#xjo_K8y;t`t^>EZ;TNtuM=q@Zx%Y*l1b7R~OV-!cS3WS$+ny`)W54KJ6-`U@ zj&k<>Tb%9K*vVcUruio*eQnIS-dZzTp0H;1nbEeu4%|f{9IIW_)w{_lh>N1*A!ebN z9^LF-JPU$0BKlbQdhATk91 z`a%+gsuZ>gihsMxJ)uSfD>{zt17j1Mob0=DwVGy+(ye0_3I#f^l)0)zd5wh0kvXTH z$!2VG1Z84quK8|StFPAj`d_zBK@@7gR@q_3^SLM(-2};&unmw6l03Xkf_PvH#>Gz* zr|tTchuP|WgpW*dL;qm&6B~DAEm(5+xNz#zLCo7Nk?kC{5dydI5+8n52ad%~k9wCc~CnDoGB}nI6D}N?QLg3lyQPo$0%K<5c#(?tVQCJNj zTD)>ZwzeMa#{*up>+kAsJG0>1k^zIolfj{<=%d2OQua`bkJqo zJ$>?o@`#3Yv$aa&qw+p(-XV6H?^rrKJxSMxLFUOhKWJ-2^nMC2k@e(Nl7`BdrnbOo zJ%eisZ-O_p=`8Nb4sNM&N(|Qm=;?pzY|m=Acbm`s#xOTmSLR*~2?3!`#&^tp+uORf zQvrRL(!M|06{9ePd&cDrb}A+=rQVG}Au zKAbv)3r_7%pf@c5cR?GE(dB}0R@9cyV#Z-$ zck&Ik-enww-wT={v{~uE%kH43sv+y^fG${CAGPC1QC5pO>({h)A4|V&A??ZHLC^nn z?)A8O;8f!%fCQ#fQCCE?Q2eZoP%PG=%jIhviF4)eIuoR`h%TaTFDaI z`oJkgonF!wfEC1^8gIcK!Jnj_c$`h2b5BzRr4=;Z7odCgsc0|EW zTQ{?WfTbgcGZVGcsZb))da^iQS;MS_i1poMsJuw1kjODVGem+GD&wyQLJG)_UoMyn z1{30oEA5yC)*JE&!;-@dsg7JWhH1Cq{G*(>e(XD4d0~*-P1y}fj*V6)mDM1vDAA?83$MB*s>{K*O za-Oeu&qR1pL*}`*&+|oz5q@8pDRqn}<9d|@-;Tzm&K!6kB|*(hNMZAEf4bo)2io7n zVW7WpLK8(0nh0AqYhw<{EO~0r3iK*MWO3NCA)Ip=2D6T0wa#iUhCfk=P7wjaR`YD2 zcP1Jk4!+&=fBmxh{k~_|rp+r_5hmb=PDD z3|0U@q3@LIH{gty@<98s98sHbG^}A*TXpp_7esI6kvg14>}}mdY=xcDr!q}*fQn8n zcmdHw-?C-|c_+o`xp{daE`^9!!h414XK1S;x@!zjsvVXb;8Unx{}WaDD5vSDdrDCg zVHl9xiy@IqPm z0|C@US$!&~PI4ha5NalG8yq)HW(#x5*Yp{1_@Q2cy*=WkKSBsgDu1eP|iHx{fQl8Y-@E+Qt*FgbIVm@YM>L zzb{4IrFaNl-Ymb)+EHwoisX%s~;-Krc!j7xaq8&M148)V4KBzIf28vX$2)!qv*XOc4)=3ouid8>cD;XZdRm`*RJdci={z&B&%MHE z-+kuNpA~@iU7y?Z_lFD`{EZTeD~&dHuFs>abucy3=`Gj#gEEX%dQHgO07`k z921i9-YQk?DXkf1K|qli_NdDHdN^awf}qAUmL+G^;!J7)FNkVhgCHD)#Wb=JfMG1a z%~B6ObQ6a+LouF#;q;Vz@U#}=n8`3`<94mdZn&u=I_5Kz)L;jLkM4{{1j%Sn=fZdl z%Q2GF!=5HK1f=@1cXzDjZ%l5EI=Zloj2s z17JV(vOXO9lnZ$-i-u4?BxrnO8Z>3xsx;xCD>3TIM1*vtqPTdtbJt^~ghLL6i*-2C zIfqnFngSZ}@*tGR5Xf1jxIf~lv2A%C#e$<10Q3fTe1@_Nq3!>4TP~V{Z?T0%2|zy2 zKf&!r<~v}qQOCM+8O%Gw$U&kDXTU&mRSA^PKqEyd4XQfVFz%^V--sA1SImbj+CTc{ z)nMr`J+W-su25z3{e3D7a~3&vvW-D3JK9D{QrUV$LC>ssDkg_zwWbvuJCMjSCXCN;q7wDiNgErCD+I z#rEJ$C|gG7Ks&-%YE9k+OcU>$!wPwM@kQmui`!ns1tumbFhMDS;pCkjSW9YoTYH~= zQ+)M{_jrD)a2b-LJomFc$P7S7SBf4=b)Ms?MhR806|kGA-JW0nHg4az{`aVN$%Ny( zj+2J}!q3<%r)q8*x-NclE-K@p()Do`cjHT}iZ9pxd5k#0yj{Df_(keXFYV*EtS-}0q+b}Sw z_iCHyX1a`P_iXe_I|}l zn+R?(w+lzDy|8OCRct~Or4Pg*36R+Pl~6yGXe8eLrE4u~-?{aNc60{rD!KvhqIj!P zo_Ex@2@^(r(cgO}@JWgSFkUZCIL{PN6BPaiqlp@!1ILN!>v%Qgk)oOv?Y zK&#FicO%*8xUwSA$milN$^{FWPFsF`_Zx%8uW<{P#GHE8Is@po==Jc$a%a#)VKX(k z;$`|4+?wSZK?xUm${bI2pJSz~iSxD5b@o}S3e5C2JBSM;X$6mhBlrSL(S$A3HT29! z*-#n9F8&m{KJi8B`bQUxA7<{GsJim~^WCAsCdK0+ynMZ}gK(^|N~`et7{%AcA6XNc-k z)V4|I$5hHu2k7`sB@Doetgbosr2r&TaHCND-pOdE=_+A|Ptqq(R_YauYS>8EmOT&=gV$I)|2(_Ezq6u4b_w!Bt{`~!3z03UX$vwqZjn=h|uwc)3JU$4E zkR1eTRw=T3&!wZwFEY>C6^ zdEs|`)~_$wMitEh)Kl|bM&nR&B05Z6YBB*=cmKa+&&Am~zy*5DAgn)?|0x+nJcsnI zX!|CU-@xyDZ7Fx+?)6yykK&5U8%H@#&mz?JOIG$zFYJ9R@)ofhz)X=q>!R@~$V*YMEyF{th?!iPi@4 zdSR{n_xj#Yh0_4@ll5mAUvfylo=G$!4xg_uVb?b5=UUNcgwf6_+R9`d_jlr4ztcuDSP5>-f|52|Q%Rg{&{|2%j7WrBEqn0#I+m+1-C z>HeKJpavs%mmq$Mz}n9L-EH{ruD<8Ea*275tKdgl!cdp7b){E@=(Kw8qpi_a=u)ut>nzDkR` zY)5C>+vSm2*{fu(b-t>)=i&~^EYW1j*IVtT>a}gz-p3@ZME~5y+RLR@zlS^XSDC)j2P57Q>l z3NUrOZw3L86vwBCbon_l*M}q;`1r z$ws2A5~J8U{ueKxF{5gkQ$B6S`uoj~4r5K()6kcX9aQ$cy!-o395XF(<=WHkEIR+2 z{(cfC|3E=!0qygGbgEU3+AaI3mG^{p3LFi0nm_GMVPBY^dKYS?s!H`=H*PU~AjVX$ z7F7lCS!-XdhO1uiEXk{9Kk49C$#nInh;tO5b?MVrL*2lJ38B{zNg`JDKy%%)p#dVXK3?GQ1`yOlIUMhqy-}?Famy;al zpKu7i%v4`I|MG~}j!Q7v#NR0{^jsgI{~T$zI2TJ_33ht-p|OPNESA{%Vj|9_$KUl^Bb7os2E<|t!>aB8@jA8Mi-EbbLz3S+#5a0fq-^VXl&;W}I^p;5)g}ewFHWL*W+sXytc@E1om+T{;m(s>Hgz zG9WiOWxGnj$YocO0g(isl*I&zW;MVpX|JxI6w}h3N}g6)xA;{`u4v#tr8Q3FmNtCh zK_HhLRMI=2Slx&h-~Fc8#1Y_VMLOHl7yb!dasRJ%6}7K1(wx%J$v%+@c!Q6FxyPiX z=n?QJdv#>(2Mo{kUIV( zstKw^Y`9I=s|JjH*Uy{#j4rYVnpKdZA!nZar!*nsDvm-gVw%zrBnZ+BQbK^!YnTdt zm5x_5pMiY#!6uSlq4_mV>p7+-MpYu^_#CW2E@`Nwso!EuI7je?Mi)tQz%TGA`N%9u z*sCH*64qdMOcWR3TYF}OZ{5A&HA$b+>Zt0H5|Y+%SUjnOY35fW^f@pcnGL9cyGQH%2EMBrQW=&&Qw~~re(DXZceTLv&i}zkqW{(hT^T>MnuBi zffKC8^&{f9E*NkA%54|j4;*Y8Lm<9JP`pjP!7kzd2-8c_ohKvl=K(acr*}vJ*pCDxAaBnzcHQozYe zb;(!PX6ggvxO-1tZAXKD&YF+&41BdFQ~yJFgGx}Yh)mZ~lsHw;|0f5;xUwgF$_P4` z^6GzNkBD?znO^&T<2+15eSO0J$}^!-%}B+wx8H_K~QG>%0HXJ!RgI8(6(S9VeuMRD zryeAry>{V6ha}SGd;CjVbkcQe$ls@>F(1dDMQ-lM;w^Ajk?F|Xr?dbvyb$*$3Rb_& z_W=IjkpP|4Ql`Qrkzlxwu!I*X)2MGOshNRlBr1YwTe*E59&5571U ze+2`l5DFeeb)7}YrOv?Oy7HIACCJ|MoT(T!wYTd|4StA2m3@r@l+DhzdJKS4GhUks zaZd)|xdPjH^F`)T=hI>!8erTa*+V0C-5#fHua1&s|62v8%$Xp(9Z4r4gs(rONa}o9 zI5|FjKLcCuKIE&rPz!m_rRXJ$Y}r(S)>pSZw3Gj##}kalZM}Yde-|IJz2~YAMJJKM zw|n%Rhoo*Ki~tBFJoUdQnL*$Z6t#*n><9`nB3Gz4H&2?zV|!8tBEz6nuRl1Cq?$-* z^%&01)Zrw$vP?7W&54z!*FkocGZWd|e&uh4{;uyzf`n)=$e-P=MC4X>Cdd&xuBmWR ztyQC)={EM)1D_qh(eZ$(3hB4A#VP33yWn+r;7^3rCM8Spr zucf6ft5O5lzaJ94XQh!3La-yWY_E&@#OaXZ_7pCYzD?x8w8vD`fX zclS2N#`+9#e{6L|psCNU!d5!N)##y3k|0f@fBwJ z4M(qu548Uvp}$M-Z&=jpOE1xou4Vygjoy`H6VB&dobEr7Th9 z80rGBLdsnbeZZDQ4C}A)vlbcy05cFuEC>fQ(3)9#@B?kM+(WS%Jjgc9B%M$OP)~QZ z$Hi9c!QM&B^B%#`Yu%ppNWuf81<`IZC2T?>c%xyCI&KiS6~rjexwo3*Vk2H%A1a3i zYiOn4=E7)$>CRqWin^=+=K@^2@Tk>lreQW;+=g@tc*`+pQ}c%YFa$7yOx^{QGd+o~ zk$qu%J8oGxEmd9S1174p-K#rpVOhWi#)DL+N)6vj4msHCwPC0ef}}1Sp4EwksM9D5 zL;vu^Iz&YwLmAJnyQODqF zJr^OrYa&6a@R*L?1R+)!+(lQF06R5zH%uhECu2d}7|zDpnhp^0P=Fl3P$tDmLeDe{ zywpc99JgPz5IyN>6J6Vy2 zl~jwH^Zj(I^EZd5lCb>bE~plNyG1?uc8JnExDk(Dj~8tOi^m;PdlDYR5V)oB_~vP4 zd78vYh%XQnwFPe{Ov`p}QmEMdERei{y@^KA^PeT}bjr2<3!?~rzE7tX-M+LSoNx}G z&mIuM?Yv@MVZ&$0YA?CU@ZG70$&?t*a!p4Z@YOv)wb(}O1fTUwaBy`cbd%|J@QQlR z09WeYV1;n4Z*+R)Ii)qn{u!eVn^vXH2B_HhU`m&^LrNFvI8Ml3n zP@E^k|Sa8I;tHMm?*h9>eks;qF+YO1>&tjda+=v;8}+Tc^|su8B{X+eZ& zdnXg+E6B^g@jbZ;xx*4X5BvX1kZ<_1;j~u&<5b09CoN*M2WCUqQphP^V z?d1?=tP$A5`@<&keY4i}t>_+(QeMqWar5?EY6)rW^A?9{xLz{G$rpbZD;55s^YuMp zHjNiWfr>WciVvE>(V0x?%pP~BNWwBWa-X#Li354Z>3E$K_i|;TRN*&E$xxjO!}JA> zCF|Zdm6yAmXzp$fW%X@H3IBAZ`4aZmgE_q1na}qy1?g1( z3G5=8HWdG~)i@A7OZCGDWWu6F?AT%CEYc=1KF%6Q_1vQ!y%F|JpP}s+o%yWku_rR9 z2;<&OAuZ!8Z_J_42eXWd%GErFI!U+Jdf#|jXYB=i)kWDoa$W7p@Lr%j-T5WhKHxiY zlYOH`&lQtExoEukVq#t!=Os$Al7Fh2F8E!S=a9bVWeHvVxQ*LG6MxSu^SPFknK-1r z8ik-9rrrsC6`g6NN^qb)CumXOj`?VZRN-sX&(*j><|~7A)V_B@FbOweR+i|UT_tkXQdds8e$&|=Li=^x;)Tm4=?XC=4Rj+FN!;GdH9P=sl z$iFMtD4il>k05yBEBN5}maKi(D0V>eFh4LP>sB_F$9YP#k`Ji(gx;-lpo1|)s=hzK zIZL>|3$B`8s&ShP=#U#Vvcuia z_*NfiT}HS<(Dnx)He5h^P7rYG%wK^b{9$J-fGqF35Py2ja!x z)g_$n5Av@Xs3x-{8_QviSTzv~Ju9;%@Oar+RWZ(L6!3yrp*> zTMb)(g>wlRYzgeJRT)!OJ>u;|xmOPK_DHQzV@d$n@9wgN12q9v(0riy28F9Xr_3Qf zK1qaH6L0(T%#OGB9b-$8Oz@;C(4O}f8y6fbo}ca=IXz62NHiu#{%PCl*H*Hsmj$wt z8=pT^vtXO$$_BygJ(~%fnIeI+oap5Q0Io{wX_&wa|1z4bMuQ#lD*%tM4ZZ&1LLJBR z>3!Pz<mn_^>OvuE+GgB|U!MP_tFvZCt?3 znNfrcqyJY|VCOwPV*?4K$9of~iO^`EJhVMx6BjcnFJ?Esfk_GhmQHNsDE}*4?Cwu<= zXxJ+ z5br^-Jl(=H3(_?f=<;5qMm8-|Ua!eKYpC?XnSS|2u>5Pova_3G8R=7eJIg-k%;671 zEF$GTI-bi;bceK9f-g4+CdW}58+j$>=-Y*f)C488paNg~h;e?J0eEo?-Q%?%s6`XA znDeVD@^hZY9up6L?MEvMcu8f*&uFD`vet4&8=4`ymaOmq4nI#1pD_HE(D3xU1$xpo zh+u%}USC#C*K32GJ(2g<#qD&H$ zyyH=%Pi?p@M$c6DmT2hMo~I}Gf>RUiQy^gSydj-1?{RzS)3p*qn~?w}`qScN?ey%` z4XXboGFm$NjZZ>%JTA!aOT(7!U>MjlgG=<+kJPH4zHS5GESuM+oC15OP`LAdLb;Ta zl5xX(GU@uX`$__1Ro|+KjEUm}#RU;mk~~T(fu47q*o;wB5)(Eu%y33-TokU*=6EJf zl=eymBtEO{6qzQPNlAxYQx9X`-!Ey|k6dWS0V;`;3qrcG*R9N57SHsJ16k)hzyW-G zL?UOr{t8>pQ=el0l<9ccupO#*pnvu_9s9IIeYq7TEMrPQ@GLVoA0?P2g1t%0tKpe0H4I3z+u)R)0aG z@V(`_{^r0dwjIwbe{&h@AsPA0&(kK%L)xm_5_o)TZPlT)XG880O&9@nu#0yZ*KY6t zwPia}!`wWA7*M?fx#g95#=0_muV%hK5e6MqCI<|G2H8RT{tx3NIu72eI`6N)R|j=K zTyh~Kpb&H`%4uy@BXm0jc_ua8012p}31oU51HcTV5%!PA>xe^+l2XVe01<_s=-lEE zG3e&z7LJHXDL?GXaIm#-d}&nG(Z=b~YM=?etyc})3enFt5>3q&dQs<)d#5DRe$q=C zixM1v8>rDwD>YjZwTwapmwF(hfkaqa^L>Mu;fmrcrTFeLC70x50&HNOE5XA{JBpy$EHr~K)v=A^e#XniDM?R(HO zMEKE2rZX(RsGa7e!!pfm(oFO%CCPe!nNo65ZIXGnEaVG+dd7* z9g)ueDo*_x?P(pHJI?JV%?{bu30n$NQ^+1^IoGkBHfzgjgsBjbss07*cG2>Y2>yTO zUI+|3n`pQ0g+T)ew%r&wBCNHZZE zLk(JB+pKFM1*}z5!6dj;qgNkXDSi%`CIgpih*4trZ0cm$0(GBpjr^*?a|^#m%WsDb zY#loSExY#M9SE}P7##H07N>u=468zQl;;kfShX?A0>ETesnK;Rb4O#H()xIOT^7EY z%P~`!wGLIW3CwV#!17MM8;*K+X;vi7WnhyY??4hV2*1=_<%?L^6zn8$(H8u=yC8pY zcAPg0^4W1GMwyO*Fs%263Sw>zN9xpv-l&tyXGRN0T8eZ+Z_MRi^~Dhl%x=(7E>C-N zuI$+ZJ8Zj_K{>%myT)Zh0w$%jYc5y9n8%3aBOi7JItM1YgAcoqWlUvNJ<<;z|Kt>W z(XCK-qb>cag*TMeB>e578l%?8#_oKHU77&)2;ey&v=vG0uRA^2dZ5V*j5~%2=Y5v-`YMDcRL4X0ivi_MHui;!F)CbcfCeVZ8mgGN!?- z#?eTyRCH6qdkL@QoC9)>H)@T>=-gv&%ZUUOwW3`5rsEGH8Gy|xhj!?@szwf9dl13# zpS{^C#~622bXDVsfch^5Ci(;2E%!+%)945{F^hH)8VLHn{XdULYgrhx5Jha@`!h7w zE4LDXK1^PMbe=KqHU~;)iQd+kx{!P9i9ahy9D=NNK%?}3lGav?jr=>3c0n9(^L#bspbmuB4v^~rg+eC)(lE_f_Q@K@#kCL0_aZSmk>kR-_` z`WRE==U@FP5q$+nGQ{K~8tdHA<_>N1NP3*pXvA@?A)uDT-TCDDXK58nxcp|jMN~@L zU*Dd6a-J>6aCUUyRAGMd`eP%@hrz>0UOmR2H@pgdkhN8 za|rBFsDz_gvAXAcx%HYnTXTv|TZ9e4wbF0{YRT;@8!Xg_!whTS_$Ye`Q&;wJeaMd- ztu&fcFsRiiW9NZ)eztttmAd%z!u9S?PGPBGr@rD(Awc>%=QSt3ktS-F^tK%z_g3G- zt3Q8oKm^fynYv~|fvBGIEQifc(>!8E@jI};UU|w!V7Bb(xu7Fc&)Xf^=m`kGFYV`@ zg3dNHyw}_c`H2hPf#_-gM?kp0AtfTT*DkAhCnYWgbG#r3oR(I`D}JNbmucTPBs*J@linY6{%2 z49IXH#jg6`5N+Sd_fZ-vi6{kX_`Jqo#&FZ+$FFm?_0=}kJ0s6fylV8>maDMWkX(X< zi0D5##%y6e(?;8?vr@ckxeHBdBUsD7sg2w9c^lt&j7jK25271H_##B6 zK@t3qx!NU(70mh7Vs7%kSZ^o)_BE-xoR3x^n{~U*N?ye*$-9hbkorST2v^o4kcgU< zsb17BP!lvEY_!rF*iVq|XM}fC)69*~$vcKjM-pa2DHm}uDTYEdr@?m~+fldFL!GC`6c=nxmvV=2%%&Mse#Q{XLq>nD1dq7CQ zjFQ16WTxKYerss=>{6U}x;g0eP6d7^sv8Zbbabxq+XM*Ea+WNJuDy$_^;%(H~qoFyha&j?qNpb0f^aE zOWdyLbFp#OunNx*v};8fl4&?UkX2wUcx$f;R?X#L5H5R9EpbV5d|o9)jZ(%Xo*p~| zjw_(`m`7C5q>;8|96AdGgVoEJc@?3a6Av)HC=YA*n%vO;p{5~Y0^iBEe&2?soUdM_ zM+oTv%HleQNZ?#0)fU3!*G+OI`x!fn$)3JhjECY*d)S1K@?IQaHb?Ojv(26iR^p8C zaDL(8{Guj|LDj5R(q^*IrN~w5fwjOcxbR~Y%cdRp>GJp#eTq~{0yh4dT1h(X5hWJN zU%@fdP7A@3-Y;9+pkGoC(>tF%oB_^Fz4djFp3xNO1sl}m-d=R2a(X{?k}rDe$wL(4 zw)6pB3Dw6f`@e1dlU`H0dmlB@y{EqS`|Y>iwjXX?{dO5?7D-CTw(s}Il(5s7JgJS^ zES&DFikdp2ln8Lq=>3dp0da}bvgUO1mm084f%vAsWmA^>WZ}cy3q>-e8rs^>BLOHL(Tm>|Dd{HKiE8%PrCk)=(&u!5&-q})f zFJjwkgYk)Hr?%(ZaM=B&ch23r#Vt0(da4XLW!9XGQLi$(oKv^D)U7UcOMB&1Fk;6| znzNx4I(9B;vp`2OVtd+?bS+DN$c@sCsW~yIIMN6g?eWub!Ei z5t_?WNHNuH&1EDMeYXWRtCT|{9CG{O3ZFjRya-g)4h4l9i~AdanH&p3 zsM}w8nUTSL0>UM2vEV%B3{e&`hdRr^Ni<)h25rSE-`79VEMzftURJ;LHEk-6GB!?` z)34hX<|u2qP`hjr%NKo|gq!Qg1#!5PopmlgRQ@mV}RE4>x zjDL1|u6rF0j^*zmC6N}Yc--S8qAd%+1&EWeRk}c~CRp?A5vxRmgI9HxUZ0M5zvtF-M!52Agn3=S9qPEdDnZim%;4i>l_OH{vOMF2T$TD78J@JQ0Cb;#R} z@obUht9T}T;cKKZ3;qIob$J|ES5Joletoz-E8;i1$sN@Zx!L)xlf6fvWjFQ|IFxTM z*tJ1)Hngv)4&v9VLp_7fO#}q8+qLYh$8qfmVfI}U;=qmav@wLtq$FU8g+?XOVp#B?0gXPs=*BLPOD1$48jEiDKQ44=9e-2 zV#9T|=XXYrL+wMz7OqYc+Y!+5K+D6aJSRDO&5vmZn?Y5GPlZwcTgpKMrYFf}CU%r9 zGU)PXowpyrk7C-+O94}g-1ToViWm|jVBX=sp{|-0)5eG4%93#(a=|6 zjKx`LRG+Z#Py=UrCZw3rMwQke0(P9P8s7XnF|prF~}n?+@>d~)WrDXKS9!XB4j)v+*8pJNxc*s>Q{2A@Dn)@}8Q zgH@7=*}>37+J#BP>lR2Ti&jj}X~63`?SPtw3)DpTm}Nj>cV# z8+itcAut8A3&phEKar<rDxmRVCi9gvVE2>n#$1+t(7zT$lkWo*8Y!iXU5|h~Ls;JYA0gJLinCh6JO{N<^vD zx7gIiuWgM|OxPx18&>ec_2C4Z;8&(66Y}9|pO+8b(Va0EpB!5Ik3kw_pHFX$ z@gFE`)cM*>{}`Efv{Yo`@BPYX*O%^fd?{S#Yi_M7MDsAC97aU$!`^&caB12XTs(i> zRTnORglf*#Hu@vtaPb2a9 zqUNrvMl@YR8dGOvPC9txaBK*s__Sy>Jl-HqZw`~E<>@hZonagg!+dM}KASE?RMWan z0lW*&(O)(zWZ;E|=Y`x>wwuZz2`4JV9En{t6f4R;%dbA^CQ6j-Z^DiQIz4EuaIyP5 zqJ?y)2`*+cBQb}05i2t3V))cDwV=&Zf)0}j7U##y2y6xX`(m;X)do>yxHZZ%;$ebu z@|6fCIBk1qzAbdX#zpuqM@SFT{uNBNLD7Bx(90$qvxk3FtHCl~b?osU*lUm$P(3?) zBEy~{;J$Mq*WvECPi`rJWX>|COvJlzDOYpVnzDp&^2_8c&s*ogEhe2oyHEf1^(zyj z^V8@#MS#4wkv-3_&-N>P-HF-+tXnDHWc*;2{c5uRHq(tYnC*VXD1Qqc#PrQqtcHjA7z#Q;Zfc&OXY-jc>n@M z1{hLAkbr3RX))vT($#7hVUX{Au7SvI@OViU0bJ6mm%?KtoiF^CxB_J`bLt@(LShO7-T)xei0P=oY7*gWm>c@( zBJaXT!lOJ8d;&sJY)XIAzMAp(N5+Q$>6KT7wdWSsmpWe37FfG(U|>mt6UNNs)>QV) zX5f)MAT9V@5<8T7FudVIzQR+1f!r?Y0Lsod3L86%_&>)z+8+E)9FR03 zp0b2G!ty(`vuON8=`c*%15!?Ho431^iL(kK*c!%VGy;@P_%nS|HeU>abOq$$Ttljk z<0QBn)#)8^01mPvUhTrl45YczPfQ%_$A?ryWW1er9ndhiTK)Knd)1P_Y-)g$G`{Hs z(rPtx1t2Dew|v?zFIm2h5|K1XjPK?xIC`8vU~?6sap zFh#VhP5ntP6rRcL=2m7UsiXzvihL@r=z#-&l3X*221#@dWmRR0R?+NLv@-UjIr*U5 zyLkMMBK$)tN<;xfdCMidsnk+O)Z(YM619aeb#HSP^Gb5j(21FWLlleNumR-eME#{s zb->t#R@zDa&AYz$rZsagm2gDd#@R?Vf-&Lz-F)|!xT_~T&FPBDOk2q^rFkmyNdY7f z8OHgc}h%7QT0&_}bfyN2Z4Q;CE1293}QV<{&?hnQn6Nq0!NVUl@YopB$I zF0xgX<3zAcCg1WD0H&@Ma5nWodEQP0=4%Al7~hL6wCliKl%9N7B7j2!SRtaIP^HGO zgz=>2fLS}|OO2sRhLg??%Y-IVdGDEb%?Macy(tJvF@P920B;fvKIG*SC|M&Fo*uML`D!1eQ=C??D+U1XH+zk&s zvJ_A4JQw@e!+GY?N1pGgnE1J2ZUIF7kob05Ydz=_X@S9iN8E>WTabuA*n5)Mz52>U z>(={7%*C>bq2hgK4Pgp^{;obF(KA_2>y4%WfYJ!pqL`;;@kD!iIKS5c6{`U8%5ZPb zcFdXo_Ps88XWR=&qiBLlg=IyCPAvT$N_@V5TQAE`%ZKXpwfX$s{wL($(d+8E%&+86 z@(bH^P*#mC&vr$@*C)BQZ|IV%rl zNM0p>?8a`_S@5aP-6D#$ADIR{r{s}%o0_UgY)I0RcPqLa(Bgx;fnH)&z;s!D)vou% zJhkP$I&?nEap6c!LuFS~?59Ip8B%IeJva|(2&(?siSjv#%+4I+j>Yzmb*urGr|jkN zY@GTGrckJK=x7!H@3&`92{>u9%-><+KR|C0Ls5K~zE1O;NIciLC z;g7))1A=sFK2(66RQ7>qAxA5eXJ?lg(NwrMg$A(rjCnHOHDhNgkL`e#S`e3^nQ9R! zv6m+DW|MS~j}uA9@n~@o$m?2BK&buwZzNWeXnl~NUb1A$NK-tF^&;L{jO(D05XX4; zD%ml^be=8LUx#OEhL@?nF8g@Xo)L{9x8ON&zLneK?ys&r+^DV_ zdA#-MiY~xt1j|qUAB54<7sFlOb4S!=JL9gTHA12!UM<5%Gq{nxwit{rtCv-nPF?Eg z`-j)i7y|*;SV4%LBv4?(tmshcz?e670M*!R*ODRHg2y;-2^Kh|F$U1q3Y-ChdKUy? zqYgv7s@^QUlN$T_9n5B^0@XvA0~;wgg0I^#kgaC^1qW9`x$&%LFIVuGk!+R$4?@+7 z4cc4E7d%iYg|KWgUM-%Jg*Hra63KPrWwf`h0T?dTXM~M@QvQPgWY=Tdh1LWl3_CSL z5I;}-!l5VHhNB7=^T4)Xa08~n4%MVw>YT%VuA<`09JGN87(-Whhx0MsDW(nbVFl<_s<#KuA%lt6;eGM<7X? z*fIfm&^VO7T`&_o&QhLlgqi~$cT(OY*GxhlP9by>&iC+mm-0SUc1-L+=)p}3iZ*5w zS#1<Yc;s-#p>s&Y5Ar!15m>dn;pGqi5TvX& zqQQLS`DlB}#Yo~tcC(8BHPmK_pxgx?;+?9xWKr=ySRCJ9Zq_0%dOS2d^)jrhr+4E4 z?`%)61>%c`xUFwO1cf51e!yVX@@}C9a+OG1IUW* zULDQ+!{`&@-P^x0ak+zw%*ZXdD{c9&qU_vl;v<7?!q6BlR2R-RV@QYMb`v0P<@le) zOy%}n_U1*CR~dP|K(jOpwKoVwmT3`LnX&B4=ULgLf9na-I{l-*v)oi$yH}Zz=OTae z0?E`}tCj8JJ8s@<{>_^bFB>c5rA~ghb33$YC+qGP+}fo&aw}kvZQtI@-S@baa$SXk zZMLm!0H!T#9)p_k5^5;0EIzmEw^#-3e=T#!IaS}7BLi8Tr#HOK>2UgG!0lD{T+!1s zu%r1+W+NoIP?4mQD@~GVfOk5Ba+ziS2K-~9BlzNn6KeUN@=(4avNQmNfLtuEXh zB%(1qh-b6o$3!^5^oU>mx2Ds5-nn9wE=olSzXh7bbDsl2{m%? z=uX5^&oh^&f;s5v8e6rr5+kAxPIasC&&nbAtRty36BMIpis|ZI-vjeMRj-s%880bE z;WQKA(p&Z|`*tuvH2qrdKNrW6mk(rCVKV5cJ3Sa>MPO1dwqQ2yY=n7|?_bye;@&t= z5rVN*>k2T99x3C|Z4_4HPJlZ8i}fp{)5wBBL^*KhQQfy>bYlhN6d!HM0@sX)UURKw zm=E9=@D|X@STjikC9+U&FqZ6TED^7Y`%AQQgy8`3mYu)&;YRSmz1#9;A|u9tP{_|-e^Mm+jMg6 zMK~Xn4MdyQO=g%$F#OVDwMdrlTy{8rMw#0lB=tJ4Fr9r#D#2W!gGb!vtE;D}`*e5M zsNhlt(F8w(z2D@!s_VzKw6SdX8XxYlTCD;dRl%fC72E6X6YtOfS%nf(o9!yQ;>J{>c zGFM0h&*P*4M7=TCwd+=g^@b-}K1Nmld503w!=-Ic8o-Em-)=C1eR$)pD@ z+Ro>E)AY2nW@P{$QFW^-ahz>dp_vinU?Y0j5NN0--1$kX!_at*+RdKU?CD++Zz|S+ zo)SOZ=eo(2ZK6If3uM<;7zDbZ6XPuBW(hXz*sMkHocwUCDVydf+%i)X&dME#wJW-4 z(c~~;ZK#Xrl?OM}vYZ(?2I$JTvpk^pt>A#O36l1| zD#6{HF0}LvSAy`QGkp@i{f!d*p16_KooG9BL_AI;Z;&fPT~Q>JnqU@pW&H-<#R5ln zE6zCqS?_A}A($J~Vv(cC727=h)pBGVwB&;3D{|zzVt?tcY+3>5W?80X8E6;Zn}P}8 zE>(u7->V+SZ-1Xp$1^NDCQn3{#J{~mu)Z_CFrBGqWFw5er&-v zm12vLgF}6^u@~r&3OMdLBLT*JySS{W(IF2@3jgJmV`^I4ww@!Y3lZLSN>drk3U&Hz zZDA^;d(BsxD(Q}uK_U%nuYm*Z7_`6k%foS$g}KidZCV^kGrGWbew|-9cSUm-gVZuq zCb)ltRbP23-72b zSbys;mZJD5IJx!DO*cZ2;wS5ur|nqB`sra7yI8+Hr6YwD#PUoj@&?AbqC%d}ThHTe zzltt54f&}pIl#PAJn1eF3UXKTbh_TtSUMdcbAhD$M1MRTvZfV}5u1QqjvMJQ^}+rh zMhhHa(kkp-+kMhoo+UXmMvC{^hnO^*U>_l*NEkgix})=D=8hC+X1mc+P8-D;wlE1& zemdBKcreD@@H5t2YO6LD7@))K$z@wz*PehOqD4SUyACto%H}Qu3%7lUwobK0Y*5#&)~mSF z5X1u3!P`i2XWmE|L?Lb%Awpx9iM#&8B4iOn<*tfQBdq0$8erNdcR>=}L$~zOJyd%c z>@SC%XH0q&nO|h$8ei*17Ux<7ZVDmV*)Crd5uD8Ax52aZ#DEp+W{m)ixmE#Q7Fkx_Hx!90~sbn z<9d!8N6ZO*VgEUKhW6(ei6HZ+#n876HNwM0o7rrLhch=`#sM5cME0;+G5Bmf`8Fcp zn<<2{XH7z30m?EQ3XzfPWwKJ7rws+e?O{90ya=T#G}QGVtFzIwqS6Ey%m6J+sg`!f zp?mYyo$#X8s*B;&8QiCp1y72sOQ3eGf$>nGPGLo@6L=``0~1CVUanB#4~guwt{#;d zKNM=yy3>K4?;dq&uc-|Htl6U`?G-&>xYx)?t6DGhMw3S}IuPgv6dNNki`JoLQj=Pg z4{zm4owYK;(28k7@4;(#?Q`^)z6Iy!?Y?>m!o5N9S&^Ow6xtz`$ z`bPdEw|~E{j`Q|+DSngKlz1Mi@_*ePp;7$b97(Le+DgP!4ii_7yvpln!RXlT3&AZ4<_^S#LL zMuevNqv!rKMUSYDFokQ*&0dCKi%SQTS#p@@PP==yK7ywMtSx#a{0 z--g>ox}2RR&)-u!jKVH5F1}+k+ta6YWK<-TYtzE4S21$xLI2~lAybgM9bKM{Crqbu zIgrYE)21*3%(*5PUlC|8IK3j^+96-k1rtx(%7l%R58#A8iKzY#Fqm(E$mg|b@`tw{ zHnfV~T=XvidUxkW&y!`kMRF_m=>$m=Aj~Me?VDU1ceMkl+vCN@w6ljwOpSz{ z4K8{_e!i8Zm$v&B=`2@l$*U{Z5c;Mg+XqkP4oos&(d`xUk>V~HuR%AL{AUz($&0*zw}5vym9&?Ty67(uK3!^&Lg$%X{@5wUWUdmE{z9wO8v2H>@OXKfkjwy`Wz1&D z*QPdJcX8kvC*I$Ho9_q227kq=>5%2>n6A;Xr^Ir?FK_ZK;j0}R=RhL}@di73Ckv)G zJa`T_fwIJaTv?9=ED#wEDg@;lOOWHcv$&V$OAQ+hFJ$QBsFYASB*DsPr%4>4Eo5DZ zh5jbHoBEYaOZh);_=EPP1u6lLKezZft`x-UTx=1iDO zl$#JUxL)QLxJ3iU*=XKD-OB5yAnceT6r74r*ea@{*YGMjfL9e5E~k}ELb*adH@bQT z`|dO<6U!GW@}sL~)_;Vse>Kg-@`Z~0=;~SEan^h(n5<>%JSZG(*Mh$P5I1v3(^(oU zpzwOLM8*Rk_n%Hy5rFp%7(hbXDXA(DtcO*8mKn@OoKyQXupCB)NQK53S?A}^0;$*G zYTDWrndTKuterc7jM*^2N;;mw9x582%(1+?LH?87jr-K(x{M1x)HF4+!M;4t8HgB#*)!lTz3`h}_z5rlj|im)WBFNf0Ua3H7T7Wd0kjbrS?fl$ zyfs6<4bC;c-(Uh5psb+gV``(L$Pl;5|a{bjz5G*#@Irfh%0pTU`i-ta#!P z9CfAC_%_J)CiEv@2bSxhQN^8j92Mf#=$=|9tHpDYs;zkPRTouVzA}^!Iq*j>rnq$z zPGU0myi>d5;ET0Aj?+fyKniKfCrX-NI(-yvF*wEv57fS(cg{PSqJr)859PH#N#FQ9 z1FEi|>Wb=4=ZJE8u!rAFxAgq#%19K=z`i zb{aLFI!e8;vgJwDB-h#CUvxU#*jrHJ7MKp}Qt)7l_Fyh!g8>fJ6Bd)77^@_}q@^jo zXPW<&lS%uQQ=(;4&iN^pE$@;m$x>J9OKqtsjsDi%uuXN~vQ>jdT(dEWubAd_F_kv{ zRAR+&6KP%F*$rXEEnOjI&7|?Aho!%hVn{EE>}AsJ#)Nib(S~5hew1E$xy_TCQC}$S z%fV})!ay9)avf`X@cBEg^6tsrS(<+V& z(9-I1i})@HR4RG{tFhq@SA6Sa{vOJB?q$9LaI?;$R^xC(Sa}MVHuPL-E)R6Q-v0Pt z1n9YKX5;$@`)JODF!8SN4tf~@3aT3ipSVfU=BZ^r7@Fbo^d={gxPpyGYowq#26Sq1 ztoKzVM>i|S&6$6Iup>4C`Ea`M5k?_C*wJY_T)zI3ftWPwWTKv#f@IuAJ`%zMQ45Ek zuREkcnHT%%XmepiO{cbj8O$0>$KpL)j<@~7< zQSRo)(k7ulMFBafWC%=C$xviH*gU4xBYC4Vo3@sbbTju6UE1wSoJeXLrC?xZy1<{G zv9XjDEXihG-*OsQnbY2raIp9s0B=&+bKm%$`|yC14+5pAvAqpJ<)A;#B2G^P^-EPA zrCN2Tsj?R2)z#WNO~QR}ZFm#mkN5Lk{u{olYr}^PM&OdsT?zS8q1q9q4Ad`D!UQTntsm#uml{*BNQs%pIbEWy=~i@Ypf7St7$A#t)RE zw;>p&8}=!h5`?71{XRxmthSJ*u}?^!T+kV|G-%vwX$0z8*N!i`skST zl7$a2Tg2EY<&cZt_HU3*{G_w_u^d4Xtkuuc&h2?Fys8C|gG`V&>ybo8z8GQTqZ5`~ zDBUI1P!&+xxVdGg?3s^Br7*kKKn&>TivDFCi{$$;YftK$TtCPMw7alI;AeQTf|12N zu-(vU$?iuXiNb+n#8-xS`~^~ro`{`ZwOYl+&SVt*Chw=WEf$Q59lYb{+NSbWk*VdW zU&s^#-~y|j$|_E8+UsBW>3UOC#C8@6d&IggIbuP(RR+?GxcLg!D7-TnZ|=P9_VYew zEC&)n1Q-u*FrlWp?5$O0g2mV*Jv=Ux7c0O)LwJ-4IR|KOMkMQQV*Cb*3%5EZTRob6OI4ectVv0LrA%=8SetR#wzwc}BwX4Mz8Q7Y`kX8m zSQr?}NCNcXVg(;kSOMht#}=yuB-KS8lh9tr%VX-GM*&Fj|S{jGVe=Z1UP<|SKCAPRrN70(Vu#>_vly|ev;)a-ub$YR?# zfln|ph3{~+nz+ARyU(|tD^?O0%xh_Qz#VWP00+O|?71Qo%Nj()TU!e}dQdek8tNE7a>;v>g16(cc za^b8f$#>mDbMNgP4TI6qd|^LM3aP^ZYk#xaQUhsDHXaU;8jHApHV%_$8=(Yh+ReFd zri_{_!TQO%zItObxxUge6|4INBU5$#b8o*E>Xap?{m&{1dVz$3h|r)mWlEH(0=`;O zPvt>Hf3kE2Cx6?_qe5`gkz$U$@~ghy;QrTA;6h)QJ8Mh@0BR9RHjKt1wvfvE%9-nM zBn8wU1O4YnrVdxHJBPi9l%zvge2sml*4}DoDdUjkRI6^_crk* zuF3~0+{*_jTCqR#S6s&SS6-K*mjZ1g;lUgt;>cIQWpFky0v)W~O7oJA8nJ!_Qi+S_ z3pX|3Y!(8^>N&woQKg*}piM^V;V<7K@h$nBILevV^ zH;egNcxqpxqFHbggaRn3oJtaw{O1vg6NERzDo z=4w?en<0$Ign4T|47g%uOTw20Jd4tE!XXP zrN#ag*FMJWN*{=K+!PF|1&v-yLk-mjIx)weS(C*^L&=!oE{fMq;d$W<0}M|>$`#^G zGiq;&jnYc}GcqU3c!qY&GAL$gvGo}^#eq}DJOuY1C{ONgUL=Swp63*wOn5So0y=A( zLD`@=_^04bCY8JcHkQod? zDjd=RFoT8l+i6Kg1%g#(@g}ARm;CJGpFOIwBK(y;KQmjpDQ3P^0Z&-`ioMXlDbf{`anm<>UrsD8=h9s7es&+QUEA~Q5}$lAF5or07)r4rLBHFY`p?&{-5n| z$c>>SaUBmRc6cX6^TGjpfY9uo8UYvpjo?@J{G!%AezfjVD~3KemzKgT^2 zB%lgmq5{?37<7R$H~qI(8OaZuET?YuWqkSop(4UkeG2S>nXi0{(QnFkJ>HyUZ1g21 zVT@A`SX<=!>J)spJ&|~AA>UlMZkIr72P+950UuOSNNH?#0m8yd=~z&h{taBe@UlF1 z7qFjKwZ})|m(r3fWhb1uG@hvTrM8rol2TTZrE%1mH$5XWDKiNgM)aE{?eY;rokwZr z5LH36A!0W(=xa2TA~-y2R-yQ%RDDz`;er&|Rsj#4wpNgJLX7`Cr=a}&GD2VNIhEf+ zEzc4$YXq?v|Br%%2{0rsknqdVbE%;uLiu!R>MC)jJrla2us6qbH>RN)Xq7s4FNx5p zQ*{rNog|C_n6krA`)Y%s5DBy=R-Yi-Sor~C0^w;hHIv<1?QvTwMiO829WfBH!7G{u z*T^~WC|5aFjJ0$G>~-GKI5l;}`VYd{dpkji6t&1wd&6G6{G4xZg)Xs%=3=Rt$$_rt z!5C9M9oq?ez`TAxX--k<$<0jF7th6da$W=*`39-*r0BcvQ@e;gOqa_zIXKiAIh#QC zjy?s_ea^_G<2u(;sJ9<0@%+4$=7PybM?~C~=Jj@OvMZ^&Qgl+7mDdMHC4vE!jpcLA z@M8F!<4Kk z>8qVuw6vVgZ`WLMN~dEKut(i`^VHmbg5PC6yG9QmDa1$e`OGwf$CL8=vP&;TXUGE& zaP8N&-*R>#{*js4gUO=TtKtAg-a zJ#9NDl5)G2>%8P?g%4X*A~8kHbg+-AYg@U5CG-_Gwm$zMdy?z;@oj-iV|uWTt@Q>| z7);@H3jHZMXcwlU6SmvZC>2J@Hf>M4)6w)ZXT}?bSPsUFAtPMQk*vWH8dFLoURkaI zrCdn4XZLBBG<`tla<2^>U|sc5FOkPs^OxTMJ4*kxK3>>=x@G%iJH#cu*BhqfdhX&r zJo4MYH}XxqVJ4_ll7_ZfqGExMWDeYT7oUm#Icnbty_bfaFOC`rWT;BlhUOeiga6>XxLgL!qv@Gzx28kGo7L@ z*t6#!W&9E)rq+B7+rp0!8xW{KCa|F@k(}Jy2sz!EpMe_7$zmE!pMv(^!esb7ktr zP-Z(9li&dg$55F}fx$zz49yanM zRt;9;(Z5fhA4|TgqF;WO9k$=~^l>?`ZAITra(sr1i7JY_i6?+7FQ!U;(C~BXk1_$% zs`J)yo7{!s=LeHTrQEvofxrLSx6fIomfP*u4)(SPe&V**wEz5zKZ?5-5WOWUIX-WG z2;Pn68xh~}4re??mSQ@P-@kVJ>%}rRihPFV&Q@j6aK`ggZwLaI5mf6Y!sOyJ$v3b) z(TAN^k{IjBg2-)XAxi!!k9dAGwD%@XN5l2;Dh4{b#jtmd1}xzk?G^$O>kJRlLbVQm z8sQCYtjnuZznbIf51(Tkm?O@njJUEhnv~ZFA6V%W6QU8BPJ}avS0_U-Nx{j47+7dg zeopBf*_HGpErXuS7hRYG4mc?SUKMg@laBLP#VSqd z6zrg(|02u!8dbWF%<)p?)gFnRNa^HoIGVPW4@{=0nt07#q~&)1lB`O!!<%AFY4)bS z*CI$1*JN=>2~$p#6_!;Qo~Gu-v}$&&24q<_uz@EmE4i4Ia>}@DV3wp9;gdxQ9xE$D z+HapwTt%oRRLh3B!zAj$w2D|`SP)wZoyH$J6$eF~J+5gomIKay8#R zb;vEpA5bWRInmyhz?Cx_&ig`oRGo_Jc0gx*o+& zBF&U4kz=Dnp;Hx#&+ke9WAlx?FGbPC@2i!B5T|VD;(dn6K~o*FU39Tu!1m`JVnZ2} zskhHfqP5tX{OKP3yBnn2gv%f6*>NIs#2}4dFT?XUY`%!6xnvMRUX{eIS2kDA6v}GH z(8v&=umy+F{bioSWtams>X4A>pp+=Z)kL`(lu;=#GmUGJEZLDEN%=S4TNVo#3X3-? zu;~V6MJRr54+)=mQYI<(?N@Z9!qN$bg0|m_Wu`T6NI(dG@Z zDf{w)wBueNMu%i0+8MN>#UlQLPorldRyH;%Np)}RtPQ{1PdOtCsmz6_&jPD}n%tok-dvTO68(rV0_dn2r)35%i0*ILl)!n9eGW ziTcr}Q7f((cMb@d_t=Y6LNZ*VK9*Qti+IVX%Tj4=uzsLaCSldn5iTJAvdDt~Getg# zi?UzorlSE2#A|xu{1OkesS^+y*KW>3HOeZ$lGFuQ>gOZmE3Y<+F0bjca*3i~?etMi{3uiWx7oVLY z!t6#8&D>6OrifhGgEPN5^V%XD3KALGwcvSJ>iiSu)MjRiJ8x_eOf`ntmWFhaQ<2RA~RxfspHl{TL@t|pBdd2}0r>2@5> zSHGFA;rL|MTL>tQGZ&n|Q6rFjf5Z?h`J*NaRlOQ!uuz%ypae*ccU0HVKBG5Yp=pXK zK6f(>vrf79Uf>u5Q1k0fOTa@k4QSf1+`-Lp{Mi*o#CbQPxxC3f90S~u8V2rmpppBH z+w-zFLXWvtA}7pYv8FL&vUw9v@R;w4Q6~WM<}^{t$)@5akzR)$ZpT9KO&gZ$;WulU zdAR6^L2zj8`Y>7qfKGt>A_AK(i1P4;h}u&qTx+jTK;SEX=^l2gT|>|*T6}yczC0B(?#U<$8B*cz7~(#sQ;%1REPrJk>v3H6IDVbPTgl;8MoGB>3oRZ z<(|eCbQ1*MthL+thNK!QS6IH@lA?TXnJ|jAqI0;)E@VOgtvrk{dbU6P{-`wl_mjYz zIw3YTF_1B?zgsHw)fSX!|Fi{9N3f89MCl#6=&(r?!~u+B&Z+u`ZGC0{H9*S09mgm$ zPO=}dCsAkeNfpqxSg&gHpX@7@4HZR5?iZ<|BHJow45EXv(Xjm#(9#KAu9*J?!!zn= z1<*Gai+U8Tue8j7tC{-sJ?Lcd-qHmu5WxqZe`9^0wWd@$+2cF9yYstxJrb~ib~NFz zvGK)%8Cjy+y3R`tq4F`Xx-3YfotS{(65nj*7HBywDq!lk^_dGKONHD)1{8%i5+h(Q zSHE8tlNO*Zz{4Jmj{M1+fSI9S?*T>Wj+|j;HOaKU-w7QU4O~Sah{3kc2Y{>MxIr&D zi}==b$2Gj=@QLVNXmCR`Ht@ZW{>t;of4gk@O?!s#?pBq>f42A^Z*TFzdy;&f!H&t) z5nu8BC12uG1Kpw@2l&Lc38i?<&vX6M)}JBS#=!Z#HX{yOTA9vJi;QpiQcazbhQ*46taj69zOsgc-#A9LNu@_ z6wc~vUL>%D{wZ36s?3(ev{J5P*VzSds1u*w_(ScCFbC_WS#fxXrRXiGu(r38$Fv8+ z{1pF@6f@R+UHt6+21U_l_-wYb3a$WW+uNIxh@JMCU-;g?1uqd1(w$I&G6L9veBzWz zkqdU{7Xy#I!5Q?d{$w(bqCZ^|PTYX+8=tfhC%d1k<~RSOkax=4QdNgI%nMWCe{#4L z$CvuLT%GyYj;HAcOn^4;BV9BzfD**|V+*I=%4T+>cyMlf6lXQ@A-4%22cmJ^@K;iN zun!MLdjs>B>=3h|P$=4~WkO^eUQGq!ixT5>h{xmu)98HQKZdd`Hw1aEw1g!_yS^ov zQGmKV6;X5=q>GaN-t^UPsm~2c!o{t1l9*}>JSr7?G)0W1<;Ly(@Ce<`d||UYK!hKb3JvsuUGPk*Xy*R@MLG%ON)U@ zB%#-n7s+zxEexa?XNew|tyoWgo1#=Yq}P$eAH&XYqgi zhP>I*2q3KcJZ!aYj$Zvq^q1PVVz+0UAMJg6TQ>7m2qr03pWAVyJ3g5cH z`v~7+6OjOg#mli;N-;kshj1AsGY*-rk>nW1QX{)}z_5?UL4)UNw+NSOJ>v7|{t&lO zvaK`Tq~iu=hm!ruxFh;xwU#YgGIxT6{wYXg#`hhq9((U-7RoBc41N64+P=PO;&r50 zsVWQpdEtppFznbAs2|UHxg}mzstEeh|dF7eC>jD>7!HLB#X{xU5_%XNyBV`K2|UIK09IG zp_qWhS(*sf-~8}(&U|^V+lk>|*yX$QF`J^sR1jUwB|t3ti+A}-%=k9nOAAVF-8@1u zc%{!9flIRxwN8eg1M2WGhtcun8JEXr4AzgqJUTzZB1MW6DN>|vT=51dyzlH^T+xE5 z;BAkmh$tFRV{=UpNC@Sw4|QNILcRhL-xi=+asy_SV5`ATy8qf%L{TXDYWPO~5L0zq zx|zHJm1E}*-kx6O<*&LKe5D_E1>XIca_ROY_On0A_=%@N-iv%4xl1V@(#UDm5i-SP zm{xDz+XV~=`KC3}sG>&4ldsgq@8Dcw40tCMw_fCtdGWlMJAyR@D|(2&dPm+kSB@Xy z;M$XmLHLW@SjRCL97$fmP(a_Gf$A0Pv2^djbYFxFhq%rTMc>C>R->-W)Vj@464n^U z=vg+T+NM4j078N&srJD<7Lac9k}Hbbjk;;oya)6D7^2!K+T zxoJKt$flVpU9=jaY|2oFRUY72<-7>zQ*iXNyehYaz zFO@i`%cwi@kO7tQL**m0s>oFW?-Ngg-5(2VKcq8t*0q3eQ&?zTo!rK+IO1vB0@!;l zfP)nPDC&jYRZ1z}2Q>uJ$Qj+MY8VoQT&i|XLms2d_G96o&~R{UY58)b6i6A@dPI_n zh8kQ%j0a=G8c0A81ef(Y^bN0Z4MBv)Y|wkfI~_$*s9#9sU9&X=F=C*Jn1d3y+nKv8 zVAICN_H?S5(zg`S7){sVQ3jP6sN=3vx=pRqMr>YT#u^mAM-5X3R|)N~WaiJHD|U&N zFC|np(H%!|rrhp%WyAm#*opI7CC5uMw|r7tQVBUEp%Z=XW{zwLpuo;|>?pLwxR>7z zVa)P|i{_^pah)6j$-_R`s>OB?Y1cV!_u)+(tDzoT31~_AoZg&^(iJ_7*U}^WtawLj zm^CSKnl1o?aQp+Wifk$OP0f1TLOc^kL296{Wi4L@5-TMNQrk@vqBBxEXafwF@(O7f z+v9S*{fXOc!v8l2 zy7tjn5hpE%WTThX6yGH~J9;ts_Ss0X+{fM!0Dcc-9ujTC;RaF!-5-N$Y}{C8S}^TX zA9@MO9>@%y6CJ3e6gPPh=pA<4XqU9Idy)3Aw%x$-v;5(dlrG;S3w({?>^W0_x1x{=i-Cd~@? zj%1;e;yzRv%f6?k!Yz(gr!i@OXB(wAGx+>wB-WzgHdW!?3d?$DKSgSs!qqtUF`la9 zDVd*+YW}W#`#;Eb|Ce;EB+ryGsl*bcZ5r&9a|8l^MwfXNobxe``tvEN#QtSsSHC4Y zH^xCIMV2WVCEIbq>cHYIBfcHNTUv7KMb-&USyK%X6~hefnwuB+HMV@Sgv_(~^4(#K zGcT->53gLX!D_4=tFUIXAtS6542BD7MRr_(R)g(Eah6E6AKyNWKqv6!4zX@W>8FO( zC#QZ1dg%L%!2XUk2LTL z902D(dO$rDfmXA zUq24+Z%MuLkOw+gP)WDLX9zn;ZYac9`vTS!C)Ps_w=HOCj%%^h2_Zk1G(PNiv?mFDA+4~w z#Sw{4=%^G33)-OF7?f#b(iesFZ7%b=p5}X4jPxx@lpmD3Xla-#>!g;Ea!P>_ZBlWo z(yEN|S4@3|q|=3$Ioojw_qVHBC3U^)M_lxD4tlyHp8i~ahxM*+s%>yVo21b3(P)u( zkHg|@9eR7fY}l#!IM^Z(J}F#TOw$!LnYly*NMc48JwG_CI!d28y?aU_x?k3`=zVdu zZa;dHShtNbkl@yG(Ryj6{NA|5x~?lp8VUn$P5fxFTTwqYzV);6FVf%J^{Wk2#nxL` zqxAt0GY)8RqEwmQD+cVb`FlIr)zs6F0zqQvz}}LRF*{k?-d>Y~RLxO`p}DNp*gKUZ zQ_+{Fl={()(x|!!hy{)}1WMmNKvC{RrExdtMEoWxs%iKc6hf{=WY7h4_-&8^5bZQBf<<-XT9>b&~ViK);2jO9ycsfwGQJ}sWsk299VmRK? z+G?8?V?mD(4bWZYL^P0IZ>NDuEqv?F(>lTG)z?2(N1g0ob@^p+`F2a8`7X|i{l0O` zL!WlwvgL{{SF}}`h=r@tBXN-(DKx#KtjskocU~vz(eRx)sV@6|>7X`S+*IF4p*Fp` zoB!k{w-5aFbK(jMxE|vRbQS83cA>e)-rY?^HHH97#xda>EuR5X~QlflIrq~wpx2fa@F-H^7Cl9DPt=n)_Hpf{D< zGG;-i!%-OTOa($Fp33#a&g7XzLYKV&JVU7_0k^>eedRBBfmhFfn+y0e&Ij)M6Ig>s z_JxBm24L8!MJl>l)z=uYze@$mICS-tFua)=RdXE^RnCug{vp*W+V2^zK=*USzr6TsOQ!62aB6e_+4`%CUJH_(1^40>=>z9HL~> zGJ7pXnjmtp{NW$dsu>XKQ>m!X}z_NvH#kV zXXjXXx*b;AUWQ674AuK{uFb{HpMWii%2jjzw` z$?MOq{YyyW7{8zB4sqj?wO|ug-PD@Pcd@9{eEWl;5(?GECqtCQgQC!3ksFxR$5KKH z?cxeuqX(^UuyUh|uctQLaLJvN`-djYSmA!rg_l&>pZx;ZvV1qB%&%Ri{fVp>I(hLr z0<7;i{P>EvnK+G-FAFF*6;n5})v_V7WcGP_Tu|-ND$yO@>S@nKoEH)epW~-)306L# z{wPcuwmv#QUI!pM*yN~6Thhd_JSf*PgYFx-i?F}Lu|~Q2d2lrdMnoO43p!F*^Z}c- zvo0sNsM5d~_0*b94}s`;rP$>S&}R>FM$-fBMKyk`#kKL41}Tdg~tZS*3@B06{Mt^y%57y zeLc`Z24G&C&$Rr+F_j~IH(<38ji=4;XEoYvAaOmC;yW!dAo-=tmLKOEN~?m#t5W#i+cA$Q`aIlrGy|;)^x}5(k4&*M{=Cu7{_60{ z&y~1(8R7QEFd&pvl=qSnN|R|~PBKMMGS`VuzLd$0Q@L^_r`<>#Iu8_8cNmh2NW^~VF2qHgl12xM-vPf-3YxZb#t3i zn{=`93CquqVzh=^*?eb&*KGb&U*_01W@^L~yIsvZhn;;%bIk8!*Oz6}IENzY_dAPU zqNn@#iF4T`ifryAEr~LFv2R0~-_P+*6^jIGJs-I8L-j-5vEO1R_UF0mYE6(@>yKW( z$m%JSASp$!mbku-ZY(}0O*Cd8m>AE0gfL(k?R_VEjYVf^LaOc z;kp;jou&QqNyg5-;6dP2l{j1pzt({W1a3nz&RH17y9k}UW6-t99dMQ0f~m>F+#X1m zRyYVh)K$Vx3A`^()n~&gsPRNLaZjBHI}u!-3xNgHV~|Shp(rVbIWG?vieWx8q_R?M z$HNF{5V%ZUP%WmNgE#=y1|5bAO7x%a50``?&-a7F;2FL9@4#7uqckX}RQu>du8!d0 z6fhDe#7w#mD6>q0=utt+RvL^MZK{Q=gS>M`vYHvl&yK&?-_|)S^^EBKOK{lH^$jfj z8n2 zr#dvobMq<(zjmc=QameYLMOL;a;I2XS^HMUD(L}pXI?J%ZAIDC-8G``;vg?_FoF>b zQ53u4SmrqjjpL;hn1y-jQH&^_TUF<0qH$~l-7p5zuR1ucniQ_~k>CkL$@SXY3lJiq zKU~FXC54+YTM(N;eTc^#ico|?5+ybZ5T7_KKpYk!0pc;A>_NcSf3&JmZj+oIp&aF> zDF`yeVT_2Opx`mZahVX#6LpI=0b{71D8g{)C}~HW{@cCqlYMzVwdcmV=9!o+0omFO zYvyyjpGA)ugy=`^CDiOc$&ljBBmYV;1^j5jL4#;h^)sFQ6)6ZOmQ(woQ7IkM9v8;#o??Y- z6X(hpdML9*+8w3Cu50b1%LpeE{izN9V3HMM< zG#Y*qpZL5m@JuSy{yF+|%N2vw>&=B3Xr#we8<=~Q`M^6{a<7_4BAZ>TGU9u~(_rp{ zfP;QDlV1IfvO3zxJRKV#A#y%4+wLin7Jmpt04nb%{iFJ48>Cs%)PoVj{#ypq(*iwp zs2@&;={#k4HXQEwy@g|TI=pIFwF#zWuI(JC_pjyWOMZ)k!v?@}6I^tv->`}P#A{3t zs1hzDgqmFH?y#kr+3))BbmC+^G4BvKzKuIS5$$1R)O~F77_F~HAd}@2BBFW9xCgIW zO8Ia3&bh+I(5uZJa6eSzlt#YwlrJ)mL|J7LTsFh% z1n6U|hhq!m{_n6`QoUiZ-ZUjx+n=`7|8G&k3P!SnWipav>NS#n#+_>?o#dnW>}T&t z^sGyJVO5-!Yt3t){)lgCL19<@kydv#jcX8klxI(67;X?RL0J4r9O!*7xMVfibVrKz zVibi3oaDO486YlZ*S#tauic01W2UcSO|!n3Ni;T3IzXe}JT*AQEopk7m(zw_1mgZm z4@X~gcYme7(^q=H)M{z|irI58bq{raIg(#EJaS&2QUWl*Sx_UNwjf)wX0lx#E~u$u zRvHlqLr>rA^_0wSi2Qi?LYY-Vt#UmMaW;HD?Y4X!8`p>9+F@PMVV5E~&X57(5Ix4^ z;@*bldfzQ-aVRtd%7oj{}+*^ju;2VQ6G_UQ3nZeG4F!OMFboUWLDFChW0$cKFFCW-Gx?L0=&)HIkJ0R6cOqtWrISTsm(Gz^;^T(^F z!|w^FK_ga_On+4AVXcKF-}BSMI5aZ0Ld%7dO&odL3+M;DwOw}@NNM_etePS`H#Bgi z*>xQH3+#x0?sO#(YDv-@zB5V3q=xa#Ad0yXnQJt9w{=~Zt=Y(d%o+9aSNA;ycLVV? zTz*qF-bTl+G%Oa*>~svhi*q}Q^b01{;yk`rzHPmNp_Q7m$FvOxfTuFa%=Q`xkfI)S za7gR4uCy%@V;${O*fXl&)D^9{5fn+$V$~i zoBDzf>aLTalG-|%Gt-i>%ETiSWsXP#7%vjjHst7P_bY5FnUs;nh=cX57hLwY#5~Uh zSjJ-jw>1Eapm)#J=KoN;QuO3@KnPU`H**(ygM-{Ir!nNYoz^d%kekq$hw)(Na(k$E za+mF1O|PvU9mvAY!V^sIm>`GoP~hT?`1MhD2^Z3FAd924TBXS1|2cKX9@N4V74z&- zU`&-iyv9pQtI1B|O*=GMey@6#n6!m%5IUPEjVT-z`|A&I+z&3ps&I$SgJM(q5=o?n`s z1V~x#-xw!HqkVv>WV-$S?~S698s@dPfA$SHvzp(er$|%IG!|bkzcHY32Z&``c3o1h zP~K@oJLc3L@OVw=b$EJ}oDwa^elO8%Dx)DfPLWe2e2ozKFf*imMb$y${kQ$r-}8z` z^m{IJG|gMGncE6ObPQ7B#Ja7*R;9)8>GWy2k@L4nKbtyrIYh61KvcKm^!sqj8h1xW zNGG9*i=lR4V$b!$m9dTJI?f5XOV6S2v~z|KUmR-BJ#o=i;22T-38zBE*v?%4CHjKc z(NeEtCb;G;;#yT`0R-?mz7e}ulim5Ty_D^P2c0HAbHz$|wgT52xR%Is*G&?N=Lxj} zslj6=a;3ydUO|-B0_$I(>cajns^zg?fnZGucjFDNU3H2w?{?W%)fk3`S5gA1ctKx% zsHyg9)n%vXn-x!$qJbj|y%b*22_*XU^ZA0`) z;4%=|lBthff9gd!fl@DAN#w9_T1!RGN_<0vqS9DvIUWsW1Lx_sl4*J$RiJ))_bMMm zaY);=0?6bw4Ir0q*#(&in1^p!bKabodGI4E$06v{OMGWYGdHqsQsQ}8`AayZ$?Uvq zrZT!kiaJ!R}EXHStmZHTsqQRK)WZRJrbO(f^tDaVURBr6wByOY+aA5^H! zJjzQ;vVg><3)&&yiCBYZ5KT33u?@4Jz@^xRUASG(yXg|J&e{6m`yl6AGPdr1%aQzX>A^p&JR=7>ncOhT?X`uQbXa z%~JP?5cC7B-Mbw@djx|d7_KXi5WWgjxVeD1t;@>&uy4|zIXkuT*YO@Gca*-7{EqLw z>qpZxeGO`G8l^3LKm|O9l(-D2^EO%!uo?zQw&l1m&oJebw3q8uKh$AE z#0+qnW^zW3-U4b6cZ@_ypK@mU8L<#2M~KwYz@&IU_I#%TG*ju@?5?jf2Oj(k(eAjG zbQog&q3!!aX6Ov#-Eyr8kZj@u6e}=V1h_tNRaBTAN@3FAHtg@bcPmVk|LeNG%`E#r z0kTr5EUs4y(bGW48DhW3l3)E)nXxpf=Pe=Xm$o<)?CHH?GZOak|Mvkqh-qCQcSXEo z;7+KL^Vw>qL&g)h8`G7UU$}ab;-)eV}e}85S^6OTn=tL6yNV zPr{7RO&TRur{X-n!R{*O78_ZDb6Gvg*hr2E!1SVYFubj3*n5>!3K~IUA1$V$W8^H< z;7C>_nhco&W2D7W4wRkL!-3}`$}A`n7Bqy1eis}%@!UWmM6{S_#QVswBSDG+A9VV8 zwAEk)@151zXwc~04H5&fDGc+#wN}LzC>DR~MS6cTMtOgG21k6V#C|9}Vo19Z;*mTT zF`}Za`zdt)qb`C`K=6LE24O+J10e2NGqkArP53_5%o6#p$W~e8yL2qB$2M;;g7tWN zM92{9oMt~kp)Zjip2+ajKiLgiCrC(ax;v8_n5zZRd>8zt`^Xh>kd{SCNxHW#Qbs$W zLC=0SXBwdbb&JbzOw>|v>_|{qU^lRTXm&VDxf!bF=-iq)%%guwuNfbg!?N_ZS`b|Y*D zHpUhN|=F~J) z5Dt}W6UQrTcnxC^u+SetsYIO*)9k@WCECQ$jCst=v9XV5A8IB!>L+8 z4p={`nB$q<#o?lmQaToBTEBP9YTLz5vLdoh9jqm#9Rs+N=z81!9p*0i0X zj{`O^iA?wS=px!#Y}V7zQ|YC$1_kyMtTm|g4w#9nen3IT#C*R;wpsE~L>YUAJtFiKCgb3e}RAQ%j)NIUsb;-=qx!|8bM309#RI&Hy6)yU{u^nseWM9tE%~KO<;@z_%~TR z-_Rg-nOT|^10A|)w}$B9U_N2lZD?eNL54_2(P(U}YjqgCsncpM_n7S_^RK83^S=?> zoS~jQQcF9eDdAJ(@)fvgVZ*y?(sB?|@s*GG#KK*IrxfdbU@H&7M+N?AFql7hG7cZ~ z(@l>on=7o5O_c5AN%3ykBc~yfR-IW2Gqa-f z*s-c8zGjmoCEY$Xey!J|8--69(RqW3+~3KX1Njl4OgOmN<@r7r=qI@qQDxKOr?law z-!i$%Hqfu6h&s{}&siH-(-LL=QXH9P19wd33qR%ig~|4Db*5+V|LZM_=6lT>*oLaL zOa^BgPpIcMW&?W1%e_;5S~UG8*KEIzgT1Xn9djGF3G7>{n!90LX=ZWzXf3ph!kMJd zEZ%SH_Huh17y9jt*~E1NueQNB@xYjIL0E8-;kW%2?h?6UryYUkhbrd@SCvYprl7Gt zP~^mu`B}ims){Zzh+>;?`mh={FG8X^40K589_l#Zy3lyzT80kp&m}>mqC&uxu5(e=;O9JZW*eNL z!mBWAD|fs+A4Qqld~q=}d7o)2ec(%Y4JeGI@oHsPKA_#l+Qn};n{p7DC@Ndr{SgW7 z6KxQVZq2#W=VN7nhO z*TcSXiVPe5(+ejSE2m|V5q(?hn3u-*p}{}I$g<=Z4_FL@71wB+f@1y9urfyc#G}>% z%@hAHS`kLiT~#EdAIR$TC>j3q9$=cDm$|HKUb*0ZS9y5Lf0`N;SOFk`bb(=Nm*Os! z3Oh9fX&3ti892}vNNvcTAfX=Iz9G36qoJ+fzqZDaI&pbkmo-I+eXO|mA!Apu#4{$G zyRh`s0H;c&_`x${=b;ejP)gStiNLn|9N;z;DN}n%pzLxHPSB?ksr@^X~1Gg@wUyd$>n*+LGUhF{&|Lm(dv&st2U=J*x;o|6gn5kU?V~ zaFmb?KOYeTki;}MWg@HmyEnKH_Td}boZfpZcp z6nN+L&ZJ(fmnJL*yVf6zJDL$Ud+DRU#G_B|(td4hB}eK;uriMryE@A2k+sW4 zp1qm($Ls~BHTxV$O445za!?ae4jIGfath%sZ|w_u=#ce{hhFUVpvS*f!(5p! zgF@YIQ2H8%=H+Gb=4Im@coJ&IgCOzZF8&am7yw<-y603X;+TmuF{~R#?hfKk8J-Of zpLK#aUh6+vNmiskVxO-nWfA6QxX_nvcCc|RZhk`#WX5{}entEALORpQ{^l&*SRkA8~Bf?k~uSxLNM4!lN4JXW?zJc!PFK|fp+u+E9 z7g*%`Y>D(zX`c{9rWYczPM(v(-jZsY_cG9fX7%7RgH`-F4Zs8La4iue(!jqo6~p!g zl=xyIUxLi12{B4qkHjzQ>v{IPz?;iwe320u*flWUf7QMAP>y5=qS-9HrEhslOEO}4 zUE*Z$L${QbLTuBkZi#qjz%eQUrR7OK|2lM5;%NSG%;T(rk82e5YkC9?>K}mBck+^u ztS9akAzS4lI4>hfr3;MZMJ|UD$MoNa1cj#^cc`|BzRTa(xp0uSbv}@$v;vsOsVLMc zYGnBbbF+Dh#~AmVK!jXIcoOpKJZe>?N4j}vA3HdAQ|Io!>NUmu9>PL0nRX82`3spo zsY8?|tpUT7s`8;-_F(C9f{oeyb9+`Y99; z5g6%tFQ0&lZ`EhTJr*V$zU??NWoC@Fyp?6u*EA5%fU?Tf(Z(VKDoJ!G+IRW z+5{k~w97=-!yqhHA?*cRsBUFT{|1dRuf{ki3NJ5KG4&DX=IG^oEiT82DUW%JoZmZ9K#C;J1DM7A#*a!UJ3~H4z*52IH=a&tTc0~G3XI$ z(0ZK*E7Cpy0FnBwCq>kewm@5LrY%fF{!r7pTOOr~ST!dUAPD!Lsjq=n~D zj5}8NDiL?VJAIJ~NoN<260?qYXFs&l)E-! zI3kI*U}8`Gll;$PR5j=?;K?INw=T!3o*S7E8f2WFwuH0&>rYb4$fF{ z0GDL8Od%_dL9j~zTcJalrEbt9=3vZ_?$PAT0EC_ETT-!owaZn4;X z@aB}_#QZ(y^Dyi4f7G=k5h7xG3Jo&yFGiseVg_rY#t{;dN`{0w9xasAL4G=yQ996 zbev}a{uU=ImW=X(re{@TH9fmB7%b#Hs}RZ3=J1GUevHexWrQ49?muO+D)&l7N?4@3 zD&!9_|Mn>8&0=ZWRb(NFoRv4~@Z#BKRML@HsW!zpWtX+cga;ta(wZNKJEv1x!8%2F z!{s_bFJeUZ0=a8_qI&(M#*mXeX6^Jq1n%s{2e-GE&)&7}I>z}qCbL<-#>*U*ghV-L{@2NeFE_ zOo`YmJsc`1SBs-^y{1o9l$PQF6Tore%J$tDx9|uFBKeT|yr2aaj7c9nh*5_=B=)LBwQ>*b8IxJbJBqs`S2OpZuKK*%Ue!r13rkYpk(nqpUBJ+Z zKE0u;9T1{jRra1C?bhC!H9*_RhtA6oUV-!}Rh>Z1l?tLp9MRwI&@U`i7E6h%l6=3; zKTGuAJ@KML1f@lNN(9oToznDyW}10X6UN&UiL2+Nx~0<3AJw8%S$cJ( zqIBQUCRH*d@D+DudRv%$yd-L;YlzJ|Dis+0rh+>+fWK)l=2t!W;{=he@uE$=io+O? zyNvV_v3Nd@*~GKHd?V$TTVf80&!{vigK8-m!z7_&Ht86T{)8lOM9H%nlqJH&~TfinQf^i2l!8*>?Ymr1^ zf~VB-?zO^97`CbwxFM_F?e&aQTwSbeg1l@!bUcU-Pf*-*!FK0a0=Yo$NYe zW=?87jd`vklF*|M*ik^9KzO{j+pjPEe!A3-&}rzp)VhMh8<=3mSza7e5AB?bc&%|i zPpL~weBk3o^0~hG$tO0r(uKj(fQR4soti-=y%_z9*=Z%={V1iVUV#B&bBHU=YG{g` zZnjnMu?tX*QwSdTHRe*^H$=p6&)!{w+}xL=5{&XvHonOa;j;0P7;m2OlB{7LFL5BY z5uJI3RS5hlOhs2WRqnLn>a~Gl7Q8C29;=9d$2%8~tAMf8v#4p)S46@SEB6aGi*zo# z)1Ra$7IuuLd2LA7ov+U4lKvm3c$N&Y0EzPg zkUV;c#Pbz-09|>W9x9Fe>Xxp5U&H{S8}w5}A0y$)gb2hDgP?fHK_7W=2GQW{#$ibEV9YQ}D|epJKgqc~ zO~j)|5&CN=D_k03nu{Qp;tl-#nS4ya>opU#+UsW{(38?vh{BIR8%u`JrVPMuDSH>v z>Eb{FzZId@K`9VwK3fU<;yNs?tZCE;V1;d6;!{-?42r;amG`BDw1Ql#^C}l@;tAB& z7ZZ*3I1^|2ih_g?mUM`btkNEw>_*{)03NK7ds<9UQOKx z3k5L2I4vPZY1LSOI_0ReRHY*;0>~Q-P?(4s7`3JXpp%^Yl%Rn@UBC8lk2s%=qe@hr zjYSn;G#3uIexu$vXg)GXC)L+wD}#G5t37yO`xhX4Z)via)!7fNO%j4Nc?+Nn^uor* zPou>;$iN6bQ6X)0v#E$erywECQuOY`BohukAM-{6_HkAQfOHrg zT(9l4($EQXLWcSD;pVx@crlujyaF!y_7&nq8`10pBQ3#0Qb5)sFqGsOm3mgh^2A5= z3b-WOSBMwK!QD8KGzPALgB(@b3~Z1>4J%Z9b#svE(~ z!+~B_5+9)6n3*cDm?1PN27ZFt!?-GNJu{c-xUmmFkgm*O=h6f4Hn>F}Y#!Yj!_4(T zWza6rz&d(Xbo(SO*c=yQi)q7??BHEY?v(~6a7r)<4dTp>z}Rb`(Cn-Jgy;~?)zmd4 zHH!i3_lhB|u7>JF`-nO|>Pl*&u*sb>*%ZZXRB)j;>hA8N|2rpDNJuUq<$S-c=^`rar;5g!l_pmAziC8U_<<-~|kCeQ!x6*tn zo61%*z<{Meozd9k40wAfJk8zyG^^LHP21i(8;H$&{KcNUq2s1DA)s}iok5|kz9rEa+1E>yQp-;n@Cj_gB0uR2#t%T zLclo;o#9D_=s>2Mw<<3|Q?KYN_QD3Rj9Pj79u38Z?`^oZ;RF!+e(dfZWvD+l__RRC z{Z#gSKS#v`K8uPViY46H+9x=SyFZpvIO<^KXymcRG}$TwBJ232?*gqH8uRylHctYh z57X0kd;LlA1M6!jy7pd3_PdQ>H^Qf>DL_}eQ=gW`E{SVQlylcUaS=~py0(E{&$CRM z-S_?k3T7ON+OPy()tD;%5vD3UD?*A75$POYqQlgVSR@~KqQ|z{?bFnxUI?X!s8#L# z?_Pmb?NX1F#5X-P{oC$98n|OBrgfrKs>h9*KyV67@cK*-c z>L9D)!>o8|8r|`p99za$3Ql+yfSGRw^}7b~7~dmHzbxm(^YOf;f1GHhMG9gStaA`p z!meYtuoQPlW!hjgM(=%*@7~t27((GD1&Z*0GL4Y3&eU0&ENjD*E`73TZaXY^&Qv*; zh%GsV@ODDaLP)_$@v2A4`uFXQq*b45Bj-GUItagkE73(fGQJK12KQlZURAPG|OCnhZyw{BcUfw%Zzfgy^UW5(zKWhl{PgvoE2C7?y*q&)FZrmhmb@vm#^Rwcn{HRj~l-ykp+HY^hX`M;&$~ zZeVrwP*SD?a=J&vdfzG8L{m6wCq(c&vI#x=Z{G)9ZPmNdeJ2ZEcD-Rl1bg<>X3hl~Ba$U&>T*eY^D;P3QXSUUlg6Wo@|$zN@TosdyqaSrJrfzU z>^ekSq`RLv(pLJepA?!t@QT+C>+Bn|eVk)Y=Dc&l`i8|}os*N=u5B9R~7-MU*Zl7_J{Iy&U^f+M1vv=Bu0*R}1|z+MD9ZX% zJyd-amg~M9F;=AbT@jIXPovkIS}i`(vSdU~hqpD}r)i)kX|>b4hi+*IC2hc|BnrHWxIIU!FLPyA!vLIMt| z(7D&tBNxkkTVhYSB%ZA%tHGkF*~^vpYxQfgejlf_>%zA=2ssh+?$iiajcQp?u>PHY zAXs$FAEofjD0=sbZon}Q&#Nsy@Vn}ZegV?G)k<(c@z;+|5(*@Vbv)v5VXMcxK-euq zec5;XHqLO4P^{7 z==()iijU4-Z}&^DGb;rO*gO1PO>&umK&vVDiJ_>D8k23aJOLJX>V*dhY!wbkG-X7+ z2z8{qi&QdK68#=YjjQ2TgO_G>3j+zjW0e<~%&hJz)-NfpI--Zh z8b;@U>=~0a0-6B%$iAIT1hoK9vBr-2zHf^aA^WySPZIcI59TRRi*4zkF3L=x7o$lM zG!)Grg|6L#glHvq-{P*@S7-ZdlYSV&Z!2fPq6?p_aG6rvX^>vJRPU&XsnC3nD|D_{ z+Cb?9SErDU9==$5^KzD$3M)*^AA1)y2Xj36ulppf5xL24sasC+Kgjs&I30qQx>KeJafS@0B}!JuH|te; znA;|ue?jwt`SxNq?*(1qYPE=N>{dc9`*ztkXG)s9iX~#Sxtc1nWyB`I+`XpcatblfxOOve?N(DC}g0@8A9R&~QtLO+*o zvN`-Is1rV74f$w>hqL9R#65BJ9c6cvP@9~jrsLTP?q1e&>~pDiJs-Z|kI&-qk#;OP zXSPuF2IhIEm8OcHMixxZ&myl9Iaz;YQW&Eh!WeQ#??Y{T!9(Y!OV}alDqYYsRc#edE!CRb9}2EFEYZx%714LD0~7Aq#Ia)yABN z(nnKz6K>S&k3*++S}B$4x=QEyMji%ymt8B`QI*<*ZU9N(xUzFQR+B65!B~XKm$smz1)zm0h!mn&V1uw zNaK~m--cl3;U}v`FYqSHAXS%*mSG{zU2ggZIvKqvuKZD~KD4;4U~%#-J(DJ80>(cf zYpEVrEVBif76Yl7SZB5nkaDs)7}BYkz>G~SiVFJY6MD6{!Q*Cq=gE5&Xx<%`MWq~m(yBh2jTUNey-Fq5u$w~l;ckFf)}16KxXnaI_R4h+ELN08 z!m2r71AFv~d<&#kFkc+(Yhqz7IYzgTl>Epeq0zff4KWO zcx3kjCHbj*g91gmDM)DJ_bM{~Fk<&cmwlC25C!P(5(X5>DON+9{QeeZufle{JI8zL z*!>V%yA6&;`QcS_lkt!vNE;Mazf^&wqaDZKc|`e`6U;s zSG!+@g@&r!#e0uFrvN8ghqUPlfMKj#Bt!7znjBV(f_x?tD$sq4Ls*_~nz-P(EbV*D zX4oQ0BFxut8)cqh&~PhX`d=w3x}{pI*}C6ByFN)?VpggRwUj1Nave&hEUJj9L9b~I zC#E5#$>yLW&j{Y*dJH+DOKt@mD%OrF$c?Y#`Igtd{sIl@1GOMbTn6v_*LA;l*PGSv zZ!SkS{+sGX)yKkZtNp$3iNtyk22BW3$i<+sf>Oc}NYr=)JJW4g0Qj(8x`k#fw)fx5 zGo@Pmz6FHhFH|VyKehd-Ih;QHHZXqKsQ))SgWIwE*qIqVG2Q5siI@9taWKS<#m^;n9Y!W7XnPeaU)7D@Zc_V`AH_U#b2`Oxj%eqdRzIlEcVR9%F0% z{oCZ@J5>tz`@fZg8|gk=>T-w6yWpE|g@$=Q-Fbv$2bN_G0X9dr+GNkeeinPIo*2)n z!Oo^#L5GLO+;v=lZ2Dy;9P4=@mPhye__gD{?h@X+(eQm3VKJ22aqN_}8rf_n{aQ2! zrzOo0A~9=xJW_vketbl76NDe9YLcY4Tw4=N&}VXpLHg0Sl@iwzHLuohQZFm_Q4A1E zRmwU|IyT|5p03yg)Nzf0VF~xE$D9xRb#vZ^Jwc3m)HIj4FIl~aDS(8P$D^g(6(^J4 zSMSVp?_bKjfW;Y~5(6lX{^F1Q3`%5=%8og%Ydx80MSuRh&QnRy&cr3o!B$rI7#`Cq}-?H94&N3(&dh!IkI^p~BYW%B&^c&qUR=z(Vqy42DhpI^fx52mIJq!K-@^ zFOLS`m9X9iDBKHlwZ5poAkT$fjL$?Fr0C!LJmH@LRPyN0y>p8C^oZ!HM5I1sDK3{p zp?#6HQkX~Nut@ooD!^Wc(oyH8-%2m3aDFT&6=%^!dUCkp9tD6923T&E13;urx19KS~AbUj%b; zA#lHLg*z$kY*1;9hDhF%y5zRG-eKk)6s(|^0%Vh_7Y^;mCy<>AwxgX#=QBz!rKI3t zX9hj3)%~zS=C&NgxUlsu2tPqIn3H*~Dt`x4<&2!Gmk;D3%ML~62MNzElJqd5A4Qui z7)1cxEDI4dCmvUV(a2gKf?{MD?UK5(;pO61Z}hDM9ka|R$3FYcL#AamLid!HT?7FW ze*HtPY#Qq)Bl)+TVl@#4Vtg}Mf^e$m5FBj;oSiR=eDfoT2?w1EPph~ZyvkVG7&>s^ zh5~zNT{`yvgvxHnJDP@k1wnHoUF)hO@QJ*@5^ka;`M(ZyOjZyKZhs1u%?EO}^^~GD zZZeNYx66*s2h{dgw_f~@5qQoy^mXQ@YW?iJ0dFo^=CbQ7OB5_8KlD}%tp{=}jrh|}Ai>B6iu(bjb%@coMQGcPW#EVI5K7u1 zv!pF_{~P>>Q5|Jl+xliR(*lYWC^+g5c86%w8_nqwp7Cl4%=JUu0P zZ0A9yOu$Lc;evQhy1zAKC+#nSgnpt9WA}+ZX6NH_TM>J)SX`3(_H($%&==9Rn6f_w zpfWu%M#6W4qBBng^j$N#ujfe4=<6z8bqLPvxV~Cqgrj5k#GwIiQoFgmeyWw(Qav=)$b^2u!XnAoR88U^i_o$gaA!(Q!Dju`>p610`62A}Bemg`RRx$EwUR zK`H^2P%?^|6z5u#|IJZlk(noU?qV=pir_6IQRX`j*~`b>US*neI9UVzO&TdPQqu0u z$UZ|R%j-AX{%YO&^B>>AKRFuEuob&dLicZ{2NBeEZ;!E^6Ef?xV76jAtn&)y-53)8-x#PhgFBz%o@)KsgFczzIaAY;Vm(-$P*5IKz}HckOt z5c-L=Kaqlfz0B)4W28oc{y zuFsY~;~oPGeNdxC;f|$G@f=j%7`8n~NOGi8{2~09p~6DB#)lzS99bV9aD)c=)AcqB zAO&d-4nZoEo&lA>!Tc!qz}sEucQx#t7;29$u*ZE8GUXY16jFoWiJE(*##73OfrMLk zllHh`e)NnI@@`Sd#@s$Kdw+`aGv5QtcbkQvRYD9DN1S0rs`y}ZZkR9S?#vkP zgc?*${HpxF&rSAU-$PS=`*V5|rQ6-~I;U>m)00}6Cmt7Z+rLhZ(oBx&6Gd!geRDXA z+L*iW0Z)n7*n^#6btU_D${#H^Jv29^+MK=p1BPCwlY2Nd`hU6BY488mD^L#MF0c3J z93`#x-- z;aa&8r0F{vl9xxSTZCqW%nI^7#%?HdNIg5q+f5z}NlVaMZW*cvoM6 z2xcNG+j|vj-{$Sy0%)$>St_&D;SRL57%nw%Kg!`X+GyX(bB=_cy`jPB_@!pL9;ntypCJ3R}`W?na z;q1fwnC2c1qvW9{qymGplydUA$mtw5lt?mLK+ab0#gx`r=L~j+vfB7fb6a!F3R4cc zu>X+FT(66T?;I#-`@%_foDlH}_fp2?7RSZBg^My(miQl1CNV zat-!&iQ$F)KEzBDM(*Yx*RdS~*QfVuTX>HnhIJaaieZ+`2Dk&?)&{}FzVCm))KaNl zQC!WB>Iwd8jimGK-px`zAs<129j7AOug4PlBe%Ijm+hb_*@afbF{&eWJ#sIS+0LG=Zr6IY|N{_uAhC_rTu%I z13aopM=^VJ)NVpV*+=V+(XJ(EWAF$!Jv`%4z@8WYe_7)mfE-kxsHcrP!EN|T$Dz3_>dFM@@2POsDg$iB8UM(9cH$riUa*QwtGOn*nUOYtZT#m1~81; z`H@n4gWlzURD7uRfi{55&f=AG9LtyHd2Av}YrCy|GOsAtFoJiy0K3(g-JXR(?*u0| z*wkCarZE_R>#Z=tK^QCJ$iTTQ?=HM!EK zz>%9t2mpt-_GB-&$PnZI{0#&4LyS%br=~1K9szUA#tl%g>ohF zcIbv-Jb{fCq1v`|hRf54Z^rQYlKMAoZXq_%tjOvTb|^{ApNE4b5rABtPE=uq`X;L8 z5X7OInDJW^Ae5(PfQm}s76}#7dQWK-)DYkH5R}^S&a`@_l%f*K4z#Ko##kjyT2b;q zC#wX(&LO<+7Pur!@P(J4FNyCXLGhlrRRo0gI9uepuW8)6_gL*fEQbqxL9Q_IKC9x#crIs~6Nxd^3&4-@DB7{SOFvzkhLCSHYAw zq)(&ig3{GL`wLf5QDS3^7%>GvmB|jqw1@ZZ7WeZuL%oYVR))al#^XwgEcLcD8E!(n z*{HzSUlUW>QYFjL6>2i>PUpay?kncW=I=H8`FquwiWW!&pa!gPqgk2bS9QW*771UZLl9(lk5H5 zrA;1j#!IV0+)v(q1A%*oZ1dI5zKQl#NdXko74d<*L`gnez181>%|zOwIXdwWDatxb ztvOf+p+h+9@s?wd;p8UjbQcJeDMO^%e))`wy8fagz3Q1eBIq#Mv(e?bK4YHX?!ZYRyJw_3QgXY zU8$lhwh1>eo{{TtC;1aEltK$Ly>6Jr8Ay5-e4&5xA%0Ry!UeeT7@X{e>8jK}Q)=Zo zAg@5^R6-@z#*8EB^sMJxacf<1rYCCZ+aLylw)LttJU=JGEUCKxM} zc&1r1O+yk1}lZd7+O&j!vm*l2K5Th>g3_KdV zqK^*{FnbTkM^4H{U6pT=`pVvGYuOlmNa;Iq;+@;tSArB&EDtU4T|@zpiHjVWjp`%K zdAjS27q2@e6H3Gw0pq+180859u=I=d%lBy}40}~&|LMyH*qE9EV`=9%sHQGp0^c~l z&fJ?JJRnQ)5V$9?F$;ww$uUlBEZg$4t}s~r!MS^wqXCAFF3!q2{jKGE$C4SH4Tu9y z{=&E(%VF<${xRog{zfh0{0Nf?DME^YYW5ClTC=B++J5`wh}$?$as5H__cQ<`@foK5 z8zTT7-~0I&b`5`Fd322;^&I}2oojReP@9Oj*Y4{L(6kbs4@82fCZfX=mHfMI-8Sgv z^;r8h2D6(159LfyZF5ju>lT`EFk^wbro@8a;Ky-r+HdOp>#AjNLEO)5Kt9GXu}2(o zGx^HfEz1ZP_Wr>P0>gCl{8wP%A_H){t^K`uKQlG9n7+*(yP7okT)xy>2GJ7MRZ;|l ze!_`unQ!~2`tmVxBP$LZQXB5@tmTx6c3rX?|CJTu6IZKn(J8Xaiz)B_$kF~E6pxZM z=Ujq*^O6@2+EIsPU&jfnNw^*LGX5{u>}`|a%}qf}S#=FY)0(|X-?r6Ojr&DF6csCqBsQW>>EJU)&j7C>|{NZE5Pnnc0%eL$~g(=ZZef{15trp`M$8J%q>- zNA<#itZX-vKbW4>?Tf6FlFQN&O^%8LG){k05A%EKeClCX?uqKlZ3mVr@vb5HJr;F~ zxgg3B=q(EBz3I@7-xMMx0KBZOKn05;bH)QP*d|rFhL_riZH3ejeE2ZQr(N-3ES9Fg z!$>}4;>??2gRb$@0S}u*LNx26;?+VawTStGC9LKh70J~Jx0-4Jk9#Vz!{^ETSpdb4 z5Vp!-mfIm7d@EM|2xTaAk)Tj?xJ|3O1*E!-Jv%AUd7Q^+oLS9VWJ#!-UF%|t5hJkd zY~nS3(`%=P1O7+h6ChYF=m2jG<$o8)dV{cyZ~J`nFUu4hTqzy)1({3`9?vJF_BNL_ z_OBNXZh8(HSO0!`k|7HmZZwnWKGw4M*@92o>;YfK zy)E7|P32WJ*5vm8z(alcTpgR8XIq(bQzu(lmKgu~XK10AELb=LJdBIw4==b+vFedvdemn?0TV7hz5G&NLY8~z9@Svivv9#-QhOeGSC(a8fazhjpm%3xwAf1RfVF5 zf^=tMhvViJx2!DvSNULA}O^k@URHwn4b{BU^ ziVLBf@|&qv#UrR)g9@HNDlGzdFHdB%qiP8+iC@UeO;rP-AF{PfX_p*GI(Z>y?iNr3 z#e(OVrFaJ)o6}H63d#ZIJ8u7<4N(F}p5vHWS%Sz32HBPKBc%A_05b^%IfM;KDmetj z*NL@+WO|SoLmkP)Q_*|56yRuEl_+*^y_sqK{1kY%5Qz2CFS;krmk_goS>z87|D4K= z61|m@71rj&2p;~`@i{@AUaNO-A4HWIyUYbSX$}wO1`aI z#ayy{d{-u{xG8;%+Y~K@4qxG~=XDaNf~kQds8in?Z{>Ai}@$7KQVK_cO8yaXL7EE0@tc}zdaa~ zzt@V+OiqlS;yW4xyG8`zVXR5R@~UOvGZy71J1N*0Plt9koBQnjAiC;@91>MfVI57WzSneLk-CZHzHq)p6|7C_Xs*s{FI&=PN% zrR(&bRA=X;Qflx(ipxZ9um0 z?)yBjbczl%zad+IBhBx~F5pnL-AQ+TZ`@&cDJZxlDKQW_{QGn@1;Qey4tO zJ|21)wlzvTlv`*VO$^p-p}omGm1vw@uK54jD0^Z$7T3_;U#W2bd zQ4iAV{>EZsB$*?0PMB#*^#*QHG{>eISm0@u$^6?Heysn>M_9$EIB`{Cr4}yO-?wpX*UH!BGE*W(UY6{cO%6y|1(qnam!*vYo>YOBAS7o%{A>IeKB9FNVU8G6F@A?llt`YjY4; zdxROl4(Zs7$?4`B!bGd<;-~E{nu>s8taLJUO@JYgq(^z2|jm?rL zNaV0P3u*+1RVNNNj?88^+7q2-}3@fZyCJBfp$7FQW6t+sO~9c5Uaf(v=B zrOsc!qLa3){|kKst&ONeM@$+3M^V_T5VsOO!n|d_ur&~*rR!zx!$RP)rJLi?6$iTB z>G9Q*Yi`>O6MH{nEkMKuHlJ~jHmcnY?WhDif=k$HAVTk}FZ{}6x>4r0xYj7sds}N) z#s#u~YBG!SN}m;XeTg8_FGu1GV>J?`0B11*Ha~D!yisT?^vX2tpBNWg&?gbb7(1re z29NbbM;)x?Ts8&;hzu*(l?z;|tow*zNG^X<>cf5Q=3 zSTA!8Bmh5G4P3mnzX=!j+$F99vPJFLTX;neNPXvSM(g|ch6*RzofDv{!qe8#=nj@9 zS+4X(|26Qp$Z+pB&6aYzG_u5D0v$XHLp`;?GPukJn6%gyt?3%m6wC{I8q6g-Hwh7$ z7h~Bw3gG~jpQf3#qK})1UG@iZ>V|;G&h+dvqL`i=@QW5CjE~@aSLSE|Z3Qtgrv1`G z)PdTKJ?izGd~YEsoYiE$!e4uph!&4Ig=fxCn!}@Zxz_nCNh1-DWjF!hm-^5? zr+IjLGz_?J7#1_{PQ%rttAs*R2U8F&B72bgFjG(4nb0AA+!MnkvLP5~RU{AJ{0@3u z{sOs$nP3sbM!yDAQgm1A#6h2|u#I##W#=MKDn2;|YMz4l*mNjpgu9}*%#x4&-8rI| zG>XL0#0W&L46hGmkhorObhOWpU0Qn(e%f`Nl1SKGI{&lY%lp)apN{OdTCjURf0L#r z1e6&;T}j6+fUW<}q`D6XKlOC{@tiE*KfA_c{lA3Q{}4O(@y*R_p6VsIcv*G94fFmX*Himbvb6$ZHb z660sPwZY4LCtXC(*qX{PysWbbR@8yCi?Ec7Z{yb=&L*Is%UaJ90=IH*@QDYoG5%*b*0v9Phno-0jtMspPPT|!LB$R_N2Wlt^R z`Vrw}Z>FXDm7^4nly>!gB{kRi`W#+v>plrxHZkrk8Pxkc9d{Tr^7R(2tNs0nfdhpU z>O=ur89&fKvF(I6li($VgX82CGjONsq8!2}K-3_(?gEH{9oz$46$qzUo_Z1PvqcY` zC!II<+!g0mCz9*X$kXHtu2Z!p$&M2vSLlx*;Hb4L31*$qflWmA z^n4`+*ZDf)jd&U#0y4>E;!PMZ-efe*2M)f!^{HrMNtGjCW=h5PTmE}ES04lBN(JNO z7j9$&N7}h(e;4YJ-HW7X2XYwPgq@MgZq6%N!F>gOA9)w0hZx{k>Dw(WVBMhYE%;M|lyn zdB6-iar&jwbplZ;E98r4q~t)Z#6vIQf6+wN-RO12ozZ!CGklS(svr@IC%)?k21o)@ zOI(v;N?XXpd3CimpyJAm@ACK=my;Ob0J_?xt8>1r)JI{>CA@T$#VV(0ho;@;b-6Ey zAQ|q`2FT-TX^;yRUws6NR~*_J1ynB}j&pfcfD+YAZv=iMrUcdEouta0Z*Ht}NgWq> z#^0|?FQq6lUX+?$Vv$>@E1(+Z?R|{RIVD;@kon7)y5P8&Tp8jyrt^TFTdTQu$^-d; zev@S1n&G**6bcA!oQ~64+hDqPTRXt-ymacQ7anko9`v|ooCj;=1!dDT)dExE+bG7s z+aXU~-JG3`D$ga0>#x-trKlz~F-@IkE(Ib5HYXrwqE!O^!(Oq4z(#6F@PVA~k?URc zD7(3k=MuxtBY4FF>Z^8;J#2{JA&IiaaN-L^cUgdF$g-`ngdibQykNwWpB3JEMmsWsSLA^5+8UlGgkucCM z&7@qeM>~~-sVHQzEXnFy_E}n}J*W2zRbICDAR{&DZz)2mIJvTt*r(I|Dyt+h_7mjl z-ZGV-eGB;Akv}9+*T5a;_BfeGb_01TSwhYV^jrb+y51V4b#-brpQGh&57Xq9E%CJp z*a?YHnkfsj2(h0|#rv501_G>C=@ONwOjW?+KoJbPoT2O7K1lRk-K@Gm?=eA;CF$mb zFGI3bRGc)zNnMecS(5jV*VU<2?o@Z+D%kL{5X&|TL+^iA<@j$M0rrd%oX9}L)2YQj~($gUR1%6fa=|l5CQ(`Xo zH|bOF+%q|e==URK>sEgE+zkcxU)-_(NcZR*!hc7>Ns;r)cgYK`PG<_**r{S+t~1DhO&swAxqbu`6Svw0a>m2(56!y$+m5o^2Cys+&qR*fiuy4!3GuLgu=h@GeOf;;U zwzYRy;U977lG`iVSl%3Ub(csxSFK<4<-Mg^=iQQOZLN`rd55PXi|h?Q3xHd)N2)r}$xfGHg#^2SQqjG<7hO=sHg88tbbX`w@K z4_kCEMM9*@BHBXbXk>7Fn?&{}jj4o7>@dzPXL*E3t-7H5jnr^K-HNZzB~8BTC6)jZ>W15U(}Ok(*h zFoK)OJe=9#dm1nqRL)CGOqT?v$zhOq8&OET9l3luzAU|);qvtN?)j7OA`{StLAsI* zW>`uy1^e(P9W0x*OCcOv!$OB)SigrJ>*r!a~ZSq zs(EEGyO>(Uq&Jj%!aB^3A3RpR6;q-j!NKSl|^Nd za?l}J8SRb+1Y79jDwfaA6Q^x-7nl1lzYk)Gu(H!iGC~oH)BIMVhZ~+(z4PJ#$>j-r zouMpLD?*$2;sNUFqZ0#QoQTa{&m`Y*ru|bvU?iyv;<+ZhfTYp$0T?BZQ03>-o@OK& zfeY1tYMBF;eN~<$?YM(qW|yWz+_g9^YwrvCaT~uso08Taw?12#nd7lsu@BgY}JPLF6Vg8Bt97PhNv_SAWvRlHLV{P^ROfT zHVs27qKG&{v{{MzKt@M4#Bhf;H6y^p(c=*%23Kuv zjuTr;TT0VrK%f!{z!&oYRqh33B>t5EfFt}410B(Y8n>@eRDEJ{f>ieXY!C;kmTyxr zEY$*CM;nE@bd^CA;*r&+(NYmw9Al?tTSr@Z80c>f4z+eB#){_iU-fKhHlyR(Opilj zR@7V~S();6=JS>Y1Wp}C<9jQi2 z$FyO{1`x5GJ^cV5^na%nO^A>`gTJzSf44sK=6;}C)FEJG)epFfwG+WAzWtD6x59Y8 zp#mM;M`3uTh+H|SwF17i9BIW0glLM2h?8|3WqrD%!g7npIeTRCqBl+)8+sCNfY&3) zt!68p3E9mAl5@p+>}y=-D~R^sRhttCkR5@2p3Lbkf`%h7jZy3>oUy`B;tf=1DEBfB znxYF5?v7Q+sG9;$$tIIATp4jHPT;33v}4?scoTZDz|6Th#LAx&xN8_q#{62ZhjNT_ zEkMf}zRQ~Z{FR&>;}frw!<3?~bzDeQw;*pq^)5Doo5!a^yuO%bw(IT%vy3sq1krSj z_&Fz2gV8q%cN|Bc+G*q`+ZXaD$;ei{8a~4C^i4ysA!C3;m_vP#Z#91j?GYBa%Xxid z|G(_abyI9^waN3uoi@8L7GRRF^iYUjv5zB= zWGgr#ZM#1lbFlhW-vqU-*zVSw)*BWcY`rdnc~k336tS(qu%tzRBY(5mvx?hKb$pZJ zF^6Z?ms24}6Kd0l#@T~98c-mvS1a2iIx(Z(#%($!1f*#6RP3{WW3JP9-tJIS&n>Fd z|7&^;SfeL1v~Sci#`}%gjW#Uu+%XW=JwgoshZ-I&Q7CQSCae;}QBF+RVcZBNZVFnA zo0&T1BgqOo@DIOWr{YZez#L_iG+>>z%JUxl|~DFL5fV1L!(J zdO03qnXa7nW$g|Z+b8}8+OxX^QHnL})U(uG3UzBn@+ud16o9c|V=C+K6*BAls)5KV zn>PKWkd&|l%?O@mTzwM8U93~)NHtOuGnM* zO*;c*0Q9-0wAFD<>EdWj<9r7b+vbGBpYolvOkP2WVTLct1CRZMu$o#r-obkomnr>- zna-S1P-_-YL6#iFG^E*lAi;D41@Kehx_n$+m(`9i#D9$r(F6)a(-OX7vTk31aB2Vi zd_E!qt9kR@h7L&&AfiPqY|pL@^x}pkcJ-W4Fe?hoXW_s#Y!y9G-056J)uXARUFp%A*t0uc8a)^|}(^XS$NZg__v zp+@x#jvV-+$f?f~k|Gv`D6>dD2HbpW$eJYJZskzm?qTz}4g%}&wcB47Fj2`C!7JSQ z=Q0;W7*%~cZak;C)zOuLbu0Dii#io0kOob9#=U(>f1vBRhh?SBO@MD0tGefh1s z79&=caIsz@ma)NA(Y(!!fsQNnMn>xDieqe_&?~#iNj9WcG!9uJ{yIo6T*2tWg}h(^ z!=49od#X4jQV+U|r{U}W$P0Rfo0^%Gfqx`NAGOd!Su?=&7xel(ooO0Rx9zm_b_6<& zLMff}LKr$Vm~rX_E=)~MRQlfsEM3KA3YxTf-Xqs5b#^AgGKdjcwclg{1IOj)9znwu z#BQ_P4$OxUG_++1XlKM6R1<^00-p`JHDgF7O)Cus;=5>{h81GzVoXLSghiykEp5KM z`9!6z%Bw6zY-8W#ns);scnZcIDQK(D`_AKT@3ZO9x@<0U5qU>-om(yF`S6_!h3f$&Ok&<9suWXL_zpd^4y zcKceDiO285gzV1(XWxE03=4F#<6l;4jJ>zpH4_;X#L4QQl6;4=76V|bSvE}bZ?ZNu zC~{?`>4EDTZ)B*-0=>6sU>z?BZ~yr{Ja90aH}B&Oe!1}zpA_0%uDjj@c~_Scm*tV~ zHMI>|MkTQqIZ}lP`Z12<+@(aq?a0kAig(<1Um>N^0KYy%qBhyGjku(Wo|ct0l@8lo=>99@#*P zYoTWH=KrH0=}%YCro{<$s1t+keQ6zZEv4{zWZ!{w(F^=)mwPq@_{nIZirne`9(v-u z)L`~a1vMsf^M-E*wg_K#$BcEp6EFeYI$po`iLR#u{e)*jQi%-ZeA;YtQ<;XSmk%`U zR@u_Izr&QV_wTESc$q(&>v^jmt-b#%?VRO>UxdoI%@zC80ljL!KmvNF&{Pm3cr^p$ zDyCykkKC%IA4(*Sr?g%a=s<_jEtN^KmN~MPYH|{U`c&AwFBM<`aO9}3G382hFW+vUMT!tk6{*+DPRW^S5MgWJj}E38w)$eKOhv6xxzs_Cc_0C1t`I)jderI91I}P% zX224oIT!%dE`t`7Qy3@hl4*%k;jefZ%w?&_B5YG`I40wE()bX_+r1)sA$SoN^iuFL zF6kBbiankUF;$`<#P+iu-(sfmzGHB<^KE~hzTfN;-mGF{5{^1#zJ8d);E_l^w0wc2 za_t=7xBCY(E;WN^b8Tm>bCdXl0Sb)QIuhKCursN#F^a`^Tb^{)7vd|2vy0C z&-k(a?C-S>M%kN?c$j}ScSWvql(HJ8IQIHZMs*t|3Cg!OhW;S_$|T>d6k zlbOrxxV|B~UbV#c7(*>%n!ROYe3N_StwpM!eut|WX9@Doq{bvmNy&ByHb>bm2q2Wz z9#he8!PKTYa56h!T02Xm5Kwh)$6aq7cP&j=6Q|maXAEd~Q#O+41Yz$qas263T~@Gs zqvBPWJX*r)Pv@{&r}KpOB{B6IWIEFxA#FUNfi%;LBsbd+TB0B`e!Ban1jpu$-)L=F zqqqjEX=)dh-nJ7@RfmB_Y3LEz4uDZ6l9?GRgnjV>3E@!w)10< z@Iom)i2SMJ*(J+&Kj4&95IheuV*$PwLFiF7qH;d2NfEy#Iu1)9g5a3|f=@EnmMte; z63tLQQdao3oBrt}ROB;H z=AHa60@((MKYh@Aj;GGtL=F=AB$X#0%eI2 zj1kk3WEnN0#rS~cy)o!|9K0<0toGAIOu4J?wL|Gg#d|-ky|ZHF+d0FfT4|z&_&~ds zI4W$IVrcmh!P6zgyHGji15r4hih9WFfYUKGMBfh}>|O z^e%}RU|&@%oWhw+ZnQ=HDTj_Wwmi_g8Fx}oE3MaceNGeh<;pyhv!_;5^7zCkn{wQn z)=e$<90HK0*5B@`vV`fizBJhWWm5EihNc;lDwx@EVWPepw*KD1#MS!3xXFY#t)BqR z9hd_WIzU2bUOg(f-l@ek3)kvhw6;a4<9E~oaaEs&XyCL(N%KlZMC`h``+vcIOkpvM zFe$%CEKPxPOT#KOrt zt_c#Z9GJzH!R8P$L&Nb3n&PR+2=@%KNGcF6eVTt(Y(wqvlf!wGgly=JWJ_DI>W76R zwA2jabv|X6q8=No!!3r*(fU70JK(k!!yRVU|8c}zP~_v|*OcFXV!`EFr5_gPz{SWF zN>RyS-0gsxrbZTw`6kC*{Fse|tQz<>mjIh~STFz=xci+QtARuG9tS(Y)A&!^uygfX ztP+(#@v)g=qqXSYjZLxUK+0>5`&{#i|gavTtiYuPJi*I_hbhz-(`&xWj8Ig#^|ef-{xI_@kn3v zcBYFB71w-s!(i*O+nMiH->m)UxJt?4QK_6>#a#n@9xdUi^!d!$J286p7FT(p+`OiAKcn1>@bw($bC5v+cGcnG+-0x6wQn#YbCH_C!M&CnAt`;ijc^(iLUMroo|} z@NG$A)$xBcSP|ZtfwT7@E?X3Z^dg-t;2JaSz08UeD~A#F3Z}!OIsCGG@3$| z2IU$1cKY>}7kz9EIj*f%x}%{xgZTs2rM2JjF%geKW#XdF3Lihee%u=M);z-YpvCXN z;mW?K;EgaFLqmY4n}~hfwh}L-Klm)Jv%B&xvG3@RaRF`1s2J=)+F3jv9)JDV^GWIG zW4~Fu`_2+A-r`Rl&K!e`yra0PmMSl)iM^nnMxN`b;4FM~5Q6;y&*)oyz8FOHP}va6 zpJeto83NovhCkc%rtNT>2XKa{dV`6b@>0ur*iO~6k|B{nKNOr*BTfxnB)sUuZs_m!Kq6&yT%?g5%A@;%V9We3vCaaSxYongTI;SN-+p3vLUS~9 zJ=5?Qeke4tKc!eCS5)^XGv(n1w2i;r&tO2UHXxPr+4Ji2j?}}7)Wf|}mR)bFrpxYp-S1`E zVyPf6&1YN_f#BhUaU1#1nt~0#w~GeU@1A*FYvZ|c@Y-_rhO&9>2!AP|qzCtn$uC|% z)=-$mrVbQ7A^z##D*&7kdhS4)tae4Co#o!UFSpwb-2bM4{03dAX)t~T8~>$Em3~~M zrY80Z~v4aem@!J(e8lVS``HV%SAiaOYW$v!20iCW@kG5+D0HF9FuGXql;QvbFU1E@%+Y8gidIdMOsJc45)kr4bu)m3P24?I4 zqG~&%nWVie9BCUGAlm59#^eTpuPsd{xW?C{cr^p^L4MF0Il`Jxs5f2+wmeSwPp)^8 zzZj#iTj6tt0+aeqa3ljk+A=$^<#xnJTOyuahJASfq04iA`W7!Cz{`19vIQ}o^jXQU zh?yN(BC+A$2(dX|OmEf%o(TTxe%VdQCcMhU<5%&Qn6&Bso%yfS{}oJLRzKG6480!R zKgZuM|H!oT>t6%6YhHrgP?v~W+sLL-hCO?DuQ}Jd*wY z0&sue`R4f_KgMi-pG$TTQ!mQ&vWA|c9*o^U&x=tV0l8qo0dt+{vzYw1i?38gmfd9F z=0tWHR$FeOwypNrWh88dpfQHPC{`IzPYI&KAS2xY9digr{DJ$U(7cMJC_>Q9ax@Fz z=EkfmaqRDuxh_-jD#-xuTJDfuUpfB|NBuA%vM5*g{81s+Ns3J^gpJr2|6g|JkDBL{ zcvEWAXgneGz9UNOhTFT(s%G0hweoX+&g>g?*dcU!oo(4eA9(FCX$6Z;j*g=Do3z-A zK!1oWQ>LQBtO?Oe`SmxOi?W=5R0<;5t97@A;i7(13F&rGiTF0_*Q96?NL z8U+gI`L{4>k=Y@{m;Q;#L#blx*R|f5v)^O;97S`#x0`UeUt8!+h&xn@k&myx*io9$ zdK-go{Aharp++IY)Vf^lIGr%LE3%%+IOV$X-r1Ey^QW`Ab&*(jnUZ$bwsoQF)RX@G z!2Q(3PiZ?#pF9O3_If0|v75#E{lC6S!`{EHa+WhwS8f=yRp+n|Kd9g4tW$yc9fTYh zD&9q>Uc9yL4s%@Ohycwi3#ML2oqDQ-f7(Z^r^p9rR~7}#u9m8 zk6le4!Mcx()ket;X<#K@R$qi@{I_A^y4k#((Cqe2wkdxcyxu}^7V+f6tn^zehJ-fE zs_U}!mXhMm?wiRxXgW=;N2FH;-D{G6ds%-ak)wy5ixhakX{#Hj2aOALe^~{4%t1-g zgZ~k-8_dzVgO9RPYB61M7sc5fHGy0Ks&|`8Yga|20Y>!3OB zaxQsDj|ohRk)t&ii&CNKJ+ z@%ydV9s28!XNhP2lE+Dz*JdJjC`#qFj;1T`ZoX}9jb)%mQQqn83+=n7gW-&cna7S`%Ba9;}4JY z2KWbv%&eIk=btDk#eP*rpVp<>r~F_cqIJ*FE!}oQV?q~e^k&8w$-nf1lPKzcWQC_7 zzoF4zQN*ANMH}nCd>P3%Wl|5ff52Qg!TlzqI%mBi-Tvgq&;`eN*?ZA8O20)Vy}t}v z_`r;HWmk-5exJ$L8UfevZ0$3l zth;Sf+Cnmxeao`9pn!O*dzLFrw?a)F_uGGVL^9DsNCR8xHmQZ)u9@z{uSnT)3S==; zt?#w{d)L_p8CVnl57v+KNVi1Ut9mRt>?e>D>(Ip^WYp8Zx#f%(krT;juS=!Tds8JK z3U25Qo3W-wd&jy^*I?F0rt<(#*fO|hIAc};a_VSVAf^|YB$6vbEOaF@$k?TXFp^Sx zM!|e0$#aL?ZXt4bb#P{oVzkLf6=uo-D@}8RSrQ9}q>7B%^*=cJre_w*wvTow?c&1- zbEG3ll#h2L4rwGWiuIT71G2ExGM!!iBQ~Sk5yBh|w~~cOc1{ced2M9r6gJvkGLGFz zPCE4LOmpL=%%CrL)pX2(3`EG7a6S31L_$io(lFX?Kt}!qDT#q;e|m*?zE@zWfI#z{ zNyvQ)K8Jp9EJJlP$Psv{wjmjcH7-s)&Mul0b@>Wdibt>{TlHSnv9M~CZVu|DR71#; zX%fkQ-vI=_Jw$KHNy>6$kKGqCo+~u@JKY^(ab@y?AMw}*Sx_J*kt+eXmdeDt zWQFzbMQJetsr``e2%TMhCNr?4LB)9xyIFF(b8K1{$y<_rYYK7m10AVEpJeE-tZOI- z)}-W^_ZVr`S`MyVE7-P`t{!ZgA6UPy%$W@v-rkaBmN0bOP;!?!j>S&qmenxk##(nx zZHKD>{`Wm~jw_ApZV!9upX7PuaG0fsC)S%K&4z*gu_38tx(B{=O>QpT6s%T_E&769k?$fi~kJ8lU;y2S;-c-2+ zsGh$TK<(qJ6MiUZOJ1%jsp7?LJzveUhV2*IWphrUsP%eV|F!5usdm<0GrQ&&`$b`E z)&qH5A;i)(i{i!rfo5cmawn9IIRPh?2b#BFCVQvX*lRb0h?_GuR_ynF2qhNv;hWoN zef~!l6?)Qdx%9V%x79C8?|)mxHgvtUi+||`%lB1B?nd<2<=e}dm1tFj<$Wz88= znb@yOC|`k#8Gdsa=v#PI(QHRld*O8nH_MdvNfLJv&+Q7kJ{C!> z&tXA(T4S;|BdYFjV@t*Jr#Gf3UWrmr>1O^tnf+%Oq$*gfFRyahZaPyfl`FhLM>-fq zOXYc~9B))Z<)b5L8vGh+#JLBF@wx3h+{WbSfajc!H9AIzZ#27!HaBBi1Fyj{PbFV) z@0W{;w!w2QPq=;VMDIaec!~?+o>~aBM*#i{WKFq*?vszt)Ipc4bgjc9B=FV4QCmch zUXLtJSm;~>zAl~(pgyX+D=61xCjpAe`b>7S1guhzkkn-L>lvov?RMgjhP44Q@iJi5 zkTr(Cxmt&g_Ktvf6+F}d_l5izzgOK}yLaXDpD4`DtI(0Wt!A<^c`8%d21YaU|YCF^57RT9<=sEM#W27vxzs*#XzrNd~KH+*BN)FGw4Au-0!QHHEB+~8Men0;-a ze~%#q7$^<(=&Lc(1$~}MUe(X_BPZxO==yyDYc5+!F}2WCw31X2U#?K;aztC$q%>(K zRX!F%v%@*oD!T@iZl9P%vvd4Tni2yGb~=^gsSN>fAR~9wcBh+p&>pKj0KOH7xROxL zm(R4?)CDUOj0g>bcOEq-+ft5okIz~p5hFi(9uFoSz|3>lTaw4RiSm_yMe@jN5;-Uu zqi4B^9Q;)yFoyOTy@z6)y6Y~O!Np^Z*h71*%C9T^U$19;t9Z{Rt;km4-{h71fHCDm zMT3cH!MU1F*ro&h#|o-j3c$7+c7~lvm_=s-q2oei=AUn$T$?eR5yZtXAd7Ce)C!CEZ|g#dlaz~|CMAXvyH$y_+K9AiPhHvzVD zF?LB(0jmy}syQ)oLsIzG)r#>U{G@G15H*AZ)y30J-`VY(R>9`0q&4r59Jj(I!Wh?c zw1r$cyeh?o^hnMpW8k=TD)z}(_ew;ygMBoHwTGy28#Pith#0PmP(&z;kU*Xja}*nO zLZvOI@V8>W=_t^w2$%<<(MK-~zdfvt_NSRiiyM^$_->7iHBK>uhY8j1cLm1)RQzXhy04|$Q324vqSCp9DW=^sy3CXL z*!{j$qWY1kxY9kPriro!o@iHe5GRX|D!QH>ktv?LUBC<17Q2mD5vjc4HZ{Oe-p1B% ze6=E5Ku7#N9ay&du}R~B4>}6%hO5Fy6TX8pD-sa`r&E@Z2G{%4;n4Mu+U9vmEL7n` zhGjvXa~A6i5f%|q;e}LAR0*gYTr3EP6C1`>FQc^{+9~hYO4_6u1X@zPl+E_{l^0N? z^jc7~^M8n}lU_4iYi{hImo{mlzl6g0kg)MJ;0fzCj)CdREAZ9Fn^lY zDMYe%9x%!;*-VZOXF8eprbFnT{BNw`?b^PnlGV)a~c@#YiwC)*g8lGtXnYH(zjF(v`)R-`d;7{hV=+;FT#KMiT9wF73E`!{8r zzi)Igh z7i(4@x@uYU=A2%Zt2cHxl-@V^uZ>^IWV+?KL;Ma5Lm)sOsWnu(e2YzlfuHyHhxN)D zvuv<)vhmvk*DhntGj0;Q&kZ8x*v173NFI@FAR?@apq>F`2j^G_2{Ddx7 z2pNbG4gpWnG_6S3`1&)?DnPqD(lQs_=nhsji@QWCYv=U*+1S(Rv4%D1Q?k0CH!vod z`}*@y7S{3+k$tG?P?U4BIvY5AU4Kt5h)8}IeZv><&Euzj_2Nu9>Pm0#WpDMLvtQ0v zAA0tg#gfmnc>e75mOireQ`~a=WOGZX)}vzs-{-4?)XB;7M6?$6 z18c?Z+vn{u$JOPZ*ApQAGP9Gg|EYC`G2Usq!&d^b@4=VSe&Sq?2#6+k$KsZQj*HKs z_tJAccYDMq6@CAMeuu{ZQ}y=|n3t#P`>_A$eY?}>FYH?isx^~?kB$4UMpLIS+Uc0M z9muY;Yj>{sPTZZ`00CivKtY@0gM{mCe+N&ZbOyInAh(AYJTjv@|w$r z^4f5Cpc~n0O>o>R4?PCIYVEXv5f*Hjat3zCm4QFW;(YXb9~4i51@NCTL-ZPQ#O(qj zj81Mgq}^bEaZ-5iR|RC@JBIEP`_FSHP?;N2#;f%S*om{(1;SwUJCdw@Z-N|<-n|KR ztJhp~YM?FAUmyQQ3~a@=xE}uM>A4^m%yd-x%dD3uRb)g7=VQ3X_q2D_iKN>S4><31 z;RUNIvbrY8`nDzB3uXX}a|K8F6{{29%%lHv z!~b)$qCU*=6Q33<|Fdo1^`X4>L3W;M6R(Ps=oTzW)qD3z`-FFHh|D_lK?pv?!M>h8 zLwN!DI}IQ7{{yH|ALa>&SEVx0uLkCHnv6+4z=`hhf9^|1b92v=Ksg<+xwk}p#`=sY zn#qOyz>vh-PTf-o4rAS3+jb~E$9(<}d=MJ&?+u;VEst^BEsuysd;SpmiEO-K10~FV zN*LfduQ_z*4>JPv{bwA`-tzPfJubJR#8a!-*ZO&-jIXz2Egc z)q*iG?JAmPrh8Ii=m__~5Gq5jfPvoE_6)h>1|6)JB2S%VW)tp>~z&IO}t|?`8 zmi&$eUIgmWdzWP0OrWkcz;f7f8ACeJdwE-9pNZR?JZWG8upR1G|KXWA5k;4ZEz`Os zN}c1QB$k1)qG<6|uPxcI(0OE@~g z+*F7IBRc>m9tNmqS&&Sw(V~yPPu-1~_VmSYX!Qpz1`8X47DI*oLCwg4p1ZS5?`xsL z;O}_-`DmZ9d#J&}DT*y;kU}IkFF~`genPwV;Q6Q^zrK_I6Rm*z5%v8q0_|tmxAH#- zq@Q5l%Ksp+e*S$c|8D^zgId9NxOO*S{5FD|2yPr8dmQ@yJA?#zf{{e3XY&U+!QNbg z^$_&||ATf=b~nKN{{IkshiP{M+OIRn3Fqb#qQ|fghzRohZ}16hhj@1b($6=@3H9a@ zyhpGP2n+hJ5TXwUtOx7{I*1v}4}2F9%oq&xUyxLg6BOuw5V1ZSh#s_?upnkAKhj-9 zaAP>oe?cQbPDr5tLEv`DgA%}mAVB|@fGWrd0`&hBwl%^chQaGlvOA@1$Cplr2g<%r zM_+k~OJ!^hhW%8>&4qLWYO_32#8aMJ07K`>+WDo!wfocSvx9~}stmDQ2`WW2WwVDI z)BZ_rK;Ws!>2QqU$KcL#FQ4Ei;LK4>p>P2qO_8dxCg3ZelNy{ZYyAH5s(WY6a=hes zKCWa6+cRx@fu&4&I=*hjgqe@zD^oYwnrdQ7Iza8>ODz(kjGt71#b`R@Tr1d{rHnDe zOn%Z0SClxb80%|xfVSpKHx=w8E2`zFbEwHYVikYxmn*}Irok`O>Kh&EF>KQ$t7Svn zLyLnI3gl?V6PC%4?BD|CZEM+lGd=k=I{j9tJ0QKt#z%m*{7x-}*DKkrLoL|wZ|~}Z zXV0IVTbJ7?uKx0t6_{m~r=FgzimO{51pyI|@#7Ra6vG9PO%HaV$<=Wyy6IN6(?EAT zid%1T1?&6NZ+bt1S`Hlas*^jxU&c3&%xMhgT69MUqQZOU#_Czblb4tBVf~yb+ zDuDh$9s>fhyE_*0MY6`76(9W=W`hM z>;jpk%>KJF#5mD=O#qem$X0T6L<}g=3vd|1LR1gkTyH zH$$jQGOwdE_&lROU&VYM1ehl_jBFwx8c+}h@zI2W@U2%1<1t4%c{GP+En5=R5fzH7 zNq9o$CJtCDoY)e*3Sb=Pq9kzXNn(nQb8kw5c9(-8$W}6~<%kZ7!zV?y!1YMc!1Z`# zCDSrZR#R&wvM>k5<_*bV8346R`Fd@4fgyciUV|?Lv7?+K(xL81bDWo#6)+j3V8`7& zP8V|90C6NcLN(g($amy5Jb$iv+7`=vgIK$zc0G^HCcYQ5mNLG&s`%=TJ+lXA4}<1^ zotYm=n70Cz+!3`&mKheZAkLPxXf8axxC2W8D$X%R&2dRcr7qcDzP*($Q3Q~44L=QO9)fD5F2rieqn5(%mrGQ4k)SL-szr2M5 zT7L2VUzy9D_1`2dte@)`qsA0EMZ>(z;WfUGa1@86dQ@2aj;B)yS?j9&=*7e*li;vm z3o8^IlAt8m6a5v*L7LJ?IM44X(T|QdO8S0LWQm7t_5k)X@LK;*_?KD>4gH{=Vlv0H zUflbEtiZ@&UV0Io!hQ)Jvb^np8kG!%pM&GjK+5kq8(NsW`v>Oa(&^RcAEJX&KlGx9 zq{caDWRR2Wr^ffyQ3hHn5`JW24$m=lWou@Z`fNja9MDyqV>#_L_v&-<2x-cx^z2T4 zn!vrj>||Xy#A`8^#%(NlXjniKxegFxhpHD@bU zb%Y6i*+M~LSUi>j6qxj>npI8vo7UBYcsUqCE*8R?E*(waI=jw_isMu5kmMg)#WMX8 zRy{-q4li_kQXw+|zil$mjztUREwd5EqWNeM(l0{`C8v|A{ zNw!2*1VtJp_2P({A(3C>oA*zj%pzV(1#C6QYqXLEnTaygWBQ6N4QLvmjpD>;CPgcN z%xsQ3zl*mk-66R)GU({mW2eB6qr{NKNXLY5$YZOcE@ zVE#S^`yG=6w&9Iv`O_Ey|23J0zqyiNwY@khE-RNmSdoZQaSSqTgjTmCtGSW5y@`1y z6Cnl%hXOI0gP^shGdq*QJQ&`Vg!?OB`r_s3RJ2a5>cwvGc36_WW=AG3&~* zywJv=is{eF9a6d$dkh%HR`E18t?BuYFLW-1`5r3hq!UHr@+bKp|BGhOW-m*d8)kE9Cl?|jvzi;EXHqTK!Xg|0 zv7Ac(4oCB4o}34CD18oG`gbq=_t$+Ob%589ll1%3@by*0=6+I$MRO)hiwgCTWGOs6 zQvos!Q_wjtQ_w6PQ-LIefe1lK8(1B6+wQc!NQ^|=+8wkm-JM1po6o^A=6GG1Ktj;gtma`s3u!g6%J2$i0r!Dc~W{qV@}Mz`r|cC zSYJTm3LwJGFiGfrezSCJ_4(G=>zJ3Un|5z&8vf-}Op;8IQR~6KHR{=Pf@@ECQXaaY zKn-~D1SHgvpInvLRb*jgxh~n7DUI3FoncjA<}B3=2Q1aZ=8UR{3QEz+lWyPbldag@ za??{OOJh@YX&5X^rm7UbmXy!{;)iOTX{*5)>y<}PO2M0(D5{RsXg2MIL_F{mr6{ag zyM#(DehtoYh z6we{@4GlwkjH%QI3^EO^b}o;SphM)XW~m6RN0NsLz{#_s4yetAHefz}X9yF7lXpQK zklXcL0B=3A&6$JO;-=Ha3(u*KzT3|HRoix`6KvjC?e+1o5AAr}=?KmUw*J7((i@N* zo58r7v0{0E)BsO5YTFic*UdsMDr)3rCzJ!=DlW=IZEdZqtLv(+%dlEx40LjGI_IOa z8mEc|@Glh0bS@KH*G{t(On%?d_~3fF+ovLRCS*|#A?V_jTe#Vvik3{9Rr3SVRr}&Y z2D4`3R@5M8tFIp?y1TiaB%UeI|M~0!I9Z%B?t|smNUwp%oME!!-aGlhU}nQtqE;W z`saoRqD)4Xf{C9`U$LtPxfkW_GP*R>|3{3>vi?VF@?I?;JaS^2)rcJh^W5 zEinD-@jm0}h3dl}u(PwhC2HhbesJy4F=qefyTud)`poNH*^t~e>fO5bld%CE-$|C*gpfGJ>PpYpAMB@$J)p-8B9i|2&txfhTVUrQrUWPp^CAA*rj-( z?)tY7`1m48Apf|nB|FZXKoE?8vH}D1O=Cmf-mKR?KALww^JW}V-xG9huvX8#OB)ztgP9yX>*9spI|QiMzmZ;z&cAPoLc@4 z(6W(>#u%4J*0!WPc^~8KY0fzb;a9{H&3_>G$FmGYKp0mG-`fgt=n->GO&+H}F;$w1 z(#c;I`Ys<&*{}wHq5g|bDehcgK?FjFMX(I4fdRpmFkuU-hqD*@Zp_-y=3~HBW{nmMJtV4Zw^WxUV z`BkeI?2io=<$Arw%gaYkPf@pjpQmrvKjL>TFM?d;M$c_Sh9lZSTDBfLFSjxZ@DDFN zU>fQkFTXL~{rr4-YCRHrM}S(O!L}22D()m~<=lfoDky*x%I(2eztsP-C&cVGp?^Y1 z#;F~cY@X}r#gWSE&Fu~J8u}$g8q~9D@I&uN))xCpToejLtnVV#_=Ur=1&--SHaVq} zX1NxNOq~s&g6XRe0f+OBL)I3L#v~!K6)o8~x@2Y}S{H*&6RQ6PgXd)3pDGe&tmf21 zvqZh)tP43IB^-n8%c5JwFewHl-MBPFD)1;-zO~WaOAQh3-}3`c?dJH!sl49U7wNH_ zOv$z0;v;AgK&nN|woS7T7dTx`kixN%nSvCLQ~*JM2Y;7(oDDa26Rp9uWrg$t{N$uw zR6KOhUoIf^P%6(}mTU11cs>5(^BS)^DAO6<6otoIREWZblRcZig0Bv%yCb-4!DXW1 z7=EW|Fcsn>F2o4f{J_t~RXd}xa1bVabiDhOz7oq`CUMR`y#G}?&Q09`e$;Vk?~>$PYGkBT8Ta+3~A9(>s|ab4HPR1@)C=cAHGa@t#`M? z76~4o)HMKxAm64ZGxUQNT%20+3sR6;;HwNCJ34eNm3x~k&d=UYl6(6-QQm}(Ri z-7)4YDIBX-hNT4kHPR&@ovA6Yj|({eo@bo*W8^^5eH8grSR%gp8`+&1dID=j#=Y`x ztVTh|4K4f#_g_5~w3rPA*5q$&Gs4rO`!}^g$YEXIFcagO=@xcog#uWVB9|Vjr1XMs zt&A*Ka~%g1K4SZZ+06|C3db0x0Tb{&Fva0ZM1Ck55PBBlCT?zFzjTJALRg0OH!Y|X z(S|$HaZU`dry0+g264pwR|{G=d=XI8xZE=-a8Fn`X2v}l$HpdOvm1%581vv-^p^W# zTN&o(StR<}j4j}2mVTk=H~r*f1)%-m$U=QA&Vr?$0p%;?+@dPw-2RTbKiZJd_tb0T zjMSa%IuuU@LXF8Y5<5k)5@efeG4)M7hKdxD?h{=K( z4VU?)>H}c0 z4~S*ej11x}LBLaMO5q(sz+;QhBNcy5qzBat-FPqgc!01h+xXC8*bE4g!=6lIXT+fJ zVQp2T=3p4O<+<=vnl=3JAhoG(nawXIC_XibdL&C<><`*1B+r7r@qRV^9`#a<(`Da` z(MuJ2NBrCnfW`cixt^n9LxODH%_2mC|0wC^XE_0GI-3ovtE9&;R@&hWF_kQG=dFeD z{fOcjb!a$b@jkL|6-+ZamR$`>;ie6P{kY)7!L86tUBe3_ic66l>%^sqTf2hHZNQtP z0v@a}%BeuvyQ-DY2(<{$Dr;V_Y4LGOsT?fU^d)7D!MuZou0{A7 zR;)wes|AD}6>P4sijahw5tjune#H}LL>zI4X`7aadzS?5=&vJoOOZsQh{xi^gf3KQ z`vl?Pjx#_c=adOf+mbxMvGRVrmj`%r`?qNNxu5yz9YFYb?tIgCDpm8C+(u4=*$Uo; zPN5*y3&Y+UMq8q?*Z4O4T$oTXT%@z~Z`%MD=~vh^71+y+%i#KQLm0@?21C(XVg6l< zp+MctGOTR?bX5;3PL~;=bC0vlwxYk?2-5Mu;(JHsN|30(G_qq0J}%eyZRDlhu>ihS8N%2U=0bhaYF>&-O}i?tAktTGfBUqoN|-9tAN1 z%!kr9$QVA>C`!h|F@r(b<|JIN$gL&aQu=DdZJGo)IrRXhZifb@ZvU~4hpO>^t%XTa z;cQnFQ9ZQj8o&$v*Wx(eH0)KI^Hxj#-9WMHb?vE|p_LttlAv)bnC7lGt+x96>TYJq z%I;F&1fA9c!aQ})pcJ;A-cjgfSaPQk_V%B?FC%fi>*aYgG0@*P93d!4Cd&--Gw8n3) z0f{rRF5W~Z5hj6f>kEMl5Q#5g->M6G%rlll!n`amR~#@!mD-zhiv);-Z=yDQX^&Yi zfR<>6LakRDMohrL;Fa^em+;*T{(F1TEP7!f?b$ z4vIb@q%IKb=z|Bs%l1)OMPaCr=k7tZh>wCTSZ%MS-r%&mo%h+l&E{8EM0M6kDQ@A# znC<&ytps;TX<6$=W$`u3DV#FoG;W0H*vH*sS}zGD#m7KlNVQ?{^#J~eTDJjq3(Yt2 z@8__rpd23OXsv$zc$}l2f?NGNzD(H7+zmy*&L>ZAq33 zBmq6F5ad18j65>JTSd#e7sI!c>`_wUNe7--igks&kkEgt8RxWLThjDH52P?*Waoz2 zkcU|dc(x`~;)NZ?-KfjRW*^Qir9&Ov>n!c3H!Cfhdr|Byvp+oa+_;;5JguzP>s987 z4~kpcnk*Pg z)mqYBAFpqSNNMNP=rC>mnJ%0LIpW(wouMsHl z19Wc0^Js|&K+0WO8f1>u=>M`-_P_Xn2o0$A{Q;61vKxuPB6NI1y~FUKtA?#`sVI`_ z{uygzDtwq9A4~+h=UM?<11o9o9j~HZC?X8aA!;0K{1qf#k9~?&hc^dOnywEY6x?XB z{pvi$bQxsWx9#qjw+V!t6wGceq(C@JNmis03nK~Fh_ncoymA9UGE##*mD)S9+nmENH7uQxLxhLDD&ACtgItx7 z6gokuMhMtXyL>bC>aV(=-1k%U+YGG8;ddc6O1xa#Nqw;}ekKtvWaNISNdk)LhpSK+ zjn-7|+2$#~#cLV_GN&<;QTvvEh{go>ifJsz-`h&)@fQ8nONgdtr*k~0^i-7uY%tI< z&(idw7rz3q{xA*Id??Vxf@rD@r54vOHMJIVY(Ztz!7QoV+?I8IrV_gYzm9knqAsy}Ihp%k=4+{6zJPl>AC;vUf5P?%BP zhol##SK|6uU;YR1Z|@4GlvM?H`kx`>0B*BHv*k%JYi@#u_vT^jwi%+9$ zV4kUh1e7@B!}ws?s1^PdC&e^S&!ND(up8TTBcjjEp3)lmYWHw_#Nn_Qv>%`CZ-xCm47TTR!W-$vt{Y5 z#lx|oq)D>(fyy3H5)7w*@cN0@EMaFR8?UR%hKZOPK)#VUxSh(K6f-|6HQ|>8`P`gShKdcWZEw6;H=iTNScVgk1>F-rq+m#hR4XfzC-18M6*Qk zjr*;hRw!ty0!&PVppCWL7mv5=T%|#s6Q+oA_b6ML};f? z=W(gL6dj?tMg#)wQJ4R!DkNzWN@?gv+qW#gG+QQiMvJn_sg@-+#a*)3Pa&W1+xJf) zzwq1rPhyH-+WK{*H%Gcil7pc<{=#l>*;Jv&C)#0l^#0AHnCv=ucaXf-rZ|%t8!S z~22@fG_r7p}roQ!ad-P$g{5I%2}-P$(45btJGQQqvmHaTZVDQ6BPcPu_9O0e+> zgMg$M?Nj2$+U(%qPqf24i5<$C;o+_P+R2^WNs@cXR4t;M#R|OTN|eNkD8?zCvp7}9 zl$d8$)G@KYc@|HVOh3deT7EO)~xzV3Aqp4zoWp0OkQA_XW@=4ZD|8xq*xAHS>nChe(ojkf#pz$!wjza}{dQWWA3S*BHsU^o$6 z){C6;vG-ci#7#mLwP1pImAn@qs0D1JG16O@m!cr*lv-Yn&W*Dnb?4iWKZILwo-{OZ zd#IR76f}p$L9WM%MYv!tV8Dj*-vLXtI}Ux(JLHtLqviGhX3qY@_03Gk*zJG@M%SXU<(dKWU? z8T@yQjE>51lGTEPlhkz1JzP!r8Ub;}*T(I;sFAQjq)}x;gyYv7o%s6LBUA<2B>U!6 zpv5-eQS7Y)U^G#R+IjTqQCw>eRI5I_Lr||=cK4|@+mljf^aQSx!R_J;ED9XrC~~pN zg*bT{T4F$=`!&DO>C?WlmQ?&?E$__4@tgb8q2XVO4c4oT6|l#+H+Cz~jnL$>U4Wos zX6>Y<_3^u^6RLD?kGx4UOTpDeohF`w#1)%SkSP7ifZizU6R`U{MbBuEB>&^$HF;1E zq=i_2?t+{#li_^sM|F8NvNtOCzk?LYJQ0|Jw-oy8bAL>pzyF=Y_)!oeqb{lX1Bq^S%Sb-V za0a?D8_pu->VBg-2pKoxZZGXVIIWR%Scw5eBLi|8ZMTq1H=`5lN%Kn3VB`U_vyyX8 zR^luM;j)i3EIHkP=_R@ak105}C%5S!7;@7Ozp<}J{)yg_;Q}lV=g_#SD@;-Ihi+O} zZuM%D93sDZBM|Un%(n;&A$G|_5&V(hN%*Y@lS@o)_duCMY8kt&g~`~=g!K;})RTlF z@qMy2-ILz17;|n#lug~^eAMswW974`G*T_iN3>eHbZi->H29Kp`9`F?E`VYjSQA(2 z-FNBN%aq*)C71eeQ zcMYbro1&?dW&Ae~aQdVC>4GKs8ZP=~4h#NIwhOOkd z5@X`FFBHR?uk zYRk9Ds2a5^il=`iK88GG<-$3uHka#DAnQ9pGJC=yKjM_-Bx$B83Pt8|XkUx{U^`aL zyOLIbUg$H&6VIOaQjVNsWC?Z(DSgfY2rl+YdBxjC-G~eT8lDD@9G(kXEI*R4ZoP67 z*nC_&ML%A1w!J=YXnvH}lz+CzEqUQfeqhK~-CaK&cKjZGR ztlx6ti(m@V;5oAe6F z;t%2Gb=865Yqy4Vm%o(rqqLH7+_xsO=an2!gwMB5{~8QPMRyqrWlK}U41U+WpDK_O zmQ(kX{A=0IV{}+?bF7LqafnVE!p8?c1KZ}JI58V^S;Q5<;eg}@uoxX`<-=T5O0V?M z4scHya(`Fx=ZO3nr(>AtXYY&beUNII<2dOM{=4X5@#^bWHY7&3w|V^n2{PIX1+$&L z-AkfB0B>#u>^=gFU#l6-D^4~})d%tsLDiCRVFm=SR=Ugs*abL%qFy?+B+2W0_zdk% zs5930#*b>(aQYSMXamdeV$<8Dzvkwi$}^Wgq0H93!HP1?XulGC{r{jAm!@h7jhcAHCA zJ=S_BmYx8AI}EzQfb|+q$yvD%iZ|YBcuv&geT;Q6#Zx4Ysqt8$#+<2D^;w&Nl;lPZ zlOofpdw-+f*5N@~8BvSR4BZmvOAn7L?aNkQBi8hpKF=1^vzMnjo3~5B#%}JYteM%w zjHBm$OWRgm#>V?Yd;d<+drEnUR)dZrdg-qxs*W70avr>^h}SjDqJb#|k7+<(u#5lH z^34wGBo10+JG6IvTj<3Uc0(Z&R5r_Gg5T#EJGL~p-NKSI*82s z%f}4-bt}5B`WVGt^Q^XT>(^+T96YB8F962A zjEiMJl-K|C2R^4#Dz-1QL-CE2GbVKXbm>Z|_-s0QLa8maLVxp1(f9g^q4Y2**TrgU z2uqFi$S|SUu-`i0Kj+sOL2+74JJHi??C>sZGcvYExqDm)6V(1qp(euBN=HT1{l1A~ zskC5j=tCU!$avSUlDs6W!MCpkIlgUBm7*-9cT%CdYNas!E%uI_k@}iE4OON?BEgoo zer)WrDy8yc1n|0)lB%SnPLw6G-?}96E&5|IhXhKgevr{A*Wwy3YgLy>CrBUhVw20m za_p=6G!0iQfX8{O95L=rP%%`!?+by^^& z_|o0>5!uhBLaP0Cy^+$I=dKYc|J6ym=ZNMY1I8tuWS@+Ge}ht7xPIGh{=ke;SA09yw3Z3gXWJ6~%3m z?_Q#}*b%f--?)$oZTF25fJ|5jpYU@d6EHyDq-PSvIl~UBRCh}9Ehk^1dnX4T_)04V7OvA<|Rik>K1`H?5dY-j6cUS5Xc zp>n;`*KL>m|82Rq3c5<9PwSuY|E^gpDOBm>k}p4ARMBx0hndhY3QP?MAmR zwO*0LvKE&X!&QAOe)xUY^SK!k$(8F$&ny2ir4ZNBl^^E%htbC0i9>c7Bou?&zpC75 z9`+JjdJ3BGOuvQHW3t-DoT08-y>(vJ!)5z53!%bjniAD$_I8$IG#IogZHcX6L& z+ZWYgRYEt$s)=K4?IDijee2py_7x2^p4ELS1tIfp@GVwie%R!Vj_ajbceFRLRgzE( zKHOyM)GmE2ykd}`xXc;(9#cfqqH4yH{W9Hw>>LP>&ah!@ZSNieq5J0t&K(-FS69qtCvtG-i)*!{4leD@pn|qt!TDz20 z!nnpZ>SR{`SH6X<1#Y-XN!f_%@$qP*6f)YpWlMOiA8m9Cf;t2QX|2Ka(3OgGJVO1? zhO&7GI~>$;kr2~3`BEnEs@&sL%xlPi>6fIC&jvOlU0~1z8NL#Prm!&(`KSBqLCV=D z^Ktx$N#fnilf1#7XPp)B2_sD<1*j_{eGL+q?~vEpe{D_=zP=Uv#o%M|^Kf4<*)2F| zGSohzZY?AtHwJHWrv{N$Gtb~ur_?UEXyDuxDTOY}YON73^XHaV@}(Kp25f@l4YF!= zxp~HGsKo}qL)p-la>D7S+1X2kj8Rs_(yNboZ9Bm6n$QlHn)~c{(Ug{$XFVuUy^S5=Nv+x$Jx<_ z=p}`pNv761Vn?bWEoQ2}#@O`!*d5=61xb+bG3gYGcszN*>shUsr4fmEZ(G&?*DPw$NYPeznszfK)VvwkYY#n@KfNF4USA$tD?mFrWCUUOy3put4 zE^Ek?WM0Px4Gjk8w$c7R=u_H)+N@ba|J~Kc;PDC3sgBJ9M(ty!H~6X5BHVcUZF+AO zLiu8O2>zmdu~B_8E0l9=D7b#eRqP7aDxTeTA6Z_Opq+6nQE&HVB9}#2k}=ED*ute( zcoy8VoLN83z|q8-VS`ZFsKvNrP2}=;0@*lxb4W}V!_gk>5w^v_HmQfJKB-od+_?Op zb3D-x-kY)~g5T9>4`{c;TSSFDkuQux^u<#>NOElBSSU%`C7(o0H8_D}ItKek)@5yT z#VxC$BwgNNVkv+gh&NYxkCT-OwdPy6AnL7s)WgA8vwo$=DifK9rFfj%a1$f1ZIR`M0? z31NRhb*KS$n$876Zqm9il61;qAdVjv>m3f7tvS~8I$3icDm5LowY~qt|B0-(*9p*s z^YAG&BMe2Nx73tL>u*)4<(xQqnj?9_)391}+mt333%nw1`J|>vDxJW!|6b6-173Or zDVO~A_5j_PZd)pXVClGlM^qW62S1l2Jjin*L4iGix~^5~bQ_+%TOexNn8%=Y*e5#A)XGY;-4)X-Kqt2_aCAJxpA%rs;ta>(U zW9h0k%1TIRYuW&>deBx7GdkZXYpo%~9aB`QR}NIUCnR!t+GMRc0*C(Qyh5jG5pwoz z7lwxuk$N8gFY9IuYCm+2?@!Z<#uDcShA?cU+4$w5dpcb(y$GCDV%BVQ1EPK>* zXeIwInljQ=;dC93AlJ{Aq;865dZSzCT7E033mJU)Jru_Isg9Uw?OMspKekOvRZPtM zljln092UyFG}Dx}hj%(J)#YGYvf7g{vQ7P?7ybwwJ*UX5q6aZsq-8cp_)k0$JESvn zpd#TRaD3wnWEX@aLuXxq9x&@(8^1>6tLRaawP@;_4M^?zgBT{BXkz1wpzKrDOv?kx z_ooQ&rwW`l=~ciszyWE*;CD~8(UBU#0#D$dcg1Bzls-txZ~_@9M{3qhYO)*7s69_K z^a_g2M^b0isJ&y9U}HI?XJ@z^RkJotai}&hFN;VPm{4+gXM-qO?|O@EI&e{(Gc|o@FoO0mU>CLJ>H>S?nmaVg|EnKar+jIn*AO>cWjetai@p+! zrZpUCuMH<}HuOl1Urmu)C{)|t2mY}v5D@Yx_k>p9*!@iaYSpB>2qr8yV=yFaxX)zo z3XKqD+{M)TXw1Zvl}pDvA~d?t6!vJ>#FSG2lrdXa2yB&9c8D=r$A%nW)>m>}VX@Jj zJ+2xqcC=3WyX{&!Xe(n*4N1qSeFBk~j;FN3*2*^c%0-1YlG&b>{?KzBB#^MYdpkPTxT0&n@rwoh71_t{g*)pjR$`< z>YF1+NFTF@tjYkK9IhxSIZZ0mbZ%*`YjT8y4t1s3 zg)DYL)H%q2ntZ8*>QfiUak2_$y(Ze)M5r2cjrL%R1#>9>kGot(E`a!WUON$=ypl2* zUQ3I(^~{;>Dycd09C@YbG)N`%!*U^o<)@gG^1vxP{ews?W#C0r^X|h^c1##9Ekg_P zgJMqQcUX|1Eg77EeISWw-NhWk04$dxZnpc+J_6wG^im#6INOs%NFHU*Fb(XQ>npnY zq;MvO!WUzi?QLv#)IFmZ^eZEs@`Pf_tW^8C{n5>Dom2Yxcx=;@k9VJQdhis4^fHp5 zp5o)Y;G+6p!^>zD_p)=dV9&YCz26$lBB(cEgK}Z>HNaw)3*+hZGwPwbL)|EBHoY3~ zkLNn1c@ZyBSTW;VZFapH_>Sj#q^BSeIc~HE#E8;=#<<#S7w3c(`1cC^HIf@?#$uq@ zIl2T)sk=N@QR0@}uK!e+NT_Klfimz`X#bJvJkN}&rZsdl4v+J1R}j7dT%-Mj

Memories

'),Ke=g('
'),Ue=g(' '),Ve=g('

Promote Demote Delete
'),We=g(''),Xe=g('
'),Ze=g(`

Memories

Min retention:
`);function xt(ge,me){Be(me,!0);let k=b(Qe([])),P=b(""),S=b(""),be="",h=b(0),F=b(!0),T=b(null),ee;qe(()=>m());async function m(){u(F,!0);try{const i={};e(P)&&(i.q=e(P)),e(S)&&(i.node_type=e(S)),e(h)>0&&(i.min_retention=String(e(h)));const c=await f.memories.list(i);u(k,c.memories,!0)}catch{u(k,[],!0)}finally{u(F,!1)}}function he(){clearTimeout(ee),ee=setTimeout(m,300)}function ye(i){return i>.7?"#10b981":i>.4?"#f59e0b":"#ef4444"}var M=Ze(),A=s(M),te=t(s(A),2),we=s(te);a(te),a(A);var C=t(A,2),$=s(C);xe($);var y=t($,2),N=s(y);N.value=N.__value="";var O=t(N);O.value=O.__value="fact";var R=t(O);R.value=R.__value="concept";var j=t(R);j.value=j.__value="event";var L=t(j);L.value=L.__value="person";var q=t(L);q.value=q.__value="place";var B=t(q);B.value=B.__value="note";var Q=t(B);Q.value=Q.__value="pattern";var ae=t(Q);ae.value=ae.__value="decision",a(y);var se=t(y,2),D=t(s(se),2);xe(D);var ie=t(D,2),ke=s(ie);a(ie),a(se),a(C);var Pe=t(C,2);{var Se=i=>{var c=Ke();Z(c,20,()=>Array(8),ue,(w,o)=>{var x=Je();_(w,x)}),a(c),_(i,c)},Te=i=>{var c=Xe();Z(c,21,()=>e(k),w=>w.id,(w,o)=>{var x=We(),Y=s(x),z=s(Y),G=s(z),oe=s(G),H=t(oe,2),$e=s(H,!0);a(H);var De=t(H,2);Z(De,17,()=>e(o).tags.slice(0,3),ue,(n,l)=>{var d=Ue(),J=s(d,!0);a(d),E(()=>v(J,e(l))),_(n,d)}),a(G);var re=t(G,2),Ee=s(re,!0);a(re),a(z);var ne=t(z,2),I=s(ne),Fe=s(I);a(I);var le=t(I,2),Me=s(le);a(le),a(ne),a(Y);var Ae=t(Y,2);{var Ce=n=>{var l=Ve(),d=s(l),J=s(d,!0);a(d);var K=t(d,2),U=s(K),Ne=s(U);a(U);var V=t(U,2),Oe=s(V);a(V);var de=t(V,2),Re=s(de);a(de),a(K);var pe=t(K,2),W=s(pe),X=t(W,2),ve=t(X,2);a(pe),a(l),E((r,je,Le)=>{v(J,e(o).content),v(Ne,`Storage: ${r??""}%`),v(Oe,`Retrieval: ${je??""}%`),v(Re,`Created: ${Le??""}`)},[()=>(e(o).storageStrength*100).toFixed(1),()=>(e(o).retrievalStrength*100).toFixed(1),()=>new Date(e(o).createdAt).toLocaleDateString()]),p("click",W,r=>{r.stopPropagation(),f.memories.promote(e(o).id)}),p("keydown",W,r=>{r.key==="Enter"&&(r.stopPropagation(),f.memories.promote(e(o).id))}),p("click",X,r=>{r.stopPropagation(),f.memories.demote(e(o).id)}),p("keydown",X,r=>{r.key==="Enter"&&(r.stopPropagation(),f.memories.demote(e(o).id))}),p("click",ve,async r=>{r.stopPropagation(),await f.memories.delete(e(o).id),m()}),p("keydown",ve,async r=>{r.key==="Enter"&&(r.stopPropagation(),await f.memories.delete(e(o).id),m())}),_(n,l)};ce(Ae,n=>{var l;((l=e(T))==null?void 0:l.id)===e(o).id&&n(Ce)})}a(x),E((n,l)=>{var d;Ge(x,1,`text-left p-4 glass-subtle rounded-xl hover:bg-white/[0.04] transition-all duration-200 group ${((d=e(T))==null?void 0:d.id)===e(o).id?"!border-synapse/40 glow-synapse":""}`),_e(oe,`background: ${(Ie[e(o).nodeType]||"#8B95A5")??""}`),v($e,e(o).nodeType),v(Ee,e(o).content),_e(Fe,`width: ${e(o).retentionStrength*100}%; background: ${n??""}`),v(Me,`${l??""}%`)},[()=>ye(e(o).retentionStrength),()=>(e(o).retentionStrength*100).toFixed(0)]),p("click",x,()=>{var n;return u(T,((n=e(T))==null?void 0:n.id)===e(o).id?null:e(o),!0)}),_(w,x)}),a(c),_(i,c)};ce(Pe,i=>{e(F)?i(Se):i(Te,!1)})}a(M),E(i=>{v(we,`${e(k).length??""} results`),v(ke,`${i??""}%`)},[()=>(e(h)*100).toFixed(0)]),p("input",$,he),fe($,()=>e(P),i=>u(P,i)),p("change",y,m),He(y,()=>e(S),i=>u(S,i)),p("change",D,m),fe(D,()=>e(h),i=>u(h,i)),_(ge,M),Ye()}ze(["input","change","click","keydown"]);export{xt as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.br b/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.br new file mode 100644 index 0000000000000000000000000000000000000000..7973b77f56268ac20f1f39ff5ca9bc572a8774ae GIT binary patch literal 2311 zcmV+i3HbIKwHYERG#$WM;FQgy!)X7vW|s@mD0BsFzUT-^X8pe0>b{p#=(VbS)gc-2 z9#P!{{y-Cf71w@mOBe=q>r4$(!t)bL;3 z^yUFBX<(btWi{6O5X0&$a)X){uWDn}=&fNG!rFbZPI;|C400^ z+EMZ{jZciDPI=>Bb%1swIOk}~lV`y$oG-78rW2Yv&y!&M<)kPRpW@n!ubE?HWnDyUZ4 z#i}m}W$yg-Nk`X58uGV_8ppk(m%9MNmnY2SXseREw-3AJ3n(xZeXRJ<*4V=A zVHsl!w|;$zH}2U<&sAJtd#(HT7&RzFS!3=FdKw4y{2UDNdJIc_DV%wzQI~8djx^E^ zTe?4OUq5&*vhXp;u6%4iR3(~fwmsMVdrXjoFv*l~dWP&e{`$^4;3y4x1?s3bwb#Q^&kCk(EwoP}{A(HIaMNnlHff7B{Ku z5j;ZBMz0*r3(RQ>d?ZpRKx3rHrt~{O9n$;%v4QeYvhk_%KY*o4tO?qoBy?O1uKu9s zR6@NrAKD3svbqH!y=xO@tco8wcJR&cCnw}FX}uG}A! zfPS~9DJKbr`mCv8?+nA{sj=ayP;DZ&k)5q(oEYV&633ZHl(YB$6p3AIey=T(Zf;Sq z*+r$%0XES~VDefX8^(BL5?(Ik+*~$~dFA?$kkBnBRy`x37D$pIp67_cJQ0&3nvx}! znFh>{_D5B+DLQJc)??=+vzQ@PNP(^Mq5*>3Ox`1oK`k^GU>VUASyJS)jh0HVT%!?$ zdmLPMBs1$)U15gulXAS-iZR{IW!zU;v*60LD{hsL@4#!D=D#UfCjXh1@hs3-5&4fd z*mXFp2#9Sj5ytJEeVgb|{rBRrIZzs(d_&p@9%-F(oOJdPAZ+T(YlA|bLBTRxiX=IQHB zW9~B-WO4ToS$8pa*NK8$OBAo;uR_8vbnMnV8^5d^Z2DEMbu%7@FdfO^r@2YTu9lQ8 zazF|3U~1S$>ZIX>>EiuQn#ot|?Zc7#3!-$bj8D!q`*dJUQ z&9K{-n$6+zmip;?;g1zx6-zA4^u4$WFI@fn6WnuHq_Rg#p*tIL@8W^u6)dOY2zy3o|r!e6z~L zQ3Zk%4w$}E`l)?gVxuoG?Lj#iv=`)sa~-E)1zQu@tG>7Kkb%E z*ueO9mCd6N^k!24c3%p8Rtl}xEFUGMYY|%r`$Tz9UrvSp4~j${3LuU)6jd5lG*fzyz+9zycrx=~w{J1k_Y0IZHJP1+yhGWoS;$ z5TQSBj{D->I+qUQ9Myouj8(<8$SF&54skmB#(Zcq~wF8@Sg$)bn^)b}#njRVV}9$REmo>7i8e$HRNc&IYTt z0yF?%TC(-mUd;5o|AJQ{l-&G{d@5=$|3ZId&UG{R`?F!R!5cFiB7u9D8} z?EayUS##p%JGy89wGg6<1yG$6gaIg(LZZ!Xkc-B+E(4`C2)9&{k3dYQ5p6)cvvUv) z>9B8ICyGr$9&2it9J4jCmLetg-#;}bsLlSor^JG8p6Swa9K^Nv`Vr_NzWiqk)l9}k z&Uz?Lk2AOfWvyEEDedf2w}2?5-~EkV<`8b$57mLDAml8J(zDgrG+D@m)a# z44%`o?=$Q8F)>G_@qr%xH@&#o!6@)85oUl!T!7+-;~+?3;38DZjd6V`@Pz hm>uXVf1pEZg2;4T1Sn$dUM_}X7_g5dxF literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.gz b/apps/dashboard/build/_app/immutable/nodes/8.CJVG2CGC.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..0c8861265f8137b2925c56123314d4499c26dc46 GIT binary patch literal 2653 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 L!`8t=wiy5bsBa{Y literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.br deleted file mode 100644 index 84fc5aa877e6532f21b6859aab3767d3a6904975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3014 zcmV;%3pw-~rX~^9q=Er-9>&Jfro**cT+_aX1m%x%MhI0(Nic%_2uWrqo9qAl|K*fr zD>KHGtiICemI~VEjT=IMNRKuOnV;8q$^+PcOo*wvo8+m!hdq`08_U z-)%*Hs?w*jeNRD6Tf7>33Vj+)GvKG~#N0X1id4G2b1_fNDu87>N~)_kU%agL+IY7S+V-Uj`aOAh z7R{X(_y(e1N-$mxRJe7oz0TCSIOCda8s>bc*B^wuVA+lX@&8}o0qyp4OOdq=dXvxU zA0yeu(#s@ z&&{UQUbx%0j)jy$~izKlFO&v^(f`ujs#V z^{J9j6cEFgcvU(nm?(IP5e@UgUGNQrL%#s2Fk{;K?d}Ko+Y2$yb4w!Rj`RdmbAM_B zIQwxN7L=OH8!iR=SPHyZpl(!{lBHF<=p!a!v>pWuBJwf<$zyq7xalC{GluvMu3>rk}tfTN;A2R97bjh&HRf{q9-6}$wCrVX>sY0j$Zf45yIuEc`C6gMS^z+ z`51D@f-UJ5)Yt#(Glk7m&wm)$~f_CgW`qH zr^cS&Q8Z9#_h!y@D3wXpMdK|=aHamfFwb&kEe@oM3|`;?l{EdG0)oVx5PQB$AD@n; zio%<~`_C8f14xGryufagfb<#GenS?rPdQ?bbu$AC(SqYaY44~Ck`$CtEvrE33uM|0R+;?mq~FqtD&)XOATR%OTQ;{3+3)DJPG>X&xnLpvrmssaU4~MCxRp6y&%=y8p{B>Lu>dEP5M8@(szB_Hs2J%{Q2GYT zbzJxX=y_&|08I08A(8Y1fS+z3mb9S4A`Hd-Z7opR!Wz-ivqcN-VqL%wrx_4+LRgu6W<6wY8FOOzNaNz%67))8uOkCbefJ}&#eDSN zgT->?4k)n0p`PUbv<|hinlu#-HxeV8d9vG$>fkS#h^PtIuyVJPxlY143Lh|i$tf|W zOS5sDZ;$BJ*bFP9y<$>{w=ajh@5EI3^ zRqYUOQDQAb4MX5YF^9mAdTRJLD;y>VLrlyT!xE-lEXEAg z;;MBr*b0#dEVbZ~M_4`=P(uLM#^Jj&SZwWOjOm6P}ma#1XoV*~XM5cUdUfH{4h^2>kEG4}5#^0b_2-Kzw z5iabwSuz6C8{@g^4C)e8c*`bN3)3sjxKZ5kd1V(ERC0tE4meR{n@VWDZbVFbq{=7J ze&0PpR#lG&i&`&@CS2Zk0`Ij#z+st1B~;j?Sc`*?wm z?>>H3j2qu8J{m28H3XJc_Owt#d&HqWwJ-)j{HOX7G8v4_WZ#`|8!j+DCW zUrOiL;safQvk>1z1@@u--o&2CWmN)=7HNT39eGb*NiVIKumMv!*0|Z4SJAniV zHL#_anm{U9KuQ%YMfK8AA9)j#GzaAGp0V;O_6wDIkqBKT;R)8AO%$mwg=UBp5cSBT z2)phF>uSj2Thk1BED5)34*9rJEL5kcok;Xf>7y-|Sj<h+>A+72&N;Rr)C?#c#0)iS@fcvu_L?M@5g`Q{}oX2?b5A@|qXB$-Z!b=2(0DmMg& zsRfKk#Y-EGnqr~e;P`}D_(|Hs`~LyZ0evQ0|NV*|iXVC>Na<}K)LAM0O*GbEjwG{P z-g3O{d*vrr0MM(sf-g|LqaAF=R!CT)r6xxZP(=^tm^Y)$^db I=A|Y55BCY%5&!@I diff --git a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz b/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js.gz deleted file mode 100644 index 856a655de5e874563213e207daf2443b86202fc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3404 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js b/apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js similarity index 83% rename from apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js rename to apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js index 700377e..10726b8 100644 --- a/apps/dashboard/build/_app/immutable/nodes/9.B4Pp7ME7.js +++ b/apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js @@ -1,2 +1,2 @@ -import"../chunks/Bzak7iHL.js";import{o as ze}from"../chunks/DUC-ssvh.js";import{p as Je,t as w,a as We,d as r,e as t,g as s,s as S,h as m,r as e,G as b,f as Be,u as j}from"../chunks/BBD-8XME.js";import{d as He,a as X,s as p}from"../chunks/DNn3Nckx.js";import{i as u}from"../chunks/RaRNNC-y.js";import{e as Z,i as ee}from"../chunks/C5a--lgk.js";import{a as v,f as l,t as ue}from"../chunks/CKcqngaU.js";import{s as ge}from"../chunks/CBWLjDtu.js";import{s as fe}from"../chunks/DBfx-YTU.js";import{s as Le,a as te}from"../chunks/BexJutgU.js";import{a as T}from"../chunks/BcuCGYSa.js";import{m as Ue,a as Ye,i as qe}from"../chunks/CruZBLYW.js";var Qe=l(' Running...',1),Xe=l('
Processed
'),Ze=l('
Decayed
'),et=l('
Embedded
'),tt=l('
'),st=l(' Dreaming...',1),at=l('
'),it=l('
Insights Discovered:
',1),dt=l('
Connections found:
'),rt=l('
Memories replayed:
'),ot=l('
'),nt=l('
'),vt=l('
'),lt=l('

Retention Distribution

'),ct=l('
'),xt=l(`

Settings & System

Memories
Avg Retention
WebSocket
v2.1
Vestige

Cognitive Operations

FSRS-6 Consolidation
Apply spaced-repetition decay, regenerate embeddings, run maintenance
Memory Dream Cycle
Replay memories, discover hidden connections, synthesize insights

Keyboard Shortcuts

About

V
Vestige v2.1 "Nuclear Dashboard"
Your AI's long-term memory system
29 cognitive modules
FSRS-6 spaced repetition
Nomic Embed v1.5 (256d)
Jina Reranker v1 Turbo
USearch HNSW (20x FAISS)
Local-first, zero cloud
Built with Rust + Axum + SvelteKit 2 + Svelte 5 + Three.js + Tailwind CSS 4
`);function Ct(_e,be){Je(be,!0);const ye=()=>te(Ue,"$memoryCount",I),P=()=>te(Ye,"$avgRetention",I),se=()=>te(qe,"$isConnected",I),[I,he]=Le();let E=S(!1),A=S(!1),y=S(null),g=S(null),we=S(null),$=S(null),ae=S(!0),Se=S(null);ze(()=>{N()});async function N(){m(ae,!0);try{const[a,o,c]=await Promise.all([T.stats().catch(()=>null),T.health().catch(()=>null),T.retentionDistribution().catch(()=>null)]);m(we,a,!0),m(Se,o,!0),m($,c,!0)}finally{m(ae,!1)}}async function ke(){m(E,!0),m(y,null);try{m(y,await T.consolidate(),!0),await N()}catch{}finally{m(E,!1)}}async function Ce(){m(A,!0),m(g,null);try{m(g,await T.dream(),!0),await N()}catch{}finally{m(A,!1)}}var K=xt(),V=t(K),Re=r(t(V),2);e(V);var z=r(V,2),J=t(z),ie=t(J),$e=t(ie,!0);e(ie),b(2),e(J);var W=r(J,2),B=t(W),Ae=t(B);e(B),b(2),e(W);var de=r(W,2),re=t(de),oe=t(re),ne=r(oe,2),De=t(ne,!0);e(ne),e(re),b(2),e(de),b(2),e(z);var H=r(z,2),L=r(t(H),2),U=t(L),O=r(t(U),2),Ge=t(O);{var Me=a=>{var o=Qe();b(),v(a,o)},Fe=a=>{var o=ue("Consolidate");v(a,o)};u(Ge,a=>{s(E)?a(Me):a(Fe,!1)})}e(O),e(U);var je=r(U,2);{var Te=a=>{var o=tt(),c=t(o),f=t(c);{var k=d=>{var i=Xe(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).nodesProcessed)),v(d,i)};u(f,d=>{s(y).nodesProcessed!==void 0&&d(k)})}var _=r(f,2);{var h=d=>{var i=Ze(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).decayApplied)),v(d,i)};u(_,d=>{s(y).decayApplied!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=et(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).embeddingsGenerated)),v(d,i)};u(C,d=>{s(y).embeddingsGenerated!==void 0&&d(G)})}e(c),e(o),v(a,o)};u(je,a=>{s(y)&&a(Te)})}e(L);var ve=r(L,2),Y=t(ve),D=r(t(Y),2),Ee=t(D);{var Ne=a=>{var o=st();b(),v(a,o)},Oe=a=>{var o=ue("Dream");v(a,o)};u(Ee,a=>{s(A)?a(Ne):a(Oe,!1)})}e(D),e(Y);var Pe=r(Y,2);{var Ie=a=>{var o=ot(),c=t(o);{var f=d=>{var i=it(),n=r(Be(i),2);Z(n,17,()=>s(g).insights,ee,(x,M)=>{var R=at(),F=t(R,!0);e(R),w(q=>p(F,q),[()=>typeof s(M)=="string"?s(M):JSON.stringify(s(M))]),v(x,R)}),v(d,i)},k=j(()=>s(g).insights&&Array.isArray(s(g).insights));u(c,d=>{s(k)&&d(f)})}var _=r(c,2);{var h=d=>{var i=dt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).connections_found)),v(d,i)};u(_,d=>{s(g).connections_found!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=rt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).memories_replayed)),v(d,i)};u(C,d=>{s(g).memories_replayed!==void 0&&d(G)})}e(o),v(a,o)};u(Pe,a=>{s(g)&&a(Ie)})}e(ve),e(H);var le=r(H,2);{var Ke=a=>{var o=lt(),c=r(t(o),2),f=t(c);{var k=h=>{var C=vt();Z(C,21,()=>s($).distribution,ee,(G,d,i)=>{const n=j(()=>Math.max(...s($).distribution.map(Q=>Q.count),1)),x=j(()=>s(d).count/s(n)*100),M=j(()=>i<2?"#ef4444":i<4?"#f59e0b":i<7?"#6366f1":"#10b981");var R=nt(),F=t(R),q=t(F,!0);e(F);var pe=r(F,2),Ve=r(pe,2);Ve.textContent=`${i*10}%`,e(R),w(Q=>{p(q,s(d).count),fe(pe,`height: ${Q??""}%; background: ${s(M)??""}; opacity: 0.7`)},[()=>Math.max(s(x),2)]),v(G,R)}),e(C),v(h,C)},_=j(()=>s($).distribution&&Array.isArray(s($).distribution));u(f,h=>{s(_)&&h(k)})}e(c),e(o),v(a,o)};u(le,a=>{s($)&&a(Ke)})}var ce=r(le,2),xe=r(t(ce),2),me=t(xe);Z(me,20,()=>[{key:"⌘ K",desc:"Command palette"},{key:"/",desc:"Focus search"},{key:"G",desc:"Go to Graph"},{key:"M",desc:"Go to Memories"},{key:"T",desc:"Go to Timeline"},{key:"F",desc:"Go to Feed"},{key:"E",desc:"Go to Explore"},{key:"S",desc:"Go to Stats"}],ee,(a,o)=>{var c=ct(),f=t(c),k=t(f,!0);e(f);var _=r(f,2),h=t(_,!0);e(_),e(c),w(()=>{p(k,o.key),p(h,o.desc)}),v(a,c)}),e(me),e(xe),e(ce),b(2),e(K),w(a=>{p($e,ye()),fe(B,`color: ${P()>.7?"#10b981":P()>.4?"#f59e0b":"#ef4444"}`),p(Ae,`${a??""}%`),ge(oe,1,`w-2.5 h-2.5 rounded-full ${se()?"bg-recall animate-pulse-glow":"bg-decay"}`),p(De,se()?"Online":"Offline"),O.disabled=s(E),D.disabled=s(A),ge(D,1,`px-4 py-2 bg-dream/20 border border-dream/40 text-dream-glow text-sm rounded-xl hover:bg-dream/30 transition disabled:opacity-50 flex items-center gap-2 - ${s(A)?"glow-dream animate-pulse-glow":""}`)},[()=>(P()*100).toFixed(1)]),X("click",Re,N),X("click",O,ke),X("click",D,Ce),v(_e,K),We(),he()}He(["click"]);export{Ct as component}; +import"../chunks/Bzak7iHL.js";import{o as ze}from"../chunks/DeTA_5mp.js";import{p as Je,t as w,a as We,d as r,e as t,g as s,s as S,h as m,r as e,O as b,f as Be,u as j}from"../chunks/nyjtQ1Ok.js";import{d as He,a as X,s as p}from"../chunks/C4L78yoI.js";import{i as u}from"../chunks/B17metm1.js";import{e as Z,i as ee}from"../chunks/BilMa3tw.js";import{a as v,f as l,t as ue}from"../chunks/B0IenmM-.js";import{s as ge}from"../chunks/BgOFZ9jq.js";import{s as fe}from"../chunks/D2QmVWrb.js";import{s as Le,a as te}from"../chunks/C3ZC25l2.js";import{a as O}from"../chunks/BcuCGYSa.js";import{m as Ue,a as Ye,i as qe}from"../chunks/B6fk3AxI.js";var Qe=l(' Running...',1),Xe=l('
Processed
'),Ze=l('
Decayed
'),et=l('
Embedded
'),tt=l('
'),st=l(' Dreaming...',1),at=l('
'),it=l('
Insights Discovered:
',1),dt=l('
Connections found:
'),rt=l('
Memories replayed:
'),ot=l('
'),nt=l('
'),vt=l('
'),lt=l('

Retention Distribution

'),ct=l('
'),xt=l(`

Settings & System

Memories
Avg Retention
WebSocket
v2.1
Vestige

Cognitive Operations

FSRS-6 Consolidation
Apply spaced-repetition decay, regenerate embeddings, run maintenance
Memory Dream Cycle
Replay memories, discover hidden connections, synthesize insights

Keyboard Shortcuts

About

V
Vestige v2.1 "Nuclear Dashboard"
Your AI's long-term memory system
29 cognitive modules
FSRS-6 spaced repetition
Nomic Embed v1.5 (256d)
Jina Reranker v1 Turbo
USearch HNSW (20x FAISS)
Local-first, zero cloud
Built with Rust + Axum + SvelteKit 2 + Svelte 5 + Three.js + Tailwind CSS 4
`);function Ct(_e,be){Je(be,!0);const ye=()=>te(Ue,"$memoryCount",I),P=()=>te(Ye,"$avgRetention",I),se=()=>te(qe,"$isConnected",I),[I,he]=Le();let T=S(!1),A=S(!1),y=S(null),g=S(null),we=S(null),$=S(null),ae=S(!0),Se=S(null);ze(()=>{E()});async function E(){m(ae,!0);try{const[a,o,c]=await Promise.all([O.stats().catch(()=>null),O.health().catch(()=>null),O.retentionDistribution().catch(()=>null)]);m(we,a,!0),m(Se,o,!0),m($,c,!0)}finally{m(ae,!1)}}async function ke(){m(T,!0),m(y,null);try{m(y,await O.consolidate(),!0),await E()}catch{}finally{m(T,!1)}}async function Ce(){m(A,!0),m(g,null);try{m(g,await O.dream(),!0),await E()}catch{}finally{m(A,!1)}}var K=xt(),V=t(K),Re=r(t(V),2);e(V);var z=r(V,2),J=t(z),ie=t(J),$e=t(ie,!0);e(ie),b(2),e(J);var W=r(J,2),B=t(W),Ae=t(B);e(B),b(2),e(W);var de=r(W,2),re=t(de),oe=t(re),ne=r(oe,2),De=t(ne,!0);e(ne),e(re),b(2),e(de),b(2),e(z);var H=r(z,2),L=r(t(H),2),U=t(L),N=r(t(U),2),Ge=t(N);{var Me=a=>{var o=Qe();b(),v(a,o)},Fe=a=>{var o=ue("Consolidate");v(a,o)};u(Ge,a=>{s(T)?a(Me):a(Fe,!1)})}e(N),e(U);var je=r(U,2);{var Oe=a=>{var o=tt(),c=t(o),f=t(c);{var k=d=>{var i=Xe(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).nodesProcessed)),v(d,i)};u(f,d=>{s(y).nodesProcessed!==void 0&&d(k)})}var _=r(f,2);{var h=d=>{var i=Ze(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).decayApplied)),v(d,i)};u(_,d=>{s(y).decayApplied!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=et(),n=t(i),x=t(n,!0);e(n),b(2),e(i),w(()=>p(x,s(y).embeddingsGenerated)),v(d,i)};u(C,d=>{s(y).embeddingsGenerated!==void 0&&d(G)})}e(c),e(o),v(a,o)};u(je,a=>{s(y)&&a(Oe)})}e(L);var ve=r(L,2),Y=t(ve),D=r(t(Y),2),Te=t(D);{var Ee=a=>{var o=st();b(),v(a,o)},Ne=a=>{var o=ue("Dream");v(a,o)};u(Te,a=>{s(A)?a(Ee):a(Ne,!1)})}e(D),e(Y);var Pe=r(Y,2);{var Ie=a=>{var o=ot(),c=t(o);{var f=d=>{var i=it(),n=r(Be(i),2);Z(n,17,()=>s(g).insights,ee,(x,M)=>{var R=at(),F=t(R,!0);e(R),w(q=>p(F,q),[()=>typeof s(M)=="string"?s(M):JSON.stringify(s(M))]),v(x,R)}),v(d,i)},k=j(()=>s(g).insights&&Array.isArray(s(g).insights));u(c,d=>{s(k)&&d(f)})}var _=r(c,2);{var h=d=>{var i=dt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).connections_found)),v(d,i)};u(_,d=>{s(g).connections_found!==void 0&&d(h)})}var C=r(_,2);{var G=d=>{var i=rt(),n=r(t(i)),x=t(n,!0);e(n),e(i),w(()=>p(x,s(g).memories_replayed)),v(d,i)};u(C,d=>{s(g).memories_replayed!==void 0&&d(G)})}e(o),v(a,o)};u(Pe,a=>{s(g)&&a(Ie)})}e(ve),e(H);var le=r(H,2);{var Ke=a=>{var o=lt(),c=r(t(o),2),f=t(c);{var k=h=>{var C=vt();Z(C,21,()=>s($).distribution,ee,(G,d,i)=>{const n=j(()=>Math.max(...s($).distribution.map(Q=>Q.count),1)),x=j(()=>s(d).count/s(n)*100),M=j(()=>i<2?"#ef4444":i<4?"#f59e0b":i<7?"#6366f1":"#10b981");var R=nt(),F=t(R),q=t(F,!0);e(F);var pe=r(F,2),Ve=r(pe,2);Ve.textContent=`${i*10}%`,e(R),w(Q=>{p(q,s(d).count),fe(pe,`height: ${Q??""}%; background: ${s(M)??""}; opacity: 0.7`)},[()=>Math.max(s(x),2)]),v(G,R)}),e(C),v(h,C)},_=j(()=>s($).distribution&&Array.isArray(s($).distribution));u(f,h=>{s(_)&&h(k)})}e(c),e(o),v(a,o)};u(le,a=>{s($)&&a(Ke)})}var ce=r(le,2),xe=r(t(ce),2),me=t(xe);Z(me,20,()=>[{key:"⌘ K",desc:"Command palette"},{key:"/",desc:"Focus search"},{key:"G",desc:"Go to Graph"},{key:"M",desc:"Go to Memories"},{key:"T",desc:"Go to Timeline"},{key:"F",desc:"Go to Feed"},{key:"E",desc:"Go to Explore"},{key:"S",desc:"Go to Stats"}],ee,(a,o)=>{var c=ct(),f=t(c),k=t(f,!0);e(f);var _=r(f,2),h=t(_,!0);e(_),e(c),w(()=>{p(k,o.key),p(h,o.desc)}),v(a,c)}),e(me),e(xe),e(ce),b(2),e(K),w(a=>{p($e,ye()),fe(B,`color: ${P()>.7?"#10b981":P()>.4?"#f59e0b":"#ef4444"}`),p(Ae,`${a??""}%`),ge(oe,1,`w-2.5 h-2.5 rounded-full ${se()?"bg-recall animate-pulse-glow":"bg-decay"}`),p(De,se()?"Online":"Offline"),N.disabled=s(T),D.disabled=s(A),ge(D,1,`px-4 py-2 bg-dream/20 border border-dream/40 text-dream-glow text-sm rounded-xl hover:bg-dream/30 transition disabled:opacity-50 flex items-center gap-2 + ${s(A)?"glow-dream animate-pulse-glow":""}`)},[()=>(P()*100).toFixed(1)]),X("click",Re,E),X("click",N,ke),X("click",D,Ce),v(_e,K),We(),he()}He(["click"]);export{Ct as component}; diff --git a/apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js.br b/apps/dashboard/build/_app/immutable/nodes/9.BHweFYNs.js.br new file mode 100644 index 0000000000000000000000000000000000000000..3aba712663c33974259ca4ec0006064cc4b9d8f1 GIT binary patch literal 3019 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
-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 DUze#o literal 0 HcmV?d00001 diff --git a/apps/dashboard/build/_app/version.json b/apps/dashboard/build/_app/version.json index 20252d2..d4514a1 100644 --- a/apps/dashboard/build/_app/version.json +++ b/apps/dashboard/build/_app/version.json @@ -1 +1 @@ -{"version":"1773441353786"} \ No newline at end of file +{"version":"1776204719942"} \ No newline at end of file diff --git a/apps/dashboard/build/_app/version.json.br b/apps/dashboard/build/_app/version.json.br index 7ac6ca9ca9d6ce130e133ef4fedbbe1d61efcba2..565d48d6180f757fc87c487bbffbd78796932621 100644 GIT binary patch literal 31 ncmb1^V)(&YlDtxXN%fKDon4WgYD`!8E?UTVt0tE=onZz5!Yd3m literal 29 lcmb1^V)$`1H>dWvuXVv3$00E${PgE;^cx~#iW{xU`MBXl)KErM$1D8*k9R3~@PwptZHF^uW} zs%Zu>a%3);4?(4*(j4tdmZr@kif&&gcq7Q-ENh4t6w%t&*>vPx7geV#Db6NIW<8p! zIU)&yrjwGR9WHT6O4CNGKZ2uIEx+yB@BTwDb@lkd5eZY;8{h0CVlB)BhV^R0+%Tl|H-SKe-EN(p=#EO@ImJr|NrAjh*V3Tx8b^n28t<8 literal 457 zcmV;)0XF_0iwFP!000021GSV*Zo)7Sh4(#$8&s)XgxJmxP8C?Ri|%@dkl0|=jZqQ^ z+`cxpQ$j$6MI|I#(Y$Zo%(KXv-3si#Mb*r`b=z)UgP`lWX%|jqy$UddFi;g9*m2su z$^G1e0D=&!pSO4bAS)?r^hI6kyyUs~&Sq&UIGsx)Ahe5+%l?J{1Q= z9$;JuMT9xbQLfw6@{7*BZ7rTBs~7jd?|9j+m0}v3uGypSgHO7xa{($@(gyhc)o$?E z4J)l{XD0@7lNY>IHE^0*@F@UV05O1GZs$Lhld&A*EAntjFiZZDJNq~^%ThHCfZ#GE z!~U}|fY|of>VLF2++a2%c`P9%VpK)B6vl?9+|NY$Sik{ z&3V9POD_F>!Nc_Rnoe7~w{VrM6Bx1G_U~mw%O=)$V%R#Kp6!A;XAi@U&e=zw|HLL1 zjfZGGPLFo);T#%JHzL8M^hCU&O(V;2uUvhI4{j0FGySUccM diff --git a/apps/dashboard/build/index.html b/apps/dashboard/build/index.html index 08a4155..7ad805c 100644 --- a/apps/dashboard/build/index.html +++ b/apps/dashboard/build/index.html @@ -11,21 +11,21 @@ - - - - - - - - - + + + + + + + + + - - - - - + + + + + Vestige @@ -33,7 +33,7 @@
+ +{#if $suppressedCount > 0} +
+
+ + +
+ + Actively forgetting {$suppressedCount} {$suppressedCount === 1 ? 'memory' : 'memories'} + +
+{/if} diff --git a/apps/dashboard/src/lib/graph/__tests__/edges.test.ts b/apps/dashboard/src/lib/graph/__tests__/edges.test.ts index eca71ec..8aa9ec4 100644 --- a/apps/dashboard/src/lib/graph/__tests__/edges.test.ts +++ b/apps/dashboard/src/lib/graph/__tests__/edges.test.ts @@ -48,12 +48,14 @@ describe('EdgeManager', () => { expect(line.userData.target).toBe('b'); }); - it('caps opacity at 0.6', () => { + it('caps opacity at 0.8 (raised from 0.6 in v2.0.6 issue #31 fix)', () => { const edges = [makeEdge('a', 'b', { weight: 10.0 })]; manager.createEdges(edges, positions); const line = manager.group.children[0] as any; - expect(line.material.opacity).toBeLessThanOrEqual(0.6); + expect(line.material.opacity).toBeLessThanOrEqual(0.8); + // Baseline floor too — with weight 10 we should be at the cap, not below old 0.6 + expect(line.material.opacity).toBeGreaterThanOrEqual(0.6); }); }); @@ -122,7 +124,8 @@ describe('EdgeManager', () => { } const line = manager.group.children[0] as any; - expect(line.material.opacity).toBe(0.5); + // v2.0.6 issue #31 fix raised final edge opacity 0.5 → 0.65 + expect(line.material.opacity).toBe(0.65); }); it('uses easeOutCubic for smooth deceleration', () => { @@ -266,7 +269,8 @@ describe('EdgeManager', () => { // Both should be fully grown expect(manager.group.children.length).toBe(2); manager.group.children.forEach((child) => { - expect((child as any).material.opacity).toBe(0.5); + // v2.0.6 issue #31 fix raised final edge opacity 0.5 → 0.65 + expect((child as any).material.opacity).toBe(0.65); }); }); diff --git a/apps/dashboard/src/lib/graph/__tests__/setup.ts b/apps/dashboard/src/lib/graph/__tests__/setup.ts index 64b79b0..cc9117f 100644 --- a/apps/dashboard/src/lib/graph/__tests__/setup.ts +++ b/apps/dashboard/src/lib/graph/__tests__/setup.ts @@ -3,15 +3,29 @@ */ import { vi } from 'vitest'; +// Minimal canvas gradient mock — collects colour stops so tests can inspect +// them if they want to, but is mostly a no-op for runtime. +function createMockGradient() { + return { + colorStops: [] as Array<{ offset: number; color: string }>, + addColorStop(offset: number, color: string) { + this.colorStops.push({ offset, color }); + }, + }; +} + // Minimal canvas 2D context mock const mockContext2D = { clearRect: vi.fn(), + fillRect: vi.fn(), fillText: vi.fn(), measureText: vi.fn(() => ({ width: 100 })), + createRadialGradient: vi.fn(() => createMockGradient()), + createLinearGradient: vi.fn(() => createMockGradient()), font: '', textAlign: '', textBaseline: '', - fillStyle: '', + fillStyle: '' as string | object, shadowColor: '', shadowBlur: 0, shadowOffsetX: 0, diff --git a/apps/dashboard/src/lib/graph/__tests__/three-mock.ts b/apps/dashboard/src/lib/graph/__tests__/three-mock.ts index 3ff349c..b665ed7 100644 --- a/apps/dashboard/src/lib/graph/__tests__/three-mock.ts +++ b/apps/dashboard/src/lib/graph/__tests__/three-mock.ts @@ -282,10 +282,16 @@ export class MeshBasicMaterial extends BaseMaterial { } export class LineBasicMaterial extends BaseMaterial { + depthWrite = true; constructor(params?: Record) { super(); if (params) { if (typeof params.opacity === 'number') this.opacity = params.opacity; + if (typeof params.transparent === 'boolean') this.transparent = params.transparent; + if (params.color instanceof Color) this.color = params.color; + else if (typeof params.color === 'number') this.color = new Color(params.color); + if (typeof params.blending === 'number') this.blending = params.blending; + if (typeof params.depthWrite === 'boolean') this.depthWrite = params.depthWrite; } } } @@ -303,10 +309,19 @@ export class PointsMaterial extends BaseMaterial { } export class SpriteMaterial extends BaseMaterial { + depthWrite = true; constructor(params?: Record) { super(); if (params) { if (typeof params.opacity === 'number') this.opacity = params.opacity; + if (typeof params.transparent === 'boolean') this.transparent = params.transparent; + if (params.color instanceof Color) this.color = params.color; + else if (typeof params.color === 'number') this.color = new Color(params.color); + if (typeof params.blending === 'number') this.blending = params.blending; + if (typeof params.depthWrite === 'boolean') this.depthWrite = params.depthWrite; + if (params.map && typeof params.map === 'object') { + this.map = params.map as { dispose: () => void }; + } } } } diff --git a/apps/dashboard/src/lib/graph/__tests__/ui-fixes.test.ts b/apps/dashboard/src/lib/graph/__tests__/ui-fixes.test.ts new file mode 100644 index 0000000..05023d7 --- /dev/null +++ b/apps/dashboard/src/lib/graph/__tests__/ui-fixes.test.ts @@ -0,0 +1,236 @@ +/** + * Regression tests for vestige issue #31 (v2.0.6 Phase 1 dashboard UI fix). + * + * Before v2.0.6 the graph view rendered "glowing cubes" instead of round halos, + * with navy edges swallowed by heavy fog. Root cause: the node glow SpriteMaterial + * had no `map` set, so THREE.Sprite rendered as a solid-coloured plane whose + * square edges were then amplified by UnrealBloomPass into hard bright squares. + * + * These tests lock in every property that was broken so any regression surfaces + * as a red test instead of shipping another ugly screenshot into the issue tracker. + * + * The scene.ts assertions are intentionally source-level (fs regex) because the + * real scene.ts pulls in three/addons (OrbitControls, EffectComposer, UnrealBloomPass, + * WebGLRenderer) which are painful to mock in isolation. Reading the .ts file and + * regex-checking the magic numbers catches accidental revert/tweaks without needing + * a full WebGL harness. + */ +import { describe, it, expect, vi, beforeEach, beforeAll } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { resolve, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +vi.mock('three', async () => { + const mock = await import('./three-mock'); + return { ...mock }; +}); + +import { NodeManager } from '../nodes'; +import { EdgeManager } from '../edges'; +import { Vector3, AdditiveBlending } from './three-mock'; +import { makeNode, makeEdge, resetNodeCounter } from './helpers'; + +// --------------------------------------------------------------------------- +// 1. Node glow sprite — THE fix for the "glowing cubes" artifact +// --------------------------------------------------------------------------- +describe('issue #31 — node glow sprites render as round halos, not squares', () => { + let manager: NodeManager; + + beforeEach(() => { + resetNodeCounter(); + manager = new NodeManager(); + }); + + it('glow SpriteMaterial has a map set (the root cause of the square artifact)', () => { + manager.createNodes([makeNode({ id: 'a', retention: 0.8 })]); + const glow = manager.glowMap.get('a')!; + const mat = glow.material as any; + + // Without a map, THREE.Sprite renders as a solid coloured plane — + // additive blend + bloom then turns it into a glowing square. + // The fix generates a shared radial-gradient CanvasTexture and assigns + // it here, so bloom has a soft circular shape to diffuse. + expect(mat.map).not.toBeNull(); + expect(mat.map).toBeDefined(); + }); + + it('glow sprites on multiple nodes SHARE the same texture instance (singleton cache)', () => { + // The shared texture is a module-level cache — if a future refactor + // accidentally creates one per-node we'll leak memory on large graphs. + manager.createNodes([ + makeNode({ id: 'a' }), + makeNode({ id: 'b' }), + makeNode({ id: 'c' }), + ]); + const a = (manager.glowMap.get('a')!.material as any).map; + const b = (manager.glowMap.get('b')!.material as any).map; + const c = (manager.glowMap.get('c')!.material as any).map; + + expect(a).toBe(b); + expect(b).toBe(c); + }); + + it('glow sprite has depthWrite:false to prevent z-fighting with the sphere behind it', () => { + manager.createNodes([makeNode({ id: 'a' })]); + const mat = manager.glowMap.get('a')!.material as any; + expect(mat.depthWrite).toBe(false); + }); + + it('glow sprite uses additive blending (required for bloom to read as light)', () => { + manager.createNodes([makeNode({ id: 'a' })]); + const mat = manager.glowMap.get('a')!.material as any; + expect(mat.blending).toBe(AdditiveBlending); + }); + + it('glow sprite scale uses the new 6× multiplier (was 4× — gradient needed more footprint)', () => { + // size = 0.5 + retention*2 → 0.5 + 1.0*2 = 2.5 + // glow scale with new formula: 2.5 * 6 * 1.0 = 15 + manager.createNodes([makeNode({ id: 'full', retention: 1.0 })]); + const glow = manager.glowMap.get('full')!; + expect(glow.scale.x).toBeCloseTo(15, 5); + expect(glow.scale.y).toBeCloseTo(15, 5); + }); + + it('glow sprite base opacity is 0.3 + retention*0.35 (was 0.15 + retention*0.2)', () => { + manager.createNodes([makeNode({ id: 'full', retention: 1.0 })]); + const mat = manager.glowMap.get('full')!.material as any; + // 0.3 + 1.0 * 0.35 = 0.65 + expect(mat.opacity).toBeCloseTo(0.65, 5); + }); + + it('suppressed node glow opacity drops to 0.1 (v2.0.5 active forgetting)', () => { + manager.createNodes([makeNode({ id: 's', retention: 0.8, suppression_count: 2 })]); + const mat = manager.glowMap.get('s')!.material as any; + expect(mat.opacity).toBeCloseTo(0.1, 5); + }); +}); + +// --------------------------------------------------------------------------- +// 2. Edge materials — dark navy → brand violet, higher opacity +// --------------------------------------------------------------------------- +describe('issue #31 — edges are brand violet and actually visible', () => { + let manager: EdgeManager; + let positions: Map>; + + beforeEach(() => { + manager = new EdgeManager(); + positions = new Map([ + ['a', new Vector3(0, 0, 0)], + ['b', new Vector3(10, 0, 0)], + ]); + }); + + it('edge color is brand violet 0x8b5cf6, not the old dark navy 0x4a4a7a', () => { + manager.createEdges([makeEdge('a', 'b', { weight: 0.5 })], positions); + const line = manager.group.children[0] as any; + const c = line.material.color; + + // 0x8b5cf6 → r=139/255, g=92/255, b=246/255 + expect(c.r).toBeCloseTo(0x8b / 255, 3); + expect(c.g).toBeCloseTo(0x5c / 255, 3); + expect(c.b).toBeCloseTo(0xf6 / 255, 3); + + // And definitely NOT the old navy 0x4a4a7a (74/255, 74/255, 122/255) + expect(c.r).not.toBeCloseTo(0x4a / 255, 3); + }); + + it('edges have depthWrite:false so they additively blend through fog cleanly', () => { + manager.createEdges([makeEdge('a', 'b')], positions); + const line = manager.group.children[0] as any; + expect(line.material.depthWrite).toBe(false); + }); + + it('edge opacity base is 0.25 + weight*0.5 (was 0.1 + weight*0.5)', () => { + manager.createEdges([makeEdge('a', 'b', { weight: 0.5 })], positions); + const line = manager.group.children[0] as any; + // 0.25 + 0.5 * 0.5 = 0.5 + expect(line.material.opacity).toBeCloseTo(0.5, 5); + }); + + it('edge opacity with low weight still reads (new floor catches regressions)', () => { + manager.createEdges([makeEdge('a', 'b', { weight: 0.0 })], positions); + const line = manager.group.children[0] as any; + // Floor is 0.25 — used to be 0.1 which was invisible through fog + expect(line.material.opacity).toBeGreaterThanOrEqual(0.25); + }); + + it('edge opacity cap is 0.8 (was 0.6)', () => { + manager.createEdges([makeEdge('a', 'b', { weight: 100.0 })], positions); + const line = manager.group.children[0] as any; + expect(line.material.opacity).toBeCloseTo(0.8, 5); + }); +}); + +// --------------------------------------------------------------------------- +// 3. Scene config — source-level regex assertions (scene.ts needs three/addons) +// --------------------------------------------------------------------------- +describe('issue #31 — scene.ts bloom/fog/starfield config is locked in', () => { + const __dirname = dirname(fileURLToPath(import.meta.url)); + let src: string; + + beforeAll(() => { + src = readFileSync(resolve(__dirname, '../scene.ts'), 'utf-8'); + }); + + it('fog density is reduced from 0.008 → 0.0035', () => { + // Positive match: the new density appears inside a FogExp2 call + expect(src).toMatch(/FogExp2\(\s*0x[0-9a-f]+,\s*0\.0035/i); + // Negative match: the old aggressive density is gone + expect(src).not.toMatch(/FogExp2\(\s*0x[0-9a-f]+,\s*0\.008\b/i); + }); + + it('bloom strength is 0.55 (was 0.8 — was blown out)', () => { + // Match on the constructor signature: (size, strength, radius, threshold) + expect(src).toMatch( + /new UnrealBloomPass\([\s\S]*?,\s*0\.55,\s*0\.6,\s*0\.2\s*\)/ + ); + // Old values must be gone + expect(src).not.toMatch(/new UnrealBloomPass\([\s\S]*?,\s*0\.8,\s*0\.4,\s*0\.85\s*\)/); + }); + + it('scene.background is explicitly set (not left as default black void)', () => { + expect(src).toMatch(/scene\.background\s*=/); + }); + + it('a starfield is created and added to the scene', () => { + // createStarfield helper exists and is called at least once + expect(src).toMatch(/function\s+createStarfield\s*\(/); + expect(src).toMatch(/createStarfield\s*\(\s*\)/); + expect(src).toMatch(/scene\.add\(\s*starfield\s*\)/); + }); + + it('starfield is exposed on SceneContext (so dispose/update can touch it later)', () => { + expect(src).toMatch(/starfield:\s*THREE\.Points/); + }); + + it('ACESFilmicToneMapping still active (did not accidentally revert tone map)', () => { + expect(src).toMatch(/ACESFilmicToneMapping/); + }); +}); + +// --------------------------------------------------------------------------- +// 4. Source-level checks on nodes.ts — the shared glow texture helper +// --------------------------------------------------------------------------- +describe('issue #31 — nodes.ts glow texture helper exists and is a singleton', () => { + const __dirname = dirname(fileURLToPath(import.meta.url)); + let src: string; + + beforeAll(() => { + src = readFileSync(resolve(__dirname, '../nodes.ts'), 'utf-8'); + }); + + it('shared glow texture cache exists at module level', () => { + expect(src).toMatch(/let\s+sharedGlowTexture/); + expect(src).toMatch(/function\s+getGlowTexture\s*\(/); + }); + + it('radial gradient has a transparent outer stop (not hard edge)', () => { + // The key insight — colour stops must go to rgba(255,255,255,0) at the edge + expect(src).toMatch(/createRadialGradient/); + expect(src).toMatch(/rgba\(255,\s*255,\s*255,\s*0(?:\.0)?\)/); + }); + + it('SpriteMaterial is constructed with a map parameter', () => { + expect(src).toMatch(/new THREE\.SpriteMaterial\(\{[\s\S]*?map:\s*getGlowTexture\(\)/); + }); +}); diff --git a/apps/dashboard/src/lib/graph/edges.ts b/apps/dashboard/src/lib/graph/edges.ts index 9e8e37a..8022443 100644 --- a/apps/dashboard/src/lib/graph/edges.ts +++ b/apps/dashboard/src/lib/graph/edges.ts @@ -36,11 +36,15 @@ export class EdgeManager { const points = [sourcePos, targetPos]; const geometry = new THREE.BufferGeometry().setFromPoints(points); + // Brand violet (#8b5cf6) instead of the old dark navy 0x4a4a7a + // which was invisible against the fog. Higher opacity base so + // edges actually read as a graph. const material = new THREE.LineBasicMaterial({ - color: 0x4a4a7a, + color: 0x8b5cf6, transparent: true, - opacity: Math.min(0.1 + edge.weight * 0.5, 0.6), + opacity: Math.min(0.25 + edge.weight * 0.5, 0.8), blending: THREE.AdditiveBlending, + depthWrite: false, }); const line = new THREE.Line(geometry, material); @@ -58,10 +62,11 @@ export class EdgeManager { const points = [sourcePos.clone(), sourcePos.clone()]; const geometry = new THREE.BufferGeometry().setFromPoints(points); const material = new THREE.LineBasicMaterial({ - color: 0x4a4a7a, + color: 0x8b5cf6, transparent: true, opacity: 0, blending: THREE.AdditiveBlending, + depthWrite: false, }); const line = new THREE.Line(geometry, material); @@ -111,11 +116,11 @@ export class EdgeManager { attrs.needsUpdate = true; const mat = g.line.material as THREE.LineBasicMaterial; - mat.opacity = progress * 0.5; + mat.opacity = progress * 0.65; if (g.frame >= g.totalFrames) { - // Final opacity from weight - mat.opacity = 0.5; + // Final opacity matches new createEdges baseline + mat.opacity = 0.65; this.growingEdges.splice(i, 1); } } @@ -126,7 +131,7 @@ export class EdgeManager { d.frame++; const progress = d.frame / d.totalFrames; const mat = d.line.material as THREE.LineBasicMaterial; - mat.opacity = Math.max(0, 0.5 * (1 - progress)); + mat.opacity = Math.max(0, 0.65 * (1 - progress)); if (d.frame >= d.totalFrames) { this.group.remove(d.line); diff --git a/apps/dashboard/src/lib/graph/nodes.ts b/apps/dashboard/src/lib/graph/nodes.ts index 0bb6e39..b8af78e 100644 --- a/apps/dashboard/src/lib/graph/nodes.ts +++ b/apps/dashboard/src/lib/graph/nodes.ts @@ -2,6 +2,37 @@ import * as THREE from 'three'; import type { GraphNode } from '$types'; import { NODE_TYPE_COLORS } from '$types'; +// Shared radial-gradient texture used for every node's glow Sprite. +// Without a map, THREE.Sprite renders as a flat coloured plane — additive- +// blending + UnrealBloomPass then amplifies its square edges into the +// hard-edged "glowing cubes" artefact reported in issue #31. Using a +// soft radial gradient gives a real round halo and lets bloom do its job. +let sharedGlowTexture: THREE.Texture | null = null; +function getGlowTexture(): THREE.Texture { + if (sharedGlowTexture) return sharedGlowTexture; + const size = 128; + const canvas = document.createElement('canvas'); + canvas.width = size; + canvas.height = size; + const ctx = canvas.getContext('2d'); + if (!ctx) { + // Fallback: empty 1x1 texture; halos will be invisible but nothing crashes. + sharedGlowTexture = new THREE.Texture(); + return sharedGlowTexture; + } + const gradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2); + gradient.addColorStop(0.0, 'rgba(255, 255, 255, 1.0)'); + gradient.addColorStop(0.25, 'rgba(255, 255, 255, 0.7)'); + gradient.addColorStop(0.55, 'rgba(255, 255, 255, 0.2)'); + gradient.addColorStop(1.0, 'rgba(255, 255, 255, 0.0)'); + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, size, size); + const tex = new THREE.CanvasTexture(canvas); + tex.needsUpdate = true; + sharedGlowTexture = tex; + return tex; +} + function easeOutElastic(t: number): number { if (t === 0 || t === 1) return t; const p = 0.3; @@ -90,16 +121,20 @@ export class NodeManager { const size = 0.5 + node.retention * 2; const color = NODE_TYPE_COLORS[node.type] || '#8B95A5'; + // v2.0.5 Active Forgetting: suppressed memories dim to 20% opacity + // and lose their emissive glow, mimicking inhibitory-control silencing. + const isSuppressed = (node.suppression_count ?? 0) > 0; + // Node mesh const geometry = new THREE.SphereGeometry(size, 16, 16); const material = new THREE.MeshStandardMaterial({ color: new THREE.Color(color), emissive: new THREE.Color(color), - emissiveIntensity: 0.3 + node.retention * 0.5, + emissiveIntensity: isSuppressed ? 0.0 : 0.3 + node.retention * 0.5, roughness: 0.3, metalness: 0.1, transparent: true, - opacity: 0.3 + node.retention * 0.7, + opacity: isSuppressed ? 0.2 : 0.3 + node.retention * 0.7, }); const mesh = new THREE.Mesh(geometry, material); @@ -109,15 +144,20 @@ export class NodeManager { this.meshMap.set(node.id, mesh); this.group.add(mesh); - // Glow sprite + // Glow sprite — radial-gradient texture kills the square-halo artefact + // from issue #31. depthWrite:false prevents z-fighting with the sphere. const spriteMat = new THREE.SpriteMaterial({ + map: getGlowTexture(), color: new THREE.Color(color), transparent: true, - opacity: initialScale > 0 ? 0.15 + node.retention * 0.2 : 0, + opacity: initialScale > 0 ? (isSuppressed ? 0.1 : 0.3 + node.retention * 0.35) : 0, blending: THREE.AdditiveBlending, + depthWrite: false, }); const sprite = new THREE.Sprite(spriteMat); - sprite.scale.set(size * 4 * initialScale, size * 4 * initialScale, 1); + // Slightly larger halo — the gradient falls off quickly so we need + // more screen real estate for a visible soft bloom footprint. + sprite.scale.set(size * 6 * initialScale, size * 6 * initialScale, 1); sprite.position.copy(pos); sprite.userData = { isGlow: true, nodeId: node.id }; this.glowMap.set(node.id, sprite); @@ -275,8 +315,8 @@ export class NodeManager { if (mn.frame >= 5) { const glowT = Math.min((mn.frame - 5) / 5, 1); const glowMat = mn.glow.material as THREE.SpriteMaterial; - glowMat.opacity = glowT * 0.25; - const glowSize = mn.targetScale * 4 * scale; + glowMat.opacity = glowT * 0.4; + const glowSize = mn.targetScale * 6 * scale; mn.glow.scale.set(glowSize, glowSize, 1); } @@ -300,7 +340,7 @@ export class NodeManager { const scale = Math.max(0.001, dn.originalScale * shrink); dn.mesh.scale.setScalar(scale); - const glowScale = scale * 4; + const glowScale = scale * 6; dn.glow.scale.set(glowScale, glowScale, 1); // Fade opacity @@ -342,7 +382,7 @@ export class NodeManager { const glow = this.glowMap.get(gn.id); if (glow) { - const glowSize = scale * 4; + const glowSize = scale * 6; glow.scale.set(glowSize, glowSize, 1); } diff --git a/apps/dashboard/src/lib/graph/scene.ts b/apps/dashboard/src/lib/graph/scene.ts index bbd39f0..6f05cca 100644 --- a/apps/dashboard/src/lib/graph/scene.ts +++ b/apps/dashboard/src/lib/graph/scene.ts @@ -18,11 +18,53 @@ export interface SceneContext { point1: THREE.PointLight; point2: THREE.PointLight; }; + starfield: THREE.Points; +} + +function createStarfield(): THREE.Points { + // 2000 dim points distributed on a spherical shell at radius 600-1000. + // Purely decorative depth cue — never intersects the graph area and + // sits below the bloom threshold so it doesn't bloom. + const starCount = 2000; + const positions = new Float32Array(starCount * 3); + const colors = new Float32Array(starCount * 3); + for (let i = 0; i < starCount; i++) { + const theta = Math.random() * Math.PI * 2; + const phi = Math.acos(2 * Math.random() - 1); + const r = 600 + Math.random() * 400; + positions[i * 3] = r * Math.sin(phi) * Math.cos(theta); + positions[i * 3 + 1] = r * Math.sin(phi) * Math.sin(theta); + positions[i * 3 + 2] = r * Math.cos(phi); + // Subtle colour variation — mostly cool white, some violet tint. + const tint = Math.random(); + colors[i * 3] = 0.55 + tint * 0.25; + colors[i * 3 + 1] = 0.55 + tint * 0.15; + colors[i * 3 + 2] = 0.75 + tint * 0.25; + } + const geo = new THREE.BufferGeometry(); + geo.setAttribute('position', new THREE.BufferAttribute(positions, 3)); + geo.setAttribute('color', new THREE.BufferAttribute(colors, 3)); + const mat = new THREE.PointsMaterial({ + size: 1.6, + sizeAttenuation: true, + vertexColors: true, + transparent: true, + opacity: 0.6, + depthWrite: false, + blending: THREE.AdditiveBlending, + }); + return new THREE.Points(geo, mat); } export function createScene(container: HTMLDivElement): SceneContext { const scene = new THREE.Scene(); - scene.fog = new THREE.FogExp2(0x050510, 0.008); + // Darker-than-black background with a subtle colour cast. Combined with + // the starfield and reduced fog, the void has depth instead of reading + // as a broken shader canvas. + scene.background = new THREE.Color(0x05050f); + // Fog density reduced 0.008 → 0.0035 — the old value was killing every + // edge and node past 50 units. Lighter colour blends into the background. + scene.fog = new THREE.FogExp2(0x0a0a1a, 0.0035); const camera = new THREE.PerspectiveCamera( 60, @@ -40,7 +82,7 @@ export function createScene(container: HTMLDivElement): SceneContext { renderer.setSize(container.clientWidth, container.clientHeight); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); renderer.toneMapping = THREE.ACESFilmicToneMapping; - renderer.toneMappingExposure = 1.2; + renderer.toneMappingExposure = 1.25; container.appendChild(renderer.domElement); const controls = new OrbitControls(camera, renderer.domElement); @@ -55,25 +97,32 @@ export function createScene(container: HTMLDivElement): SceneContext { const composer = new EffectComposer(renderer); composer.addPass(new RenderPass(scene, camera)); + // Bloom retuned for radial-gradient glow sprites (issue #31 fix): + // strength 0.8 → 0.55 — gentler, avoids the old blown-out look + // radius 0.4 → 0.6 — softer falloff, diffuses cleanly through glow + // threshold 0.85 → 0.2 — let mid-tones bloom instead of highlights only const bloomPass = new UnrealBloomPass( new THREE.Vector2(container.clientWidth, container.clientHeight), - 0.8, - 0.4, - 0.85 + 0.55, + 0.6, + 0.2 ); composer.addPass(bloomPass); - const ambient = new THREE.AmbientLight(0x1a1a3a, 0.5); + const ambient = new THREE.AmbientLight(0x2a2a5a, 0.7); scene.add(ambient); - const point1 = new THREE.PointLight(0x6366f1, 1.5, 200); + const point1 = new THREE.PointLight(0x6366f1, 1.8, 240); point1.position.set(50, 50, 50); scene.add(point1); - const point2 = new THREE.PointLight(0xa855f7, 1, 200); + const point2 = new THREE.PointLight(0xa855f7, 1.2, 240); point2.position.set(-50, -30, -50); scene.add(point2); + const starfield = createStarfield(); + scene.add(starfield); + const raycaster = new THREE.Raycaster(); raycaster.params.Points = { threshold: 2 }; const mouse = new THREE.Vector2(); @@ -88,6 +137,7 @@ export function createScene(container: HTMLDivElement): SceneContext { raycaster, mouse, lights: { ambient, point1, point2 }, + starfield, }; } diff --git a/apps/dashboard/src/lib/stores/websocket.ts b/apps/dashboard/src/lib/stores/websocket.ts index c9985f1..8ae8c65 100644 --- a/apps/dashboard/src/lib/stores/websocket.ts +++ b/apps/dashboard/src/lib/stores/websocket.ts @@ -101,3 +101,7 @@ export const memoryCount = derived(websocket, $ws => export const avgRetention = derived(websocket, $ws => ($ws.lastHeartbeat?.data?.avg_retention as number) ?? 0 ); +// v2.0.5: count of memories actively being forgotten (suppression_count > 0) +export const suppressedCount = derived(websocket, $ws => + ($ws.lastHeartbeat?.data?.suppressed_count as number) ?? 0 +); diff --git a/apps/dashboard/src/lib/types/index.ts b/apps/dashboard/src/lib/types/index.ts index effed1e..0e2a6de 100644 --- a/apps/dashboard/src/lib/types/index.ts +++ b/apps/dashboard/src/lib/types/index.ts @@ -74,6 +74,9 @@ export interface GraphNode { createdAt: string; updatedAt: string; isCenter: boolean; + // v2.0.5 Active Forgetting — top-down suppression state + suppression_count?: number; + suppressed_at?: string; } export interface GraphEdge { @@ -150,6 +153,9 @@ export type VestigeEventType = | 'MemoryDeleted' | 'MemoryPromoted' | 'MemoryDemoted' + | 'MemorySuppressed' + | 'MemoryUnsuppressed' + | 'Rac1CascadeSwept' | 'SearchPerformed' | 'DreamStarted' | 'DreamProgress' @@ -198,6 +204,9 @@ export const EVENT_TYPE_COLORS: Record = { MemoryDeleted: '#FF4757', MemoryPromoted: '#00FF88', MemoryDemoted: '#FF6B35', + MemorySuppressed: '#A33FFF', + MemoryUnsuppressed: '#14E8C6', + Rac1CascadeSwept: '#6E3FFF', SearchPerformed: '#818CF8', DreamStarted: '#9D00FF', DreamProgress: '#B44AFF', diff --git a/apps/dashboard/src/routes/+layout.svelte b/apps/dashboard/src/routes/+layout.svelte index 41280b9..5050f37 100644 --- a/apps/dashboard/src/routes/+layout.svelte +++ b/apps/dashboard/src/routes/+layout.svelte @@ -4,7 +4,8 @@ import { page } from '$app/stores'; import { goto } from '$app/navigation'; import { base } from '$app/paths'; - import { websocket, isConnected, memoryCount, avgRetention } from '$stores/websocket'; + import { websocket, isConnected, memoryCount, avgRetention, suppressedCount } from '$stores/websocket'; + import ForgettingIndicator from '$lib/components/ForgettingIndicator.svelte'; let { children } = $props(); let showCommandPalette = $state(false); @@ -144,6 +145,11 @@
{$memoryCount} memories
{($avgRetention * 100).toFixed(0)}% retention
+ {#if $suppressedCount > 0} + + {/if}

$$jPv<)NrxOhk^sCm<;c4Gxu3qPOW!{Q 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 diff --git a/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz b/apps/dashboard/build/_app/immutable/nodes/6.CBsTT29y.js.gz deleted file mode 100644 index fbb9870d8e43e5c4acad5bef5cac6228a811a38b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144193 zcma%?W2`7am##O?wr$(CZQHhO+qP}nwryKy+q!2axxen@&R6O6qkUTj+h+u*Jfe2U8{oV69oL}}b*^e{An_Z#( ziP*&HK2Sp0k%7elajYILue2-b!0h3I`E>l8Z$0lTkzMl>7$0-C1G+R?Q_D|pG-?E- zp8He_-<{oL&`8+v(Y)F8Z6fj`MbUQkmwji_7yWh&+gXu)$0vEk-@mZr69b3dD54X# zJ-uwXbwP6XyGK^HN_O{;3g2<=YNNieZr$!@_80C?Uftapq6ZxbCl^~}E$qGNSsJRz z&KMEYN8|SwuNH^W=dUh@U&4K9Mr4M`5lQwR{TU0lc(a+li6KlSdt_2%rF&?-Ol5oP zZll^o4y~kdcziWCzb_9N8c4IAr%{P}$W85-?`YrW=2c#Se+9jrX>pKo*er#&+*7Y%gfugq%% zaliMUd1_Tgd}${VxSvOEVt(8*s~yE+@3y|&J(WFtEtHIf#deP_B`WLz_$TjeZRGcU6j+z$~%uCQwp+|h=TZV#sy zb}d8+buWg8U=xO&cSQrUQ)p%3dqc-aWL$k7Lpp71+b+4Zp?Pt7dAPZ}Sj^dFb#bw~ zaN1`x2UP-(qa3V9;HQzuX4rH?i~?7q9xS-5*)HtPIcG-(OCG(#=PV(t1NA4`VBz1# zz^rfpSPN$hKzV$hZ`q;ZjgVnBXZP;w4nMfiJEB7!xJO_V=Vce(g?Xuua32<2e1J@e z-9>n7?=ilavtAz-9DSm17F-cwd9jaVfL*hAPfJd|WqCelw@*uMzQb`__Pz!G#3{a+ zvW#PLQ}-8TH*dI>nC|5lgGHt^@=NPNGDL7J&)o)V5IqKS9zDg*PLg5KvsRY+(s>9z zo=(PI-NLQ*vDQ-@jWK8Au07bT^Ra9EQLfyjd8JKHcT0|=PfM<+2)>=O*e-Wkvvkr} zYZ_ipTh2dE7i}lgXHQ$Mvqm2`>`1a}E~W_IFWGwUUV9wJd%cg3iQ!Sa2YPD|6nL7y zxp#_>X#cdO$-6h~WnWt^KgVymk6^!lxz>_vH|&1`LY+U#=jDRyFF0@C&}7P@XHp-r z{MvF}zqTB99Y<>)nSKk+zzvXehWdQY+W`KQO-5LM+l>&=`PmZFZmy#c58h$+9T({U>!y_nDy(b&9fxn%CD(uvKT@Jl<3s$Yr#F;XY3u8i7qrSgXH#Kcn+2oVmcxOs|K5ku;?xHZD|RzKyYgc-u8A z2oSF2>3EBpCYKMuD<`B6b3;(SS(NxuaZMvd>A=UaE(<4fgeJ_(Qs!rX9og4XF)1+xLkWt{7M-O;*ba!+hu)}>HgzbnLt!>z} zKb1-NX+D+7_;Eg!N%?s`ndSYf*f=pi(I+!$KhmeMGCrj*2Z%hWH|@bQMBcQ!j^H^G zZ`uQ=|2JiY*h_lwp8%m3^}y;s08%gOfz|(xEBId6gZ~7Gy|f2c{{awsaSwh&3HlY9FglOMr#a&P|uxChS=c;oIog6D|5aStBB z^Tgi%hm>fro$%X#fYD$(>9_v?q``KAZ~p=RB5oC z#N2c# zR5zx0jLLNzx84@)6E+DyHVFeX362xgI3IYZeparWcvZ-rZ}xj%_FboHO*Fl(R$YH2 zoV5#^D#&LqU3;CkCk-=@nORE3CZ7Q3$2eiGL&#rikjcziZhdci6oG+MOYUT zwH~KZL{{q1BUS_Y5%p;6FVhk^nFN|~$qfF)^7FXm(h1R7u)r0KZ$TS>qk>^SyCNJL zzAWa-Aa(3W7uuFBF&@4$E##+$dnZuwCxKRMyVmu}^6r#HRZvn-53H4%;&cCp8lHTlOWyV#U}ew0fm#=JiiKdkF<*wbThn2A zdAy$$9^P-xcdu`ve?@2$=S1<66A5Ir;3er2KPVxS;uEM3{oaswumwY=6mM4O5dvoB z`vQs~a*l{I(w^K=B5VzDlE!yn7#%-4FAwwcPSADGRi`64^+&qTI=} z$++Z$j3UzCgK~7F&Dca^!lOk+AS(@8WL5?(m)cYgO}m8)EcO&wN6j1%(X%7gXFr<^-k%=XP>LyOkt=Z z$<~UrZ!ATfEG?Ykou!;CJ2_ZpLa!EXW-2yjDlSg5i-ypuOnSK}MO!E>T9iL%T&m7H zE8tmY(4r#pq&m#@_oVKlmPgi^OuD@E`RqUdOh?TfRt#;=E@to~W0OAr#sI7E@92G; zq2p>o5KJKXnR{2it-J|c8IknMy%rTJe+{58*dQ!@l1Bgp5RLU}A}dVm_EAy^yJBZX zD&Q+5pesd38nzZFI*?LMADmSc{)7Rf5ITATXG9t>hd0Pq$hM;p5JJUMl=C|eQ$hxe zD~5sZh*Vg+gpU9Yq|w=OY~7QS?=#}x(FjEk2!2G612$Bc4WEO4Mwu{R#!?I>ijor> z+RzRY7DmpaGoa=!-MR5WMl~2{!ik*9k}9D<06y!R+n zi>tH%j$;Nda1fVVQTtq5j328Qj$>8(N%3jHQqEITaIRJp?sda!$O<{dPBPP#popjW zCQFE%3)Ph?M{-%tZ8oPw6|TK}0avLW(W3&Fo(hI(km8V1a;B^NOX;TdtC{#I! z)G1_9bj@gRPE&MM)gLvWZk3fM=1KO}_?Fa{L;#2a6~BvtlccRN`140dVy5pKMq*_x z6i&fIh<_weJ(uDos1A)bxT;pWI#J#;&U%Zj8*n%*hahR`xO)1hwY;5nh00(_I=;!~_E`D>38}?d91t zZKV5f1P*!EMIqo1JMRihKVEPqvZZ3VNC9fdCbFecxljRY zNcko4$-DBWe=%nsCj5RJc8Z$BaZJ*fZufYMgXM%%H0*|j+~CQF_PC2|5j29O7jq`o zHsTKT6^%(|q0K^xdLYT-M z*VzH%BpV1qDRR226Zg|n9QhD%?)kO+)1{*Gp8C_Lw)36v)3I`WzvR=iwDTp%)Z6TP zys@_#k1@t?@`#riGx7Z{fdSq|++EQ1*qgwM(7&fv9*zya=$;f|sm@kSOCcg7iz#-x+%Bv8gpHjjLe!Gx=B`x$qxO0jXFyukO8Qls2Gj{FN5lj z>J%gNjF){knTJJSg%XLk2OjO8m;mWk5+5~Fa@WMbfhBA`99}- zmyNwWsXieu%Uj+^ce;;CL;1&UQbSW#L$>FxhkQyARPCXx~$-s4WLMFv! z<<+HV)dDJCQDtx*XDCQwF3GYGEAhONsih-B+BVk>X$OFmo-LJPdd6t+!!tl&WKTC+ zvBf^y&$e!<(sW8$G;&g3kcLR)Wcw*j))}atn6tLI+I_`=gj%h~^3We@6qY>zh~%j$ z%mPBeV5LoUKb=|A18^?;j*ieAhxa~JytrAo+j!As`?ks zpMFGuD3$XtfTC9+`Deb&8M^flb+5Irx5pBHGB?rybQ@n42oGdcL)?&*d@%!(O9gcZ zFJ#q2+>n-jH#!j44qN%b>Uv&8{M2_*E5Mm%fjTN&Fvu&6?=g;z}Z1MJxQ~Ju#vHXc3}9hey58Cg=!CJu1vF7*NEVDbNk-@;TlB& zH-w;QO1O&8P9CTT%kg58GDNziXkOTR0ChZ&cSDu0DHUXZ^YO_guMh zVx#!WmPn3{G;v0keAbsb0bD-I)(U?ru`(KbpZ!*IPptCMK~ygXEyd zO8L3pyoI7=56AeOXz4CqylEQ(KKR=8dWGMfd%fQY2Kl}sJ4En_g?M%G3xWkI$HVST zwc|q50KfUI6!RkPq6di(a3@q2`Wqrq&vcvbCe9b4AEL=cZSYErDG`5Oe%vU{tO)aq zC=wGlRPG|P?hO-IgN7P0utk~fT#n#J-8eF{j$0zAxBw8oGOlQg`y3MQw&X>%;(iCn>Dr}n_J)#2_D~PQ&C}f&9a!^P?o7nfA$|y zACz*j&W7rKdMt6@^;911DyC#KqD1&eg*5pWPmUSsiQ7hisYPR4&lU;;e=b@+zEM+0 z0qw9<4@jiFF27yv@~G2Zx>TrT+jEz$7fzB*du+f_=}<9>+gSrao)9uXS3YL|Ypil4 zBUcAHw{KjhSOWLr`8&16oAQp{&(d32j&Lyf*~dJ+yoqbJUVoedZwGb@bKe+P37^?9 zkHDpOC%)dFP8N_*F-rhG?A>~_WLZiU-uxjSBoGAKghvwO6h;|aX~BLNU-;T)@r+&lEb|NUynywN9X2%>5)X3Ph@=7*07KvvTbzt0Y?ymCcL_PdQs;oBPd zlBb1(G*laaKGkpBJ37k4%?lOt#uDAJ67Nc{BI3FP^h5`P+n8levNnsO$*5uGWGnLS z7N6}=5#S|a-TBtcLgyPI|54?=f3$Xt%VncA!}prx8nG5clQt*6uwl2|#BqlsbnzP+ z;^iE46g9;DPE0V%fQEUF!N?LaI+Y*mD-dWB`W`u-83Ov4-NQn_a??wZ`gGePwzm8L zhn*GSCh&sw8@!M6-n_y>MJeYDa9$a3OBM`VX?p z8av#5&_A<*uTyjWMHULn&{606+YK22(ewgK*X8IvVjT%t;d&saj}PGkAQvllnxB-8 z>!)E_O?W{V(=4VvOm@JD`Pn=}(@jGME9Z(v&;3jNw~H@Bt%^-iSho%>i6A2_O0F=P zF~9Jx;Z}zALtS3gbzOgGy#JN#errXTau0D+zMM!P1M!6TfR3zAPXm*Xr{^*Obe=Xd zti&eG^b*gT)7^CNATzPj)KiBlXWz-7>zXe0;6|#t%C-eQjXgUkCi<6zx?dJZvz)-aSetNi@$wI61 z4b=aFQkHrm!;}TW{`tc6Z|epC;|l|1{wta~q(&#Jn}^%y`-pqSKj(lQjRCrbaMG?b z+*ql{0Mos}3j^PC{!qD282%o@jNeBsF+x47g+}G9FFmPzAA`D@Bu)TJ+>Zo6r#@^DXli{7;g@p~_a_yw@J5}rs9%d0 zO&)WGFtFW#eCWU#a|uS6`7ltf&zOnO@5Br9FXafU^%c04fM5oH3PmpBP!u?d-1I0>aOT#InXG(lRpp3^?WyoKu8H~X`$WKWFl5IY zC0g7qG1La*b`thD_D{qcO)hXEH8C3*@u=8`u+hL#Q#J#b4SAb-`FhICj*D?#XhP_U zNC|G1GwSUM8AZGTfBj_n4AQ# zSF7U_Gi$vWJ6TRSXokl00RgMHSWXf~M^GW)U*oWwe0y)M3<6Ga%n3HjG@6h$xgXI@ ztSbc~H*C0#Fj3CKYvI^+dgS_luh+apWqq-N>uM-p#9ZKtN#+igMY~|n>&xI1D}e{n z(UoV#80ytJWUSc}wnm>PzfrsI^E^$}mO-Z5@d7!5f-X9von(LP1~<_+iF^evGcF5g zEk@f5=%zkb&>>&uvGK4^^12!oyijRx8=Ch}%~m+7HKeA!Wh?)-LnFM+1I@m&-a=r^ z0?-vKxZybO`%B==mS^D9L;{p!JBvfeS*woE#O`XAqO>V4U77iAH@EMLV^nBAGHwH0 z$AoRVIyd+DZAQNXSjbjk!Gl@TQ`Fyh&T9h8^F`6VeOimIJK73x?W>q6`d!bir_O!X zi)WiQDY_`zG~LoRDI8YL_UF(Fm8QBLC&?D2jJ`3N<-MkaHPPcP>*JHx-oDBCQ~p$I z0WDySW524d+QvcD5oI45$?q=P5y{$k?t2tBZnc=e&y}m>$t*TyOufCs7+wV?O_?lG28>`xT#zf>1z3xq_ zaMh*=)g|H2$*4a3goS>|&HlPx_~~>-?nWr3juM|S7F`DEWD(#DYrC%XtB9zc-1gq9 zgb~iaU_SN+6Sx$S9*2>2Vx~9ArF2Wp&Y4!l7Lm+4381a=gbG?@ox+8w;>$@9+8O0V zh(0?q=O53x0(U*h`+8nNm`YylJv8BolVI;$k;G-% zs_cpuV|eYpHQ(a1MnY-}%?03V_)v^9!O=hO=om&H43Xh!2 z;s|xZy`8vdfy4Jrc05s&w6V61%32Gmz?2rP9E2dw+oVGR@t}G5 zw5p_-f$~V8vFwm7UQRz~#nDnXJ^A!Pn_b0MKqYLld!^6%FS%pGrF`QDQVS`j6rS{4XLI zw4)mYy<}M-uu~eu9f?Hm-eF@vZ|%w&i;qra-ISg48Gp)&mV9TdH{9ix4o^6hisf5` zl#1n(4;dT0^ghN#`C>^p;H{zZtoUUm~8523NQ{yly^aUV-v=w@mK5?h05O4ih zR0$A&?5hEW^8sH=lEisLPA5S<#S{T8btrUGFd+L5i`G%}SkFMTeZIDrQdQm?eFpSX zgD!sDG>``-9y*vxfI}uq`A`#ob~wmsgNi{O4RVM5iQfD*(-VplC%6ui(omQz((^Zp_3uWcy(0oT=2z&ai64+8) za$WJ>%{tb+x+=nXi;`kMr^b~y9LJ}+RHs`q>C%=IUXDSg5v*O(691O{F4jeLQD0PQ zq=fk zZaI_W)d4V&BTgg#iq6gKkHoIh-s4;)y$2U1y+)JEsy)V(btnJlig3Nwvwq=_Olx)YMOUkh?#7y%Lo-!2vRy!TMkPb8LV**s9!j+4ma6V^c? zr_@pmV$dNZ&V(>|J|uV&5vK5a#y4+2Pfe#@kb;4u3>a8wT1A_pWws3i8Gnu#d+{QY zzSA)thvm+ZugOEMAcm#2(8~Ptacm{gBaRdm3}saob=;YMVT)~fzVigkR?hVux>$m& zH9boUw_Hl&zUG<-`ZHS5*@=umUEU*Eo8}IBh_Apx=`Iq?Vl9Q-yCSO=_f({@`XRtH zC26x^9qhstYuWb~CBQ&3omT|{Q1R@7uj9{|Zk{lYCuD5F#w^L$)w22{vSI9uN!83U zE2XJYEJ_)5&@)J#;lEF&5c!tq^hVz_eBK2U`=yz0uuJI*s<~(N_L(fSH3r~Tt0j5k zWW%i9#@&x$_mlO5ldmQ-EBQR%EPZ$bb+((>$mn8q`xHMWi9VSR-Ob;QxgA$imL3K? zF0)R$9kqA40vq~5gP|367Y;Tqk|nhYHP2QoOn@KaHbB-upYn*9h0KA@q|a8Mf@dRm zTj*<|yV6w6AbypPCedlKicFFo1{xW;|9L~qWc^6roScTVp0+xL8ln{Yin-CuGQ?Jh zjN52u6&q&N8)mf|VKe#DX0j^`Gg1sQG7K@4g5V47PVekms;l><#G3{Z2bO)1*fSQT z8BFgWXXi^>OiT(f17SrgA^4T>1uRj8>lzo!?$G>FCdV$^A%n=A8e7~0&0~W-1;jVV- zUM_i<9M$mOf!34^TY4WEOJt@c7`!Dk(pZ%H9%6t2a-0Xu7lp1{zfaY#7ND;c?4Lb9 zue1s{s_S4rywrc7(YgbAU=WMC z5VMZ7{O-Zm^wKJ*m`Qr}R7$!7#D46t7E!$pqe6;$#NQSkgMoYH-`2EXHx@3`-*&Q~ z*nE-*y0}R4^6%W)3P5~5$`T>0v1munDAEL3yXc5w1BDQl+QGd|ddSFo_PNB=1 zV?WO+hPelx2k@A!bWhw|8U2}O)(EJE(asJ*!zuIhRv=kHqHdzfmhRJD7 zrFC5!B@~~Cd9wB(hs~tyRYCN5bWj;-gI{3FQ&VX!z$0>L1am5l@{j;qs+MX~(*O*2 zQn^6urN-gN4NWg5bqJu~kIdPtp8jB2F@x9~1pfT!nKnk8N)oI{?4HqResE6jbeeHD z`7olH&9IBM7p1L$wyG_xN9bi8++wfYpMQ^*&6zvKxW&lf%9|kCW#aVUO(N?ybAIt| zeZG5_&PB-zAGV8>`YJsy#`YK^cxp3hor?--8Z>-_yL=V{ncgEuCpF#)sd>^(v<+8b zQEF8~k-^YaVL`!GF}c-L`s*lbbDiEhTGo<6bF{h{`*@40MrScn*iQ02-@91W&hf2n zina^DC0d85I`L?ytYKL>0vJSoP9e^lbU>D&4Fo**R$Ics zGdtJIJpil&WP>Eq!7$G4=2Zgi3W9QMJE)}Ni7#8njZ0t70#~OFT^$~VY(Bl(KULh8vrjL1S?bsh}IS&SEJKP^{jm0hAZpkgHlxcCE5{j56`y|ZF;_h5nR&?RR&cHO>Sc==I zcCskAP{9!3=tGem~fJ=>fxv4NvXYF3&tkzr%zXo{7Yt&vK) z)pd}aZ0kiD}7eL`&(=9tPP%rT|$uheA}Y^^Z$&}OrLCSOwRoO`pk z<3-A8d61Kz-erMPn5G0zrWqADnyi)oO);5eBYFLB#s<=Mui3UYD&?YF!8qY*;A^e{ zY1_y4O0#zI6Vi746M}Z|^Qr6c`MPWS*=l98=k9TXMOW?9W@Wi|ue-^%EBraSWwv)S zyP?-%{GvvidePn1R%rO&N8$^Sj%<>q1s2R0I$EV}Xe(u0uFMfL#=lSQ_UjqFmo-v8 z61H0?3F6x^QNu-PPxdj2M+X=*4rH{5uczlBm?&WPGTR|h!#*A1x62sHoi{D9($6+4 zBW&BhOnG3AuaXJv{%8?U?g`!gXbU)Lj-~e`J0Gr_kdm8U>b344r?I6$)>e9@mL(P9 zcxB{^DJQJPjjgh-NjFEIt?_vL!1Tuk4aZE$48f}0i-<-@i1Eg8blum1K04BhJiWt1 z=Dw{9ys$r;;JK8M_0QR~t9)27OGLeAU`oOGUnD3Qn!G9WaI!dIrHu2!Pt?0<; z*4qm8W=Rvmn&D*h#aFUEKG) z#h$8eLw>w!y}z?+UB0zyZNH=F%)jUQBA@Ge?4RrU)ShoUd7js9#eGgn%KIFVF1@yW zK5E-?e&RZ|pKjYnl)q$|fL$gOQEY*2Oj_qnpj22X>?IsYMP5Rm*Vi`CRy5|YOXnIr zTlg#L8s5!hn#~|k>wsIt80GwxYI(>Ph0D%_Lw7Z>tr8M_=T`eEMGQ*Af*du&*re#_ z*LKqq4AOMw)KoAh4eeeS3%@^{HSkBn&uvE7s75ukJHCFG%nDnMMXIwrm@vVB?q5CG zIJwg9#1+b>$f`KB;fl0cxtYq3^7MC#h!o4i$f8(AWqnxm;u+qtaiJg2l^q%SYm5{N zfNP06?v2!q)~iUWBB(SeOwCh)KdZkcOd(KaZEhG8kF|zv9G11Vv=Y%|HBw!*Y?z*q zO)R^9acp6&pB`d*p!qZZ@{1 zy(wz_dmVHm(~g0j?_{!D{+=1H;||>ke-$wa0#+jk|58{j{f-sfJ94@9OJYRmT+XYB zk!0+=5zdD#P}Tq#p9+7g)<{23___8HT4DI?NM;|AbL{u~!DGLz7)bF>c(e%aaqr%F ziI?D)YaJC@yTnj3j@7=BYj2C9n5fxNbefYRs|Gra=c~Xxmm}uek79g;BS@qFWrlnx}d5p1Sd3Q9mF=b#I9sB&$&HB<*w!gc0?-8 zyXUE{QiKU)KFixDf!2jFD>I9xfDg!E4(FIqPf|4X=yz2UU5z5#67wA~OJ^5WJn`f~1>KA=c$`*?-wJ+2(GZT`Z5!pj@(a z=ub{xs8VKWVH1^fj0|MvctwFCbSynKYl2418Wm02b9l!;t}w37Ofms&_X{RB_+-5k zU$W!Y|0WRp*QL1GH$AXF5dw{+Z5 zx}0k??hCoJB$e(val@VP$r3SmO)r;b!2X9O{j<>t0e!eYF0&Y2aXrq|^WKf@&u zz@$(Q-$thhR<I=CF`vzdGR2WY*E#&d(fq*iGy%cq~PZ~Du zECdpj&|Dzi(Xb3n?G&E}3d+HwN!UwCW~P2M-WSG!w(esuB@a6{hS{|bSYh5Fl>w6@ z13?frrF4{1HozUA$MnvjdE%6Dvmt1gWzaK&WGRAtq<`f20d538u^5L!?94Op#qx2A zJS!V6@VYz}tUJ97aDC<9rB!_x$%|@qLPe|ni_D^{uHX_^@CfZZJnsU^X?pIUFIZrQ z3H&w;REyTH?&{mMDb1h?LUjbsy7p>}^C%$qwNmv??d_OZ`Qc$4xd?8{vc zmv=lS_oTp;8c}EbHR?gghYmw#S0y5jcCoR%(1(}fz4%as zw=Hl%Sk%c2E02G(z^gqkdl%^H|K{|)FhSJL0M^JtL&>3&OK>{OD^#LEo~9Abz_Ltp zLLoD5DMFKLAg!?w-+WSnAQUR2x0IkXDPN+GkQ}KBSqf>aG^T$gsF7$q7JWYVU_$v` z=AuL;Z|dgQqzVcXl4yzAMXqp5)o6;RRUSAeV1c@SoRdaxM9F+gZd7mf2WgxVQ1pa2ECmrrCZ1JuIX}9w*vxU^W zHpnWaeYGN=LO`DKzFf*Fb!q?ByzKU~bD3|Z`*2{`$xQ3RincVL{ z1ivMq!w7o#7k61q9gTSIn^EsJMTTP(bUBSE98IZ4!{DwXOY<550s z*N{+{xrH=SH35h_OLsPc{w@1hd}gBwr>K|eRUqyn zTk#8!tq&FCijvk4;la($JxN_cNF2f~)rK?WP#HSgq`(q^D6}c1f6Co5&BvtVu$_8g z$9>iHbT?Z4D+wW)12X5@Y=Zt~{|p;@-i7rPHGmiQG<`RWZ+cl9`6pK`Mog47ttslq zvL^<>G1@d=-~Xz!-|OnHv_rN@mpW3A?U;@%V*91D!FYtjNbk-Ag-QPl9SPcm2C{<`qkstpC1VbnGf2sOkzQUq zXJz9jZUKv!HNpWzt*TLVeNm1k76Y^_Q0_jKnoo5s7!Z|aK)&SW!8&nGSZ|y-+p3m3 zr70&2MI~urjic@>Up3`td(uZ96eM;i(1|Ql_UU^jm|P`+=wXFo3`=~AFyo@k8{fe= zL)t2#Su^BwzB9>Wnz9vWDzZbhwmr9^e!v}56Gdn@gThIg4Xm-DQ+uIq8$gN5aNL`n zJvip9XL3hXBP|X#sX`n0AX35BQJZ=yDeFnTQcLdeX&q+BRRIkjX@{?U zhsUljEbkUij3!g-)INb&g-g-e%D4+s=CLc8olKiE3=I{SJVb1icq zv1pH`_b=&W^ejQ&yF!ED#wT$v_(NqE&%*5!{~gR&%tPs(JwU*NgI&u^sfP{|BI!(# z(VKE~p~fESFUaaVl#zlUtwA&apE|y)WHsOuAxSymH?8pT!6jEQi<8XI#^)d2C>?@e z?rt&9cXPT3rE}bW2KAZ&+CBkn$(v_gj(Mu_sIe~5exC94c40x*;a&)@D~Qch8?M+? zizUy_6&O#6{-vHQ>x;~xh?EI&BUxNBPR}5qe#hsc$VGYdtR|#?9du;VZ`zx-0A+Cb zqE}4B??bD^PA*&0Rz6|~fs!~5slTKcq-MZTNEIkQC7FJSar&(E?t+bu+6Wec*IHn$x6tB`-r982f5Sa`b#GIu4KyL633pT7v`Kn!x+JHJ znNW-7q0%!joB^D;H-&YN5wKNOTyc;#9*%iRXz`v4#gk`r=SU&d?Be(`kg3E@gaJU|susAn`;$qAo_}8Aiz!`I__s>5DfmpZU zS_7sP+W-6KIUF!bgoNHfP(f+-E>(Yf-L#=lrey{--Lkmql3B|Wxy(B&l`pRP2JXpf z9!2xambg-|vJEa$6hSdUWCIJ8`nxQjsmu9(TmW0fW_1{Kkf`3V{j^|$;35NG*xfLK zKB*VNG0Z=Z1m_0F3_`3D#Kk>>W7`u+K4)rhLApr45C`oDW1NyeLNj^>5GD%w3 zWM79|;oRg(qYBB&ft7FGpvKWWgyt2?-`1o2;HR?Yw!lE&Qu=mz9pz_oa4>E zo2zA0+MzvF8^_C-i;I1jKctUpu;aid@v`_hj$9nYkHTTzGO!oU@c#_En*U|kmHB7b z-K1WF>3a@3BH&tq^Rs3jLc9y)2)j-Mjw&`zE*>CjG}D(TS9_FYKG zRCmuh#FgpkYX3S3UgfE^mXG@g45bl3buOe6-#}e9;8&85i%7n*ev6CauEzZ5{nZhm z=yex(-5O8y@}jl}+cL@uMX@$$@Jx@y8jYzFcR5ot8z9~;%8 z>wic%b)h*-#Z+T=cL61kxg%Zm5$~!WYeVw#JP#k=6$1$Z!Rm8^)*JeM?PWn3kU+mQ{< zOP5X_$(q^pvxcM3XvT+p6^c)Ozk0;SaaWX(HVUjug>TZOv})Kn4@D)s$Ldcf%ZI9)uQI!WwO!kst&s| z%Q785C(R1BpJ|J_Lpf3Mm0QHKtgl-Ex=O`L@2x2L^FUv63HX6RPvOnKi8svRKWD}G zL$t1+fl3;Zg~gSBHvZuBnqkY4%) zalU5HDDY}a@Lef~XA|Nn*%S@A6BGCE<2wQB zdXc{GkGT-`I0oQSJ`#QTIOW2Geb08{&2P1l;K6?xiec@2u@Rqh@A@}0|7PpZNMJT7wmo>0BShbA6~#W%zZt8UE(e6 z5|l}n(sj|=Me|9NzRw4=;Z(r)t%N=w5W5L~$#oS3$dW4i%48mt0{c#&3VS2LHst)! zz=x%F2TM4d=D>7xqnLE`C2|IaQ8cCou|DQn#CvFd!dyV{^oV=>T`*sA3Iftx#N<6O z$@B=bH=BPpgz&IAh|9%(Nom+z70J8c5E4vUs&gN#_7?wDJlV8+G}_dAcvx;NWmOYr zH;7)33lr=-qJt+Oxb6Nq5Z(TQYNv;N=ny>jKtx2^yho)$2zo`qLD|~Ov1EH4iUc$> z0Px%5OQ(fkgxFUIu6GYnL4z#RP4a6cJs`x6k2K|y3bQ{}<9Gu{f%9s^BVw7&(;#WHOR)A3mZ z0#MCwa0RY?r=SucriKW?(t#H~&x7Vvu~d69*&&-L)+wWIh6Z3H1Ix&EAW^ISSaG%k zIi+)m20-<6GkvT5n3c8zM2SJc(K1&7(#O|&?`o^c7+-Bdy*4pH8ymQTebmt*`ZyDP zoP|Nv%8)p1ke@cBK@)N$;aVnOWVZ%MKIBK)LS6Y>F2%if&?!M3pX#Yh(ps~CPvvj` za!$lNRuq%f{4WJ2`+0AoO$znS+$r_z+rn4$|N(sR{gnEN@#$@4u}i zpHZi}YcB2fl79czl8Rb#Ye~#=)}F?6(PKF(B26Ojdpu-99x_W-kB!O47gjpRFS#m> z@$3PfViV6#;CD%K6Y4VNhb@+P12IJWoS&@l7%m>Km~%=TI#uWa#h|ba(x1;3ZLHD1 zDzpX7-1j2;0mVGCzzTx-5(j^bGA=rZkcxoYBo}(XiX7*7;sKCQJOIMafsk|8s2YKg zUe%+w>Z)WZL@#!%*iMM7g(eUcNELFId$Ke|s`>*Ke_QJPMGl$P~H!m}ziQFMadnKP- zQp`m-sIe<#+!BUGjfk1THoOX#fE>rHA?@<$Wm_PJ30KLhMo8dMZ_S3aCU#hn_&m^W ztsyZ?i;&n$6K0a-9O;Ya{^W^pJ=@IkU_RpaPen7i< zykzvz^39R=p=Q~w!=S&j9i(yv+|6cy}MEfC5Hei|kaiU+@{4%;cLj@v1$4%{iM zj@&7%4&5oNj@`K|eelj-`skg%^l3PM>GN>@N>9Y;D?Nf&ml7uGN@6UoAo#xXVs2a} zz`67*^$pLPBuP9~mlaO*B~M>LLWN|Lab>m&Zh5GD71W;Gy-cd7@ zvz2OA-5SO92W7XsL%qpRZIY|ogQQK>SdCM`Qd7Mq>%lOSYbMy=DUmQ1xj<7{`{ZB?xilfA`aba?$&5 z`0}5i^-Wgp6INzYV*J&!Bu4FPHU0!+cV;USRB|6YNWL`64<9~k-1vbvTKZOkFGG<) z#vLw~7RH(j^3P_OO#i7e;kro<C-zZ7fRKr(|EI5$pUyc1`}{fv#X_T)s7YN#0?b}(81 zKU^o_TXryOa>UES)8iMvogKbCeGTq-dU*OQhwIji?_M7tJ-s#iE8m~QGXD?qUHPTA zfs&6a`Kx>??qU%yK&8~f5N^Pq%)Lo?sdM4liVvk=20D$_ak4&tf-&GvbaspZ%<->z z^^+hkSe!E(#OdgW{pcw~t>NdJn=p9nLz5%X(~5(`pDEbD1c)TZjNC|)0?3oL3nyaW_TJ21ME%R7o7DM6d zj9DDo!hB0^8Sh}To6VZOp137%b_boqU=t#XMQ-?Sc+yaZ&Zc*W>7uxe*&fg~lcniG zKcFRWigESLh|NyQ;Lbh%Yc*rU!m9wizcuBlk@ELjQ(kgP?Leo1V9&zTlR=gd?Uu== zDxPM?2gsc<;PcB_uRXa|XR9-^EBXGe^rv?E-|tEPhZ*p}FH zMrQgf-(1qqX?PSCyj62wtQY1zdlP$InRR8YvQ1-!jrQ3y*cdnNln^0xc|sUDxV>J# zXYS9W)@<3DDVgetM+>NQVZVrv7PEQs2i?h*e&8j?kWctuePZqEp!y69S6zP)=ghj{Z9&}J) zxz~JDQhEd5JpNIlB_SK^g#5KL_JaRA*%|peEJ5#h@s78{GA6xwy+~qzIj!$HhA$`K zPhR07hhRdoW(R%DAhgmc!BrTZn}Tb7wT|b!^3Wywl?R>VvkS^~h%45sg-DmW6f#q+ z7DfsZiOYlgH#7(nQim+0BYbLJCUx4(8_}eD^qV*l%JrK*ACidDt_wcqytk)^Sei!s z`1tFo=@$;Wvzkl0{_T5$dc0b~LLcI~n$yn71Ne5vcG$$2Zz!WVzl=TGQCh;n22Q z2$Zt2Br*4hgdhGgE#0S>=YZj0><52BdUGy{R&SD)O9$-LK=&E zdl_>KxhD9=L`(LQe!VCw-axlD%I2QB{?&Wo+w~I-t1K;)PavYdl%%qL5nWXTdU%?t>(xhCzQ-ecC(0_qriYR=OAAxy4PLgYgpCzG! zAJW%(?lU=jg$m}sWzUFeWK250Y9ZMsJ>1{`;+K=xudJauREr-N7wTuo!~pF={S80B zyIAc$-yHZvli_FiEEROLgU`@z(!g8bfQ&xyC={j|5dj6 zj=lnDNhyF(9q7FYtLkWiAkA#M-gSfqUo4Hg&dd+Q(a=CE%Il(8yEp0Ti&{%nyH>h8 zQopV>?WqDD9Jael{+xt5Uc<{dHKpVbTXm`ZZ(F)coiwA;RH@CWn$v0RsN!c^>#5Ua zl%Z}prw#o<+;_G$q}fDT1OLh2NZwScQf1NmP+-v-R6CKQb-aeYmk*R2t-3a+adr4e z8F6GG$EE=;R%GjT=VElzGmo2bYH^lg!FQclJaHz+6a^jf!X?tYG^%XFB!lTQAQ{PT zx~9upCSsURtMQa|#UGQTo~yP2rAk8-6n*vF>UuGs6viP_97al>lrQq807OqB@A8<= zVw9Cu3UG)|(91Y0vr^bVM{?|93BN@$MG8Qy$L755(*KH~DP?UG2qCAV;*m0tbI0uudj@eD3PN1Ami!bru zKpH7MJL{5e%4KH#s~5W0HMgB*!6K!2Q7@Cu04jWwT%r`_#QMoVqd_udL5z{!#A(6Q z5XQQ7DkgVbvIVW{B}JMZjET`ztT{NWh+#qE6qUp^vYrewaoI7$&!Qs+*@#>RIifrB z38i<;Ou^#e!Ca~IV&G?R-@pQ8_z^vnjW?MRtYV(G!daQ#28AD%ykLDC8kQa@aB0#> z0B=(7^e1StFBDH?R56RF0!pSyA*6F9+CMUZ!)zioT@CWNWuFPU+=&6F0#r}!R6V#@ zL}5UiD=DKH5EFSpoH&L%g*weoQZAEAt&wz?%bTf-wxO4lqsi9LKnK455RZ<)5I_%` zA-zPE%0rG+eTc~P?HCJ8lAm~zkR8W{h8+(k6c&|oZ+*f|qKu*}%sQx#V4-DMzu!5A zFgOQeNMUgN0RK{T$Yi+uFosb&J=4Ir;9Xbvsxd%INQVX&eOd&8u_}$AjeH3~P4=(+ za%9k0H`DLzx~@b((|n1`SE8Yvj3!bQ9$GOLCn+g3rCg3qR=TnxN(eQM7N(b=-*{*x zRJ2?^7#}P_%TVZeBJswjkbLbbd|1-cG3oa(6ht;4x8xSSunLr0TqD?(G*T$;7h@n ze%f)KHTKB)m}kb0!;6N1H;%SOgmBbyu6@?!;~EzIUj~J(M+f^{?1%)=Rg^qHVOY?cw~TWy`>>0VtK^V>9OyQ^Mp6vFRSA@AiEy%;J$h!#*!o#}+eC$O z8|lRODB3+I_IJ^SII+L;HbIH`m9q~r2YEf_Q?qi$VuN(R7_bC(6W0m-c3cOK)ry>AeIMSiFDkRM?li;?eXQbic8>y@H)PdJX z-5`Q9v74Ai?sx~%;Vah5r;lx9Tx8Q-{vhXgPI_@GMM3&{Mr^*yq}+PpL4-JKwBqg= zZvSEKZ#aJ`8x?!(MH{|kX*%_`>q5T6(FM60A4b_4>+9Q*a9|y=b58kj#lAV^$6-WE z<5e0nS09J$nA2kiG3)|-VtTQ$9-1@UW>3jgDqUM8cLng#RIW@Nx~K|oO>l0AuLBE# zTU+6J=M0w}6e%(f)Tw^T94F?f^^zYLV7)9}#C;jiv)NeB5ZI`|RrMu5hwU0vS_`_j(trAZ-!x;4;YO>|UmT%b_G13@4UE2gxc8k`}U$ zTEIg)KS`aB@hE0f6cbVmJvUh{Y^pywOfYMW)`?%}-Qj6uSL!J9{WkNB^mKpW@p?M- zBMUX>EshHqPjMUsEYB{&%eC=oHyuQVi(gDY7hLoPGw$b8n0}JjZQO zeym;PXNO3-f~4WYBPWJ~gY?Fu%|xF4%+<(x-l{$ppFz3cdCbFL0_~3Sw3r_i3Nu*& zS;!MIF0t?@bidguLKFY)QnvQAEOTpb%NlI$@q1t2v>ekHUDH&gsCyYo)JGXY)aAu2 zIwC&A6|2&gz89G!vK$w1nL5(q2jksoc4@Sjta7hpf=i208Ba2n^UF$$PvzBumg1ug zhz6VZ9MuZWn0?n$+X6fZSBUZ=^{i?E3h{WiIT>b(H{%NH;4_LXvu_4jHdQe~nRWXM zrzE1=YfEv{GIN57AQQEPxc7N%G=0KDaPhV$+^lm@PuaSRlpocxc)9~`beu12Q2_&P zW`QCC9cM&^AbooS2x#&;W`SU)Kg2T|w1SQwq|3jrCaQxc8I0PdV6HGeVL@W1Kg6?N zgmLl!8(JHq&Q7kZCvaspJ`nGIA^DOs&5de!!{uHHF8RoUKvpO>=btaIvK_q1R8zl$ zwo=u6!){Av`h&`yafvH>bsw^ehta6*Oj z91aO*HTZKTr00wjq!4wfQJoaxIB>h|cDvQXi*`UU=yp0S5j^*>S@Q?`t^NH@x9xb>P`5CO zwu{6ge=(!HuG?>R8_sAE|4Aiud%Z@p-F8Mx=&%P3`VHtL&Rd>`!GzhSY&&op`^|Q<1yt*3xw#BO zaU;!(lE}xVk}KTmGyw|7EWr)jR&T%G?mMT-y$?Ipb(?9^*9KMZT8X0HTc-NK#F_=#!vstIr=C*Xs0|E&iN^OT0}IQT3aR zezPxA!EelF;NpM%hTD@6-w!~OF7V6mOo~r)@6!Tk+O1ZzBhZkl3lsIA?>73~wkR=N zV%smUbvpeXZdwa)M8}TY`X1;kVc12ZW{pO>(Qum#!=-0N*J-r*JLbMa&$k-;ZCB)r zeNPksX6S=z0!YMWQnY)mcB|b>q1;-cT)W>fp}q|T*Z;W=7wE)Jv)>jl#T?y!zeBY1 z{ncs_aOb$)J{1B;{AnW!?zv-Q zULug&?mFNMaElrv;DkPiMmL+{M0QoP+uCn8o#}c!j~5=-$nAqAX0&jQ!YCw$0k2_v z%;sU7C|oVKi=+;524%trFdKZ*ZZ-QZfv6EE!KJPcWwx5V?!E|b{3Uo7^=&s=7% zQKgp+it7f+3z&l44Q>Z#a0U`F2ZQTZAS$g zj%2@1Zy#00<_%V8q#XjpZ8eEA6ac>693Y zXp1?!Mm+38O*gg1F%Dz5r80DanFLU}y=rZYH|N-6!BV&0)>`1_vd-fR(5#mzc@}CP}A@iBL@&nq@KB zhiDSbo!!R1bME6f_uNbV|n5h5;|Wx%!wB`YkM^ini?* z1^~K#1+l@HDmvXx4^0(dCKIO9CWey$rE~)CH2dfa1{-8*xArmBv;bat8xJj8iGkbb z^_-QDy8|oiKe?^=56S#!P4h)}AJe|0#zxm|fQMFi<%ibjX1m)$=J0YNCs~w@H3B11 zvIKEi4Yl+cCge$;l>l=0pqMo%R~%$YUzt) z=v|D4o}TlAlVU2G{CMhGMHH}7BLd0Nip-<7J#yD4yKn~9lPPfGa105E2vZXYXy_*U!)j%f7SH_j1kA?FYYWBgkV z8aK|f*aoBrW-p==S-TsLjk6m}ze>-S_z%gP&98CzfxFjzw5XPn+M-y^J=5a}3;gQ~!mhSWFGZh%AK&rqpby@PsS9Mw+471h= z*r6WqE4|8?M5=Fi|1pr(q`8aRCPRvhe97dbi03pz+c`Y zsbAtG@O}n50yG8vNMgSWAJBni4>ytS@j0Wnw7tWjMeK-mSA}k&QR@IRtmQ`WPn$PO=BzQ2acOC_mk_*2> z1NcXTOL-r*%gstqiw-1)7o_6G8C{ihU8->ks5E;TP-BglB*{J7Ef`95w;rnW4B6+% zFiPR$zURx(qa&OL7^+1Mn7Ew5&f#)3$6ZOfo&fPAp$mn()ug(+bGcY9=|<&ZhRY%T zq`q5brz+yb=;7Xfmi~EJE&sDr`tYCsEPt$&|5@I{RaAdWCSCk8aHLOlV)3*Gd2>_l z+dS#MEt-vX2P)+44uCrX?tjLW(my9aA6J|$;nJgl{H*-5{zwALkA9T3z=PgOCtISI zYEnN*#HacNapG^L7L;}+dXC0%;X;Plep{O6J<_y{G~$Am)vEun+LHhJK5e5-azWb& zye&=h9%))e8sBn4HjkIGGZD&mrqPmY+x}w9z^Mg4C(Dw3Pt1FwKfN&tar`x80 zt&f?O-R8qg4xzWwHyK-k?y$=g8bi7qvGzQN_8p#5HxCyi158yV)XXok_D& z26b+`g(%7s@7%wVgkh3sgGExAX~V2cVT?lD%%oB>%cK>{GojWxk3Y~vdPM4^Cmubd zqy5;XHhb0zPKRXo?^(46A{pT_ zpeyWp+2PNbUUc|#R8ElzG^gPSui9B;FBTRu{!EeaXNrt3C0mutzN(k4yK#?N`jz{&$Nhz#)SnQOuZ?7zjQ5&WZ1>1~T zsFwfnaLy9d1RliUmV1ETW)1OWM+ycz!2nO&$M7z`H>sB52hpSMz;a=_6H|hy7Epqw z84*zgc_>FjTSVL}_l8|GF+Z0fQo7EP&pX?yueXWXi9&AL_Jnt7|ffoIFstg3f0Iy9>4 z-PwASpIY_cQajq3In!oiXEk%;&Bl&u={&scJ!HhcXzbpfZ9xVBif|bDRNq`0E6j<~q zz=CEH%tc5Bl?HhxU#gF1aXMq3Ma-j6oZt^XtRo;XL3lqLNyw5Q%Z&V@_*_n{rcI0X z6Ps`6Rob>q+8+6Os^PPvmAk-BvxF2t%(M97cip2QJ@i@et0V?jf-1e3Sy2~5h9pIE zTwBETblhl2!ZgQqMBKiLD>_iszGNek0cYxK#s{nFYm|S!AVU=x4r#KmvsXr1?SnSPZdj(oIhJDPGhRm*7JhmBmS;_Ti6mxdM= z?Ds<88*pD1DC;WwWxQO_G4qTqzhcu-6e3rTY<>3^k!R#l zLbyFUv%7C++o&=lGb8WFIL(m(*Js@X?ez&5C~-}%v-F4&GO9)+6?Cg$v&i8wvd+O; zHCOYM6kw!@tJzqHXW0&TR~myTP*<;fuqCmWbLB!5BvJ8cf{Ivd_++~6lN8KoV0K3% z;%Ah25LNq!^;Y_q=jh<_X|RYI>f4U0p)y!x4GpHEYpA4O8b3zGFVYvgXmEMiX|V7* zEafRXz?e)1_|%?t!B7IUOUD@RXSf4mvG^ac9euN*lCEYRiKdBk=d*N#%PKn zNhk4)y2%g?<_k9{nn`l*8?G`Er?GYo_tO`3$j*#*4Z#N&p`@Vk&r=0G0zwn?TB4mS z=2Ee0Q=kh53lDb6A^mZ9oo>uDx%EZbUu}BaY3TccIMk4d%Av-ro!VYB(tEvVq$OT7 zaHPa~X20d=u_9gVGJ$8x+gzDwO|JWJl;zZZG}XzG2_@~OU<3wkDU}?VQ1U(12g#pV zf+a;dmqPB4j_CxWcRD$;!K{9=oD+X%&AiA1FYT*A86XE?y)>W}p9V@YF)~3cbYwbS z8K6{FObJG%08OI-l@s|3$c{rexCuO=ce9jAj!Y=KRLSyk^P`e-c7mgkeF)I@f!Vc`Tae1uI=%?x3!|?bqh4f-o7L& za)G@qND@{zKvJywNlxT|dTW>TqOP5!ShbU!$N`;OyV_)KGc>EDJqi+)7oLj&qlewr zWpYW&GCT4Y^3PX#L#B#-*t5hEBMM;c2=Ou`K0kV0Gfpy+V$BfAi5yVx ztTP5S+idp8)11hG^%U0#TB#P2R&L}i;zw4}Z5F07IWnQ_QUt+r8nSQ*$Krl!v4EAs zx$e6OcV1|70Q?}$6+socxlvg$w@v9`laiTMZsaZFytBdYq4mUult|?THp5%{{Yxnu z+=3#tZ)*(PhDc`QD-oDd8>rwQ;dG6Z;~4pYmgxZKT`Jm9_-V`xNsn-oms;{4DJT&F zpe@e6k>Vhl6}X}yRi_~@GGs3x=0U}ZvF;EGjEwxil>PvC(b3>coJ8{jk5CB8{3F$6 zl*Gw}3_KzzI^Cvh%7qO)qAI7nl3}^9L77O)sl*g`m6Qr>A($kTRf55xBEm8o%-SOR0!K7w7U5|YOyEeZR3VaP!32JZ zA9M)kx6~m0ypht!z1hx!O%>WTAS|EW}%IKo3!Eo1zBR0 zM~S2j6}VDMr{J$n$zMH1Q8?!oWgCy7<~+>&%joOP?Zw> z2(wZxsWxG$2wN==SB9-ult;cT%h>{MRmhQi%MyPkj4mG%taOqKbs(qsm!=7OU@iqW z-B%MZ%1~g)6dxbE^(mg3o$9OWcW|OIuQJS!{Ke$pflVW7KNxF-CYHJFPhGeDM1w#9 zQLO^y-aot60QiA9i}~bF%Y5={8^jz9o1_(y;j}YDIsI6B^c+MVc){ZYI|Jb?R1Q;x_sVFJK6{7w>yUN`vcW9wE9VOq6+rMLoFA^ zr>P@V$X_l&T+lB|NvcpkZDlF-)2B35nBP7Ps>1yCDN_~Zcd1@g;YqYfOyy%srMSvg z1^KY`t_uCzrUDE7+adP~@=>CbRX9nmidI3t9Br+FeE1c&3OmJB<0|NvN29ASK0Vr9 zh4Ja3bIgwFP(7CFSDSkzWo{dB`-(S)HsRIrdzkVZXE?zQCV^(!NT1~G<>hgZLVTGh z#vn6dlgMXRYw1mg=z; zoE|f!cLj%^p{+H1^M_kSG!F67exyg z4@?~RX1v2MT)#=cKujQ}YL{vU#_XaHm%OQ5hl+C(aLQY?)W#lbg)s%eRMRd&_ol*w zJTeKfCne?2e)uL^_S{Sj%*ik0FV7k%j8Ff9DC`t_c@+A0={hMqi6u*? zaFWVaQQ@ZP6@>>XKlP>k!L@XGeVMZ#H-)e{=*6zz4}3U$apPVD;GO{-#xVLBh0S|3 zK(b|(v03S0p-SG*CSVMK!Jt{09w!LkaBIteRc1l88w{HSR+%(-f@^rl-tg+GW-*6| zQL!LFR^rVDmBh0sMyb3g@HTtV2}wvl5uECyv}GAhn3(-4wY0S1Tt6Ryje2jVGZ6jlDB`U299aj{v1Y#=t{S-@i=lk$1hSDKF! z^v7oh?L2$<9I(d||7{vr^R&R4qC)*N=1Rm$v*)HDA9R`u{@0wALjKa0)Fcx9Qe+?! zrb|GX$}dHXqDjEmglvO>Ydcp#(y>z?i{%`sRPm9*hZS!dS{7Tx^d-zjiFv>Y{Ptlg zLXI3S;I0NFfV;F9W5Wf}+*205{WAA^LKaS7Alqt3-7oLK1`6|U@t>(3vPdJbdOs4^ z@mwSzyBrBHyh4Cm{AY^)+?kFAjL_GG5z_uUAhY%j$Vk0P9%c0VVPw_&0JIoa0MHm3 zk%_+pUfzlyfSB<3WLpW6&7eFLU84gD;p~PVar|{jx89PmHkV^#?~(HYnLp74&Ej=w zAn;S}rGhkK8?RbbbYi=Tx!8#NWX22*3*LcvP6y_oA0zs)*>;TRzjtjMt%87byeQJ2 z#JxFVCXoxE4EC7cfb@s&iZt4UYP5e{2<_Ilp#AIjMY~1Oezy?XtKWk5yYGwkszRGz z8rHV4FV{ud3-8-n%MID6N@=R?B~BhEuE2M~1PrnvDgQR)R0>RXPSJhmb4&lP!x$(T zNE&~yPN)=E47^fB_u7PxO%F>Vc45yvtSOUpG#K*AK3ll)j=o5+O=~ofSwrp{(h?_S zS@I@-gy2P3HHKMD!=^PYv$jneOY5}4Z=J>nR)BfYVK9P@RXG49xjS)Jad&)=G0EY< z!8->xt<4QdYjOvRqL%bwwXC+hwH(I_*TS51Io06l_L*6Ov(*_YCUYbnjScZ= z1ogU^W1P&xZ1hlt$Mgh>X?Vu*Onn&G41?!%bmBj&KVh(u=V^B{?gq>qj> zf&741IQ4=<(~vGw*mCgm0YVusl1oz*3kpYISFR7ja8PTe&gz$37@f@D z^s)15Gn}93ZmD32ZA00@eWJy6!cRegdE1O=qHE;mG_wtNLf-Oo=QXSl9ot5|x4<0P zeTD%aHMN>Htiox_1&#nbuOyq6_9!oTO67LH%7a8pX66VQd!h5I^8;G@N^y`Xh3uhMritzN!F*#s{78 z5ay0&zx$RL1{}xdIxl^Z1h9y&ah#|QFB`av1b74R&lLZ;^MxaG4hQ3uek{+2$IJs} z?6`?Gf))!7o)kJu=AF`1!FXkD5wW-fh;;z3PW|rdSBRh}c^ba9Lq>)m(Y+dQPnoK9 z<$+JO8j3S8pjZJaDMe+>QHdoJCC3nS7;Fy1%5ik0B8#Zb?<&|NKsGDW z^Vp?Q7@;T6@}l&12*uj4s3d)RNXMl~{_4PDXK8tB?8+$Q(0LdAX2q!t1hRij;QY>E zq=p?(um?}fq6qxBt#caCvt5`A4;EP!{7W}N^-sXpRu#X+e}QD7%}i$~ia~7E`_jk4 zLtlp^W^71xF}89VE_Mtm7Z4@(eOy+T5+!;_(dX66*oiww@q?`av_1au3`%@Eg0=Tz z%Hxz>BD?yY+B&zaw$AM$wLw(Odw>?iOf)I|27A!@9PbTB@Sq6V)g(Xc9C`-=qD+4M zIwyNNKl?5S^eMpC@_#*GE${HuUIpq}f$o5k!A)F&*0>X#yk0r$#}$3(Rn$I27dC?g z!hlcVP;rX=S19%5yfnra-y_6-BFGmCY>4rH;-MhB^uTi=XT|(S1Fuq_4s8F^?Qccy zv&!-N8#`LQeT}049b$F#Q83=>w8#1=$e8w3`yWYJUD*SU0=~E4InTEkeBQU+`8H!E zaD)3wz?OEBOIr{X1+(`tAy-oFCKqpIb5w*NQVq&wiF5@0L+0A&XU?sZnUNW|LI%x7 zaLUhcWfaSUhCUobrQ@rx1^>MeT{#ojcDMTNZaKDD2=*Sh(}4c+_ogeS0SUPUdp7ee zMzoonh~g|tH7s_|ab`e&+li((qB_)gb$C)igMalXlV{l(f6(QG*Qj|Eq4St!2aY(~ zzJ86>K|~yG#o~EtBu#ESKE>voOPiItgJ9(fR6RjatnvnpLE+R92U1V>J+D+b;uUp* zRyZ~lAP^@v!DDsu$TLUxfe{cK8c1x!nd@vA+>6KJ1^hS=y5}CET7odTrx&~I!?mSU zP|)F8pd*lb-Ug~Q@Pz#l_YQdqoWu4$-x4*o&tZdPAJ0DtX5&Ep6xDY{Mqm8xiN9Au zKL!GkiyznW$Bm3vFDg>H@ssL#cpAQene=YBG(3mk=p|XF5aF~W>rD_|d9%h?;ix1F zD!eYqdV^@7E95RVDt?UEk1H(2e~1Cv#h9L>`t8zneOkMQza!KbfH1b;I|^#sg?(JT z;Y|9z6Ji+3xM4keVGZlBVRwUY$m{7jdC8JC(E1Y3{VMo zqc@zh7QTaDeDTT(?xNlBZM3`mu6?)lwtcq@iW!rt@NRpz+z@_|@pqH_ZUuqZ&X;1v zPQ~8?@%O}D!P`|p>%hBga$IaDe1Z<-;y8_PsM{hqHY~YIws;QgIXPe=+A4-&1Sn(mjbnOXb6;7;MIHyK9_fc*}rnAx9Ly^ zA^B{YpE%(10(r}fJUByf{w*?>>p|XtL?^;5!bg-BAWkv49<1-26^w-?2#K_+RXW@n zF&-9s_Q=6OpR;ft$|2htwXfiKO(iemD&!7w+mcPnSJ_zn?TEjbJd4HOk|UVise##a zVKfbMBgXYw`g*>?-EgD7U_T7?S1V}yb*4a-1>~kBSvP20+OmlHih3$2cIiRxIFsE&1s>R2EyKg?1l z^@-8=K%MdhybYA8P8Z%2T<(r93nfAC!3WX8>V6!-pBYg%fK%`)?1#NzrnDTHuu)ho3CR2TtaWopCEHbI;~S$h z0Dfw33iNeaOE@4hQ?XHHO~nipVyT(Opu`+Fq9xnFGS>!{IT%>N;R%-{JE+Yw9AAGk z#d7vAOXgT^e#B~-`KBCX5aq*)=*p?=Z}r-J{er!M5$}J(;~7R7AK9GGK7y0OZWStx z1~SJ*HBimp8hWZW}@%wj0{SQ4TL8HY_*8iWgDq0jJwV zhTuG2QynPLK~rXx21-!;W!B~#pdXud z#lB6c+w$c?OK?b&r*03H{*~UAy{)TuPcQuuY|GxKc3SXl_MTBz0JwRR7mibtta=B&B60*3>UpNnSGZV~I?H4WN zJSE8CKTt2|FPe|rx-UAo5o z)Q9`2`>E}|F1kpt$vX8FHRpcn8ut_K0Jx0CSi4D-_T)y8FB7r!dmpbpk#2am793Xn zS-IX-anHSEUrL-)t1czUs?~wl)YzzdsVDBGp17BK_PwOmJY529y3Fn6kx6rEId=n6 z*xW6HALmMD2CAmeuMK3U__c!yJH=8q(>K&NndFKg+R3E4;d}lF?&jfHE~HE0v3!62 zDIciY^2dq%@lw87cVx=0EOne4s)?ssHSteNRZ^09oZcJcUL#$PU9Qk3l%ja4X(d;K z)ZG;-A7oip<(Wg&)~LlO4}wP)@_u>++;8CV8wyMIF3?a>Nof%gF|exNP1t**GoH?? zUPDEKjDc~52**`C|NMYKU=4|-ai}st^-%qmNN(yRd!W@%zWRJ4Y-_9tlFm9#fV8J1 z84u!`>fox{O~S_%;(PJ%B82LiGX?S*@Q)xI^`_J*FO@pw=xzb;g0EjiK$bB*8=X03 zM`fCO8{$Z-ktvao0dZy#Ay z=%0Vif-gHf^ornT$sy%2G*v9%!4|~s(nAXGXQa^ZY63d3FWhCl^fNzt81J<6d?$C< z+AqgpKiKqUFy<<3;y&skF)q(ePTni9_95J6F@La)jU%ldxoQ|hyBze|maotf`F&cd zS$HO+(O5-Uj-itVyqovRfE%fDFtg?zsAF{5ApEh)Docw_lIB7o16)XslWUOrN+(B< zl1QH)0*SL6PWeE|<5U@sOcUUKf%dLC7_*SIy0p|nb&Kjw#!(vwP(S+YsXFKyz1hhS z;nb_ZNpZ|kE5iWeT?qu~bs+|pIx^wm7T>2p`p(MpQ_duoe1@?#_Z@5QGg!%-6AjLq zyj!qqrcZ8wrm<3*xZYj<7CcMFf+hmOY^<++7LZnYi*bz0fwq@>4LC`_$i0$#?Rx8` zeXaM}FaloBr*Hy<)X=1pK80smjy)8_$cX<1=9yO86Jm57R9yfs4@HJ3v^)|*Nqr7X zqcf19T(+lM2kj|gL!SV}#aPW?M6#`ZBa`!7e<2e(+U4)`a1s_^8PrAIRCp3@ql_hI zI>T4s?G0*IDWDNr7?y=)Kmzqn8Pfh}sszJGN2gUBY>iRIc zhEcz154R@mA?f;=?BEawS^mbZPxY74^$zL!S$G*v=XQOFUAKFMHp>HjZT?%A)8JpR zoTjjhVEw@IfpzmAyle*FzHEjth_FsznGB6C{>9}nn<;kp+kO>d8cGv9s5s;2T$04YTd1v-CSS4c0p$tZnEdt*5(%pz1alu-;L zpTv&_S}wb_Oyx8uIr_pp;efqTKSr-ZV6eoz@omDwz>L%QnuSH)%msi-7;`}N z-I*CAemkcJM2>c`IV3&n#I&;UsoUBJq{m3M;_lk21RcC ze^5w;wTuS^ypK!(m0#lkO$GoN5~vCPD;NZxc`Y})#`9|&U{wK3IgkL5+jh;)uPJ~U zhgjDlf6n3?cy$0A6NoOFK+M$^;BfsixXF!z=|M+{Q_*XXL=WLoW9NK$z^^n=22pAo z)0J(|+BjG_2aS#CN-MmB-!0J7IDvnEinihUcom&5H`zq}9VY6tGCfTSspBH$g#`)> zi>+7ik0t=7MKmdvc58PE?f~HqimjjE9}V|M5gimuZ))$_Nda=m=#OIQEQFuKPtmkk zy2PK8PtjWtDzU35!9d{&h6sm$K-SC)HAIPq06+Pq@w~ZNL%FoKRF5Yg6f4{6qgk62 zD{$@qeK~5*W_IV!dFK>?fyvWiYa9O2eSsccEknXjOOqn}Lw!`CD6G;C@LiqaPo0() zG;vZ$N#6mM4^eMVB*51P_WgM|+L&dU$vFx?qh{J@Ir9g%Or_gNG4d_=`(gw~uX2-g_)l2} z=&ge4=`aR(ox}v?d;mD@v?;$7<+5o~_&IR+6o_K*$&{HgS<(}A9(yKAXkvi=MIv7a zvEC?YgtLp&MCLB%!a=m=0>NPZ$1#BUmf_q_bi~z&;{)Coe9?G68zsuZ@0D(Y$zaR(x33f#`{tTQ7U4!7W zCu5MIA+DQmlaNj2=6O78-*m>6cm3!$_9`0!>jvif%cCEz2N#kStV9?R`FBqH@ReLy zsthx*mwubXf2x$5xVu&*I?K&^qY|_q&3+5td+UD*o=6#%&;TzBCBjNW{i7-n-220L zahICtG&UZW_|r5qA4?a*=yE^{@+M-TI|;8$2_JV5&8v*w2`7QzBKdvaa;@+9 zpNYVjs}(7GE_w+R(s3?+LWsuME8?Y;3!$GWCK~>*l!t&0)PLg%nmDb5K^n>WWT29ZA>r- z@@|>@+qpn@-~<_Wtc#N;J`Qa$)IN$_a^*Kjco#QmhPj!(3K)|kN#RB~or0VDVYHVn zATjr2CIvxmPT)sK7O>NUx%iirGTU-GRyax8{T!ldc#AYT?t@TH9%j_f1OroqQr(wz z&)`{^TF@riVX4wf3r-Pj$PC&oA`}X8oA4|p``YZM=agE0hd_%ce~2EV7u8AHFsEz zQpe;5sBxlXc9jf1}jBd4aZ$)skOvdm7o`uR+VeHvVp!f8`IB4RtHw`k9c3%9ZsR@7v2^q}^4NJm=!XVj1`Y3C|>27z}vvrzMwUQyC2w=}*lnaY9^ znV&NQkSgbs*4Hhm{=BmpFMccvHQa{hsmG?V20S`+-w=vM@M-hFCej6)kex&84cBp* z-SdMC&MJn#Hl{hxAeqIrKv2GXt3)6q)RN?OTA^ozsXWM%zQkz3C_o!qT{(m$J+G5E!vq|w4-$<-J;ptqL~(_xA&wAg2)^Ei^BdixNC3FaAT|8560{yq|I2=Mr6SS5hmBM!vUz+g?#zH|h# zmx5XJWF(YGn&iefg(ZbNYH>S&74|sr zf;BC$jvuULfn|QMRSRt32V1kiy0~S_`gh~4V%@5u?`sJR#6t|BOGo>fG{x-YkKdf^ zy&*>P{AwO+2I7wAYNonq(DoNI!qX;*%pd@iPKh^o^O5B5;>%YDh?*gq z{js5Wy_Tv}AylP6um;k@G*tf+wq;`Yx#d&0iXa={qU z@bXr_ky+jWG`TS{m>r}^o)zFneHv0hv80{EjC&OdH2v^Db$mdDWoIv zn^vF_H+$&}^+WcUqpU7^lfr;>0!wlR%c>bg7!z}BS5O|&j|cX0fqqyZa;_rsTQ3tS z;@JFB$S!UQQ3qZovsp-`6Pv$1dh`SQAIR;e=syf3=c|<)lL_1wAeiNGXN_V9mIoS* zA%4J$S*vh%YXznAtn?3(!>Zg@RH_n43j0|F4HVN?g8J?B4#oAX@JwJ}2>p4r7Oo)t z_o1lO2$-UQP%@C!|M0gY?G7frxUzK_gRbobAE96DO!0hE*#bBC=eN+5=g46dlTpb# z!_gofw{|OPQrZg-yhZ@5KZaTQ%bd{=^PmQU47WW}s`pT+B``dH3uR(~;rUIK)TO{J zT??@+Tf0@=w@_E7rx1q;&nlsbwGOw-dLSGG9mdr!XpXkYUS6;*UXmU9I8bB)KYQXDI7wsh(f}vN-=vVD%_;C z&t!*x?=LJ1Jq4Eov8_XdX`=TSKIfW6h&999CgUu{1x$r9poKyF0H}g529xm^<OSf`v??b?1W`7F8)SgimxH2@myJa!{{j!Fls3bS*?_|BRQF4N7Mn5NrDD zC9_simM~{MXGGb;(VkRF*NKgke=U`jCTRK2pVGyq5mOp0zxM5GN?lNnmojx?8|;2IU40fXjhr8 zej^YNf#Dm^AGvSQW-v~oSBWR4%R?RCOu#NS1qsZTJ~+&wzAz;8|CV_paT1-#fp!^i zQ4oH?Vw>8f9naY;ssH|HjeN#7$?VOftna{#6qt{FEJPN`zU)lDC+0l!SXUBqo=d8w zERaMnXNqfBYV^Ckl@os^8GQs|3x^K$NYW}+Gg@XA;ACpI#eDK z{Co7#Ox9t-)%!&#kl1l<2HCY#x+o{gl-+M-2Y#TGq=Qz|3cSK8NfPJh&jbP=_Trib zk}wR<$NH&3EOOzY4bkz)wNJw2fw*GsL{X1>;AYRD6q(CC;g`l9t9*IYg{m0`P?V6pMmOKl1TH<$WFZZxX6R`InZR zWY%qhln1$p$=(0jwf999*tCZEzGoTtwjGCh_&2TTnEj7flWNJp%XQuZ5jELM#)>(G zH(L-I?VEJ9&KoJgj(pvDfJypjoD^}HNxG5gld3g0o;-QdYOX8J_=u{n4o3aX8zX5f z*{h-*3^ogc6GPBLmaN*xhmcTTQ`$9XYTgLH#m1V8;DnffeGr6^dq1);F4Rv8??V0b zcc8FSe0I(=78UAEBDV5RiLe4Yl|QEP$6g}s!v3y)b-L0b@j$v3{-=aLmnr+opzLTY ze;rz;WiQ6_9S^_muoKX`V!SKmarh=7$K{(u_%Aj%b4DDYk6CILmhOfa7*xo> zW~RsAH;Ls)SX?OFA-ovyDnmao-K)Y%6d^cC zVJcA0mRdZQTg#Ozjx1%xdHc7r2JM z4P{uwKD)R(J!OSKL+G|RwJ_7Ze?5&cMFL*A$IelREwtxmYoBt@uP_w0Ez}f4jhm4j zR3&oj^BADvn7O=Xh9cZBuA8CJvy6fXkrd&}3R@t8uI}g61MVMKZ2;^(=oy|SjKmKC z;-73ds^tLZxdia#XHp3of_sdG?HK$%%%mL|kGX^1;F&)h$0^}K4hIVyDX{FrpAx2+ zo@p~JjbP1>fM}E{RL^bXoVCLn31tg`@Ontx&imaMB4&fFLijHn{KAY;SOiTbT~aO# z2f~HnPlwBA-+Q>)eo8{s_5BR`0b?dz_l4;4j;X*&2Z&rrU=bYwKKHh}5D_^- zZZ-C0J14jNjT5I)`-aQK;LBb@?eP+5SUQ1*#f^4@a=o*KswIrozbEzEXuJgFZ)-XJ znZlJ*pGNHW?J~=m2Ahz^Fx^YgMWeiA5hB7G;MbJ>0>@(}-?xLogxIz7kAA7TE~gZf zPe84B8~p)l!}t%V2}>G=!79aE293G$p283Sw$doqvi-tIEny`XOI6rZ2Fvg$ZBy-D z=~D%?G(T^Hj|Hxt(UjEJ%S?5z=ha5m9u7GRB~)SszEVqt3PbShe@rv-1xO#KP~jvQ zvL|ikV(2PpKC`DrUpq)~&+n3yzg#Ago;gxc7Y>;i`vw2blklg$^1_e{#knw+@fZX- z^LM?jPUl!?QFUpBpAknP5vjyQ#LLW$ftW5eH-ZrVGfM4n`dE>?+)cbxqgKgW=$t+@ zAPbQrgXB2Xl4Ce(Ildr{&SAWqnCdK&yJ^Fu{CdY!T;X6;9vy_w4%2_~z!% zEjVNQSyh-@(}J~>yDVi8uP=UgBN%WLEpz}m?v2l4mVbq$IvjNLd5<67%Dylou@pTfa^ET*uZ~SWDc&svy47}i>2{$ zlZNAi7<{P;$Ae6u1Sk49-Rwsk=XEhD@E$#KHZlxP#7Z@9c7rJ zNBJ-}G`xXAKU5)MI$Igj_Ex6)hcHRt?N}|SeTeM<){~r8j<~3sQ|5zUc1V=CxEz@* zZ_m!1x2wx;Y5y_AV;7_8_n_Jgn7iRvY4*+EOu4(6yahd5DSz-*(z~SX9)@$yNgRfM z^xe_Om-Max`kx$m;jf+WNy)cGeN%OFmf+PE05tg{TRO(9U3;cCH*d1S@k z0YApgS_hop1Fmh1g9D}u{3V%&18^JckEulBd>M)`^TU0)6xy82$1;#`2|IC43$pf3 z1_1k~j7nWhI9pBf-wsm`)9qNAIWq-6>Bec$A-ew3ZG5QJ(>icx#ZoiSC&9P*p|Xq; zF)AI7+?AV>YLr74yCyBHME(uet=Ud{JJ|?u?~HlqorfV;iNM)6kozT$n!sqh|q|V5mMfehR^Q~#)Q&(pth2q(Kn+5x{HPS$?G9_C?d4ELaQ4H zmrNd^z0J$A2XslQ8A@Ml2D%!m)}-r9d2Unj^aSTcOsTiiY~F%pqheB2Tx5l_S6g`D4N1{&RtE?KT6=lydr3U2Yqilz|>WjEIKH)NDHvi85EuB-8hg`1r5Q#_+lu8 zY6SB;!(*Nx;B)1ZkEd;tSexKAN2WWg-yF|iC6|j}yw&*nb^J?{J0P=acSZzU^NBWtNb8h7>Auf;^i#n9@5ir}P3z?yN?AIHWTBDt&RF|+I>(x+n1)`j2^ za$UrM(CqXTs6|D|F$xx%7-*gjlt4=6kRtqjDsYG*b7z06|HBWd45|6jjEPxfo~!XN z6@f6}M=F2h^2b>I=!hTE2?nkZU?&k{{!cT$)(uoM_d2%x|#AJj8hXq}+HiFh~e&s{p*I9M@iGDX^DX z4<%j)F4=lKhF(B_c1~kb(ZhQjQ8u`a3 z7_&Y9`1BKa&B#AK`vei4pg2@B#J}i*8~?U21Qz^-nlAA#R5iuF>nv&|hOexf6v&_k zmbbNTIINArX>DTciZI0~u;7;gei`7G0e;zmZ@KV5>@N2K{u=lt4EWzSp|4npqnejv zFn^p3>t$=_J~uV7xdip8%w2U!4H}mTA|%A$zzX}2F2uho%urY)5LrxOw1P+P5(MIV z5r`jxz|8OgV&7~ZQuDe)Ni8{*u|+N;((yzQ4Nek8^(T!d&Bn%)r_JWmjrFxB8<;l- zmvAv8e=xJbOtLmbXS*^<|3`ZV+GZKw8G!u{d7!~A+oV>s6n)t2Bf1Z zd>VKY3xv9_8KH?&1~@o%|3HBnHA`o@65yR`Fh##Oc>*3#KzX(3gR_{l#zqX(TX`pB z)F{oX*RZ}l7F#$84)L{wK$fz3hX148`;?MtN8m^9%Ms2AZ? zn0NFb%SN)=8(Gyg?ysTz0(Wy0yIP1M7_=v<+KCy(_TIi<{gu8us9?`cWajnJDh_Rc zL%sHmDt?18ZN1EMgA_5D^XeQys*eWuhy%XCWP}fc0)r!v5n)=vNIb^9at`IOfaLBb z>>&bft!RKXpe*r$Dg_MVtqvD?$^DTdsfmi^U%#FL-sv^^t}Snvk4qz%(>lr>$1@`s z@C!@jO6vC|dgw~FQpvgB!IM2J%NwI;N*?j2e*p88Z(*nn3c<|}cYg3oDvy`f;{}2O zmuu6#9wNWmR;1|LjwD6zG%0Fw^2Ygs6zE}6 zGK=2X`yWq*{$<*SkHdGSe(p-CpF5ZOxm$qxxwELB&mQXMZKs_2`TW}#c80ERGZ%+NI zXn)n&L;O`o=LzGY<1_3$`T1x3`#K36j{YvXaTe`YxWnbjaFVkK$}v34!7PYB?HS-p z4v-m%r+`y88Sp%Ks;9&tvLEs0!GlMfpcL55dd;)$Ad4vH>yGrHTY9i4uC{Kz<)1p9 z$=g`EE6%jhLbmybG$T@ePPL}q^MT4XRrkvj{P9u*lf#!{YqA?*A?nO5R@f=u;tbHL zf;t9t+Vj8@=X4WIfQ@30D{*0Kp{){(5GG8%F8Mc)ooMRLbcIIza|k0~#y^J`0$Rar zr3J@t4F6{Q*1Cci3u6?e4(K-!8r>*cMs5YDf1#WI6_AoaIe32HS$~cH+~7Y$Y7#xc zF!o#h_C%lPXVGNos@72;mjH6P)oovDkZE+e)T@o#*ZhE+hP5-4w%mxbokxcl3YNo4 zrhYeTla&Dmb2nNau-0YT8Kj+ozT}y1?lL-C?k-J08j63b6XbLp!0)E|IuT!!_DHlE zPQw#8Qze22@HLZ<3T^{A(k_EaEgyjec+J!vJ&;`9q2O-H;G}sZzzoAyu*ge>EFDjn zJe?~Qy^zb;tsq%qIYwjNdeOd6u--*br%)uw^`kp8!1q*s_c=6xVOB8fEk{=~6K#RDq`_~NswuM8%-xz= zXT|amxQ=IRZvr&im+5kg??{MUM0aCm>_%%lW{Yjd!GhbdyTEqr|2wv0oH0>}TIc9` zSFdyUGS)fPuh+TC#dR(}_&QfRwl|)Ck-=t#n`|TGE;iL}4Y|&``1bBy{#Ko{d&hF) znzvhQ-)?;Gvb~z)Pq96V zW>C22@d3>C_Lca1|MeMJd*UN1@Jv>?0rV6>B4z;HVOot-I5@#WEvA95`T_hA*Z|ow z#bAIdvEFkBQ2JmC+~FVS22P@bmAKu5{a!2dv5_yIER6$wXmpk@mtarz;20oKD)mmL zB5X-nalJ!JSPd2e!(P5MdZx0DxcRRD@(LiY5K`RvC(F~Y3Cca;8UIFg_nA11&Vrfm za4|`N*dzt|A19wa!r6k#QT+EOICS6_B;oH9^&35sRVQeB{`G4I9?L)fY!U}7FRe9! zce^DQgo61$O)~VxRjICWFR36-C~+dG-Mq+Al};9CRio)C)Rp!+<6a5F+6N+ii;8IS zUrx`q4|lgub~hhCp54#UhKKNVpE(0>N;Bc2GoYUSZG8+Fm^a=e$D4mAGXdGR>+^q@ zz%<^(5<$r~k?Exc%*rn(!;zc9)SV+kjok!NX=gaVzZ$8$uyEXgZW2OeN-_X`1+ERV zGMZzwOfz029W}OU^v!zI9K5+t-T;2deF%P#xOLTt37AVxuvW-x@B8{I7R+ z6jp+{_En?<@g2BZqo7}9TdHu=%O;~Y3|Wb(618dBfDFZ2i~oW**NE7HS*Q13TemS-vcq5^cR!@f5#i*A*b_$ z4^Yy#!uWicQ2F1uEx*&EmP;ys=#om5iErtuvOpgH_phM`u8aTtX_wPA=*|hn?eMWt zRSGU+N0SxO=EVt1)WI4P+u{Xv2TCcCgdEq2aZrCl=yr~`FUFVxNz6DnW|MUuaz}d1 zQ2q^6X_6n=1yp1Dl4c9uTanB(Z3kt<3iJc!Eyi*p4Wv%6ZfELm2Xi6~B%hF=)iS&s zcf4g}W@LcM*DKsd*`MBWJS!q#c6g?ONq@bCc~(Tgn8VLNN1*>amP$6Sgi3e#&eZK5 zPwb5i09FIvlYUBUOg%J zItDzA6y;DUmOiL;6fLjNRA6#(#Z8rXRF+I7LSOgrC=gzuj0fAr4fqNiWn(arLYFR0 zD;2}tLJ@F5*WgYjgHPz|UuaSt&+f$JMrEN`gV1>Sq5QJF{wzHi6IVc*dts&(!wcZe7Y zHm*LyvkZ32dZQ7Tij<7xIpw#OJZrs2=vvtFAE6tiM`(+A>1}eC?CeN2zgMmArjy^W z^2L!XTI@nRUlkKaG^;$N@Q<4DC65aAQ6pbX3Ww#4cFsqt0Sk1&54Yt{&P~AGyBK<( z;x;g}KAFO&q?f>(0xDs(nR_$*g*rF*7t}9PaeBKpyr6iUFLtA(){O#tAC{q12$gv( z4O~i8eKYehM(@mk3vsz12UX;WE9dPvP)M6sPR@MWoe94Nh-VFIxef8(Df<^>FzP%SF zuTl0VK5@Qy&*7!DB_Z}<;lDU+p8jxfmR`Y5bU_shenavevqLk*dH<;1^>ep)VKp0kDLx+wD%^Y*N#{`1JetKuGMtI z#ge|nX$Oo9dl*CE3Nqg@)w3r1{hF(vHATdP_YfwP|M~#G{uF>hN3ALSeqpV3QK?!E zEKyZ2r&p!&hU7%EWYMIYagz2y&O1xv%&0L*;RxNo3NRch88R|XKf2?jdn6x1r4^TD zC_=BQms3qGwP2;%T2c!F{aIAy604ELWrL-(wq;Tq>R727mW>)(ZLX)C)(SLlST4{n z$#RTtNovf*!5s)^9At00WxerC`-;LFw53XV=UW%L9B7h9-6dy{KrhD2G@Uaevs%=5 zfIpxGLye~M^}_EpC&O?rw|rS7fT+iFuwCY5yQamqY;NM?yuvA8wKg>FM=Q;u(7 zV(~*o4Yx|?hnk!voi5HcHIq7r9dTl+NXTh%(&?$wdHldr!=qzv%VafH=3Y~P>|AnB zJ6R$iYPi{C4hi8S9kz#;N$e*cXqHlEALs@?*y>RqKRGudd%{>(A*Vor09CiI#bN?T zarhwLhG{_P2-fg%mJDObN&=H4`U&10M|o@{jVEc!rNT2-T9F>Asy{M`u&m7lxWDQK zRGp2g+AHdw29|YeJVL8)fSFyypt#VugZYLF986|9kHzIHK;=gsSgL`afBunTU^tKy zLlWv@5=!kY9G-T;bT`Qu1uM;X)f_c$!03|J(u;Wmy zv-w4t!od|E9vtmr4!4rC@^jT>)WU8vs(Tju4*h}_$kyVWXjyNmJF*EjA z5uY{wY2s6czj*QbLfQHTK;vshzY%^YRM4Bv%6SSW7;+uJtpqPsVeVYf4;4EX)r`GA z*#T!e<7_bC&mOU!f6wX=`YbIH^qF3VvvS<&7E-A0b&_=Nlokt3sT>l+2UwH_Q!R)@sOKJP0Fv0Fz9`6x74~t8y$oKgfaxUCN`x*VuL{Y*)6SKBV`0G$!WkqMZ^pF^ zsWe=}57Wgi_ZYfr^^4URBGFQh4P<7<^v|vidM%xTRRMX{nDPB&OQiHe4 zw2Z5y#|=FijbM}Ju*$$kb=ra!Wi1HDGf-m~h9O=dwIe6683fx%m zj15vux<(gll5DugJu<3G+j^j)f@`dN^rH1_Bx%lJHp$}`6CiSdNBZSp@8uacqQX_ z76~up2>g$S0RLe&cOUpqodNSBfZkU~DCVRfFs^5#TNrvFapjUS-mqnEioVc;G z6x4@blN?-OfVpOu&}(3|3CNFQptZS&9$@_?pfZz+*ot63e1(BHd9Zj4epzMyL(n)m zOV39T1*o^v84NB#)w{~gLr2WVi&|>1&}ginU<3`mJUH4uQ?ADi*mGb!G&eXXa8`0w zwz*-s4|ua8bjYTwtDW05(KhzCVk)xLjNUNYG%D6YTV2R`Qck$(`1MN)7WRCF_P{9aI;z~gtSy!@l zzVQ6btB|qJMj@^-`t5}9YRoO6K4%I${Ca94x^!$2x>8J|ur*-GvL2dyvMxc4|`syYI{ zRM9UZ&L^*33lCUqVPBD$RHLZb9&O3m+aqmpdmZ&YUZL%C@8jrG`-WGr6^WXbuerah z<>qtoOPgYggiw@OzTw{riOuTr@>PhnN8of*_3VnoxElfQ0uWGWZCz8;1WxWSh!&Un zo;m8v+)&^X%pm#@%8t*;=vOh-JrHK(u+9|MBV#dA;ktubZk#Bta0X{^TH!)NO*jyE zKv7-M7%N)52I88M*VM*CKB;rvIeEy55yAF&1^|*aJN!^Z7g>v=j-am&EC{`h6+YD; z`(MBIW!UWHgh=ft# zjq@8tM~dirQ2oNvar44OD()O|%LI!aIA?tb1Oc@mc>)|adFUwrdjAC~i&(chjWQr* z(hR(BAaTWtaL#&X!0M@2PJl~zhvbc26)@6xQFX+jA8GW#C&n0i9jeYodH^Lg0iy=~ z7{>81yNSUW13!$wf6DBpGp>v#(QkiCuE4Iea(=pZv3+p-di(YE>FY;7Bv+McrI%b? z0as0g0jz9Qpt5Z=htu*V6 zcnyd-^mtHdKB+h0H-oOj`6cKjrY%=Gmw8nbS|x?1kR^);{C|Maj3Twl zky`a3MUk%RFJ2)a5Q^V-cEx2QjqQx|Xk$~n0G!RcU~P2+!-mH+r2inorB!+_d$(0p z3fg6@g%-%v1px>|O0+OaZkgc{v;c!#S%IN*=4?sh!Ai2pk_B@p$p!*jj&DaWBK+-J z8D!V+p&AGjejJLuHN8L*L)H$n)uL_4*%7TMJYX)D{NqttV(KYj4i5<2MlUO)8bp{bIcm=~C_*Ye>--@lJzvi@I52O-TvjMt=W5)o;_MWr0 zFbk8O^NzuQZHix04kkbE+ImNJk@BpPM%aj_w)b3FyPUip7mjWTV@(pFR&T!L$rntAxyzB=HfSs<*?Wc6Y|=W8+?bdSw!OQE^l`-wcG=V=G{weN zDbd9}NwSicPy3PoMX8^n-ZG+*Gua4NK;buzD!~;Ctv28qdj*^(G4Z_I8FH0i=w-oz zfAjZ&ZtYKKjW35+7cU?pReIdd((8+TSYb&wfth7%M9f#C-hwyp>=7@pOA0uPD~AD2 zn9n9V2d}x;MztqxKf#3^TIo0Z9=DT4cxo#(7k4*Xs$pr*c^_GcerIrnWI|NYilGV@e8o#LLU9!M zC^>Y9L`YT`m_^=tim0xcWf)#B0sQ5~X}1rP{kdv)48}YZwdz)0L6NehqJVY*$Xp&| zJ%|O+R`dUo&G{?%cbCm%Wo4zpqMJe|dcTF+<_6zC+27qe-Pt?b*^^8f*y*d4_aA=6 zX9X;#Cyi%}(@?O7WM#G9T5GJWufY{kYt)}@JZo)iK*tydXMJOBbq$}1wPt;N^+|K} z={n>z>rbC-fH>|cE75AKHCpS>7*wOa_U!5UYIBX3Uu!}Q4OXJD{-o7fZ$0`!4=%jo z(sevwwa#B{sF6P@{S(f2%SDIB*S^S!0EkOHc znM6lm!j7M*cdc0rn&XX|0*RyJ-B26~{p6}JxL)wY%kfg>tOa(m0XY22 z-t^BD=i`PP@9Xuor|TPWtqHWwT73;l;s-jd;1icm+?M zt*`RmEm*!!*YGzfi0oBaaIL=Ddh!$io`scX_0`7O2LHWL-)Od)_?r~O%Ohe4FNxJk zI)}C55sf;W47VjQ1j}l0mOuv+-t;vwM?5=_Ww9A(0hvn?;PPbc35-*7&DYjieZBRx z#j%r3LRVLxJ!4(9TK))x!zbE2DZXUkBC)8fFjnHm)AhLaL=6BCA20ysQL}`@LiVa8 zQ1rstAH$-`yBLi`E*$W{oI~RN(TQBoptaDFzo9>8s4m--37`>*ffR;kU@-8RAET`H zOF;UiahmLFW>un_g?1P}4rm+NGH;WzTN-%g!#}X*oHk7!A@HLaj;+%_plUvdx^CEB zR`ZnW#-UX&&5C6*ub3AgjWL=MSu_-GOE7bA800*VV-d^D+y>N{ORFN7oZzW!9Z6=d zLfU0ove`1P){};~Pf4dW_!(?9)mJD>7~B1XRn=fT8{TniV7Ck$REgt#qZZZx?4241 zP%9c&5MLeEeI=NYe1(N_VLXHXW78#ypETVe5>y!|2Afbv=RlK;!Uy8?eG;mU6YR*#ZrCT^^dlD!7CD2HReS zIxuw~zIPfre~9@x6vTSj7{Ps8Wlwg@YPR9e7K~QAvb+pG#lD7Oz(7Ncu?Vl~bf`wv ze??bW`6Yf+8!0%P3}-+OE*z{Ks*^{BVnM)>xgXNCXYt`rtoP^no8uDBn{eIg@ZOZ? zR!%v#D!tde+v&yCpWt;v9_)~Kde*}SESH$wyx^6cQ(+c@OgYHZ1>udo9w4=$n#9GY z8OhSQtWlOf_r)9I#qGmNFAKb(7MN~moYpn{mb#{9UHY(xWeVtptX@jGflUX1T=IwX z_V`i|!1-i+bpd2bNIvm-6;|{d$mbA&IXN1Fi%i!%|EB?*f5?mq~lDst*TI6#FqtY#oTN=e6v*!&)Cs8J>#A#;b_)Kc?zWzW*V96BH z)trF~=cK60S+$&&qoeCe=Gcks8*Eq>m;-fqM;1ohvr@2CKB;gHXX%b_X6H_=HMgac z>TTVe?R%&DJIwdDPWTVb@GL2M{5wtltZbS=G6y%G4Y{ zp%xd9prn}YNZhqI>=)KC@Rqd8pj^l-$J^dtplvc7YYR1Oji1@#;rDN`^7X5kzJG|i z3p+|U=m9aMhxcOrauKZg?65cJnqsZ|%h4vSu98-5ajB4!-l!$ir9GsOHX5=JJ0zAO zWf7nf+Y3l%1viCAF->Ws5W?OoY_xDOYBaai5l)# zBc0g-es1gOY7=A^jVDcD4?o=?xff^%0t37Lr19k0#%gQh$+NYm&o(rODWPlBp`z8s zv!_ot;O~=XjVFG<7OJnVKWnb9JzE3t=2PHGuPe~KZtC=IK{QuZGhKjf@4zCUbEj_cYR%LR-FL|NRPoPl=u-U3V zd-@DSaL93g@)Vf+z{Tpq@3qw@>rdXI5(~W~qSdK&u3*cf#FafNd2QfH4I&CBGIY zDgWpZegGp5(aiD^xmUBctmec}gj4kxDu!l#QXx*JTKb4~vId`(s#_S>olW38G8H+r zHzc*xdnhzdxE4}{`x7$M76=ogD)X1b)yT>UZlP4U5XVQt{q~)Gua=z#msAnmGLw+A z&Z2veHz*p{n~`M-E-MEdB9jvSm5g(~!H4Vns{#hAY$DEYjCtS{ z2yOvjiLPtdXd`0yhpUrY_Z}K^XzLKPd+4x}MciLl4o0HJMIM}q?$n|xF*ux)kR2k1 zy2}BmjK*AyMUQHOqMoO3LjhIIL^xwsd)07MUap=sd}=;#U(?YOdJQlZ+;9RJ2kZ6q z^|dFfhyw$!0h#g)$dnB>99s269?}gWLzML)x1)+EAiGkgX)PsRKLkSmLpoxq!@SV) z2Cme6arWUDsNeG!dl%<#waP8??)~-xY%ty=ql5ScYFn!}eEDa|fT{ddni~k9G%LYI zBd%7=GoLcQ;quW;@rd6=1dwo;p`wb~aN;RVOT#Yu#Z0)9@Bam0g+;{=qM4oniD%+- z_U|T8$eghySUa8)Q&pnLO04k`vkJ4_D?#XPVTA5f^(|KY`Zps)6i=aul6JIk-p=3J zvqt3@6(Uob+^Ff`Ek{(2KDm(wOSB82fgSP-&50LxfgCfV@}{@)8Z8_epLf0nrsWN^ z7HQxf{O`)EU%j{bzcf5+55sB^iKO#J(hktG)xTCTb70)_`bEl#$tz2e!vzlsRsV*C5B7^+JT*YYS8L5KoxL{zlNSZ|if^Tr@K)lwaq0w0e`$6ig5%VMZE=@+3ev*d!B_g9BRy2pNlHsfwH81Hr zHb#1Uxy~jnM=M{}koNiNMQE)Iq2?Tf)(ApP3n79mt6U@0TnM4{GKALVAhb>pTC)%$ z$g;{cLTd{lv{8o8`W%Ed2tw-?LIhb>xkhN+zO#6fHKE$WZIzq#CaQK)D>zeECmE^x zXiaYLd#)p%%=F{$U*zKXX73JCMBgOvkg$);Hm&ZZw#3HD%}jnn2}5s{tywXsUuEC7 zvRkA_^qOMR%-fCp%94!hh?R##X_8EdZoc`T<~6BcwKn87cf3hnamY~&LPKv;>wnyN zEO3;C3^kaUV;@6`Y9krLXl5R}U$96nhtkBrHZfvs4F|gw$>3o8$xF`W2;~oEw=6T7 zGNWl_v}8t$X*2s9iV(FWcYL%uj4>iVct^voLXC?l0V9;i5lXBP zO5_M7)(9nXgpzwlDEaFnlq@(xzUF1Tb-^+8AR_R131ZiaQ!sbg_4lLZE$d8;>Wa4~ zRb+|B1GHp*V=^&aaD%6*$BW|WZ=|-sSp62hHdQHi_fJ9Iyu-XGm8eu&A&wo@N++`M zTnG$WsKsla@4X@_O5-0YeuT+zclUOVcK0sc!ek#I6@PYqq8ozQ zw_C_hUcKO~Zt$;kboR1p;Xn-8e<;A`|3J2U0*XU;X5gd2D8eap+2vPry6i3&(n(## zyGisIWU%0IP>F5%)pnL0O$sp9KSMKBCa2XfLHlv|o?k|5l>-hgx_PvR-Q?`jHR^ar zUVfM&_^fN50h&`%Uz^MhlKbajiVvvSz4qkk#*@~wryI)F3QgQvO)&6jfEi671$C|Z z8W)I}z;0J zt+}zWA-LsebGNQ6(3mx!-6@nIwjR)%#%go5@zmd+-@*^pT4UT-wKL%J;@#27!S3G`3cQ#L~+}h>CKY#mPnV9LQ2=oX_>{( zP%1t((Vt^twaf`{*4aN1Sl_YbVlHXKsuAQhnOyBRc+Q;cy*$|4Ib#x6X|cdXix2?; zS`i;rW28d^mB4uYd#m7Ncxe@(gaPbN&;_ZiQ>uOOy4|X8gc#IxOyc9*OQ#7yMO$Yx z($|{0=6_{y6n;~$;`=-q?XfI;A1M@&$w$7FPC3EYXp(P0$tv@s{NiBma2M5H-kcwt z?H?a}fO^3G=o;erTytTswlmX-q4|l{8mZQE36KQrs?7wGh z_eGHT?u~En?s^&rs(`kH`t9?Za!H~;{AZ3y!|+u>yti2SdU=p6Mx>kTsXcFfTDK{# zOHrJxD9@FvLHKe~UHg5JuGynwYnlmj8;>H{;nB&P?E^RO`1R4@D=Y0_`^}5JlQTAj zN zQ=J>ovpd;NXY~lzBf3fQye)d}a1b^5RaL${XKXzKXkC_Sh&=b20>O^AeHkxVy0vOz z6Z2Om+q?VaOpR+{G(%pgkEBZ{X;8C29*YNZ)pS*3xVfP^8``hTfmD-}Wo&S1hsq++ zYS}R>Djo8`zgntV);H4>pKu#U7empE^n^tY+ZLE95nCkz$5Ehe!f-XoH{28b&TVpW zpy}S=32uo$kut{L%i=eyn!C}}vjvj+m{(3g=za<+d9b7kl98xW-7Do>C{g>LZ)UbLX(_3)Yq_K}oqWOrg;ca;sT2CwALs3eiQPA~ zbjwr`btC`#=Jg&ws^2`s+N45kAJh+X_7VlNCWAqjOwe!P7|sBBPBAT7fQo@NdfM+m z;F|U$<6`ZQz}C`k$bN0Gvk^4pk6wU*SYX}E>Y}?#Q@M5KGEjYiw(Xt%x|6#Iv@F40DQ-urUX(cDH3KFt zt=1E^jTq#z3)*C$Tuu%5QWH3o=(1=!w@}Mp=x%PIRezz|xrNq@LTjyOjkQ(gS^GW| z*Zl>j_oBJM3bMO)ZME4#m9abaANuKTtvz{y9M-utJSoR{e$!9Iw5cN13U?!3V|Y)g z4lb`n={o~$b)Xh0rLH^<1ocApI}9YA|Nbgd)IIDyyTy3TXbfp@brrP7G+=#spPk)L z`e&f#IVSw=D;48iVHFM`EaG&+BR<;-*n&FcfR1{07h<+wU6p3{;%;ZUcdHCw^hGR6 zyo69IP=N{@z|;bn_`zz|s)-T5P3>OX#6xK9axQ?~)ROe7qlp0J7HiFF7cjDFCO-3| z8J1bUF~Fyzte7{r@Cla=7$>+xH-bXL%WM+0+4>9Cb*Lhq+n85zxcYiAsA zi{2e*D&mKMrrM|ixG1g2IRV!rdiM^jF&-RVm}qJHed=$Rb^G`T;%)iH{TTS!g*DGq&H1y!&wL(jn>oXh71u{vDrQ&e zpC;=0Ra8hLbQqgHQZ{@BsJTW6GS=$oN(<<+6V^J~NKHL&B2FGfK`$p!muT|GsMJxG zT4<-oN8WXYC)It+tbC{6yYPN6&O727PajLx^3(|B@|Regvm@U!Zw;c^{e;pm`w()4zF_EF%hkoq06_KcL*F;-&jMZ#t)x);rMNk)qlF>xBxFR_iCE`4g-y?zY}MZONd zMopqoKOV>T(jxii>5efD*Pt()_I5lZid}2p{1#|aoIVk6|5j-)J@0G5dmhn;%skey zs=&YfF3L;^a!B`I z9F#wcj3Jt5k@>y!W0bxIFq1u6B2)|8(GxMAh>kusGXo|S3-u{iufQ>*vCb4?Hbchn zq+|pa^}6rZ%wJ&0{klRm-Ec|-h(8$60QIIsk{DmZ} z8=)$-cZEMq(gqFSfIibGG+9Zqpvn$)CG!3*FU{5=Eh`5_cra)GifDAYliJXnZXg{m zQqQctS=Cg~HtnUPmPg6@(4P5bj#xB<)AuaP(!V16`YjwRCe1P$@{6)ui4_+5A1JQ! z4(bDB8t!deB6?m_ZuOrao3iHeKU*;MS7-3wB$Yz6A1acb^HwE(kN>$iN zZ>@9%czYMR6J?Kzf2VoUPf1X$rAq0pnsl zuau(kc|K8;Z$w-uGKcqJg*&ZEH*RK0^_B&r_6HXB2ZR2x)^hF z)O%mNbN10&sRB#bcqi;=A`iIJGyo8Jv>|LBAqFROR%=y|*u%fQ;Cpo*@|d{KzsZ65$VtK39y z5f*}w_R9}NXWWA=-!vYK&F!Mn`8L@hpDN^xWmaM|b8&KX{^~WjB0nu_P>(=K%L>3k zfu=KDroP2Zr$UpCo^0?@GJkr+RZGam-$>w>iGPif z<}S`&@9+G>vr0+zI^-7!_k8JZI=9Jif&p>7xju@;1oL za$iU0^kbe6k<-_Edvr17{Wwn5<6V7NlnNH2^n$Orby=$naZA&0LMXUb8UmVUEAt5S z|FQSpZEYpV;_%z@P%S%D~7<42faW=RVIkH?Q6Mks*RLXwq?z2oA7Oj_T)V{|%HSEuUg>I!x`?bsFb%o0L2ig-ETJxDu5>)1`xyhY>~bIH6nS>u#r zQslj=aG5tmf7&`#yq+Wb8%iVhw!YMGZRXs_WFB_gRmVdG#|ArJ=HHyXBg+xi4r(S^ zJ(=TDb)jbJv<#qxXMr4NEZjopuDME7qoS+66~zSgMlFGZ5ekNkM)Mlnlat-HM%@_c zFvS2~_EpIT+hX@DBt54ce^L>ei6*NJfmJJtZ4!*1=kk)0?5tD3daJR{Ka+#Nhvyxo zv(37OZVyFPHk38-16x9Zqy2B{zLVMV6Os*l-c zeil*(F*8h~o5XnrslH)YLr-~uLHq&e3q>0hpVphMPYL4UM1=REQCs~5|Y2Hk|%jf(*(@`)hg#gSP|r7jsDl$oP{oM617h7J_p z)Gl$*l{g+-*UAs0K;(Lf`$s=L+ur{5>==TegDpkB-)N(k@sOH0tp{Jf_jkRir(DEN zftCejCpbjOrEG1?q~#(AZ8b-J(B(UJPK0Wu$_g;6-j>x*XRN*}t22kjQsw^weHveY zTvo-UVPmv`V|0%(c{gM4;jN{6rE^tH6m>!+B@a;^f+L*wL&;YP0D)zCgcL}XWEG+*bv=r5>Mb%~zRpbm*g!&ocD0(2i5j(!b zd}}NQ+O7j_H?US5iv=N8onCU5o|@*a#*&j_EAVlrX#bseGQ6ql@2ml)C9OLzny_49 z=M!U1l=+|_bUtY7_??s5fbY0JZ8=&w9hg?ey-+B8B@}S&k8^DJJi9||e;DqsxsXD- zhf^|PHE_hWRLE-w=6MvFRedS)O@yg;H#3P+!Y8O>p2^oD%B-O0x$<8n;U{T$baihXExeGu5&MeMuCO1c@h&b#P33U#;6si%&fO{bEGkYb0h z$8aLV9GGYyirzxOh+|fsA@U%V)W_7skn!^HVI|*L6l04H3?xn)_WHI~@*lQ-nF5i$ ze*O0uX94@JH{RvTuS?Sx?Y-CRLze6VR_p^7>_gV;jLS9h4!5Q5?_2C?KYS7MXZn1} zMchQ_7*!PCch%=(Zf)MmX?!(5J*vEmucb%PsC>!pSIR%~rB< zu>=V^b85(gj9nt6hD>un+^O^hR`bSG8vdDMh|gKt6Cl;u)ga&-l+~U+?&wUH*55sL6(t-7Zmhzc z&e$!4;+?nX#Yy_SFl@*;OU5528)dr-R!YVgQqh%z=jG!{6Rmgc0@$KJ$-S|gR0?8; zVSs?|YdI}mJ$h=b0)Q)c-Kk`4F6I;f?u%`q zU7&ItRQ|g_Yb9Yn1`fRhjJOMrwVjrW>!|SQsYF+ zmGPZ)-n1#@s!0JTFd4!@pg4%d+p37PYy{5x4X|Bn50kc7FC@)#C1SFZNgbF>nUD&` zWWi`%D@Mf)luFO#k8~4uUXVhZp!1e*j-!9lHB>O#dTG0A5QgjK9KD|Y&}~A^IMdsJ zY2JW;PvtHX%)5XFwrVt?IJL=X@`{Kl^>XbG9>G5G4nCt$ixo5_@W_XK_9n5A&#$FX zR@ukr3*hk5i&ms72!yqiUIT7zVKu$Ds>>~=^G>m~^xBfeJ$f2j6dS0IZw$FSc){c# z=7HbLEkjG$^xBFl1xaox@a~l}>tI`iMuhv8-hcCna~aasgMx_1nn`EHA**3Pe%e`K|d;Mpx1p$yOcWW8#RUdA00d+5vTUipnmR7`5UM?4^m(}&M zRAe!?M6ZU662_uB85a|MXU)}+OxLnz#buzhRP^gpSQ*mT5m6m+!Q@sgno0QpqE9*! z!V7EloJAuQXk-Zq6tN?GEPnHq1vsvrYtjpz=Ue@5hXU4o$5st1MTBXtkseN)SJp4K zaGVKstzFfEv^0V-*ycHn7}x6+sT1cdj*HdE&ZXA9f&ep(J>Vl+gBm{J_rZ3IDe3)5 zqs8QRLCD&MX<5V>WD5fqfk+G8wj7HNS~*wPbD2RiBV<4^gY##vpNDr$2%a9a@*+jE zLbTg=jRj=?oVf~1Wtm_5EuU=$LmEm92Ad>>-Y{H zhbn7W)6xEhLPg^|5qS%1Cq)bgrKoI|b{v#Veaw31lV*wMK3k?zGCiMXU0dKzl#$u*P+<7~?0!ew%%j20)VSe43k z40x;0l9TuVf1qWb$$|ev9j<_WSUFJiM%DRB5mU@_aZ@~!iHM7S<025l<%m)yEt{r= zsPZXMW1`-Jr`Q0qRXV59nRA4*p^@)tG9<*VW{zW;WyYyitA2aW``|!=Nh#cSP%$sx zHeL3R9;S^C|<~ z*I+)>9iuK0uc+)(clBC)OWD@HX&ja)@`@M)pyFGX^2QnTy^4Io1 z@EFwNsk{%kgRGWJ8HBqD2A2Qwp5CPD;y7IM9OL@o z)yX~8(kM?b&o_!>)9oIVXyEmVhw|jDYRj^SGt{O3{xdwfa?MVe>RN%#cPsi0%N>T4 z32idP+MgRCN4RmwkiH``K#nNqu`PCG)^{;TS+3t>&K-QL1Yv`977A}Veg_j$#k3W~ z4@D3urzu9^gYScm0b=ZVNm$CMv_u|}0u2$VE9s5#0VDPDrBPea^b93e-f$Ye2+YUt z${PpoMJ!=}=CmWTrNG<(6=B90Xcc$Nuz)=X4tiBhj5_^pyM5N~c6(=F@(Ll(o`DBt z+@#<$7Z-G<2!CFOI*6(B^KvnmcC5e|Af{{y>8dBP2#+EXzA3OF)=_O^2L=-Nj}CTs zH#g394-O8&&(y}|uVK9PfTb+7<#?4sBWAh~5_6yf3Hze0eEkDDR=78!aB2udlI*|u z00#@yOb}`wSY%n?7${+6zIMeFSz^6a9Ykj0O=SexV}>9J{^GHEOHqGCjM~^D5VVy@ zy7Y*p{c`CYk+fxm;pH%u-JB{33PRU!LG66|0Py3H3X;CSDsh|J6Ocry6JUbleYC40 zdclB0Dn$!ybu_I{`G?hHok*b27J3Zj2<0mB1V_-em*tJB+Z>LG&6FMMoOKPn4RsLaneGR%J; zG~sRewGVBo{mfp`$c`ObDYOJADEcdZ)>m?DZf^myhy|fl8yJDgWwj%{P&#d4R72u$ zohZfH7rWkm3CF#lY3ZZC!=D1DG3bE=8a^3H&IShZ?>RmUF(4nD1-~TS%mxJL00z{D z-FKdk5v$gr6MP>(!QrURMQp=87M*t8Q_-Kz4n=hKDcZL0#`tf5ww+ zSJsrfYyDWbn>V%;+rzQt#8!?iqIdL$i}62cXZtj%qV~6ztKnjb(V!|mY`?jvSi8<@ zz}4z83pI>u($((zi%kO`W=9N(!z|v^&fC@tgy+4&jSdnOO4t)T*hi7w=;6;8d~$3W z5uMpYJ9dZFeNU3>&xzt%7LM>ngvrwroZZOj4ZC~vPP3M} zt9g!};_ySEE4h?T?|LGN+O(y`1e7#x!qX((I@^*Dtu(GlJjXS*WEK!c#jT!|6bQB2&>Z-AR?cQ4>cY;5YHRwpFV$NH$b^;Vcv z8f?yHz($1>l`a%GI3({fMv-(IpxX{-S-mhQjP1CYtno(xejNv#kFj_tgb`KifFv{S z$cxtSQI92yD2pKE?sxwym~9nzk-j=G!+rwY+=yu1r~;lat;%j@22+{EwWBU6;y~o`gR-b|!2G!G+Mo17{|s zU4hhou#+d^xfVhSOyb;PQ}5m3bLUfNjeC4*%f8wW(p3irnP=}QKCm%G+V5;+rw&l;^6-yHxQZGE)BSVkz90#1+>DY*u^!6zHY?>_?Ll2= z`Xj5ir%F4!Q6&pLa*ut={pmI=W{v?wXWt6ninDVpWISWUnlnJY+CX;pk#l^zv%h_| zcW`w0PQBY-b^E=`O0|z{N2l2y;d3xt6R1q3e6+m@OXTgr$$o|IqoF$M)j>noOUO=b zHHI~CrXz}pQG!!f*muJFGHjroj_@wLvq4UDWV8eCT_}u+bsh5K-$L7v>BzLu$T-?mYC?t-8&)mZbMCVRH zowjkkvjHO$B!sJ-XlOse6tGv%K^? z{+!J`1Qs5#1Cgau=4RSJnEt=@^j~63guN3@92^EOW^kfQ&OlGpoP~&585r~l2R4v< zmxZ&ZP3$X!a#i)-Y=%>7n&Cu_#lXS{TnBcJ)q!w!x7i#tlo=u>5RsvhB)-sKVVbN? zOK$A!xPr=4KzIbCq69Nh#8Xs$71b{aT|_mm?HUV-iM=vBwS>Ab7CAw811-VlKo^0F zarZLqyA@ZL5@c34$Rzl2X1K2qgkyrwBQ{@ns`s^ zc80(YAm8B2p#}0=E0s@g@ z!O9{ljk(ZBUO^5{)^}ln6Oq%CMwL3??iU2?Xw#SB<2rO{(Lq`%Zk; zH8KYk<4*i##A)ms6{_k;C>RV8Xnia{N<_&gTF3%_GMQ}UQnMJ@B=gC)3@9u6 zX{Hqtj?<<)H)T$9Pcf;v`^;*>JMf7|8{S;Z_~vFBV7bdf(Mq*K^Y6i~P0h_7Jy`z* zUb|?E{_B~h6zq!BQGE^)W2^s?pyudqZ3X_@+TA&H=?LmzEA?tuyy~Ys3VU)M;qCr2 zA7xYclF(+3tpd+piy~FZKBwB-fB0ZvZB(_HQ|N&yLmQ7oAJ#}|=0t;jRM$`T4kanj z^?PEz1tR7CdCVHFzk~R*XU(tmBTL-fhL%VBp*7ZZDME6z;7fT%5dOzBUD4D1+AXO zq;Uo=2$a*mQNMYHeF_pvLdl$-e9373PgWzEVcsjhWHtBaE09YJh6coFoE{9VJX71w z14p_jGFG^;=74QJq)5 zuJMBl-4oh)vLodtqNfq$hQle&%0R||*^eS${=UXFXb0zvX_Lp@Gz0O@5$ig^XT$L9 zP_t94xtxfyvCw#YSA*YYgWthn`9CL{|8m|eA|p~;QSHJH9r|_K6Vgrs({G<`<;NHt z9D?`ZUnzKG;=h z;JHZak=~+dIhI2 z1I9R?yvO+FlheocJbG-;zjwUyGmV$=dTWi&0|qCToN-`s$@oFJum=Sxg|B}(Pyd*6 za7~BHl`eJ5ro)S>M-re44d-lcA3!g>{4DVDK6qYmIS1T0jYc#!flQN+@AO4D<3diV zpewm|;36+XS9l}Z`>)()r~%RJS5XaoOn!cm`jeluF=|2Rtcl4AZ`MA=IR@Xq^7Md1 zfWmfzdtXZb%G1BHg~(@)aF3rkxfGPQJJX)P_eLgvHOYJy&@tR^l`c2Zcc+6D3^_6A zkVU8)*tOcXFci_Wegj0XxO8YwKNmz@vU{r?P0WR_oot+QWv1A=z^y{Zq zi`IHq%qJ~dRQBcA=v^H#x3)}n(Pvj=AnW|bET2}~hLzrxF3Q#9{%hZ@r`^>1-V6F~ zQd7vWD}8%#aI~TPIvdgPV%WgaU-6SA+4R{S6X-COwrQ`g;wRts*0y=#St`ba(bJ~i zCe9DzlOs%Dj5bh<0WcW$M_{lSVNOYQGb(P1WmZ>obI_13lql}(-Yj8NSCl?_a|z41 zkL+r=j?BHxJqK|;=5K~^z7HZ+gflIk+I(1D2MT|g@toq>VG!FpcL*ch%6P`mbzTxx z-?O^IK1O0I%P9!Cw)r#Xz$$ILphRSCi5zRkKL4=$a%B3Y{IY@Wd@Vi79-I@6YqILUs$sLdLfP#QYWB zgDfzVGx6kH=c!KCQ-^XUJV!4=3i9yGb0(SXVJ}dWbkM*9dI4dQ3Y__dNM{d*N;~_} zp~A2{3DjIbGx8K8kb7)g^G^abBg0BR`nWz8)JGr0C+KeWsRj|Z{!=W@{F5xs{1Yrr zBzsRW0@)`aP(G*#Go>9`ze;3R6yM{hOok86v*UxU%6Fcg%5cM2X6R$Z%9@xf7@4Ws z9W|NwG$x;4Mq_;h%9e#Dg5+f(djZO#W}j;1-e(tHA|5bH(6pJE@7bITkX$(514xfU z6bO=>&Wg}Nbk``1)3awYgOW1YsqmV3b9ykY-obk~s+z(u> z8JwA-MI!k$9f$OCE8VvMO~;`pp$67Kl?3wvJ)yrhO0$=MqMHf>gQQwc8jEZpRscs) zi@|#BYNtx-5c2GmicsyV?qFC}j-|42)N%lB!GlgiM1iQe1W4m**;Jh3s`tmk5 znbOz?*4V_?*tONj2l2&=O)Q)~h`DnlSBm6kF}k%3{5_{8(wqqS70O;&vc;*czw$pv z&SjV49>=|c_E@o)@n;4a9OhZtk(Oae4Zv9}Vae^!WNI=H@AYUSB`O+(ZB+kY0|^aB4HMYBS8Bg!^!Q zO=+(Dd%ETdv%6d5nkA@;6{ETG{TeUdp_W3pdNfiD&Oek={%EC?A9^L>C2FaZn8o=+ ztK<*YDp3USg(Qf{DQ@c{sSt8mF)M)dMxaPCn&fIH0;22hyZyFt%OH(XwSPUmkv(SQ zBHFofLaC$i7^ps7-^hMXr@jyJc^v{~d%pHy3-!NR-}6!jIy_!;u~7li?)p`(j9|6K zIm|CbA1#B9&nF4(EcD|aYO74yrsgCJ@T+d>(O#n=leoINl0z1V~oO=hd@ik3~G5S(#&!0EUP1;A{HQ(ut6H^NFh;g$wHNe2{!7o~+Tx%fh zRR^DwG{Rn~$Ag&18Cjy@cLrkd?!Fn~vAE$(WS8ekPNJ%(=tjGn7aMPHl;cK_s;&lFcrhA z&Uv?k=3&1I|7q*ui~OYzKDRpLep0?c@Zulhicdnte~T-A6Ds~buJ~7O6EA?Aacg@DOGonbSxEH%r)siNScSn4``ADl>RK0Khgiv zjRGCnlW=#D`x*Uj;{OO5_g4B})Nzq%;tra196(!bNtes$Y*e~fHWhQTR206N!92uF%%jvIzqKZ)M63$FIZv1!zdbH>UAN+{}Gm)rY5?i zDrq+lB2%RUXQy}B9B)T_h^X~6`QaKLVrophHGYe!apSG=KBflhXLFyd_^=b&G_ndp zO^IhKHRPRU9PPnMa+FJQ0{Pg!mOt}wn1rMDbbPHG;h;q^PA6BUdnx+#!l!4PO$@G@vBE?)&YKOXk!DbKPN zJwDugd$LSTisYn&iw#Vj6T8g?YX-zztp6+XRxSpcSr_t|0-&uehO`kcQ zM#X@rHXVQSm4kf>l5hwsnT3PlCe1@yDZSoQqvmeYcqANDVSvE3(!W%kU6lYY`7lA! zjHJr#L(~P@cKpp+-@FE!VLGu$bhX<;oA?UH&NY};41{jm0}b7SsfZ-fcgsk;^w3CMPx+)ARVJHWp&kM3WfLekm(E$eJ36YAJN1K&%2sQbw7i)JjUC+V1bi$& z8Fplf$mJr|*y;2}D1lH;fTb=3;bL@t9hXYre|$&H78WrvrEg%_yc;mvVwaxRSaQtFd9an1hcc8 zSwxi-u=CGma+y{7mC59DD-0`0TFPfJ6Dq*pY+e*w$*nAN#3(Jlydr@tXO^f2_BLm5 zi(aHK`kC}HTdLN0$~DEZ?Ny^UtX17~-qerShAHFqjK*$vXCEBtVQ9@949!{P;7q0* zOFsu0Ts`# z;{0k?U>rllhoL7Cb}@vZ&8^Ui$}F!5lZEW^B5N2HUv7<-)mnCq)RZ!-s~M|6W-%|< zU6%f?t}QJKti(ROxZY?qtD`pD;XA-pfyP-6O#dXkNnEonO(s%!VqdFWdyV|@HPVjj zoS7t`AWNj@2HBVci)|sX2!pn$(;x|$=4^UxnUbi)a(Z=nl`7~Gu=#Uqs|pByXR~Wr znJtDom(Q8qfAQb1T`Ud_KFhwwf2adL^G-T?5(#NG+~V z63p@1YA%~wga2D{c05om$XNt3x0+pAB?_^!3<=q_HP~pmB{`!j%PVVZi`muXOg_7o z@sN$B>~dx~3p8d);*rTN=Aq>B;_}MUG8yiy!sNnGEU)I*mRFb7d{pJ)SJ+q4J%;59 z-OXf{R{fi5mDFXl6Au*vc{u_53D$mLfu zxm*^;HWzqG=GGQnP`KpR@@x6kmFx=8*QJ$w;7iXftza84T5B*endPOmr3{R{Jrsf$ zDPLUgwK|()GCa)Y(u*qqrWh(xy{00dW0eC8*NQVA*YSHiOcb5P7%o8PKYc(K8w*)7 z=vA2_f?t@FCN-0w`zy|U-8Y`YDoUnKwr3gssv^-;!$Z=Yl^5B)X$1bu7IKvSfPOq4vLnohqlkapIvHN|3Gbk^WTL!M=-Ty|;t0uxnf z^R_y&BWdUg`?`?hhCV2nuRN`#2R6ubN`RaaU9Byn+UuO4>LA+tBL685MoRZZbObRkqhm*{}+d4UO)tK-`(t!!!u%=g1?-S04`=fF4{B7J7LTC~|azkV`kK*#SE9qYxB2v1K)-XC~nD=q@-O{@Jsp zQ`0t%FszC!5%94_2e|$PjLi(Y5Uf#!SC)WznhlCv1V;i>@|;>6-EgEdHnngv84a*= z{9B%RLeJlOkB0?e&W@gG=X#)6ZplLt=7b(TYw1|jluBsvSjn=sA9#`~v(@cpx$C>= z1|V^Xgc$O#nWP$g+dYs{DkfLibZAxCzhG8`&lQxnApg#5E=U`L2yl)8z6aI{^t{G78u$FYa2NmCrae((i-TUJR&jvbT2W($eU`QIp<0(wZ7s<7 z(y}GuM?&p8u%a-Kkn#+YixV@>!zV~kEN|7gQPU7Z9cnL8Oq$MYn%Z6EcZclJ$=KXz zq~Cm1Uhk!bXNyWf)owqj9YYC=b&;cO)|tWIMF!blnxT=lL{k$$Sy@lkCDpq0)w-lw zm;PE4R%>F{ny^|EZU~s6yO)e0I})~P(0)K46Z)7)F{rROW5)gy119SOlf5^X+*E9` zvw+D@#byc^xe_nTVA2l6>6}xn)NZ$)6br2fS2MAi=4o1eMY5`hw9>f9&IUR+9durU zW}8A5TMzFI`77i_&FlxUs-XqTy32Zb*FflzUG>bYtJ*zlOUh`$P#D0IpthD(X`zOA zp_*N2G0_xf9X&MK;}K{Ak>u?Kru(TtZF)1v0%~n0s5K6?#-M^4PTK;?FJ%(rKsBOW zlDjiaVVDFX%&!bb)k!GgN8q}14|#?*{AWlLqs#qByIcY{e(q~_{IsFm<2EGn3)m(P zGlJtF=By>OC*_y`&epG1Ht0gF|f#8=ElR=kO?n6oQ} zL#c$ugXoR9n%RBTrz2dm+moFxyfkX>z9ID(cDV^pmwl${q7;{i1WPS?PRl7%aYw{- zXF?8FLQJFUWWT9gKnD*&(U2b{9*kgV$>qkJe`r`kdMTNBzZNO7$_y7Wl^?oac4 zD^xl#XJP_q+|G5R1rAUyGjPE6bR5b^a%#0knOwwR=ir4bl%qY1YJo#6Id_SFsI%X( zYF*)t(uMUb8EG$|F2@@?plfm@?)}CEYrA<2Lei?xqiWHEK~~<7@U?qMI4PC=Hfyt` zgE-|?H3KUU%(|l=`mL$yzk<M?5EsVmRCt1?*CIFM2nhK^(1!e8|Ii=f!xNXxWdkihb+%fy?*t zR`0zRZ`|6ATe|K*KYYnb%-vI!ub`(|Jhm|uKLHwb^$cR;H5a1sDDKsCehVsWcE+uK zw{r!D|N7C!mRdZ{L28|xhHGWQ469)sf+K0CQ{*T+XzBM+$K%SJ0rRnZFB#4r}7~Nl(sI51Q&Xov%;%8&vN<| zy683-dVlw} z&UEhBsCMJ=oZ(cm;GK&@DH`IerM zTiLJ+&TxiW?KI308r{Y{&slpJvtu@9J>T;%wwmBk(xRKV_la$sBK? zrhIf84?O(+E$vTV$KT5*_!~Z&Y0~b&Rk+8u)$D+u-qFoH@Q@ETHCyjyWCvV+$!e}; zu}jfyeIHvD)nsL+1NDAvn9r6?jI7~(V#f3V43f8%8CJ{pa8lkjIU_Z_-Tx7`tNu{7 z>tw8j%lPt}C0o$wYq`+0M4<&|y@VhOK%n!|lT+cCGzt*Avm1VjK!zAF4Oi8f3Y=Z- z4OeAc(t3fbI@2+i5&+3w37orrgb!u`XhZ~>zYDXkqql_zD$zZC1nZ5T5)>8uD3hijUSUkPD&(^0VGX0`(cYSqI) zn)XcPnH#c3IK&NFZN`kV3vBl09pRjxF|^R|a+qOMIN+)1gt$zPoeX;m3h|q|c?Zz+ zhV4z~*=fVr?KO2v{T?)Z%;)C*sqmD@8BjRw!Dq?aO)EJO_O2MpU8ae>|O@%5|Y z;4#LN59i3rmACK6OU*MEz!(ksdRNoqg)BA7HB^UM;5rbSv^#>QF5? zDMg{@(u1i9i&m|R$7sy18{=-P4#{BWDD2VY5@BWZ!jRVmxfak9N@%ou#>r(MT%gM# z2P?ZPz|3Rjk=rOb9!<_63iAc9Kb<;rf*kIXi@8)K){nl-iYx~n+{e=2jGU~E&9?^| z5OV>Jl7q9#=C75Lqs@PjKY9f~^oUek$&OZKkyjT~;aOV*zZ+n*4$e2`je+e_4lKA= zz>=IB*e>F*1z`}G6|j(AL(dzkY#X*^<+9q@{4%Px?M4IB$YN$uxEry-eic2GtH^Gx zO_R@NL)bF>1 zmDvpY&3-M=C62&kPE6d)(+a&m8;#FEhomiX*%EQ)I&ws#b~g@fQjSgFK~vK%GeVeT zV~f$O+$60gJ==W6;fFya;xV+_4!o15kRk0Sw>9mGE@1!Y!|ty`4#xjfa&R3!+i2Gh zMeH-j+;a;Sqnp@;(Q*$u&-l!C=!tDXjjKb08olS*k6sIwm$NFaCXN4Ntdl*WuI@@; zQztpIGl<(V(DP*Sf!svoaPbtN7FF!3+wWb1qXW=~iz-4+5Myuv&GdSsH@rL_HKU5u zU`l9kFf>|YU>CC)o_8S3JcJ2q;Wgp6_r);fWPSInX+2_|JnYGNb z47yuPh#yT|7kW%Sjj@w$nC__?na^TGzdI3Q;;xff$b^6HJ=yNO>mu$nJGACT5SwFp z``Xw%th_rrEWiCX`X(%aj%+TIaV^O8zSI}R=xqf>VMs1~JIQQMHoR*8_%cbfKfT1T zF&IuMa#c`9{&}R*$WRp9PQ@b>yUp3c(_UbW#8k9@TL31_1=WE^rUY>I>Fll72{w(5jnx|>J5p=$(V%$inwBHp|!$3FpyG@bG`n`hKogeFa8Uxhx)Da z(XgTXYyd$FQ!bG=-nBC0C|C5sPZ&mJHoF(!!3li#{o7dryt@e*#~v74dx)m;45GvL zVG67Qk<}l1UO&Ml)}BDNOUrE8akKSEQJ9@v2ZAeHrMM38K`TdOJa~n&b?7_B9(>N~ zCH!Pp*IDnTb>-&Hx(v;7nvyezEA-)G4QOBn9*(G=_4MdyYOq84b>@|#I~ra<0Hh0L zYsy^G7H7Cx&Ty!US!7vmlh(aj7=4=BFfd<64L{_Eky>Xfcr(C!{|dbQwtDSWqkcx5 zg-xuFo=g@Bj}kGLttTYSPcAyW-#zZhXtL*i*mTq!JW3NvJ3@xfq35N?z5dx3(9UTKIiMwdh7(HLBQSa79= zkxJ7q{E!A-{dW$J4&Ih`&klE(Qo-~VY&TtDvM;tL8|*0{=e!)5msyO5RP@km@1poC z@_5gDB-~;F51Dv!x4gH$c~o&E8mHi5<}V_oe;Te*@*GdcbBY+MF_`~@nbKI^atdoX z+mna)(P1iI>CXNm%02#qZ~uG`QvjW-vHei--TbOq0)xWpFu zC$aT^5ECqX^r4hcnQdbDbmekYQ;L7!EhDtbRi4@gF(m-hz$WNyfBWxd_D+c_6N86a zB7}!q0Qmo(W7+>%IC9macLumqRMKc4@OW!-1I9Q>Ia{tpKJ z2Lu1dzkANW*TV)s32*QRy_6c|2e8|zp*he)>BRp4;~mS(PUB7=gQff-1b%Av?7`fZ z*eFHWigYi(2tkvXCbjYDL$pOoq6Llc=pKoTKt+hM%+BmeT=kkvWg(C} z#ZAV_6fr0jwnX#tg{~wR!;P4x{uZzG(;2xPM(2fVk$+is^z0?jA2Yp)Bov@icc;s{-?2h-^-p&Wek7tZ%@O&J@r1E$_5&ZkwX7%a#9`YGA02eUPimP10%MA{@V?!q=iV=vnWhvomAY&ynBX%p<)tmZAY znh)O{fM=8+Z42F8d%vaUS$?X$4PnMK1$bZeDLHKVCY2ymUV7 zrL%Y0jhp=+@0>s0Ie)x!>V5Lhe&zJmSDq}R0k9JPi|?fC?BGW$?v3)%#+2KJ*I%c5 z^L_90xcKK@ReoGXe!Ro}xQsmMWn|_nM>G|g!Tp30l-&5JmxO)z?!)m8sO$p@vc%58 zk@?{Mk6jm$575@szUSQx?Eyc|rU~&S?Cc^f^c)xMw%IKn^37Z{CBk8??Po5JCu)yN zP1gyv-=lAYTj>~h+?%w48RIeD?Yi~~UyRH-GBf0l)u6&rJ2uoT-gK<%_R!=R=j_Fp zJec;lY~za>F3(q^tJ%s{uSMAi@9OTd(Ei&)&~5+f&XRF_!~5o!dxno#EFO37QINQ! z_qb(ZLN8c7&9RUTrwt6*YIn#9`ryIB3i%Mi;Gsg=AEJ$?6K$~V;UC2~U%L;MkX%j% zty-M?BHqivqew=kp}@W9|LGzWO{Hg>$;d+b7>;dCpUFQYHa{db5sSxfF48SDawVDMi=&Bf8xZe3UtP)R6-PlON{syLE1Vyu3ff) zOJ<$dTWAYZ5Im`CnLy(*)95IVs$p1=iFl-7XjmYt(6EJa)XH~vi$EUj(o>1 z^pyj+js0a6AAU#^e@GL5NE81W(nKH}pIyT7!}9v?duhMu1CPVW?_WdPVA%Z&+?0RZ zO8>`hrGKEB04?zUbzA7aC*yn?c2Mkb{3@Lm&*<0nujXHvT^A1z;BDy`LW#M--!aVL zv*_53N>c9)qUHd;Ph`jN{p&C9wwS`?v^qobKwFZ_#S$s({I*%Hzzg03d_e>(fSsC$w5J0v_=71wWo677uT+zN?3TzQH)t~6#dF(9B(2#s6DMG zONYzczQ4c92YXPKT)?me_xwNAuJ>=kaXh}qWIg&1Vh8Sd;QtdGFTejz$IE}ZkK_p1 zNuhTEnpGWa}&8c!vQUK=@z3USZD45z0A?CNQgYH`TAMkn%!t;lQ-iRSje~3&~I1?DVQO;4^ zCb+DRiG1Rd4yHm}lyZZh!t1c;F&`6|#3vNU;ljMFTf%WsP@EmR;C*{8zSQQ%YNE0m#tPp)1#8U<17w(vHb zXIDOqC?K)g2xrTjUC6O+hJ_QAVz;nkCCl3TDp7uK;WyH?!U6n>)>SO5j{+ZGU$}wv z=m+h>yKuJ5`8*1IV&lT8oo@GOTcU3-_QHEB*{<>{z_YEY3LkWmPv5feMQ7XT|FzR) zKYlZ*UX{o~wH{bD)P;YK0&^-AUWhLa@)wb$A^e9G(TT%)5c!N%Xw(D$Q(2)SbHct! z3$0L=U3H-I&Ap<~*NK*JztFYQZAfhc$ub-))SL{v+9k_%bjS*$aGqVct_#?Y425Pm z1K$=3y>L44goP_e_M9?>3p?GRhn`G1*<(9Pre4 z85Yi+47*wday>GI!dIDY(Ur1Hw28%$ObyFf3UBQ!nR-|cyw6jGjc^7{+OAHwkw3B1 zCHNhks>q{C2zP(09!yc3EF8oYA@tUH2^;=RJ&4pmF1)J;4u??qTo0s}pl}L5V?<|# zZOrH5k;40W5Ps(={K`{p1U}RQul8!;i<9Ay%z6+ZNGSXk%2MQ!XDA|R(p+gn;TOoW zWmSd$h$L57R~R+}M}|~r$RukSbRf}VU0oR1={6qyX5i!03ROGZuGEE0pCV_W?PS>1 zYR$mCd=xHCn(W4iQshUy890)zLbC}xQ|GGqBcIoHjAsGP{!Q(u&K+(b5k$O?wQ6-6daB9+{11}b!`D0R*fs6?e1U<6PM ze%O$``f4Rnsd5u&-QW^dO{*pf9q|+@^H!v&(~wFX+G$j7L!=4ch@#l8l|-dZL=szR zg&ix2O6`jzar{xCEuKPU4pfRf=&0DblSn0RL?Ru*RO%f|pc0>(K@VTY#G)vi>QBnu zZpwWpa^LGu%Ka6$L%%hYv;9GTQtp@LT`+))hU71A<^88{JFd1zjY6mKHPIU;v&$MoF1LscMqhliLhK5DlqK|hspK<|ck;%c$y)=;VO)hci!Q5l)LJHE>cx9TGV zn`K0SzmvRQ;THae0Eo0BDPVCiYr+L!)2g)qW1^Vzu{~5^%BjE7OH{01B_93=fvddq z+A82g7puZ;wHqF;E)Pw`;8R9)FBP|0xK;73Y`CGQR}8d{k`)PE-oFaB_#*^cCPvOM z<{zU7&a`=Fj`_l^_!$DLlOq9(5*BF88pEm%vMFf9x%%K9FbSasoy^E)c{!(FR^EE6 zI^c_%U8`U@%8&4xG#Swo!r8>at^NuD<2ljLI0I3*?K2}x8ye4vhQ@A1g}bv}NQg%11O z^9E1VQOT?AT?s{HB0C30!^2i%fNM&YE8O0RYcTw{3)dHKCQ(oXT{qh^D=EELM0fH_ zSVGuosN^(a-!RmuY7s(0z1j34I;rweBFu{ndfj2{0H{6(N+gfJtx-{IgczX?$lwUy zUZXR*I`3EIXT4FYP6XPz%|B((bnDJwVY+t|Sp|3W=rn)8@X4{@LwCoa{qX}M6W&&@ z8vUx+oOT**PmQH_psXBss4kK8_2Bx`n0>zuK2P4N@sq5u*@0ND+;3FxKm1=?_2DJ{ zxNKlu0j@o)on@V46_RoeVH5n@gZQlhjkNi64wtJa=IZ-du7K&lg($k z&grEfjm7&8p0+H{rGGZ`E~uEphirHoLmGn#BUjQKl-9&qNNGxrjy# zm${eXb+6i~SNrw2@p`fW;#?$ta~}161E?W!+NYo~Vj-??o-0lCV6q!~v5t@1Mb7W|DLV_2EqBAp|R*gu| z)1Z+Ms>}9cERWj|n-H}sn5-^hRWQ+=;Zs}`MSAqAU_vxcGfbv-$3(8IncHaQDH!H9 z9BGM$;3Hfi+#CV12R}z%eCLRTIi5Zlm|x0eV63-C{eH`#ys@2Nxe=nZxNd3*cWhU+ z!26CQ+`N-R(QDqv;TCj~cQ3pGLm1U!@Ti&AmF(NXU{fbrHv_i`OOWnq#*(YwS;F{x zZ2I69WRY;Gf|`f=ieskZ5Vm#$ofD{grjfXKQbFwE+pM9-10OMQ-xAdAG29n<-YFVe z^9Xq|zUzh$H6}mzZEhn@zq>2eI%#$Mmu#dUM=@7vl>vyUw?wuzbXsVq@tjC{QL~+1 zL<8BMDjs!;M#@QpunRq3e~u#Mg5Dyr;#1*pkF~;{Uj3<|M(w=F)@)CFMns>tvRp5G zx?Cm`QBHW^Q{@(;%SEHj3q|5jE>_r(7*{U7n+JEt=e(8htoYWBJnVPKJ)Z~qOta4) zRav)qatOMUITP$-;nR<^U1H69i-nt1bHj0roYdhgGg%$NNjak9&?T!GD>rg>xpPkU zav6xN>^kuDKbTEl2d>{vz7#w@J^jt_64ArrxNLN1%W}!+NP2iyr1~rR8zMCO1GqE zw%BeA6YWyJR4VLu)C&@5$w9{n^hFOuh}TdXuGou^xaW1uDtQTd#) zNHj>regk|fbrO@8FDFp6A_5w|e3_h-lDx3t@_x>|X%vR3G-v@OC#h60xzp{AO}js3 zO$Y85P2gh&X<`S`gT{~?L?tr;{x1tdTM$)H zytilVkoCtXuL4>WUh+DZa%WHaWP zLvnUrxFFAV_h7iRT>zxz^+w@yL)?N%p8Hc)e7vW7AbjB?<4@T;SjLxW7OWn$CP0gv%PK&~6 zB7b*xsQ|Kib@Z!t2?Ow@L%1X->G1W8a>JDv;%JyPZr0=P(E$2X79Omu%ayt`Kp?BPFFz6LWgiI3cTXLN*#Cb3rbe zjLks8W+Gp+lP)jWy6MbDwraDGEk7BlF*0&BGYtWGm4|@T2$k^q)umw#)E;4v)E>B! zcO_vh!?7t>Ch|kLY(x*FZKA&yOnfJ|A5lsLGiwl2evTbLf;(#%f<PhxvVg2oMsCpq zwQZm}MUV$BoohgSI(`b{09aKB7D`{caK9^D1+p)N%AFa=f75+Hac>P+0)WY3wGU(p zMgVxjz4EVTr<+HW&0o*J0QYET{TSw~gsKjuW|F3v?hF0WAgCf6t|51md%;HVKDY@^ z1(*K9aOvBndh!PHHd4ht%*HlMM8C8h)RO&lmxu>U(~D9MAYiFe_;~s9!hD_nB)I#R zFNcaEoC1@&xx2Xsv2oAJM@Quk5KVV$Yx4*;%ZqQ{s<;ynyPU|q~ zhZE4APoAdaa^;J=ZKer$YEbYPHcp8em;3$dB*{wFl6$NuHp&a`v67coNkMC)%GO1n z)Fj@N-lxB|Na6EJ&>fng(^BW-Ub=LY^M0@X_jbTh@% z*Nx)o{CsNTYZs<=@Z%46x>3WHpH1K43B|h{Z;28!7us*8>g^fVav^qtC|1F#<}+yr7h7WPagX(PeZpLh+iwVKIaK7Rg`Zg*?MdHr0WW%3?>Yiv8 z5Y9-B`{-eVKKhP9A9)5{_6g?W_O3W#V_q5!VM6qP)11+-l1u^W2>pO*2x#Ehc$H2A zX99q5%hBg!KTfJa--AtH?LNK7H*iw}+QJz`apU#-;s$K@y^kBP!MT6|h{XuzGGlQR zFt@6S_ihtFOZw^177wibs5W`={l~per7X}D_){w3jJ0H4NpY!$qPwD87Ds6B6Rful zDnDi=C1663N|iPo)+J(Kf(;+mdbr*r@q@)HhwJ_8o8o(-j_(nVJ@`YYz%lQ~{e3FH zvL!x@=jN0SUIg2z+ifAavwO5d9@83qSs03@3U&#*06}A|m{a!_)zan`8qYMsEHrw3vj-6FWE04K(% z9)g>?RhwaZ2sC?p_}a`ejt!*1ju^4IpWhzB(M{s>LylK*k2kaj**}RZ+D#g4Gp~2_ zG>tmeO7UfT;Lla@2^=z0ca1i90-XizD;sT?TbnPn_|Y%JRB;xd=gwG6hOg{m!3Q`B zU{dB_1td>~^PvKBfXW;#57C!fGwX8nLUXPVt0H365MtHPBvps75uSFEJn-jQ{z-~M z`^rXp_DPBZdhU!x#3W5I9jf^e{eTJD_ED8>N&7~O<_x~Jz)c1u$zuhIgXL@@ z=g{|DbIfoAWKzX*xaoW@Qt7-?Iv-nl(J8$cRa%mMr+7A09Q38{D*T?c3uo+!#kuX_ zA<;2+4!H4rV%hI8d&AtI@SJ4Xr~k`4_Ix`(s}P;q)2x3SE$%z^}rI z_`4yN-!XcxDjaL^$u8u=nKWon#^9j2t*)R)ZqA{+j+WuR*kY^=h-aisO(hBO3?`j) zz@~xUOS!n_g?zph>`ccpz%y`` zjbAlMPra#I6fg=#*wof^Sb%|IHlRA6iLQbKYo?A|wOZzab9w%LbA5aFjC>TFVH3|& zY5LgE%~1(zDg%%}Tqy(&J)okBq+Y=9i`Vty1(49*eChJz#iyc1sps^qEiek2VVuM= z?Uf>N!J;zsGc(jIXLZ3n;SnBgHg~6ay<;i;r&r;W$Y^t@*$o`^r z3dFJ;6xkxA(H{KdP&+6C$-^|bmP$U~{Izm66mKbK%~l&&zB8>#(W*U9(TzlrqOzK$ zX|;+2SD0BQVJ1j2Ds=$ps9wa49k1TcfN5az7=@(4T4tU-JPeJewes zgzt{f5)dQnEm*$Pq7p7vhxA_g*g4sI4D=%*z0tT8p0~SS0dL%MwNk?r z(!1>qODw1^i#2vx0)m(-B12uncMwSIwj1fM)qW@Wyz=g7b2I(EalXAPUJ&3#;W-c~ zc;kcZJ?izkz>d`ec-@4DqUS)l==R&F*3SPpDEPN-q|Z}Z=Rj(?^NKe;v)7*!&_w> z4<3Dyrh+Sfp|>aNNLmh^(xcfPRw}W@06iod@cFiKa0JEABZ`-gKJ4son{pF>IlbsY zfI*Ar=S*83B5r5qU*9&ge&xAl3wzKb|9&?So}w@YLM+I zR8=~P7j$YjFblXA_}5Yad=7;cQ2{)gRIlX|J$UcJFCh}sX&0;nDQ1o_0Tnu~q?Pd% zCNNfPWT2d==lTkziJ%aJ!a06z$rpBAW+Gqibxf?ieU_G*fWImh^zH;ma+M{m$4mU( z6Y0aHcwv-9ffD%(W@Q23d$!x%bI>hE{@X#cQM$w*C`8t!!{vgW>e2<^s(dbr!2!Y` zlK9X7ArOfYHMP}~b>bR-8hrb9Avs6*C3|0@p#hoTPgkk_8`;Z3Eh+g$fk36y2kpxa z?DERoqIlLRjWkMxI*c+ZRkoE91MKumUfX5@zp>XyA>%BX`4U`FitLdS*g%01G>Ymm3cp5RDxITz4Z8_ zD9uoCq2>rCL_XraQ46aeUOUBY4`*PE>yX$GSndLm;DW?R-@aWbo?gjFO1=5<+#=B7 zCRdHy=@4}(c5z~rp#v#!RN#I2N>A^V#NqV_-8~5Of(WPMz=@Q~Sq;9qIrBDzxQQp_)p| zqeao8MzS4fU{b27>Ojj^)r$r;0jdG*v~aobv%Y``^{y|MNtLAz!bA;Jt3VM>T1izq z7pQbDI{`PODz0@@{ip^toJdg6*c_7+7+{?sxNY*elrTIGK-CMBoD|kBstMViczu>1 zY#4D2*q8|yim-UWCt!Enh;FlJ4_g=RptlOToJebZ55Hck|>EGRn zmJVB`#o(82>0>&Z10M|Fv>{06;lIVjW$?(5!+%zDpMn>iQZ5s0_X%>X7W_vktJ6+@ z-xp`&uYFjuAMl?q>~#FCQ%Yv%VGDs?^cT49ETvMfazUk4%D(yys7<@{k&Mog3-DEG z1sS2KcbIfO7w{wat)sr3Py8J~8SC48E}$;+LRNj+Ukgmp`A}*-e=646)xjXqXp4F5 zkI)n$Ig|>$XMM?(mxh8ApV1)&hWA|gR1AyAZ+Ah{@LC}>J}D)JvyXp#s&oBh`;*El*#=+@_k#N!Uv^3M3>rYp-u5Fu$!n1_a#*D zT0h_hkvYh~$q{W(7^-A$X<6+)1+m&D33o%Fj%o;6{h`jTNsO~rHj2dIfc<7 z`wk!@c=a?Rne3B#ULz%I(E)R~ceJ^e?5i}i3h0b_n9#rTP&68PacXjv%`+^js2z$Z zsjlRvXRad`fnvhxx|~$Y-d$Kqe=F(F9^e$ktu3cQN;mKH*g+$-h#fpa`K@V)xHSM1 zO&Ze_BRJD zlp31v_0}7kBn<@{#4apvvdaaT`Z4oKw1+@+il{*8se&IGWxiTW1%D@EEh%%S1oy2e z#93r3K?bA79)jC(2`;h|cVXCC8jzo(y#tbiq`jwtY!*xm8l}ZKCmj@ZVc54wI$o&5 zUA5IQ9~Z~~qAog((g2ktQ8}bg=>$y@%@nGgz^JwtKDPpP@}MjMPTo#CDJ1_S&yVIs z)Df4VC*@N7+anJCDi=e;}q01-YhjIy@0GjWMf1{kzd(OJ@Tn|xHOi7And*5_60>$*=Kt4 z$^UdwW1p2M9drT)!0f~x;nyB0a~j%DX=7CL+_uHjb}Zb)sREYHTBSvKRyq@i@=!V!DptjkT7&ew zWD}MmoI8V{G6!Y{Kj+?{h|bg-FaxR79@1sbvh`;AC1Mqo8*Hz&g6^v769^kDd&;2^ErixlgZP*HTsz3kwb35PT|*5_luM>6s24j$898)j z70zq3LW&I^AsLh+cssQ>`=xBL{~Bc2W^YzYMw-Cs`p5pKIp=%9{stO37fQi_8@4|t z2Mh3(`oCdYqVTE6Zf(N=GSOTgcMR_d@C&klwCFcjMxS&NGCm=%i^^45{dpU7s)nO_ ztAiGanj6(6;f)5$iIM=67ro=~w0i**3EESyr>9m5AAm*F{kM<+NgyTh)?U6;ua%8{ zA13NKf=FmTtcj};lB`CeLBT5$3|s<2ka18yJx}T9&^)?0@GtPeCzRMVOEu$br&qFh zfRCL|FhlUzIM~8Rk_MdcZ)lwy?z~Fo=6b0@ZjODw=%4^-TszvcEdixVlRW#1mBF>tzF(*9HV{BS$g_X@D1?E|h!Gx%*v>(+F*JaA#DQ zdP*67mtO;(^YdJX;ng@e7MrDU-AgW<%$>Z-rQp?}HyT_f;gzvW=UZjIbX+LEz5=QR zKXY@(AULq#j?|_sqt@uh@~0C1^Quy8Iz&dxOPgugFD(RbroR&3s8S$;Qkty`nOZG5 zt1svRR!z9Af~MAWOI7Z=9OAj;5S!_Gzv*@<0<#N=LvWWx&rH?1qovl>tt>@;v16U-Mb~?MuPGpNbV? z)s6#1_Xv$}@e^LS>9eTJNj@G0`hTB_6DqV9jHu9^^3Oq{^G0zObD8zFayR{)1kvE} zq!NsQcX5k>+X+mo%dJRNxA2al1e%Mx1a?3t;-#S^FAcb(POwk5WCbM4rd8N! z+Gh?bRE{A4E^5Hg_^NbJ*^v;eWQKdshr6|~Ucg0bP*P6_F!82GmivHX^h%D7fVQh6 za2r+a;IaEW5C->Pp4fpiBS1}*lT*|~+1x#Qzq3(!SIE8^+R5)WK}o6t=?#^R3Lbkq zhlSr?+_vu0ncwe%cz2DG&@z8alF;g6=rCGSRF#Ut13@dfvu&c4EJ4v-l{9dj7IwOD zFL0b4{QfV9?)yw@jU=SDlnCTn^yh)?Qjw~Sg&v291v@?%4SS>EhGHy45fvC#^t_+j zNQiMM@=O4z&Q>d3M3a?6^fA$)@X02df*P~o^3)Zh=E)GFXJt??)F2A%|39%v5}W&{ zq@@Jfd_rgG^dX+fp*88msU{U@bRbK!JJVazxp4q7s!4`w7rv_udIS478xNY!Uvv22J}!Ykr>fUW5-%{9Mv3w8?uWtXJfh?Bp}HKQQ{Q zSR->{+aM^3emwpy7ykw9`JCEzsv{2o~Xmg@>*Y?5ed&JnO-kCpkk{(@c?|vj!j7 zy1w~pvjm8aas;W* z1|w!w`o+4A_?2;-c2++D=RnB&)tFGoC2X0GE&NgXsf`F$jUt!wf z^##DxzJ0qC&DM=}qJY&T9bjqiQrDOK-W8}jo=V5w8B!SaKdT^uyf7LzDJ!*xc~KFs zt)NJNPRr`0+M9+?+Y_8{)l&tLrBt6VDexm!vYVFrp>_pCy&kfkGuc`Lzbh42l{V_j zmp%A@t-lH*NGXG44_vQ4pl6|eJ)l?JIIY({1DKLL-<|fV#?)K8Vkxw>*PdEwS&QQ? zA@%Zgt#}FIxbDZxPfUfiJwLBTht?X`TPTYu4NBqH}< z^VlpEtaK)%Mj|)X4A=lCYjbh`sLKb}vtie49#c|gLfDZ$6oqFx(6HzLEOJO`^;|ue zW7myImm*c=mfvVJ@qE5B|2)x9L!Gb;NYPppWV(zD_lzaEY7jiO_5CI%Rj{$T)l7gQ z+D+{VPPvE_L_8@oxL1%1^i0uYUZ_&6v`HmP{^pd!psHP33_do=1BN=7Nh2}YOci@{ zB*+HfZK18K$C7L_{%^yu)DZT(d#_0m;*h$)WYmvoEk*lShP6X^NtN%4HX zlsAs=D<9A2K^5kRetbVFx>Zz12G#VFE(7+c)4=R8N z-~m_w5`aPs29^g5vRF&LXv2zo)2S62wG_NDW>dv0g#{R@DK&t;GIAWTEjGe6jm%yh z-UcnZJu^#vW*uqSkJ7vqdwSzGRjaS{WPlC?)D)QGFJluSU~=xL8;BJI2FLLEUO9a+ z9#<|I;i>i_{i-z4uS%1Q>_MT0`?tkS1BQa+QLPF;9Dizj-IHCZaHb-2(HTn*RAicS zRpv*$qz4bweezgxk&-r- z8Aqw{f|MGs=1V=$CN$1UuAE-h1y=Cj9Ky@!VaB*-xpG~zh}N5GuObpKl7PdjYJjK& zW7KXG#RxoqZ}t zEy*%DPnol0fO=>b1WhYX!QF!ct6bkMb9ev_53xnjNnS#+k&Y4?V}Eu!&2Axa()rx! zeudQy(~!7==`P@jDS+_%8nTRHcuIJP>Y<=7(LDVmR7=W!_f{OXpfVvnem9i!){-9=E5cgy5JfO^O z*d1oyI?Y%Xl+=n%cGGWaL5MLTGIE)yQP2Q@TZtMEQ)XO>7#UOKDt5?$KN^*y#~rdO zQB7cOQL-P!o@6i++|xB*K+PAgH$=~iFHC)K zqCR(GhIK$gYFceMOT}kBg1Y}213$UA#(W%;T z%e0HF2(hw6Ky#CA#|O20Lk`-uqiKDq@<32Q-)sP)e{Jla=-~0^R;MGnXD)M~a{L(& zO}L;Aq?ALV+EfiGP)!7-Ukkt<2aen>{o8JbkF4x6 zVCzX=1085j@?y#?`1dWBr)z8#uR3*Aw#)T+n|q*rTg5eazETA zsJ&9z5}Jw#KRX@mnWi5wBeyE3Uw2Vk91T3dPN16V&VxUo*2n56R-vmGNS`^6Z-@{z zrE9~iZc6xtP(_Q4*PUVmh$~kA*uaO6A^b7bREP=F;HGTQ1~?1>1TX}P zg*EAmnxa;>4ff#01|LK5)&}Z*Y6QU%E)@fFR^0*cy;JPSaq6TRD3XQ+#wTd93T_0XJb(cj+n8^Pg6wpt ze>dv*J12hMSl!5bx)ETZa908ZK>&(M<_GdJU(xY%j92L<$;GQbZ)xIKz%> zR2)F|vPF}7)4GLrM?<(IyB_ooFb&paTLSCwu3SA)SMvAoN-e4@Ay_qUS1z8YD~tE< zN;|46Ay{p1SI+K9r(09#^!SnKbnCI`bZhEfyM97C-FhgUjwP1U`?U855zE%o6U*tH zJ-+8!9!*=!lSf|6qeolKqv@lu`Gm`P^fc>vhF+cjK?{2H2dwBBx?2fJ#o1XiK+ghR ze!L@kK8PgUaAU$UrGX5aDQxkFBBD|&Eqp5OGdI zt6#B1UHw8P0!E7kot;tHXROH;lb==jW0t>a@^dQxn&q#V{JhHFGtFx}k5!%J+?wvu zgeB^dn=DcH=$v&^p|qS`(?4_OXFjv6aaz?lR~UdbQ)|uCT2V#6nxd;2lh1y#W_72_ z2JKY_HLrhWv!<3t>!`~e3@Ia74Qq2?eklCDHi|;_!u_uT9=9z+&{F1`b8JjQJQcb3rh9-)jaPC@cq!AK#FOB0z347~&7n zwom`=w!JfLJ4>|f`rq9)b>4I9t`e>L^6#Hj%?EG;TZsl9KgSL1rf~zyY23hO8aJ?? z#tp2eaRb|F+`!6YZeZsbZeZydZs7hIZeT5i8@Np41`g7=fz>o_;PB6K14l3C20nck zH*o!3+`t!b1Ilsu#+C0lTs@Jh7#=O-HJp|*g@2GukYl6)Zl*ym$({oJE+`tRpZ*x%V zv@YRDWZ%Hv9y(7)ubH9I`$>)Cm48yD6Pac1t%`d(^ zcdvEht~sJmz0%Z;NUVqkpG2%(Ep$o$k)UQBc4$MITGBn!mmwTnjkI3jT(M~2haqy> zx9uj0E*qf);~Od5_~B}8{q+s$dJV5wpP>YRk9VJSTm*z)7(C8VuqUT#MSoA9kju82 z1^fwLIp|qifGpDE*9KX{QGZ!??jST3 zTTgaDj^YbaFN@@2u%3PS*bvymIy$T=U@ z+75i8V4x$R0kNrLmm+V-lb0|44E`~RqrPOL6%6=r+> zEdiLXx{yBn@xvc^cFKnR?Yuv~`IY>&4s{AFfuosU12YwpB^f2%vo&Vsi@N`C@7 zqQ&VC2qrf*{RC%!gQo)iZG%IB(?2^rvtOWx%8k)oIqT|ZQ?3i09x*SkqS-o!{NngH zXWak^Uk5`dk0}2J>`OZ67*)L}`~$9DVMYJy;jC*PaA<|&t^5PX{a~eY3;p(=p*u2_ z|HIfOzT)k)H-zs)4!fM!TvIgEXW>Z{OmDK~lmXhQ?5#|HR>vyz#~j$Gy1EntGAh2t zlr}3ko{8@YU0-X|G{p*&FvBFD*;CW#YLL|!`QDha=v=%&OOX&Jd$zo@wY$Das?Mdo z{Tg`;6QHDeyg4|>8YM;IUXIn6U^hXgTGP`e_~Ep5?f14)t?pC{Q*(vf@2#2qTXi&y zxR`Jz3h^VUkwrN=9Guz#rf2`^3QjH>r13ff=MaC)jMNV;XxA*gL2#@!{1`SO!saNx z1$u6$o%}%t>Qm&DjGZ_9JjJAfZ0!FC{xHV!v~K4=YlxfzVb3=|an{^txX4tA4R(t0 zM=<>~{aLJSr!m$OiX3LqMS78qE(-7;rzUh-s*MjhquTEDVNcicvKpLKMj5!+lNn20 z$|#j9HF#!6Tstqb%cV-^M_y`^Q@7jWXb2ybGH0M_f&bG%Z#qL={bh?-xLStVI=#`@ z9&4g7&F(O!XF4;}IpwxPEqqLgncV4__RRF2!;~{1#i^%hO-NR?!#iQthgJKaHu&Zk z#7(JUwa?Bv%?=yRtlCgTop2SZrGiKV5vAP8ls2W@ixjh@rj_rHuBjt8rIGekcWB|D zGt*dKI@%beY7a`*`v)yaa=#k!zwIZrtgQP6avG+K1PWtuI&;+xn1br&b!M&AWEsYy zWoW4_Yg5t1>Hl&Tm9U3lGl~?GQaAt`DnCIW@1R5uqqPr7N97D`d=#H&mHBdRG|H!S zpxg6(iVC~FHjQgXDx`sf>1#GXJBOS$-syPZknN~5%uTDV8KW3571eYz!O9Wg)U2F} zwz=k1IEn^*>C}2Hl(X zl=GH1Jrm8~24ZPF2B~fD85rOHx+4E>jj3@T;h(#3x;?n6z<(e8^m`8f zVC^8GgTF%j$LuVAiDO(U!9&UiZEIB4@@pi(q)zcdPdI6Vvd|SgX?~I3b5PCqGYnE4#Y0 zxmj6e1IPOM_HyM2u)};xNc)?v^X2r1bKC}w#zhT(vaa1S0ocJ?cDD7E_yQo3@n>3qs8)*XDknkF+K zS!#3VP!z!hL~v6*x4)*!m){hyaZXu=k*8b++`tIf@Z;<*Isi5n=jG&VWRa#!o?#Zopc{43mu3Fdl z3d@>)#@B)fLR>WW1sVA9%>piC@Hns6_yeo~+ucKo@dkhMIT6cF#EXFVltS6%0|r)= z!p#|=5Tvfqmio25q^BUh6_p2lvOCO?cof#y$|ZhLNkiMS(swNEk;tK)bRBD-J+O7# z^tf@(zZYShe_P=V|DJ`n{0rM|{yh(I@g0&)>_|(B_5Cxa9b*Jzm{zxE&%2|pc8Z64 zxAtj5mtC0y@!21^YQu8`+!Z#ys)m^WIg9XhabmB@w11&2NIQkGC}A{h@*obgUD}c` z+w@{|o_?JVOc-+t9h>VBu|wkcpI`4-);m`9B2pQ83{C~Z{Fl`aQTZgCtMCm0 zmo11|x62h4qO=ib3_BRt10Qm!v{zok9*Y67%sU+tm(9(cs)pA#hY7Un+g!Ip>;O|x zJLnALTV!jSS!Qdey1S;!j7RO2!8zGQo(*DcTG?4m1FGC!EjT~`!SCJff`)`Z-$w$v zq_Y&A@pBd7$^e+2xlkEheWCZu^3~FnZVVC-r5%@j3PvCSu(ZFm>p+x)gaptw-UCaU zDPTLNUvNp}hmMRA^_``UIGk#`CA+F@={iTk}R<3|Rq!!q_=rk`=8!JlI_tw_S8-8;~SM4TwUQLv%?N-YBo26q}rPxNvQ2a`Or!7Eip*qZ4mgdSrj=HOFc0wX$2=766sje1}dX?+A$!J z`iFo)7KfjBHe{gl=tv4;A4LkCk$8P7W3a`*GiXl|PulpU6ib|D9wv8|Srig7{d`Nq zknC2XQ1-ExiclVUaio6X)Z;_qj2#{ZTcSkrQ1P&&EQKg#{?#p4Gm;}_&*3_VZjvgZ zF~SJ@N0nkHr)6m#wNZ>g5_bv(RiXnT4N4uv9_;?jd<=5`U_J)1kbqc-LA*;qywecM zRo?zh3_yAEBO#Ik6GI_xE1MIHMc2o&A(5Twlu!}74#QX0lifIrNM14gus0s-#rSC!+$Wp!1S?yG7Mk(zHs zTHe{;-V?Y)8GVQj#t1`G1L~GIK6mz)NUv$#%>u={i9xN1L(h0Mb^RNzyXT zXQ8KOx*7zJ=XhLi_s9H}9>ceOT!98bWqZH0=Qu~a5c0bvQXGO*X4o*%NMtq#MC^=qhS3EH z)UH76DEq%UXXtfYKmxTJ7i5SV;msn3%tuJU=Evjp`WKBbzsE{ zPN@an%EeEYseB5OrkkN|YT1-h?_{ZDi!ISl)<&m<(w)!9JXC^nff-WGEcxd@L(usb z%klU|hyZTzlm^LpJ9c%f@9kiaL4!)GmFES2*rLs3?q2!NNCunFhzye%Ey_3(_k%>- zTmZ2%L-Tww0bT{vbp`YjMrsKiYL|i43&+g#?A-MK6K%#toBv62$_$C&|6bxu5=hu* zsF;`-{DWg_#62@pbou{8r2o+(QVQ;v0tM~Yy>FAG^36U)0QoPLZT?3IbpN`GHXP!_ zpY|we!ZYIk5tniB^sP?Xi`8niw7l-UR=x1v{vUm_ggOzc*2A=`-QwwTKu{vm`X1}h z-jg%-&6mqoyNRpZ0eUyk7Y#8Kl`^Te9H5&!=JKCetfEie$;ItC{BOS7re8n5>xM~| zP1bA$I`R0f9$KNL96(p!?tODqXJl8O{-92djl0tbdMNV#>k(}dJiTL zyh8+f{Q8_i3Ayakbc1r&fA^b2!@2I&Mf!gKxCfbu9l z1LX}=%DMil5ke!kK`HoUC(tPhG(T#u^?TtTRsjdr_*3oC4}Tzh!pW7pSh?F=r$6nI zO{8Lsib!=)wM~>YVc|n6Ju^K|g~nhZ)SmhePL1=y;xy)~+qgp=Ib+fRi=(+b)jGu* zkLrqf)#Mp8Vu=h)rcy7?v@9w*qG5PmvAw(}vPdtJRerxyagrY7-Ey3j~}ys4C9G;^58HL1}Y+8Mg@C zHv^J71~FK+6E^gCiWW;@>W`Uawy8sw%^@+D%Auj6LK^!N&Bzp{gmMpg%Y5X2FSTv) zA)B==K5y}wKsX&7LgVnBjinzS50ud~j*C^Ax#BARTE-dNIPVWea8H2Xl*4hKxxKV^z^WE=wtzZxZWZv>=Iyu53+ybA@Cf}xgzp{6iwg>4;a z154IuThhYlcH3RmiL!E(!280e!Yc z%Hv^51llx|Mm67zv!g!>lb&AP-6zj`jgZT7GA-rM6U7?8H0>T@pgA`<8|^#ess_wd zYp>J8Fwe&-RG)H1g_|nPUq@k;Q+fVtc`$mI8tiV@+SrQF$ zGnC^gw1Y_zNEO^L1~(-0TMv#0Pe%cXd%E>T#TeK*>t@()pG~#%eTVSPn?QVp9KA6< z@Fw6G1;c8!^WGNlE7X9IZY1hI5QD$IoO70usUz!8Rvs&naIARq^%5-p3^N`Z@GP;e zl!P*uPgz$c>uKUdPnd$D3Y1}|!dN3nPeCe@U9BA{udL+PhT`l#CAt->NOa-l)l|q^ zMXVz2kf_qj@={fE)PTZ4CMdz2biiya9)b~qQ8t`M7mhL02$V;byI#<={k|Z_F)i|8 zm3k$IA%meS`oga)C9cAevwX7As2(Wv50^GmRG4n5YXRqU>|3kJ)G6?^>-MV~5XZ@@3rIwQiDO2@4CTX4`J z3*DhM(~@2Nm6gB6?^Z5Xy<<%WV?d-N#L)bv0rSK!O&h$2Zf3KgKt&9%@g22urnGE!YZ{gTvt7 zEUSa?kRAhrSBS}G<72IcHJr_9W4L%oPivjwpwA)>jzIY_%w>YN3-C}wo2sUtm;v=`SrfcYYea3D=Ew$amhbE_Li;j0Nz8ee4w zXnd6s81pU)$C10JjUzuc=4M232cHi@Ng)>_is<<2xloh}av=@U4@jv1bs)&=DEJgW z(savqWF1R&KSp5_?oMFQejSA$V{FAIO7Tw}#p46E76+}xIgqXiLWT{{k2um>{NO~+ zt0jYt`nDHC~hrNz1Sm6FL*8NIa^l0iAFMXHL}qgT+5T$XI?8Y2@g zFu}E2R{Cu*=+Z>kM?}m*Gjag*U>Izx1ZzyE*auu2cKRU8Mtt3F5z}o9M;{*>aB4X^ zs>;p8%bqUU7v%a*%DwdtyoGn4k=~bu4#d^=##K<~K;SN0NMVnd-W?p&CwA-p6lm*E z!0W$)CcDn^NkjoOOQpvNMBx^0g_1JnLM=`5tai4L&jL(*1@Vf*wywnZeu&b*y&o3#qagO0h$JeR7W^=X*#~OSlqjfyKH^3P9@AJj3*v7C1v}r1 zo!OMk^cAp(3=>GX>A){LK}_$cVAr8bgPHJEp-DePDhosK%FJ05%H}UJ_QscBF@mI# zbKx>z!dmzm7@AtRX$P8~7M8%=8&XoZjDi>)Eu6i6y@mQ58HJnEAWeS;g zpIrp0`Z5{d$K62E=RyVXzy)lqRq-7FlrPh0NZrAc~O z=s+eT2xXxb1u?=|Cu#Imp!sF${arnnTLr5|Y-1J2(r>H9GgyV;?H*lK0K zz|h*lbzli?p&JF3#1@(uapfui73seMWyaNnCsXkHw3Z=0vTN*f)0Ox%4GoWIH*QS(ZsrylgeKPYGM3o-XHS zq!x(T7@a0dN(hG{ZdkOd3wr4>@L2E8WRdiq`SwCbrhrRLf{HfX$KX?%m2UFWY5N6b zwkw>p@F}Zeu?$hdAMCbnUz9q+!a(y{uTh=iV07Si0Z^`}gg__}5xlRgH5bGzKL8R-QDEuPGz6zl>aY~P;{4I3 zMBF(MMq441ucU<+T+;(-M^t$Bt{w=hp~7?b^&n}ka~B0E_CTB9f`q@u!WIbnP}znw zx+b88@9hvUJk284IdMcLq{yjx+LghiL;19y%FaonAmC=~rQQS^vBr`Oni1`H9e38>y z0@yGOuTgSiX2WMSURICCoW$!(s{9pdDSCi`&|74()1vAw`hnF`bg7r^Af|c6H(2-i z0S@t7+1Zbeb3uyA23=c|sX?ZvoWeHWNZjRrwi$!a1J>vFx9P*m5*!RCy%a-BA?cU6 zkV|0inLI`dd2y7F;dX9|f%9c=&jpQOW35UGaSTvbqJ+Bk;}2Zw`mY7SW&LnV{CHYA zUbW0S(XCXs4VzpQ1gy7G$5tmVc**ZfGMofA?K|47@Z&osA-|H1Y>}sBh*WE{MnbZ< zr5q}|6lgWrv@{_HUd;XMxU2&YT2@TroQk>^&}H)PY$5U*o5ZWLPL`bm`Ak6xJ=5;x zwgO0JPt}h`lN2W86HSlJ2j#PZm2k?rM-LwPhngz5B_9TCT2k%NW(nVM@kA*~5Se^q z6W@+;6N&D2CLss$6nj4tY2rdAQWN(t*<5+ik}dUaRU*T`LCF^S*CmnT-;B~Swo}`k zan}(L@#{=_mVa>(FtM9SJSVeS@2-)Oo{lp00wDkrmjs!Y)dk}~(4}auSJv!vuX2{- zj9xs?9s==P&ri3PEL~fB8Nyk2dOG`;_OgWMYcD?V*V|txn{5Zm7jx7bm=+bf=2a4Tu&HPgd%7b3_r-CAk!lNAYgC zIf8PMVUaWM=akhQ&t@<9*(_2P+3zS@$!JCD&y=bts7U>VQqzQ|0_Il_Mv6=Y(EkvS zr79xhH*Tz>7$WQMlx3xIvj03Z^71P)=Ut|{D9g+Rmq{#v%z7uY7QC#VW!5_{>lc^h z%#d6*500bHGV6bA_ejntb9hY5vxCgw5piN(Ip=e-OkzdM+jTm?)Q>Kqq#s|8XM^+j z;xkss{=yTN_V}Vpzn90?Uh+c;X5kUwX-#Kzs$p?^%h3 zC~gjkb!cx7iA5N@K_ph9z33$tqCBkoD^omspoE z(fh=e=_u!&(@uG!)H`{JRCPjV1moE$RWf8caU!w^`O!-HT3YSUJaOuPIw zK7W^`_S&*i@g(Ik@YxjE^un<2`9QR=N~3|w-n^;#YK?A;F4X;T=Zq95E-)f!p=te_ z`Ok!SaFtW{2-eC4M=nCdQw7~wt$$gQA)<4XVf74kHy(U_oL=Cxf$a@#90&#I!d=j4 zawr?4|GgP#O<o`u~0Ia-J`-qpj%Pc7cJkTfJHQ69UjX=jI|fMA%azsixWV% zx`yaon{rhs8P+kur&%BaIZ*=&Z_{D@!bUK_~`J;UDv>K=LbNMRsow>t0G-G6iM zOdIjvn@)Ngw{Vm`n8;Wsid2#Em(gy8GN=wENTHeJ5&)EqABaEu?$43^)78_+wSqG! zx1GZVrKc9}7y+H2!KFuM>_UF##^D3TxP^uW17_eLCpQX(P#iE50j&oyQ0IZ{d`k{R za9_AlpkzrwwT5FzH^!t-%e9PWRXrj7X=)13@L}o-uPDdX7M|l%)DZghjc4zngRcvO zJ-pCBX?HB5cKM^BmHa|~kcw9^m8L}N#sRm8im^e7u< zmkq@(Yp7$qt51l2Kq1ESh0zBDD^p`AV1_3AX}*A9W{8a%G~{`daU#%J5LwDEo$*(D zg6=#R=_ePkb~lkS+*1LKodD60QPl&<@y#~b^d(r5gDaS|d+k|GIgeO0u zgr3R}F9%Ozjg5FIQKMByIz#zWsgO~?mTEKe{}nT^r;@i`|hSvlYcX>6cF4eKQ`Mh z^Q7!j=n>g{Dbb_wvW| zVx-@8J80-Xih?C*ljX39DucstS(}jD z_bOhXF5_m#@q(-9;wlDgRSekbXEJQ6!6vKSI%u<99kmDDae;yX1be1p zX=dh0RuMlX%%H4>{ICzf2X$ao>nSxMHqGf_%Fk+9-5pijpepU4L0BS4m$hxNg9qED zwn2Y68>89bM=|;)mxwhoPVr;Y92rMW-+tJ9MbnWtChj3CKGR>|)Dslo`qOYhgGZoMB8I!IOwVBj3XZ)P?a4H zhTT>^@FwjrFB#jx#io-@8b&hv*~A_5qqbh+J~!JVdQF#$?Dgv^nJs%L zcrsAyM>7j)tMWf?DY~|cYolY={whi%7O^1I@g?}b7dDBK*?p;ncXF;)kZ^DvZY2?qRX^KSyNUD(7lp8@ z^2I!br66VXVTQb=hryTY4igq%beJ!>;xIcI%MJZbtTl8uzR)m&-YP@a_LEKT&+40S zxQi3Y6DK!=3w2%5SCv3qKJ*6cg%^_5TJQ54y1j0w+ljqyjNk7S$L_juitEOh#kHps z_;1K%J#G=Ao;#P2!2q864B#jeEaGQ-AKF7dJ|)*NGKqz}^mJ%joP&tFCC-7JBW_B7ri3lG(x?wx}End<#d9E+>iSfsLJccI{r&i~ReX+YY9lLA}{#d}rf zW~}s3s94;oGB_27jV5#pBjtZ?NOkyJ;AxBtyi0O{r#=@bF?h{v#7f6A&tqelWEW`w z6(e%?myX_9tmX`khN@>y30-Si)8wC7Ip-AwG!VVS+eIZM(b>k90 zmH`I#g|jH$zd_oXno$I^k^0CfpTjTcd5eWU7kT;Oc|nfD66phaJDug$!mpL2sTVeb zx{+&x#6GDOH^T>3^c`_z^Fmw8RrO~-P;FHLF$GxgZBwP$bm8I2%F_86YNW@jsm4&- zy$s}+9#`rNC+MduEpBUwf!-IvtyABr+VD6xbUGjn&HRp(3~OLLb%~cM<*$gRFi?AG z6hJ8fZ&AY!VZ%OFNw9|2&;iUKY@7@~`??SGe4X)L)wb_dQAupStVia!Xi!wXYTs2p_1 z>~Yv;FfTr(u0zEi{;Sh(cE_#u)cY%Ky75D-ZK~0#l&W)tHu86F3K84uwbIt^W~D|= z{F?&nwHxd$c6QDtjjqRdtZda&vc@;crVGgi|ND?Ty-09Vg{cMn`*td4v)`B@5f~c7 zC>sG6AaMAS%;~;#bTjbBdsB`+W@e_i-xl}I*%=lIpiMP1fcnWc8)*NgW3{a9RM(Gp zw&5%vu7_(iWc-b%fo{mG%dF;i+^4Z7r&N1`g*6c7ob%_Jld~D1vDRhoVAz_yy+h@M zGH2Tra2NAvkeX8b`Buz3K53l(_BS5*nb2#?>@8<`a}x)-1Lj!5ObkgJg0cP=5q83^ zhLM$nV|{1!zwhZgdK|ck`G&qzh3Q@9=KbU#RIr>M{`U04-}I8@pSO0U{P4HflJ-6& zoZbLYtKMqgFd#(bKKL7j{U`N9jrKexhf_3Yyj1oEGX5Ck4r)OkfE9C2LH9@`WJ zRc_*vO+kql|opJ8LGvaDpJms~Mx6v3*-k=V45mFQ#qrJ^?lvem~ za^L@4fRWhAW&3mC9;yHr_`c}F?I;)CZWChV`Q$-Rkiu_Ifl*N`JczYWc(`eF$4a*U z6u1et>FS9xP^-YC{`~ahdth1b#XYcW_t2xO@JuUBlFo{5*lcVshx67A9Y0dHi|2H7 zSR;j;^B)`#K&#DfHY+su?-uxE&7I(N4gUwb_D=ue-*@=^oDbev?_4+9d0y@unl5;G zA&-2@7pk^tWZ%8?-55uMeHPG?8L#sD*>1N+CT(802wmwG)iuc`DV$2r$ayEN2DoGL zD|pY=N9ItEk3CtRvXJU|^(nBbVQNS-Qyql5W3^NlR$D5ygz9hDLG=n0=aIfF(-E2o zV!BP}O_Q$np>cXuJft~T(vB{2r?5siw2rWpOcVKKHeQ<#_5tn_gfKaImx;;Cn-ay5 zy2)G`;iwq|xV^j7j>>v%wrh+=xx8{fZLc_RtY)r44nY8j+Yc9ykE7YU4;LhC;&1#8 zXK&T(2IwS4?BZ=Fn!TmV<1I9YZhxY$z~WJflzXQO-z5s)aW>%YsPLUA%!!cyafW= ze)DvO^*O|Tdp{~q)YDE>Jq<7|YE~~YyRk@!P)cUKD{pf#YWUGG=9|v_A5S82;beis z_EkCea(hP_n|IOsafE-}LfwoN%c1qf2J_D}Pn$GPH0GN$<~rrxq!__iMt%=k?lR!xt)~!)1`M=Rog*_SMc}f>(_g^OOUnTGDaYu1U(FT zaq5{IQFc<97oINnh+vu#+Q;QXyZa-b@%AVYM;w}0g=e1eu%_4pEa6l*A1b(d0nC}- ze8|vZ32@R+3t|@sYG~b5x+H&XVwap*dx2ST7SHnG8dl}9m7wl)mXORDNGLw3ErfoY zNe;Meo><0#QBzj7GwLpnWy1H>eQ2QG@Six?pX~r)ww<_oQ75jxvlB1xz?JEMw4vj3 zIjAX4Zi{EHXjCcoy?vlwSE||+IpGx7W=KD}{2=V~-L}GIs}r%6ioS~rJ%sxRpwKne zg4Q~y#Af(LG_3X`GeD$~!HkfC5GIDEkW131CE5haT#DNf6TD1fH4Fo5ESm{PI1i+( zULw_*(7+;T4CU?nu*82byL14#F-%+zq#48k@x7EB9+*H32PgNRi?1Zmt8mNklmX@9 z*{?+UB9$A~M}bGyK0G%}>+=ErdC7=8d__k!tm$9~j-fev#3^1j7=n)KmlO? z4pKH1{Pt;Q#qmw+F($Y6zgxr#LWSV-Ag%?&>)vhq+ z`ZSZy83_49oN+|FZ%KdU`It~GBmSOrr21|3m-3XPAlzd=<$(}5)^#oYki6|rz54WN;N5v{att_=sp&mZm;?)e^2jeKX%s4>y)d9jVRe~Zkr8Bf3 z9SelshR7ep8}y3XbMS0)Ug@KDa)Vw0UcqHINn7^ zuEEk!u=>gfZi-TAj1`WZ9>gN;#^*x65u9}J+raM#zXSZPbUqir+@AFD-NtVNza9Jz z@H@iq5Wg!O!FDcbHD=Fdf<~xJflRcuRiwo^d`PWHmf>3GD0NR#_;jxyTd+ZO3h`Z3 zvWCNi^VE@cnA607+FrM5D$?+7k4|aFcsuQAquCmCcVBSL2S`)z(zj25s`3-n5Th@Mx@_ zFs2cuOFJvVwR||};!59+7PlkiQh7na+utd{l=Ns$YR@_OaKJ90NF>fWiln3b?#be}L5O-%H8T7RwSVp}Z*b~Wma zMl*u{UCf<|-bWE)^Kf71CvZ`Jkv8=rZMsF;Qrs;TX_MDxQ?Jbxlu4NZa_JX^JH3-; z1XS?5)l8` zFKv1-qd1l%$S@AFnuKX2V5${F%JO?PNOXK>&qIaVX#+=ddaIwVX-%Y(h9;ASW-4i* zyl$kY)y~oU8=6qPz10H(C3GV-#gjL*w>QSEw&AL78wPA*SQ0eRU zl#zZr(XYfhN{)HaR>m5*TDIt)GY|5L)C$g3T{qOsp89*Ne)iPQsru2@rJL%fs(wo9 z)xsEfAaWbR91tcYN`SPTe-72pz4|$jJi{v`k9Tp-Iw7hIJ*LQYV3>^_*JTpVfeQIfYQV;S!!%2{r}LP|H}i`*#1%xW*fzhW@ooLWgw-1toeoD*Oj6@_# zh-}MPuEAPxZCHn{Lbs3G)NiW9&%CFw3qYl#wtl4}fjvjTG~eYw(NqY+Y&$zh?aZ1< z-CEzSudHw4TnOmYD^-a$O)gPdO_s2X{5FZ0x1;xK_y-Jp8El&?`fmC0(N9@GIO=M( z^l6c6T&HL}@0M{SU@doM={=O+cCOuLXLf(Pw!TX1a_Q4vg&5R=E4x5tXSQR-Clxko zBsi&bGzeY`Dj^za?KJyvms7Q zZamPy<^9dg`bw!>L5LfA)^p1q+2#Dh#Yy?I38dUHu5`-q9D{Tcl?b089=y65Xva^k zz`XSJqV|<#R$HnlIPaX=HT?Fao)8seKp+4J)S_LkmJaKPg1c2gknojC6;-w{#3F@& z^BOt{7%#7&(WwHs72C{J(@b@_q*YKcCH;6W~zCtRwM(4;GUu%eR*e7QY zjc{w;d)icAV#@0={JIA z+e|6NJ1^68j;-SzS_|i4*$lHj#<9syHlVtIY1-c|*GtRG!O4Boe%JPw_Nt}wUU0JJ z5_Ob#n+fH(=;X3VjRh4&G^LXR^-(&~qhF?KRv81`+Jciq{u?*1;N*z^tX0c(9<$)& zA48K++T2|$1t+hXUIHG6uvfvs2Pemzvs~LVWv^|5F8j$;LMeUVX$^M#z`t34wFU(yhKR98RRgrF}E zH%9EhEcnu9WgDh$Hym?UEgF){-`Mz_J`hM;8B1!ZsZc7Dj*rCkDvwn;(j3@8WVJi~ zRs1i9=crsOznD3?3cUcBkcNoIP;uAV`bf+Ep)bNS2;D$Q|r3kb4|r#g^A6B(s2H64^S z7DZ)VI@qzn{p*H2hT>l}@F@fS*N(1#MTy-_gylJ3OnM;1HM-yFt=FaFP~x+(zP;Y1>@7P`AieGAGg06!NqNR}WZ#k0GT^K5p1KLcj*4%toBHBf z6)3%NFGnY9pAir5GfnSL$ z0XYmP#xMPIN@7tA5eqFzez_k~f*K;p5ZtsiLr`|U+ZVt3%v2%9TxrR0+4*%ZvYZ8h z+18jZ!@uQtAfa+1+R!5NXax{k3u}s*Nig5FVblD%jF-X~lyXGxK)r9kd*3`*=ELM9 zy;(|bv+TrEI+>NcbTa*|lUa_UlMgAnsb+e0I*Y(nx|OJxjYNafivx=taYC-id!8sS zA-A+QQrAWydI{`TwS5+NS)v?dC@!nf={msU*e7dJK+6Ve1y&i|yYoR`YZ1r3p@bLl z=z6JeWJoTL%W0vc=CnYIbyGAi0{L-y2ka0e0!Fx%mF*Vt5_9ZZ#G_%@%DD642HcNW zEf9_n3|i?Y9=gUO+;mqrD;~ zEhu#HT9&*HA4u1$prg$gry=SS+Q(EP#E#8f8^u3JYp>1ShzFWSn7Xi*(uFnd0{t74 zu+RkIs$Hh%1*Mo)4lG{6>N>q*{Zy5y3lx{OECSk=P0QSH_;o35Huc`BK1^^Od&x73 zKCaSZGGZCtJ<$7J4^(tS9#*ZqL|Ja(%@NO^W72|vSJ`I6uu9Kx2E+ykDf`BRn%@1T zH67WSNC$j;`cLRgElR87ukFSlN*}R*PLEp8)b`i*?TbHtICK8;4n=8I{I$L4c~$%q zCgn6)!C%{hT_*R}k>OFx;w62g^x;8RZb3or@ZUZD`%2<##g>-yf{>gsrcY^ztp0BT z)29?fN4|usX+&DZm`KZeQjxMPbqK6+Ib1|y=Kzc4wP)rfC^BBMj!uqQAyU7F=!}tp zOv_f?n^qaV&$i3d(=`bo(bwGXv8ZLKqihvW&oyeQ*H2XfD^hV2@R(_O;nmz>znE5d zX$256NpK!AS;}5zdMZC50lZV*&ylZ`eohvP7fcd*q)8s=O6uh##2xN(8wXccDWl&K zNVOHHMw|cJm*fPvQy}=!earWHby2WE)=7fxy-M@9e3t!r;qO2H{n!6l`1>y+$I}u( z-Kjv}?>n;_l?puxh#y;_dEQjri7~T53b!0*5Otq@R>m<_hMSR+Z%=YN2J z#S0g*dkQ=5W}RYc3p+2w#pbKDR%pNB%oQ7@4)L++@kwt3ijYkz1ZKS;{x5y+%JokH zvVFTRiel~U286K|JT~H3kNfg_B}n6%5rsO9#YH%3$0blGYImel^l7D}y1%qzVi6*! zbjk@rait~8M3J#2e?tMWJ+>DCtvwc%0#0Y}lN^^jo%y4%+G#au{nT_TRd!@GMH`El_F_98W`_U)A>cM5%)4^?YJPMo6q13Dp@z3 z^9F|H!}NH1@yGeX+a1uz@n~rX9rX6_?YYu+wqQhVh9wGQlh-O5Fpa%P=xVgIHip4U>NRjyn($YhBa?=Yf)>~lh66Wn5+~A() zDnZ>oYF#a+AtZ=G9}J+{+|z=exS`BoMe$e1*1mNk#MQsTHhsAbMH@b>JU(t{y6|Cz z?!U+3%3C(OgYB<@3JeGYOvmr%^FW}xzqYrv$;+qGWfgkW|H_mO(Ub=A_$bP%zDzFc z!PwG_a;X!+5+S9W$h9RnoC_1Clmaf(EaW3;eR%wn9tuPliQ*Z0Y>F+(hPJ}<+!287 zOY9&D>x(+A(6V7TB84|R3h<}G6k_`hqQqk17f|jPrkBV(qY5&ONUJ(XWnoIwvMI77 zJ;e$lLwXoIwWde`Whys4qdPYq+Pv?Vy0c45o#Jtop#PAG={3Km|?4k8yc3h*(nta8g#$O_>j$tM>3{m zMFlF6`MHW0w^1VMjJV}wwk$2a7L%$Q1q=LcIRg~L)dI2lj)Z%Bq`a~v$_$`~W-+PT zQIJW}j*Rzwa2#yV+a^6uRy29hp3f_3ZqF;9i!Ycpiu2dIifBEINfma`f78B&qCF0) zDW$Q+W*+dYHARORd?Nh!^h{-D`oBSyhz1>nb)q_T)&NOBw!e$0R!BsP&$EYS&4hCwdcFrs&vs!cvkyyIomk4~#Zs&rrI+@j^n#9*p6^L1yDO#4zLc^$Q;PNG_3LEa z^q%A=$pRg%v5l7Hoq*rlF zr4niUR?wr7KHBx4)&E2tKW9Mx!vC9hkiXPR^X6uSv`|yD$4C7)I%EG{l^LsE4);oa z(jdSjURagTWv#AmUdlHsj?E)!Fvy%G5#<$om@d|>#{~MT-BG{yoyC<$^NO!p|IxcugmZ#+a35^){<6T2u4Cf&(z_gc?zV0BOYW5qHoZz^RQ2DhjRz znj9BX`W8AnwLhX$XyNBKRM-^*yO1wD-!IZ~-i459dvD?AM8{kvx|q^4mrtPxSEO~C zXS`JZoSpMkPbfZY)7q zTe|*v5IA-++4HRdS#aT@c0+|M9o={~J5+ z@51lvJW&&!x+O$Qq85iNwLKZ71YUk#kPXQizyzQi#%w4I+;bgHD-&NgGW$gX=ymDI zQ3tC_F1m>;=Zfvk`wg|}j1)!f{S|K0QH<Bt zw^n#!y|-!@6}Uq&T+oMbBplw2CWtc(2qY`RJK{d{y_oO3#_1vaAws2U>MJbW+f!st zJGHvIZ@8Ed{PA?}P{6AaN<}l_d?17y2a<}O*cg~~<+QXi`*jH4HMAPV_g?I~`uI2} zlB{(Esxqu%c$L+db#)J)aw`E1u+gV~YI|Bso~6`EYLRfoI!Ok0Hg?wHEhnSHLDvlLe4%uIf!GnWnp*bS`ch02^=HZBsJlnCd} zG9{bOYGs9pf`*#h98-oAjj$(A5>3E$F3{V8Bx80BaGUFvz3DV{*do2D2^!u z2s-ZTwVl1{&h9666r+So;Gblx0(M5W)wp#H$>llPQg%y2i9q_|xQ>Jjk{;A6siGE^ z49EkYnOBkwh>|xX`VCh0VXYawn%UAv;Q_it6LZ9eq!W4M zA2v>oK6@zW`@!g%C#>-UE8RgT(Bwr1arjo)#*olBNzlwp(TT)QDxUbL7X9c|@8x=; zrCOAfE!A0e;!5Dvxe`0aLvD+1q478;M4O*{-2zFiiaC<+;~58>A@hwrb0A^BY|i)%{@`T^n|Lv||tMY<~#;^ph!b>~Y;xyQ!= zZKM{xL2pAqjg`4n-8rnmBh+$brL@1fS7(JA5QnSIZM#dVMeR z1%s*3_pl7$-D+hE7}s|h7h_KeL8t94P)nf9N`*s$ zqglEqR@;r%9eKjp)LrJ&2RluQSJ8(%+i{d%>jb)ss0iEeK3Z&hD*gTqZ$5zXSftfj z=nwriQD{pq9bS>S^dd-CBgZ#pcegdP!8DlmYGhwF@(=gqh!HKF)Jmveqs}7=6R4|I ze;ZvMBi&kqbn7~_=!vET%=GWf_D}T=-!wOq z255~Mn}T32h5|yrn4pCWNqOAv$;-uy1|?jbP_-}8?fWx}z~JzfLE^zG zpUCjeo7A=OZaGaJFnNV=b7hCKm1#EeM(271p)Q%AmD27WD1lA(skR*3`%fQ|Q;9 z8nASN_T7WzV^j}W|5Ezy?bt=TT^G%`W$0PI`~(oAm8NO_(u2UF`PVL@!hh8H_Y`Ll zJmT*t?6;f%DMyl}{lW93dW|S`3XTbs`Z}9XgYZXjLVf+y+S@3bOkWd~o&Z5a`q|B| zw*Gb6V9e_|=sriBUs%c9q!Ewt0s{3!ypyMKGK=BeLi1^ClvnG!sjsB>kls+=#Zju4BSnF2_H}3hEP?KlKf!MFzD>S~L720NM3?JYV`qWl z-Vm&Pfal2In*Mce(Y*@;_k+$9w`pN1!3T!f9h17ZrklTJI`{O~-yRH|dzMOCzzKH& zNeI0z)0Oah`uno$fmvgTZJT-(u+YUG4!tijlr3VNK$K%HmL3X2gxA<yWbr|2I6IM$DHu`Hc5Wb^bk=+kCi2&d!Sd z{bct$?k6cOXlK}|qPmUiUNkM&uuIO`UV3NAM1B;d;huA-|Ec$wk=5v-jqsw2%y$ga znKx3=Uot*ES{>+xPOmjjQmnX{HOu6nXOVqZx~8+f_Y8XzTh7;pM@uj{axs%-DDRc; z8B4<@&}LATslUAeRY~75rgPMbOyqM(^e@|p+j=9$C};6|m(z?2O0sR{eml0Hw!d>h z0q;?ihITH7_{j)azJChEP=3!O$>QHg4gch*+s$Pr^E-z*i3c0iu(3%bI0D7twejcK z+S|xkg9b;!!pa@KE9QV+@lM!*52Fs~79G$l@dKKzlw-xem?u;)$&vY6*+fLdx(|g) zWmpfusUQ*R5)^QjP+Lvd2m2UjtzG5=ZSV5o!x2Bhc{$pK9a;Ry@9WiUr2CxrZp;`c zbkx4pnTxUNCEq0dwcx>fa9VjT+owu}U82|Xi-Xy-#N~QnSty-TFdx4x%_tA0cc+*m zm!5dtFXZA~Mdv?+6W8tQ*BkHCAZ)y#V^%;)Yw3&HhRJHb#L3K)^aSs2Wy+t7r>Rcb zgxkxNsvAx{U&_ab)4Z*Fh9kJP9lw5k9DDCvJmyudTuU7B)2FsAQ`n#xLN@=g)J0<6`(5jrX24@q6rc~3XlsVrhVf#7FN68E5>yNp5%+AdJjw?MRTPTkzujo{7OxIon z*y>vkA|$a_R}_hL+9{;zQ_(kMD;_70#N3a^F#<{w1Hb7krQ*rMZBI{Q29%mw2Gg_5 zI>1@@LboU~ky%u6pmx$yg5Op|y%A`VWL%a( zK3Ilh%mGiy)J5(xR?_tLm9V^#=>`L*Ei1Lra--Wlh1ieiLwXLhIE6WHE+2k)(DtyY ztqDYC8oJ>48589V1ff5kr02S!tPj(WhZ|3+jS7#SQY>$OB-q9{8kD*e?mKEPOCAaZ zR+3aPN}-3oB0a<_BsDf}9x+Ibo_V2UezNHgP<`ppWr4*(KWTI;`0ai(aSlujUZ9hJ)nKhz^9M;+7QldEd zX8_Lj6@ilpx)+eicg>*DI=i&M@&!KA)?Yd_NA)tbr6rqG3P z!!_Z3D^d-4u+M$^1(#ZpFMf$8thQuk(sCqiU8zG{afKt2>0d_LwamO2&kUah={jVX@$Vd}fktYv` zVo*w+&?9*QzG4Cea@`ukz_#T_)dbmMndXvq*Ya($g;SP8R`lJi^3AfDw77kPguLdN zL42w7AgD-T9r;trbUZQP@XszpEWlj;r9wyAQ%9sx@r)YBal$V}=CkqllK7WV@mtaN z6hcl`+|QigX>S*Uh;5(8Iu#U|vK)z6L>GVOtfP9Iv_m9ss^{6fW2rMiUrkN&K;$--$XDk zlipD9m02wjVXmTF#yakTza@i_>>SH%)R{xKEUmezY~~{Q~p5 zA;ZUaP0Zc0QGEvW`|AEgGCOWcUzG_CF>R`iKNEurH1DhZs{=NiLzc#_J1GP3H9rYF zF@&n%CqF_;XjUk{WS~rKZ5?LrT&dnD{Gi7|N8Q^+?8kSpEx3m z-?02o>a3e2Lv%VX_|_K)s|?o^XAoE(!4J!s=I+ya(-$&}Zwe2h=?F<+;mkraty1-O z-iyI0+R)HfXthF$7rIIG5(=tu!CpUDmmhBBlv-8ZkI?CP)RG?NnAg#w0hUYR{$CVv z0}?9T!uPM#T-M1XNxekyUHV-izd11n*eiMEsycVfD!$O?!Eb4z=OpK!a0DmOQ&>oY zmeYeBAr8ci^`=B#q?N1!@7XQ5S{gzBz1>>6gD?smgCnE~@u6Ks`$F~B=-cv;O^s;G z5R`6(+=Y8lNZmsF{%9hLxu$-(t{}D>kTtr8>N(tSrcLu~Z2{K!n;?wJ#J5EVk#&-& z8ism@@v3zCnyx^UNVLibYno5wfC>S4)nl9^SevGG)L_NGT^@%IQC`9BY13bR+#8=o9oTGM<%u=RD;V_Z_f@XSXZrY-P zq%de-*3UDsBnf|bYbqJZ8d}x8z3?(}D{qY>7eT0C652V$Fv8wbK5d5j#A<}GjW}Yl zFc}wM_n811zHfO0aNS4&@SMmS$S>KD+KIe@Jm{uC#=Pts*fjww+jS|@xe}8x7-coX zKztGnUEj9J?M`~DO#Yb|D)!KCGWJA<^WSfBS4BhFw8vx|iVTo0licWg$rk)bfN$=@ zgIQ_2Y)9i$T4vp=ZeMgS=JMT+bpk{m(gxsIj2yfhn&b^X*+he|OUUb}Nqr>?t;WlI zZ1|%P&p(0(KJK{wz1F{9MkJhU@Hs<&4MQ&~moufXp2kM+qGo+GJU@k>yrB#;qpC5@ z7_w(K+zD#5oG5lj?cH9vzI?PdPtL~dL`*2447*Z`UB9^4J6Y_@i;Mk2#bmIfDe9+H z?RnWSeZvTS>j3c_f6LH#1zs{JUV)6^&=^_`wV2NI@0I@THD0!)u5O0ugVkze4%Y5L z6;1njX?OQvzP`R?x5?RaMHUi8t{T|`kX23Z*)p!4%yB!{<5btbH!mEocKT>Jbf#@; zUoR#W`)~EiUU{JqZ@Nl0t-E;v8WlW+i`6Toass2s%N&JU-Rv#>ThqUH`nRHgPxbGf z{{5za9Ut&*1k)r~K{se|rYMH$J=Hj(>jcnFG&-Fla zc1ycx-v0JZb&GhJl=k}o_8O4QPjCT!@8K(qEVuqlIeTNWB{N6tOIMB5wjQw+{k!wB zksF>rH*$Upxs`imkEz^F?~U$4YLS&jCVKcfuWWOP1zBR}*-ByslOtySR-wLPw`D{l zL!7shz6*xANMCIJWkO$T<(@*@yqRA1;N+K##HLAed-|!^>^4TDspFv%5Dv#psOTW5 z2#X);O69rQ(80h};`y+1CBH8qZBxO20lS6|mM!L-NX$X0DT8ECmV`=nxg&5vLK_V` zwKujmP(N_AVz{8WRckEUyY+$L^vK0rn-4SF{vSG%?luE^`7Zx zYSY~)#M&>0M|Q#{Pw0t*Np#0$LA<=lp0*F#kfe2@yELG#4?!*2O~X{`pO3qfQ8i*9 zj4K}pqXApR8b}>0UL3JuQVT|o5T#5Q9L`RR3#U#P63(A68m4^aKrq0>F(8O15{Oci zYgYBmMOlmGM>7iXQI3}vxMO9wK^fq*bYtMWCZ@Q^(kSUUz=bN;7Hpc5= zn+|23=v@kFcZ2Q(<1l3zG=m%HAGy&P>wP{;5xP~hw%%;Sl4!iu=uF@;V68SC_Eg7s z7C#-5Ya@3!K)2MNqh_Pqb|nr6!)|NaGuT5O9|zS&t1}*jz1boEL1oMg^=!a;?%+k( z)F;RZB7nErw{OmHRJ4b0;CX5KbI=mm(Z#rTs?*QH3)@Iqr~JaQH^{YYYCgCMXXh4z zbNoB^OR*`Aq*-$!Ar|6?tC@3pj7iD0^eJ^8Fch8^rURO|cB_x|P*Ag|J_5Cx3cMU) zR{vvG6W)hcZ}6Mdh`Hw)fzA)3mo`JOI$cM=X3x!uf+h^ra^saIa%jyB-OB1FSJp6P zWp$G)tLs))*R8CsSy|l)D{B}#VHSZbyHG zKRY*-FaGeu(;vYql}5xvTBcL#;dQ9ros~T>YX=oA2uH+GIsA5>nxkINQ9-;}XvhN8 z3kJiMYSlt+3N6KxFdQ2qarSoVt-u}lnRg~rq30g_t#dY&Qy5YBL#VpOb^T2jRvrsN zqur1b-3q7;?_BveR6Nk1cNiz2%Fhm|o~J3M;opZ?pqvvZX#(_(^stw9Bh{G2^%F5+ zF2pC-xQ*Q!&WVH-`hMy_(ZH}`w0b2%BTP^$Xrz{GJ0NMq6~g}D4h^@FESSLK`7mzu z)V8L9P^Ys^pe^LS9v|DbF)jxmdBa1xwhJV&UN{_@88sakJ<+{v3!`C}e39#46nMz| z4&wqa+r%CkHb&&1@ut)MN-8jc+PmBB+yjXb;EL*^0WF5YK`($Z(mAQE=#hQn3Fy*iy;k zqKawD%{f$6@i42!Cr<{wf7=`}uVs(H&S;lrwjW8>Sa*Fm=z>^>Mja;iNnN@6FlamZ zWJAvOy~tdB)!^e{KrkVBOYJLdnV3xIDWxhBgZxF+35klUiH_XA2)_`_i6D&kgj6q9 z1k0J_yU)&9?vuU*uxDVUEkxD4nfLt&-%?Zhuy(xlf_dFWMibG)6MRxCj6w79u|al7 zskezwtcIwr^j`5Nsn&RaZ8}Q#KQV&aiY9I%_uxk-LFfz1b6|YAngDb?Zny8-F93PI zJ_Ywog`9nmnau;HJUWk>xPP6aX|J3W!YAlre|mpvRIxuf!yTG`T2}qY@q>4~hG?(S zYMK=?nm%cdd;2)Jnbjm0+!}tRK3r~`H}vbwqirKen1X8*j0RUZ3dfh&=Y(^Yyck#M zLXfNKYRK?ini$BI@4W8-}0a?NU0u z8QQBy)vZP!`kip^T5j~owTPOJDWT~-#g`f#TKmc(hOX+9)ex+<0SL|4Hg8{2W%Zgh z_^X;VH1#M&S5{@6(6aM*%UrAM2}&D1t0P_~n&BshcBwIHbKr#(jAzCx@LAzXlmOkL zjwj(;4v42X1?1d;)YRHY0UEh(7@)@JuHT%Jy#SdUVKzqcX=<$Av%K9vn>Xnz!lPSR z*^-E4!8ihv0^yOX%=~Ani4&?Mh@(=;ymS&3^k#2|q;ZbzjT8SzwTK&E8y&ExxH(?7 zkE$*kV^~!qD`*0dgmXg@sBX^9>W_R2I%QVg5O5o>59k)2+l&Dt! zepSE4p5nwoC6UrIRu1sQ$*PlhoYTsazZKeXh0BGXarlWcYn{S=hbnMM_niV1QVo}d zIL)kruGHIskadw1!>rT3M#0DtuEOxCsGio2s;u9xcSvp&kni%arLEC-hl4L|UcbEI za{Cbtn^b;gIbiNVjY;9;?DJDTL5t@lEj}|Wv%0a`&oxJx_qb))Gta<2DBFZW0|Ee| z-KBmY-8B^$OY=D_Fm6z@{*s?t8USgqQm}IpIKv5uHV5MftJp;!2()1c;2WTnuvux0 z7Jn{4VwfuH@oSbC0E=x}P@xr-mkj>^`#quB0iGni4N5Z6Um{Ov-|IW>V6p5(B-LbX{St z9K;TQv0}Mnjs#@ptws?eV!S{AN3ruPH^?&sV{c)Q6ex}cq%?)4nR|voQ6v~Gb;nbs zf72NbIHtoA7`WCJjA7(iMdyz>d(627I+rZuPc7Y~pq-ZV#{M&@-H6pUnJV z>GDbQr7go__JvOatZAE17Y8DG?$&|TS8PNdD8esT&qico)R0Mdd0%wfiewuh4fmoO}KHD|ueA{Wr4CRsF>MQT@8Pxy*qrjA%nYtSSa~ z(A#41s}X~OhnJ%CeDE;??$(DhRwYrmD&M?5=J{x3d6_;_6rS0(GH@CN7|+{D`KwX* zH9DF9`SaTx{my;Hcm&`S{X|3o3m|5oufNmBTm13MXV|mqq&GI{E2sQsQV`kWrX6DP zkVNJ7IcW*~h<^GCKi2dM!=0@tY(#H!Z@$jl;H>Po!>#D2H(%8qSPq1EviRhlEI!R% zj~nDTM}6o=i%;t5ql=s)$gaGE@;AQr{eN!e%ARu2qbPM+*2+f0YlAgaao zDLENjHf0v6s(6}LUrHIB?>Vun&@j(z!N(75t?0K7PeE_`+{L44<=JK@v)xz;Yf?y#X+Py3SPsHBkob&= zG0zwLOcTO~D*)FUTS;~nzhge1gf&{3g=k^oO5z;}MNKq6&C;V*z_jtKF)ZFBgvGfV zCx-r@g-aqSAKX}B^amyO30(?oB)7PRa9{nD)DLLV7S)I3Gft&{K@M}vs8^MEd_3g8 z&y;LDl^?OKD5x@lskgx8z@sc{Y!FWQAPg54FM$G5)jax| zzJE(8+jmSWn5z~i_&9RM#BE|_+l?((ULoga$4&>kf*r-NDP|kQQ3{Z6qN&;j(_zYy z@3DUoQA1HMbdKz(&4=}h?KHRv?;AfY{KRJG5M=gq^KU<8AAC5g2;Kc)&x-Eo#W-_x;B58`ynf5U!jY2GmAZ=M zN=filvZSsXFWt;n*4nVsP8Hq62~vz{)dlIrD~oaE*RUSvwXq&ZkrE$ct)O70TLcv-WRe9e1S; z=@VN*M`4XSJMsw6QRMw6*oO1@wWMR(b!M6-=|di--o|7ctPwzcuMle*=d2DZ0! z{3rUo<+{Bkd%dMQ%@-&o_;U-KFIO0HcPUB;?`YxbJCYOQ@fvwEQeN4)@b;}ED zy{{w+>YBr0#P%a{iAEkS$nOaM9T`94H?vxY00#Uc?UsWX5@HqgzPqJ;cPlQ9w_@AT zwe#c_hdN*F@JF%Xo?E`kN3^f@4Gr=u&>$v9Pj_hCou*s#u-Afvc2a@e?KYrg_xg2) zNa2dJ4Y1ai?UTanxzvKZR_pwtSyY0IQop0dW^;g7nN6d69MAEN4v<+R%Gb`1C3UvG z+rB8xf-9WoJ^riRc9i)#>DK`21^I_wQh`V3r>SOYF=kVXBZwtI?XNGEf4@cKAPmsM(-3`*JLaXxl;v`y*J=Z zuJUp!GidRT1KPb9;0%pJUBsZU#`~?tu$2HjQ$G&d9a`Gx8aOZq+@Cvv3wh1PRRYs_ ztV-UVSzTM!Vuu8ln;4dD+TGnWG^Eq#jq75r;W|UP%Z<@RyXCqv5V&_)`^*;Ynpso1 zwX0z#a*b=cT1i`G@YPk>(+g0nR=pfFE6H{u{1~G{B&+~JS|b$>wwJr|Ji%j?k18YZS?c*U*Y!K!$@{n zSn>ssC|EYOX?6R8FEkA-mPeM$k~XsBR+Yd8^xw}Dk@u`DNv7#N=e+C8?8d6h$a`dD zWMo|2$<5_>(A#({2?A4wjmBya*0(NarE%x&Z>NNdP;@OMJziC{^{uP6(zt5-+bI#i z`!hU1u+-(+e7m?$DN0y-Cao$#-Y()ZdJ~{F?)1+Ssb<}{5c9x^vbu}t-vfa&*r@n< zOQ=de?$nPj{NsW=hQa5Oj>C9{Q zVyUt**My8e{c{K9eTa`0N#*Zh!L_ynF&oMlg#9nG4&OH;T{R<$%)3*fQfXFFSYY+Y zh)Pzdqs5L*R#Z(^)~)I<)diPqU?EMV~p5r%bvHB)M*m~q>wf<1LoymAgw8&)&V!{l-- z=n!9GXW7yYm%H#1bFH~NhM$JBs7JW&yXnkdR=vwY|a81fgN7bn!w05v`|p<|<-b^W%iKbkqBD8uIcxSnSi8J zBb`c-ECaH2yluQzCZBk?6p2b6t#eXKiR$0{u4DT`fxD&={nMf#KFSM9kJb8H^je;= zum6LsKjC1kxktXtblj4|o#x@o({jVQh4T$u)N%)*58gU)v$=-dxfG0V!{G9x(u6;Y z?wkuM7iL9)IDHT8;L8tXN zZL3gp`!N+E$pcI)&ft3-5Bd%5g_)|_R>2qC#lS>T;6l#a!OLPEU_Uxhu?>sr5Y7f{ z7%~IO!_mW7bZ1|5jlS*~US7|h4jX4eOSh#Je9y|Z@!~>DyeVTQ&(r{mBLfIIA(=}_ zCJL_E=-rLn<)l5jmEmo5I8OU_Fi56X=>_!+v(Ul4@+O60RSP~^E@3(qt=iXXYr!N! zu|!rCmkZLS!j0*ZcVW~%PM`_0rInK#Cr`H;C+7Y6bl(v$U^K0RohntFEP*Y8g`%GXV4CqfhvAg~DiC;{HYJLvoH>I$SP`r@^^ zBWO(dx%^RoFMkMalt1EC-Hl)H`4ONUZQT%^EY^9gb`3^3k8-i=Du0}BT_~1_V<$B6`9Dcc~u!@E->Lb zr|RTXt(=;ZQ?qi`K49wg*SZ6@X2ESZIqO!=rjxT_kHibSEKS3%>1y zIv@{mJKRjirbLGR2(3BnKXrsvH}$sM0vf%JwTjEu)7OnHvo%k>{eFR-mY>tV_4o9z zp)v=Aj`69g=iup1 zigZLD4H8uO5=s}^ zEhr$t?)n0T)v)m*Mgl1=*I-90no_qNtVp>X;;q1|S6PJcIl3^bf9>vc;o7Tl5%wft zv9X$IG%VFch`ogQ7A{PEm^hT~qAIa-mpCajkD0!|AT9@5NSwMLzt!hRe46f#C2uG1 zM~GpxfcPGMoo7(mqx(aouM_H`Lj9}vBf)Oh+mRemeXP8>ymOrl!QgTt=jSUH=@ZN@ zlX$la!rc}oef5F#Uch#jDZ3n#MwcUUQXmX7Tl`a7ZVu@a7W7hp-%BpH7_3jl*|L5F z^UzW2Gp14+Dz>@EkW`WN6|mloq0)HOLM@BYRjb!;ULCalJsd#=opl%i@}fm*)^&E4 zGD=wS(=j_G6Vo_rNIxnLDv>WpBAhpD=VTkO%Pns~qo2~mQ3RJ7*ukZOaPSv88h&0N z(zrW?!RAl+nChjxKMZO^b^?b4qw3}w_66Cl7C5^RFKyyHyop;9Z97bpUjs=MNnVGh z7$-LEG@gKKvBG294bB;17x~K(Q+Ek{1Hu2qiE__$G48-dyPLE>3cV~IW=b}?knfq4 zx~0h8f)?Wo5>ji!Q=P)}FQ3ednNOB_(8hihlXi4LYQCvXYeOf3u9`wol*Yr!?1AWo z%-i)`?VS7OwDGYVZw7Wo-d*FPK`sp{kHeJoDXN-qXh%rrjEmo?^INz&ux{GDa>?-b*UN^@8eHr~m z!JqvkuKX|7$rq*GGDJ31hEy2OEoX~qumq|nWcocOQpT?jdOBK}RC#5KN%8A-CM`K% zYGrdwIP9+5AL&2~Y_0+_1)3G4^id+J76|p4-WzLGoXUwEcO6jFr z^2bI!nMdBTxO_`)+DHxsZ&8er+t|)9AcRJI!seZkvh}2Z;UaK41wYO3!ka}GS@bH4 zuCnM)h#(LlHHlsrd}iNp+hVV!H>J;I7y=9J{xX0$8R7LlBehJX!Swyx6@N!mTbay+ zDRJ8XRq|&p{OZD#A(OXR>Bmo)sW7OpSc8o*`$6Dt?23BNu3;fdKfZ_tXwbVn`Y$wk zM4%L8=!UfN_V{;?f4}43S7WNHCo2A(I{vNL*({&*o zm0ih7FuXsbn+P(%Ymu`@HT;R1%h3x?_%}@idd&y`)pG&%i(C}y_@5%Fbz_nSiITgf z@oA=iNASYhx@ob;Y&dp==`m8+u^+o$fJrjGjpN67m%fEqmbPgcUs6IUwYhKNYyRXw z0|)f82fGsVWkOgciT9JBojGyvm^m0b91u6CcR%JR$G`=1A58G6@X{zEmN2s-zDl}jS&*Y7y{2@L$BF>4IL zf%e?mwuv9(TjSG-9GBp$kWWNlr*;i?NT%((TemI&fsX zRx6`P8AmGAInKxIuCL19E-&8PE=DR*7H)E?F$mIDg2Xm4KVYmi?Q?v_j4pkQenVem zx2)NnRtZftyj;j}e~gd9V?Qby`_Wv(ctKwD2O1(g2$r+$Sf%Cwzssy~2H50F?RQ&xSzyFfe{ks)) zV9uFaq3GO6l`|JLv$z9ZG1}w5o#>4JUNpK00p6jvq-GX%=;dgS{^FhJjQ-+P=p3#j z#B2#NIPQHaeMV@heQ1uYMjbp)l|ISxpJe$@vizq|d8ha%6_jE7TP#z}Tl?9hiF1K- zgeyCfgL6Y=Nr!h_U>X7{_Z9B-3Lv51< z{uyUB9ou#RAt)&*0O(b}fD)k;7ok$+V#C%XEJH26Ce8#8+!SY)311d3GS%Y}@#EIV zzwM7*`{UgDy=VRY)B4>@tdAGg?^C;`U!C6tj&?1NXHhzw1<1}NM*#ackPc%lmnMHP zqX*_ap|U$dVk$(q%yjjKog$t~-h06n)14LX?>}4b^;F5%`74nO@TIIsiGFTz3t-9J z3Hizeox9GIF+1oTK3dwgIohW0fr)St9Z~{Os0KR`wQB5yo zp``amEu37?VjZ-{wu5hq_G?V%(}H ziRO$ai9=ifyClr86krlwc>0%6S(Go?M&F#L+u9Y^5O_dPm%>KVz8*B`4B5piT1jtn zaG9r6Gl)V;t~03=5@AMv8!*TEK1&CIuzl>5af3<#?y)Fgh-OZJKy$ z&6vD#%aBD`d?>A)A3Qkp9Fw6B*S!HmZKd+lRXUwMwN0hvhG212S4-PC@r0ZcC)Sa8 z;-O=TPuXqo(rmqUok$H2Bm(Ytn!YzG%ZSsC_}uf}%^Rq#Cf_jksEteT^Q>@8$KO%K zk}D|>5!|158BQ_bLU9Sl+A(~*sqf`I@)$CPBLw6$j*TCdcbTz}d51E(c$vzJEa+k$ z!{?ODTRt{5m8tv6$*^D7YOacN)d@TcqFA^K`C@0fm|RUv?s2yAE~6R0PM)rQ`^M8< zeW+)!$70LzP3aJ8*vYVz=W@}mlIV9J50^c+ymwzE@jJ$G01^bmV88Ri^IILVF;;~_ zWq+BUmjsfKB|JOiv=M<4`G&Pb0_3u+mOM*>qu6gA?w(>koW!$}=GNiMePrmM^M}&T zUNCiAS-j2RcevihmgA@eUsZ7_usgJs$>vo}rwNCoNS_D#Q&&Lbu_6y}zJGM|%IhcUPW^G&<4MU#OmW3OYd~d$D6OKEfEh1;RYR-~4P*WC2 z#e)bK+~*qMD;Ia5CU_Q*Pj#^AZS@q<-!50$;yN#>IHf9;)sj)Bdzs+k@iKXuCHNQm zBds3a(dmI5BF4pY#J%AO+*yoXCcF*A)BrW#zf3+nOa>SM{VGpvtXC5*mS2}Ls|uQd zFbRi}M(9;JvdfB-<7G00mh9-RY^L!DQ`5Rta6CCCLTn(j4kAMnt?3h;09Jmqg)S6! z@+^^KGlS<0nbh(^jX{y#)`E5ktqtkk#lTk9MkZz>KwH~hS}LxH%oy}TNEcCj8tl#Y;cK^I=l-#3Pabwhe z$HLLycAiZIGxt>zI{fr09eF-zUEY083!!lO=P5I}=W-N_WyM3GpY>b~(kI^^iRY8=nnhoK;Qai<<=sLMD$4ahIkKWG-;vcd>~o}63m!JFgc6GY)ULacKGWM3_Y@beU-M0X zK-}u*bk*y+)lU=(g>T5;gA1YbCD^)6I9SH$VP9#Qq*=$-96uXX?dexNS#NzoSb-?b zoR(4fA?-C$P*iQbM34@xxH2df79u?RqLTCDbsKQ$34vKfpBI7xH>Xz83|8{1z8njv zUqc~N@KTctM5VxO7rR92oAIy4Nhfikd8rT%5_*@PPIZM+vyb z6Q~@+nI6NndO<%EL%5!6-i;jg4o{*X2cI}n%mwde1R~OmR)}r6vz4976J*g8`{`uh zgpN@?ZjN>zM`x|mv^teq zPu37XkqZtyc97`FQf>N_&|daV{ivx9T(Kw2vNnzPV`6{>wme&P4rLNjScme{PUalV z=jv!44of5#xux6hM9#FFfLp`3->1eF`H7+W=rXTf%b>9$uY9VvZ~&*8Zk8jzG_P`@2lgB>iZ0%(?-dxS*eHbBUiOC7n}{SZLXLO_+qa3)-5jiR%Ud`iR(Dc#@8<}_T=*0H;QqW5yb{Q5`ZKl z{JQ<%!ON^DAcN})o}bo~bF9yqB_RA$jR)PuZn!m!awk)hOXN?)uYeR#2$sU3+EJ~lyeX>4i-PVFGEw&YV@=-~t3PH(yi`+}A?*<6-p4{n*2 zhA?s4$pViS~n}IwwukYH&<9!Od!rW%~(Ttt9Pz2xPVxMt4mSQ z$+l1vye1JmNLJ6ax94W|bPs}bi{hP8_WLHh&%UE4$M5Qxkxn~^+cm3QLwy<4GpCbbswT`c~(&~_E|;mxsKqW;hbEg zazVHF`%pcAZ?j^buU)at;z)C5TtP%9aj@eW^OVjkJCdsgRF}{`huZMeoOT- zg>O+WleD9T{kzU^aKxrYCC5eRaOjX=7CD)N2jZiknsM2UI@C~yf~yQ|PPX^kY`<(t zc;_r3!$no2YV@^3*C9Gp`Iux~d-isW+bI|`sHFaRcFr?!F6QIB+v;DPb5QQZ^0#k= zU=rf_*?{6pK_Ir*>tn3--A$|wOxe> z7=iv0-{tfnet8OSkaw=GN~yZ}=+UEEbt9^5P(|V$-e+a0@#u;_I#T#d zk4wkqFoD3BbLoVlNv5X|BjLSH9PVw~aBuRIN@7`{p$dMa2QFWt+Xus)@Pj75f02|r zQU%UJ1!(B2lgXZ1w9?;Q1-N6+p*_y&$j9YBD7s~{2*a9O!baEg%<>YTMATYV*mNm! zGfa{75+7oP=|GeVeE9UZacEYTPR93#AL#t;>cy1|hFV}G8U@Cry5#W=4lLZE^5WpS38Hqb6x2m2y zzP~U%gUklbUpLK~Scdf)S2d2xD6Wp;!nRSpfLKADZ|w3WjgEs-j);{VMEWP;h>cM8 zG;=(~Q1cQhlI+#F1`^V5*1`BaVSc(H`Q~k-0J3dION?)eyx%t~IqNGD!*^oR8R7t_YGwxE!R~)+TIE*6?^oBd`bb`A?p}Mf>!&lF;H8n?R1FF(a2cw_?*cS2B)jH znri6llgXDdZo2d4HGeqq1drHGI$f6)Qy}D?n0itKaZNKb-7szkY67;!1{dr{e9)%h z2B#1A2M1O(fj|*GUR@+v?!5G#lKG^T!gXSjE)oyshSCV)k_iMFYxPAN9-x&U0+#~G z;z9y|iUI?(U=x(#0E8>0Y*QOGum#<;V2vu1ryy&eR}1p@&t6m&OsyEEMld%d840$= zIW9Z7;JZ2$51D3f;5#x%QAv1xPOF0Q%;fx6>6=ywbnW zGv!}zdNNWLM56eN3{ZKZU*PR>mh$9Kycnvd27N*|j&ebjamwZ5EFV=aNTG=+TT}nE zQiTS0)BTRLqKPPHKAap?)=P0<4u+$ft^>m`5x*P%)~;F2>s`66UK#jLfb!SnRI2TC}Y%CUS*c9@}YcDBk7=qa=DAb_eDaY zl5M^I3BsS1)Z~BrRxs7X#-OBghgEA1IYDuEzkMs}YAA=h$%?MlBfwQ6FShVt1gV2o z?<0LS_hupDH><1vt@s6&jKV8w*~1RhIgoKcylIafe@`1iv?GK%blclWL`Xr7t<>07 z*AX%o%HR@5em;i=pv#7BWdU{#jh`j%z2@7ut$ZANz;!aA17#_Wa;2K?ibv_6XThva zuSO7Cb%V7dGHNuKt9aEf{#&Y-N)EA>}+HIz+cy(JJ!rfsA8@%bi+3 zJ9^u}{EU;ur>ew0&@_mhSY}B3WCK_;vr^T0_A^~CIo&>bX|GwS@;pcCJ1bR?cN&~X zv`88fuajJ@O1<{?jL0AhU+{=1gfKQih&81UcV=iSBirTi8u}f&gltGtwsGDbs;IC% zQZ0E&R44kgXAFwKq9y~EJB;2XRJp#Yg7V?rXKYMXP(WVdsnb;RD%ZTqHLnt9+q=Y| zPLX>`hxMh%hL!_N9}kct%w*k1sE*~;qKs&I`mHq|sPwFhY^XPhKf@K3u!f2?U*iOIq}`hj2x(Hi zD3T__i#l1vG>IHn)KSh2rI#L!vM%A=4II8NvO zG5P>Hx0J&1Ed@I)4_H-Gz8MdI%`K!%+%y+WtGjtQvvvbQ^^^NQ z5(Lay{|k#9SR@Iwcy~?R(4_@ zS;{dVJb0xe@*d(AM4@*|FU5g?IY^*qAfy8*a_FX%#YyO-`7r*3JDD_Ew?-z>yd7V{ zKT~ULg(=-ON4K&@OWc5d5OyLd7bWjJ^TXtE%G5Y{rXN08Fdebfc0&?u(>*^dfdg*^ z3w@dBO`_*3;C*h!nR`I$mE*pYrlEBo3sU_}#kWnaOzRYEj|bUyZIu z@s7Gy;=q4;J;J}{$@Gr_vfuB)+3*WR5B?Z1Ie5WdsO6V(LJCgLvOsPNG23lGB5%Lo z!FQW2i1)Md68KpVO1kXB*&^!VyrR;Ue7-QNsH`WA_p@`7ZU?~3C_jZ5UnvDF&25ka zx(%~Sw}p((Z7zbdNwasTTs$ErnkWw|TNF1mAp*NcQq;Vcl@sHQMZgM8gMBd7{Q&ru z0e56FdC1qsTT6hNr#V+jO8TorXl2}E*v*8Z|IJ8)Fz0C$vs@`cFc9GY0^E}X56 zfS$S&;PNPobaJ=)WR;NF+Enq8ez2SdX4Jao*Nh>$Ifq9s@oOa;uE^30+F#tl=T^Fa z2U9i~fD43n3zsc2l1bzs7gP}f#4Y6$p58AP%RCZ*%0(HfX*14AycOG{mu_+E@=Sd~ zf_u3bb|EaUXi{p3J9&DBCvw?N+wkfl+&Nf)CF#8`Ey6o=C?@Ycc>H}04*mqKZUGg9 zBOfgDp?DTKrmJi>lg@l@E%jD22)1Z1>ak(Y=q?J5 zm672P`Gx(0yll9Tb&)z~4@Y!Pume0YER&1EWktPmwQseKag%j@j&j5;3h zMd9+CHnE{5>kA_*OH zCYT4PpSD2%p&}DpS;}OT7Zk`9+5K= z2((1_uLPEzI5I>hUE^b`k7ww%?&01)(?i7K=ylMSZ8#pG_NMe!1n1CwZ9XF+*L)hw zb9V(a?1BkD;^pALpA^0-9LY|_2PFGlI)CLzwD5SA)sUSVYJVJ zsEFKap6qTNoa3JzDtvEBpt;v~Kb8W#(^GLwQ*lMX8BVcw06Tqq_~QKKtJmi*jt&mC z4tGxJ$E*F_vt8vO9I7lK{L{NN*Pou_D?dBg~|op5m>&{dM!es+Tg ziQ*!OyL?O(Q*b*!0(D`Hm{QmT0$bpFSh@fkfd%Mykl&0EJy>&e1m!U1=FXaDBM@+| z)_i&9+x4vpM5WZQwtCLBi(PjV)Vg4tt6(d&I0;uk>2#bOS2knqtrw1EzkTDTZ>_}Y z2cy-`FOdk+QL05NN2JPPX1+lpb9Q!4jdmp`+rId<6GEqFx{JS+%#{e0BczoQ2o$r$TSEZwrB6 zo$MaG-al);+JAe#wg2kZEnUvURk~wUslqC@_M0yc>DG-x;{j9+KW^daLYN@Q<;ke) zPC#y5`sC=%`Tp+V%d=n0AI*s$aK3bk6N$ z(g-WYdCVfK=E+;f}9+)D!d zX@Nj+=Va@RQ}}umDr{oK4&V~-kHORP4FBStcTDO9(}ZZb-i3r%x$C1^ibJg6@*e|Q z>*6MIW0=xJGuOm1=qokB3^XDf+4Ca~M{!n)^HKcHd-g}t;qKPS?&;aQt0Y*1`4&Yu z2GL$oiH8t~8+f7o_D#M{+?Hpe;+$Q*YtP%!-FDg04@IV*mrpiU${I2AaJo&=JS+)$3EZqtC1Y zsk!O7s@C=1vp40sH$rzf{!Q=LS$l6t;d?;AXo_l99D`v7iibB}@8;oC;7DvP4ka1P z#hSEwbFd~alet(ER-qF<@0u0QJr4=5-6X7c@cJDUUZdA`W?ZBlO`z|)NU!b8ag{y_ zU8T33t90OgU32f(Yah^M^SMsql z`??m%LxCmNMu}{9zyQ8!ngIyMj3)2V`9hhDuaplloyp5h5_>T(Azw@QSzm_%6vjGS z3SP9%{ZNBWbBLZK?zdJ`ve0WUy`*(X?)vdpb}6u@k|^!mlG=Q49mep1%D{LSE;vf-r2BAb)w z_fcF;RyG^$K0MMa{BkWc+90DIj|H1O8dKQ55`rs80VPCp34fQZ&|dK{sZeJ{lJcCZ zB9DuRK5~$P-i${SDbPxR+-s*NEY@OK4B|7LM4o;X+`HlM+JfOvJ6}+hlh$Q#oLX>B zvJDSkcyL8VZh0(dD^ab8g5UbmyB=pZ(0KfB86l-8SqX3 z7@J5cP*nL!K|eCxI~%?bE2>7v{)J@+b4j9jP1l&lU-x(S&gzRGuEWp!$rW6mzkVe@ zU*9Z7C&bRk?-Sy(7NhN>v$LZEnYJ_hJXn;3_Id~vsqJx=Q4n8I?@q5GFg`kH?(FRE zQUY%TSusAbMsW>!5Hui6(?9J?b#TmzAQcNDGtU=Gpldo2xqJNEL znEFAlR92>KWYI5Td8Q>Yhl#iZqNP@G{*|qg(yS^rDQdJh=UJeupjpei2MsV0s(R=r z?iq_LWQr0Kp;I?I^CB$f`~Myf6APU-N9uj*)*mzXn*8uL29lFqy@@f4xxJy zsDaaSb#Q7?Ejvo9-x(?6yw{UtL{fCIEd@Ezvo#bhdE@sV+!TcbKz@nd9F}=B>$&*&T9`dhUfGABy&3;D4dV4poOMF^^4LE}2IF`bggBsqzv(8>j_(Bl zuvfSPX)yPU_PSV@Q856Iu~pnYH;@$PbNN9apGV(@l=X#}Wv-|{2Owswod+`%LaXRW z<{qY!ZN1&3#R>O%)iX}I z$uPb-MprS@f{|V;9VqH)E=lt67QKyCe`TuVRq3iEo1u-T%A#?x_cFzhJ6F)>rQlXv zjzes>$Xm)^S);)AFQ@`JfeOe;%668*u! zEe20lq$uF|U^zZY>Vs$Un=)6BQjSsslQK+d!K4Ca@H9@J2ZwG##ttGKi!qIYu<(Zx zt|OTGtTb3o%MWYMtro)7)@L^yS_RYfyjaDIB`;kG)fH&ry7e(RZC&Y2?8;Qw-J4B| zK>XQf{iWDoCGVOTg|N{p@0Tgt7k;z(jg4Y*rIYKI=x}?! zVYds09p);DAh*TN9L`>^mW@kd-CXseQLnEep>ww81pO zI`}6%rQ{54TV->^_?&;e^ahEe9wHDikj;58FDg!)Zt!j!R7LR9BK;Q#Kuy<7j;joAw9 zIE7EM_bd5Ub1&+yggqoq9!d7Xd3><$>8ChIu}#AG^XzvNf4rp5BJZ7ovA{0(m(D7S zqD3zlMeWOlL|J+K7F-tH!OXfJ``ymLTm3G4bO~J3$?_jU$f9eV7L+J``=jLH=IT=D zooy+rb7oOKw?Qk)2Vp5QcVM$Ymny4OZLFnj5h_nMya&o9c*b?Erb-9 zZwf)Ntr!qYho}+{&tDCDComW<_hZD3PFMpY@oC*kmgig~2gmhN>r`ve+b6SZg-upL zduH^fJsPH|elv5)&;f1Te4l4@S#($|l)T>>>CioRs&u-bBh3psLy;vFq za8o4M<)g9L?!|aF`#$>II(;6-*$*BLcl9B2X9c5@XPX*UbMV7Qwe-I_D!~HKw-q#r zsR`L}=a^F!&asdSSZx$gAvVdCkx*YS)}Dw*NYI>>0q-NQ9SME{{lSnAq$VvcMN*Zv z;am{n^kHkMwo-L33h_#5^l(^Ssx4Q8&*aRQPP=G;UkzU~4CV7re(9-@0xM!dJ=ujm znsc0;g2{7tItP5_1TLipm;FS)EQ_PsoR5}PgBYBo34ccF*V}w0J2WY#jxZABD*CgW zQ(&0C$yY72b+iV>e8uTCF+6N2OB7a-*W#chbdFt9OI}4JcSZ8Gs>-ffqIKTpMDj<; zQob{{4-XxQXoA#1&T>a2RfLP=O!YWee-yTC=*q6>zH zAfHpI|LlLC1TX359yO7s%07MAMu|i z=`E7(%8hW_2=)y-fZTW_y`N(+9@q1q8;R3!!7wxfaGx&7=2wW1PUY9z72=~uLI#lj z1-;(E5+0kEQq>!edt8l1<$~_mN2$5EC>$*sK@>*m@VXVW?6I5Q*SNb=3-^K31((+? zMk;rM7#^b-sRnbbXzC!1$JBfg6${*nI7ds!y>fRCa|H3ulc2kI62s^^_m=stEe-Vw z2N{smn8MJvqG7?T&rPoFb(&4B&DIGwdmma|)N&!IcIffs971=AK-L{kZQ~pAStsMh zCZi@Hr%>#)iU`kg3t>Bp_g3K#+QkHUm`I)mNk)TQPUPsx`{Y9$+x_r6n%?vg1c)Ci zl*7@OXX>Wbso8}jOh=Uz(nLp=x6aGq6jy-hwqhRDXbe7hE}kxmczR(pW^DG1kBdAY8e zYqq>(>y)>VxCZOn^F-Zp)dja&AIL1I4{h4_l$xEhsu+JY0Cj0W*wcV@5Gg@gg+XQ~ zCP>F`*QK7bUn#g8g&!OL{GZjaH;JO{sFSj>WwJzPM<>^RNOa?zR z0(kIM&q_Uun6A}{m0`+;Uw4zT+`4AP5?(QmTdU|n5AJ8lPS&hRoHLi zbxBDGj>R7m>{5sj00&p@3YBDEl!b0x9W>TE7NN8IE){(3==tlx71~|YcEQw2&xmAt zMkLeIA{oQSo9EA&Js~zG*AKEDW~Sb)P?}56tW$C)xoX8wChqvi_WwHu_k;Qp80Fua zHV<*~<{T#JXWwSR-LAc%Ma>2|YQ|MaT-4*K-+z)UcCuHtaZlmny%F4Sw7Cl9V&7-B z6|ddP6O3NRKS*RSZZ_~afP_`!(ii&F}EG6km$ zo(zlVY@Yg?LVYgOqX#Ftj7Y7gMSV%~Tu-cik3GI&-}5dM3T^SNKDO`I$Le<)b$@3! z#dV?s?^6Q^>+0y<&7BBDxfrSNruDC|ufDp%aa#Y%F?Bhl!z3C)!xf=)RbmwZ2*@W3 z+!b;K_5b zm#O1cOKuwI6e3gOxbHuU1D~FLMjU08(#BocI9rnLl!vFRyNqP=xOU3=X!L<4L5=R>qs4wfH(G9_1| z8b^Mp5qzzzUA$e2o{u}StLJUk^O=&SULznZL!Kt3%MNt)e4hynfgL}@1#5Iy(Ya~~ z*e!wjtqVlmj_|v8ErZAU9uv4$mC3&JG^Eov4Fh%gi5SXnsh)KY@mS;2nRtoj&7C;W zp^Kh_s3@EVg<`jnq^JmIgolY#omPY<&h$@Z->SL;X_BIt8oD=<-k?mevR95h=OraU z+z_xEe@xHBcYSd@AYI(vRS(frBN6W>tse=EO`@BfL5Z9hRb*D#5JsmzF7ZR4Kd zL0QF3m?+%4N?{2iyg8k>OU_^n5=0Q=%4JiHzjqhlgFjh*z6_2&Fj4=k=B;_RI}oB2 zSV2F8Ye_gCw(HZ_O9rAjc-1&lBrqZ32LQ>;{s4SI0cHfdxg#V`%DeV z>@cUG*>`dmT=eJP1u5d2Ll!5;#9G#I;?UeYO|B~ErNZAC$gjKB+SI~vWr>%@OfXc9 zkqiSxu9_$gIOh1Em3}NyaCVc&kv9tRbh-Uu`y(u#U_KNoX>!?&1220GyX((OEqFj2 z#$?jcg6Y>VcB)CmG6}Dz2$1=6QSQ-A36j3uSNmHpcB8IkV0iHbVysR< zn$;O|Rh_;xyT`A$_Hnk)Tp7lI-*?YYB*{zm2^s8(J^xC7mq?*b2beaBIt0ZGn|Rq&8V76a@#lhB>Oh&$A^=d@)eO0(dA`<}n^WS~n_GvBHWh_Bz`LcHSCr zUElfyIn5LE?rEE#79$*T8RD1HJQI5;e`;o1} zGh%Xkg#8KiDe#OdN<89s3LCta?!zE=S6sPNokk5JTdpca2w6Cw1tD_ql&`LCO8cRz zv>#S&;$$l`$Yo}9AS%E*KG36eRo@heVR?dm_9z!eXi4>%d>)VDK#$X>qehBeyXNV# z@976J8*MrA8zylre=`I&h@9R0RD$1bIftMcNEAk1gWXXE)(M3*f#=Q)jO&ctyco`^ z?_~z5e8U`UL&&qvLT8)1nZI)!=#SM>pcyHgwQ0cQqHo8KZP_=ki~e(>NOdRiszd4* zv}QQ6ywT^_73scBswU>nqX5nY&L;bi^TC}1Z|;L4$^s(^^kF>4=6V$f&t z_Kg#V+-TIhB;PesB4S-M_*xyORtm@Yi$|f`YFppC^>sCWfjuAgFU^ged6S#0@Gh%w z?+xoWokP6%k#e}?4Z--ik;e}YKL-{~$%}&(m;I@+JnHc2pfgH=!AkPt1GR1Wg{p+7 z87FkvpL)~cD9(Xf4Tu!4uv48_DGpkbSt+H^?K33Tp>EWjD{k!6_PyennRnxYB?wM# zZUqWv)1Np6T8vuLkcV&Z247Pp1@3g>ue07v;MAixAc^$dSr*Ty@mgzK)#K5}1UR)5TE%zyehCiLiHa#8Ktf;}CL+)Iu-8~Oae0_1_L zb@)f#d{yC@TgA_VuO| znu#csxUg)`2gabP_MWY-;Red?Y9vMz$;Q?4t7oj2y{V@jj&bjh%SJ-4*Lhn|?2m8- zDG#?ybzPlp_=Gzh_Envk(t;TUA%hhOY#8eDySA|z;lCUyiq)R892wdte)=mMo_)a$ z0wh9R@16WVupK!>g~}ZugjpJID1SI)@-ZTJ7bUOLutKV_!?|LJJ3!?5uI-T!^a$w= zPE=b=QvmIWNnQ`YTK2d5Y|sJjMkx{Mpsi>pSoT`m~o|U%r^y{xS7$3Pt=K<`*lJgh3LXfIdTwTlw0@~QYPvG+v$ik z?_%ny2d{HaV?+OG%m=LmcD#HXN()L@)IdVQx0n0y_Ny$j*XtueKf}2XXMV-*c{QB+ zfHurMpecs_24+VP9&Go=BXwevxJ`Sye7_cLM315;QMC%YiXX7+rlR$fPDu%xj8AqN zf+_XiUw$Z09U1`i64N6LU1!weo}g#dhoh+aur(KEHRM(0nvZUeUuFS`ms2w1)%P3^ z#B}ch9hX7vs6|di?Vlpt4 zhp?=9&QiiVwW1YO?ZfqbHL5(0Dw|PdJ*w0`H0G*IxEfZqwM7p&=M0)pBAQ?PUbu&4 zHIj1l9UmX&8<}a+o@*~lj<*|k+6^rV$dl@>PpVnqf8eV!xHQzR%B7#(sr0k!(a%V| zF4TWbqDv9AJOmG*>_-+mg> zj1WO9jBrK~;S5ALdph;3molVGQRf0Un9UebO=DL5`WT;DyWV$B-9@a_)Yc2m6u$76vVt z;L+?;d4N+nB};N^#Dm-%q{Q#p0a*2RH%Do^e2MqKn0Agx~KcfQTOJY-CO7!s#Pw(JVQih?Sh#@ z<-6rDE-0?|O&|NFZ||GF+Bd;&7a)EALo_|x>6;*h=RU@`?RD* zKaj(_FP^Q=i)Ue?XrIJUjt%t5*o>ZNteb~~ua^HQCD1`Jt)4CU51e$ajGlwUg|FC_ z`p0|YKw|)cICz>h2B3q9xT#mxo;-fCE}T&(w{T_$k2rAe@(>Q6(andM_HM2?b)`!D z_4nPA!`=OJMCxw7KCNdH%d*0z67EZZhVhJW! zSG_hlbx0Lxl6xA+%eVjaFJHj@uYdVw8b9)7fNBdo4g8g{uJ|3DtQN?F|Ts|FNW7dMz!R3dXaDMR+ z`&qzS?+W(#~4r{iT6>j+Wl5ayutF2r zS0Y@QOO&sBWYs1L5S6UdKq3UB#16Uh=%G`jM^2&09;8Bn!jr(G3(f=rtxCBuI8y`; zQsJIIBQQ;4QX=dJCH=GUiOFAiVOf%}sqIvY+o{fIr*@xqYQ^o;X0)?*pLW)Y+gY2@ z&iZ}YSubv9eMUPQvK{*@nB=auT8>0<&T-n| z(pv5DlSh!pudY5e>cf=xHYshc!p)QwqU2%E4JA^kMzv%O+R|1;HTGq=wi-QNEo;?6 zs_xx&>1%6{;Y91TQnE^B9Rd0QpNH^WG)i#)z}*AZc_emOkx?T^Nn#NXu>&oLb9xl@ zJg=J!XK4cJunC``-97va)0R(A;x+(e(-~1Ti2+XB8xFR(-FFjqZ!tQoQVjZl_K=91 z%8PCfG2sT5)wUY0Q0)KZ8j9j>wjb0HL-(R7;#GAca-5mM2WMnCdW`XS;)I2O%e2Ue z1`%(pQi=)JB%1NUH^r4T*;^@?@8C8Di!!D7Pifa3mf9L|Atk=-Nrm1S%RrAjc;R`x zVb|JHb%_v$!*QwlsJgnju}T-1Mkd4X>1SI;!eME1qq@FceH2wO6}43|LUXYV#rc1H z{X-4?vJ){7HB_ssYqiyl4LtL31#P#26%=0q#;%w;+GYKMLv?h=4Y=kc=ay-Oy;!92 zS1s$S*CrD9Qtm-{EBwmJWN@`56y55$Z%b|G`XG`%0MdFIwWUEyeIz&?wythPqt+c9 zI%M>66R|g}`eoFo*##5Sy1t;~zz+Tj?f2=-lC%iOmV2TK)`7-e@6d zlpNdP(**8iu& z{_(L49z1XCM7-~o$)1UQX;^kfswv^+GtyRMkn^@bJEr7^uNpwHgdEqBk%MPtx>zoM$wI8L`#?N-;%EyZ`N1|Rmb9yVA z%XRXZ_Oh9u34b2cLypE1?Mv27#d5<59!RqWb_8$oD;nmZ+cD5Cv8%5TJ+I_Vio^)p zv)~|GLIFypB$$Ou7}NbN_jh} z!H+^C#8M2$@H0bNM8Rwo?T=6m!8U(xmFbx44aP~sja}@`&WL7bsAoq;oXnA>B^bsC z`;!E-H=H&(?eOI25%2_c!xLm8cGDzvbCWcfK1q6Z{Av+?nrl?rAGuBw(l2pP)}V8A zO@+xIn)=_uEkPJ%sW6n-9BKy|5@ONJj2GGK97|M~hFYPyEiU4$&*wD!L6U=AIDljq z^zvrhYpBZwSV}+EXAOQ0QS&^wtMW2e0Wj_JK+6PH=<>-!AxJWp(<)&jnfLL=I&3 zTNg?H^oCSrg85ytBuM!1K{maQSSK|obUQ1^RE$RN3)YYzQ2qN4_L1C6p_BNjAQxl* z>}CmdKAIBVf-ia#yyKt|2C-j6O4ViK%YFl|95rSXC4Ka0s%;sH-2l=96fr4|uMz5IYou=&?kmj~ozzAFjDP~^9VDfs!NcGSXuLxVT-lI7}ZVukLHF_2IG==6;d`HpohtIPx$Z3 zCp8Cr*uwCmvgWjm`NINtx{wX0$cxBjYhQf$YFyfrmtV!Bi8{mJu!znr`?|#e0}?h( zrPx`_*9!tQphVnJMmw#n1DB3TBpJ*C@q6jYCijJ2Vw z-LI|uycG-+Jj?S+)m^Act-fk2!C~YA{kHl1=$b*6(xvq!sNwLxKUCa z>9rHaR1SZxghsg7i73^=cB5`s^ykk7kr2WiEI6brr7|98%S-F4(LGZAdxz=sK(2x4 zcq%$Rk{xeN;xHM(HGwWOaskrZE};XS4sU~4%;ySbmooJIQsONR^HwO)(Ihfwgm|_7 z+LNnxMbS8b;~4}${XP0f>yUEM~W{ z1sog^S&g4@wf}j5|5Et=Ef`x|H0CQ-pn~<}GotYn&ffU=wU0<^a)L9nDQ6}TGc%Ag zlSWXT=)hX5FXkqZt9MJj6zQDJV{Twhm?a*lE0-1&s=7FS(sHs?gPc=sMza7)>DoTk zXN?ByoRZU6(dpD#UYJfyawNnV!R4?$7E$0BOo}i|i|y9nQwvfEvQ4(VCoI-37fD7d zOw2c`;2ETOe!RJ^C5?)Uc(zWS*i!bU0a@{*^73M(Qdz9S#k|mv;h4X4mMbSVsx~wX zNzEXO7ca<6t@illc3}kq*?zK;-hunYlj?TAH~4taYM=7=9)Ke}Y7NpAOl$9IF%mA( zwjfCx#EWg_9#rBsuBj*uGoS0;B|M%|dWu)P;b)=3yoe{`7W%ay|5tfjHXtO8k2m$F zcxL`HUiDJm#a*GA2>2baC;Tg>ojI@=%|P z(3+%89X<_LU43sN!*G9?48|=!n_0`dua3f@CTP~NU&0d8*#WB6pGeW5qN3_HBF=|4 z3Chs{Eny@19?2XGqKlKp_sQbis`AjhqY~|?*5r%R_j#5({^|}8pL5Skd9WyRPD!hf zI0aFUE0!d|pkK)ZTdXzcUAM%}B6g8vnq=XwSm%i1DicuSy5BdFDmkW z_yK$x(*Z3_X~+8QLuNhfS1c02j7*HnU7P2!&lD?nWVsTVZkhNzuIyR7p}KWxT2f7| zY?L1|c3eS-LG)C28g_l^9J>SywxJF1`W1^tfz#?XWJ!Z`H_;6{-?=L3POPs^>jiQj z*7!xNFAkpkVTw*Xnds^^Rm|AHvPl0wL+XOJi2hMCYXv>{?_a*^3hv8rAa&`9&M-dv z)LQD&3Ty+>{okQ)1bGUKB-vW=TkvBFg2i%1}G7wn(+Awk|ap9~=T5)a$>{?n* zEgqm}XrZ_ZDdz2i^C`O*jC_v6dF8WnQe`X8$8T#ZN)7BL?qVBV<*8N?e&;96CN%b& z@+m5N4^F9wKmnOb!}!^d*G<9sOBV!knztd8gbrepwvkFq3GJl*VOl+i=hX zEj8Q?<7Zc>2{OaJIJ4U>AZXaKmg{6oRpNuSC$=_)8N`3pjit8Xha1D$qK@KJ+^Dz9?^64C@!V>a!SaN7M?5Q`Y7L8%YBJ1x;rcP6CN?p z>Gu9dq9y#_wZ-w(6)oDYuJqtOUHM9$UkEQ-+P&;d5ouewMRIEf5tml;yfJXzu+lgY z4_^A&YNS)_mnsMyejfQRRjv3v5aWZC(B9B%4Y}h3#t8+GQcGQtMk6JKTz|az_z^DN z1-CAJl2xjRkSt%aNP8cGU{?$&#G4;mytkpQV&rpTBy}|;d9AOj0p%of?J`T(XtvxN zej=|`YHCuQVowdrWLz3Cf~B=~R;Pb`kizZ2M2(b~d+v$yrLuiB9a0{hn~uzzj;v@p zERnLtLMch1i$5fkGinUVTGlrv%DpJpxHla6VzT!i8q@B?&^pmbJ7|EA>pQ3D2GP}T z->hWO8%l-_jI>sP7rb)A+YCuLH{Liu15$*R#?NrbU>?XRR*v(_P1Ybh8LQ^%D>td* z88z3qW)Tx&5fj5A4)VZomI^78%Oa*RXq4VtGWX%Y;}V7Ebe9~objlnL*XGrhv_OH1 zDI+G&m$^)|R1^tw;0l+af4+T3(Vt1wNAaR7U!;RiN{7#Mqz{ok6zM_PPFppm*_*b$ z#HK_?28zKPco!%G2dMl4Sbl8{GoQr4<)5`!9(;Jc!fQ0jjc=s;tuMEvDoE@@%37NR z_H zJ;_7*VrGTq9#OHkghyC-CtxZ^Mj2)>9m!h;$x{lC4rERVnOg?Q9pv`~m?SU@@@zr* zA@OeD+>E>9MoAoL9=kTM87Mm9atxI1oHKAZ1UM&^u6%i(6>Ia+&2z7p^e=4=XpoFY ztv*7fLout*Dt#(SmVmY2mQGco@m%i|cHW`ftdi1Yb!&H0z1q~PfYs_(TO<62U6bO+ z9$8PU)r3OjTC%pZ#xDYa9HWJWAQ6q$QzSK7&>0xKZ!N8Thy$;3RcQBf?s9cTeyuP+ zec$>JJ6UwEY$Q|T1YMGk2Z{*fgOPY#gYa46=uRK@6kDS-mHAndNNvHB`+7j)?y@|# zT`4rA@NllyCb!CStPs>a3sy+vcx!~jS!)D!$EjstPP#1v#J_kym(*vQuzlU*j zbNQ@`ua6|*WSYZ4(4dT)P9agU1}g6bN@pbMX&ohKcL^08yg9a8cTo4x$Bdp0`)Zmh zLN>~it166&-}+AHaczH^3qk*QvJz+&~FQ*CPAnqK&~d~EHXD@ zGUtOyozFWB*0Lzw&^yc$d5moqQMl?%0;dEdi0D8Ucgw-DeHXVjg~TE?oVxLfj}Y~^ zXWpotS??PxQmF2$Q1@1)DZopd#QCqaZ>^LNrFc2d{bNmtfR!hX1k zTB<)e5V@-qh`p1pD0%q4>v4)dc5~&xy5mGBf@rv*#ZmSPHsRyHu?gE|6ZUhPP{kf{ z&YxM^P~s-2uC*iE5m|W%kL6lb&mgZp!!&DS9c!{d@nmf^C%pEc#gvQ|>tuiF^xz3P zK!*^&Go*F-My4BWs^f9)^QBgBzSMZTJodK6y4)Fm8|jC59NNg8AYc&nmRl}HetR=6 z7jFQ2n=ZSXK<+Pci@hS6B;IV@Y%Ap4t*CbFyc*|ySy7d9-am3Y743|Te|l#a9&65R zvFYxLE8??+BMXI>FI*YI8S_ zXS9XDLyOg;$2u7ZTn@>Y3*N&cF}Fi?()>B54IJ! zkVeCqpo(^Qw}6(syV6xaNFqzHB@tKBc6oWIen~myTb27(=e{+$?^NzPo%@b+hpJ{> zA9Ttd$@I4>{jHn+PNlz7=|xJN{Wvu1jebZvUR~j(e#j>l9vDFO;>spT%tboczxycW zp8d0s%z+M~8L6=oCHzm|n%npPHEg@WR9$IoyE52zrLgTvW80O%wkw5gR~p-{47Ob< zY`fCfc4e^bD$?}Ek<)Db{p6nZVPU78RKSlG>q+bV>8fE`lKAjYYp?dQR+u+sm?R1Sj;V} z_O#2szE0m((-}#nPd>!D&*Ij~5QcG2+>>nhUL)uatFtG*^~T}9lwnz&i{?^OOf zo&Qec7ZIi~9cuWb10+pem#l$e=n2N7sY-tE;AgeAUu~-k7;V;EqfH}6 zs%}1d^r%+dn3L&l$Odd9ON}h9L}^qkMY1q3fW_KUOpH+?vQMzo0L3h<=nQZPjU4s{ z33SW!+}FsgF5{ghz|R_~*GzU+gMJ5_Ar!<%g}UCOLS1jan=`1mjZ}?MSjV2`qPCiE zRI6q1+1AnkQiy2WYUK!O{!TV)HghFHcPhNdY=kdV-t-D}icz6D#b~-ZMZWvNS@vsD z^JVpL;zfk;{Tx`Ak#c?@nSESj(~pa6>TwZtvfyy1|M}+40rQWxjqKu+GE;OaD?TZ+ z;*&BsF0(m<+WNu9a;O??Q|yPVa6e>4`=OB&S7?6+0z;f_bdVc04~tuZ{3wtgKa#+R0aioe3d<8&~gKrCC_3oU;aox=03EwU4#MjQu7 z0uEaItDR=hOnyvG~F(&j2oxQCm{H;2i#`3Z}G^J_J)lwOWAS~q@xv^S?) z=IOxA0v>q@TG%OTvVAZ*^;j8Hi~Z@>VbIR4!lY9T)|X#_ho^2WUM5xLC;9c|vD~dP zpHH<0QvHhEZQ@qy=23-SieH((!@PC$a(OBJv>|JtICv055vYCoo-vECzwbzOiCe+6xj?}&@J<7cHWi9o3JgFSD0+!q>5aw zFq@Q1H=Qt*qpIW+g7V3;TuN55^3p(^PA46>I*nQ!=uum%ykLiyww*%{8m*o5`Ewk2 zDSg0;%Jb)oi!uN!2UsVqH*@k2r45OSku&5nxFV8faeq0k*=$0afQQ^fc~Fs&3rJ2Q zV9Ds7D~VvPi_}zl!eBU3rJhnU2?JAh09N}m&e*iENk)poXoBq< z6L`RY<-|&rqpFDe%z%x>)g;5%C;OM{d|b6FW#L-4GW^7L2s9%G$37ANDkzH@t@Da_f;B^+n4O)QvHJ zd=A^di1rc^^{y39rk7h8Kkx4lr&5N#fAjPRL>w{|FxP^CnF^vDg~8ng0tdvP6CIEj zNI3M>wHAp%8IHLePz3T+gw@W1w7>DXRLwys-tTs(^ zmLkR{yb#$Kzjb-3@V(vvw)3h_7*WiNHT+Dsg~?|Tz6j%j^WG)wXl|rE!Fdje+D!5+ z=rWc?C7ME5A7$ia!78gP3o;V+bVw3EfJ+++{mdmtAz_+alP~i2;zYQoX8X8n!iUa- z2cI51P_yN~)B{75fP7}Sl^s|2LF0P;gJ8bknKNV1GCGFok>NLAnI|5?S+LI^iYi1J|eVh*V)g(ys z#U@K_iY}5`xg^<@PjsdzgK?4ZNs{4~mMeW?Pc>5y11dW4wnP{vKY4JAeLW1#Uet+i zTnk^Sg6Fj3Oz5W=WHR}D?hwNbe#l`o=#<1$WwUe zYIk3W_zXPEu6e$^i8|smayswpwyg(8rxGzHYR2$Gv@gzCg*?Z9nr zYOPP{QZA8ajt`RpUQy84#*L=P9vx;!SgQ5fW_9z)hT468(-hrFk=elh5^TA2V(O14 z#4=1RK+J^IffKcyJES({peLMk1cy(KJEn}gX#aSe1MKE{m&~Ku!=HsS0lOg6*v8{W zkJovQ{S{^*S4#+S3%9*?0C%XHE3M*p!iHU77E1{`rb?wpW z8g6HJEfXVAcijC>{69bC<41X+g{**9ZZIp3MdO62LV%gcPyZ9Wrg||w?H--R3lwkV zM#M=%NF_H))0mjd#!pVHyzxnbH64p+c^){UxfT?mx_tM4diZeRl*H4??Mg~c@D_kw z-Jdwt6a89SEAj7}H6Gs08bzcdSKuZ5>k~zzLZqlGm;s9>YYP`LuT{Cd zixygyFP|y@&RQqpOQ+dxb=zSjw2D zr=ikXN^Z#M8#?`Jl>9YDNTNHA4aV>Y+*MLR6<0-2#SQ#{Rs;w6614;UOqEL#S8iyH zRfQbr$yC3@fdnbdDyRA~(R0AHt6?{f5#SK(lPuieu^G}-v4P}ANsIu#FFCa(|6a(y zZTa_-yDh74VF@XcBvIJ(3_0<|#$ zl(y&vlFJJZ7f8tOq(%-9&yO4dkv5`1s0VAdLFk0h?+mF23!hsfik?*GwZ1_ooxfmE zUZjbW^wJ!YVF z{`ZO1Gey_r{6(^>k$)EIiZ7f3+p@rRae=l|;Ds#kqPW1NQ(#9H*a;O-O~{ypntWLJ zisguif`E8{Zd@u%gG6Bg;Vd$o-(-Qi((iptn3WJgsuaFbUW%I2>)|l#QiKZ3B|JsS zb4j10Vry>jVInpI%%W&SqHCb3q9)E!WI&IE5E)NjL_Ji)T1AAZdUb=(MB2VN9z`|* zircdo7pngc`BJ6oBxOrfCj*s?Kb7sm)(GiFK-3`O5P#z%XX!A)}d#+c$>o zP(+s1u?hq0#6R8d_<=`XcdVGOOhQfY)X1W?UN~tPC$9%?btK}1*(ox<8!B)o(T>Z? zzJ=eAmpXDT?06b>G~}w}R$OVpu}oFHPQbCtIL*e_FK`#ZlN<^TWQeV!5&nT}2TmS( ztOqwx&gBP@Qm&wA*LorkrN~{_E%!{Qcb*XyFFmp|+>uF;!~wC+D$eHjD{4V9?t74u zo5@$v+1;qN&|j>f0MtBfP%sKkx` zD^blvbeE4^oLxoQVuRsqXb^*VQD_h zK{D`cs;b$jWq7kMIo|BIw6xbztQkIzI*PNw$96|EHa#5*H!DZxBe6e-q0t&w@T9`q z0OroBr}crw-TbN*3VKFO%i>dfE`~UaW%3Zeu|hv7%3!a;Efh0Ges;dj|EIQVYic7| z($DAoigpjfNOm_!LN>ObA!Ompc!XyL5WWS0b!jAlZb%K1V0b-oo_1qnBX<78KJVFx zecSyf{w4cmW>s~yF4$+zE)S@?DyzCKSyg$f%={y{GNSFxp~bHTYnw3e(2cf9C!QQt zcK8SughMprjtn9$n!$OP`eD1#zINE8GH}QK8P=@R;vaWsdmVW@KUe{-kCoj?2Tpi6 z5~?^a{FQvey5Ti&2rh22&pgtR!_y6>MY7r>Ci6I^=>{2QiXUJP9#_3OqJhCU18%#a zGeQK9F4-6rJECVF28gLWqFei*(T8FOoQ|)>HG`WbUk#Snui7;1D27${N2X2X9;Mb) zVW-9xjF@Q^n`%reupLUoYh#m&5jjImxWi?OnvqvYs|$Ji%~XYS=fnQjjgnuDh-i>sDf4 zC-!ZR{yH&n$82>KQILo1xK(2`2K^QnOGq|2ie|>)N-K1WffXMe6FVji2?9UBmA1rt z6-=PppL5Y!C{o)@T0b@#qU?nG)+PFD8Sw3KFs9$y;sBPprt=cqV%X`0q z(LRgP>lKN-^f2es^+5rg27bzbegJ6H9}uJpMn%!^_+GFI)UF+Klz7lns+M?Rs0lp` z>@vI^jnKfKYeXB;db1qfr!h+^XjWzyS(dx~;P6xCWUbGoW}_pKZxzz45%!NLa+TWl z+;m~461ISyg~pLzbFJ|$r^I5h$Ofv3PztyGgtPx3k?W<3j0A@aVP?OmXFpk$b=D<= z70iHD=q96Cj-r1R>*I=XoC5mtj%kX6-~#r4Ta|k1z$?O3Gbl1CfF+Hv!ENsVTNg>f=x+_!5N81&wWz z8c?fN$(2#y=Da-7QB={A>cX=;{x&jyq{0Do_724}qy3^6TD3mec=F^dJ6mVYBvAQ! zb$}piv~;OPsw+|B)v%NL4mf%pVpnOTT}R&sbVdtl} zJR3>Rt3#@X*0uu!Uf0y@@{pkaQ~8j#y+O{d?*`f8f_8M4av?K1j(k z&~SXZ7(SDUOROi`M)<-_UI#(|iDuE0Ff!-Rqd&%GtBK@!Qu+OTq%zM3k;1urCZ>{Q zqoZW@u&8SqrMj_UKKb9QwL5ZKbT=bm4#LSG<#*SuOtR|d%cyNd=P6qWnD}1Bmw>DS z4>!CGH03COCsjHX{Uf;2ng%_2GWXNVu+cAX<1WBfIrhbM5R}&+XC7W*$&XT4+ZV+x9r}n+|pM6vONhKDcEm&E4PRC`)6ZE z-(5S$#+q^+H_h$=Rp&n4ifOd_wm){gMs-R)%tWw|h9|L>` z!QYDDe^A?Ln3{T++H+9N5;}+M)9(tO(_XogDtn*h_P(=nTjUI+qsRdjsc^#gm}l=3 zHMF1NN_cG3+;l5}ycwqrdSnnXiH?@8cf?!`nE}!N4!5m~c0DIY8+yI5Hwa15YpoY2 zT|+MPygzZh&lx9!h60*fhR2?I{LHW|&z)vnFaL<>ZT~5Ik5lQB9Dl{n8^GKGz{Xq! zPjz~-g2r400(ge_Ev|PCUWQ)>{K}(0RBbME`~5sEryf5z<$V17QF_wE1;;7ZpY^S^ z0-rDPJq<)Bf=d*lo*^6fM4j#(b-J5XFz(FW58|sgB=JaT2ifo-sGO}4J5Yt$m?CpK zX4ev)o-Z0`1{}8!(s5NpC)Ky%ivM<`*zDL|8O*+4#{$Ads0`hUBwf~7(AsXmboJ5N z=EGELy^$_twaiHFMs-vmW%#X=bk?5r`6h~PoC^P>z5B1O>ICJ}UyGq`uVMBDmlWbO zvFfQ;=Jvo;5C!=&AFOS>4=ria2NryxYi&i7(xw>?r5+Rg8ANC$wO^0S-1y;+kANu1 zu4f=C^YJqquB4sx(#Rv+TRg&}?T9X%2cYCeJMi0qs0t&!FPl&6I-;~`giZ<-fq2P8 z*k}7#t=3q(7do|m6!p7)-XRtN?aetpYcQc`4*dxy-1ymyGxk3{%Y1(V`6$j{e?o+s zRb7*Qd{BO2$6?|oYyid?_#2K*?%hjvoXk|Ng7qD$F24Fq zRI#*@$YkadbaMw2&^3c8$ZeD!xA2kmPh`t+vZS4u2&-oni7wBLHl*E%YYZH}iipJW znL^#!?hmLXJK4$hx_Z<}oAXH<87pmF8mwq7XPyzj0P$~aNPD|Op^JT(Ot-JPHg}Mm zrMZSPH=)Ln6X;)J3`@9H5t?z-t!eiLSAZk-9sb38O;F>IcQPppL}g->Xwh)M^s_rB za)l9tgV@R-MM=oSqm`VACnsjWxrnfjzT!1WqW-5peOiTHVyjT_$6@WF4J3jsFy<_3 zU3F_Gh1u%whaO|a+z-+6H@@YwiB{ha8Y3>_{kPOE;hz0ZnbXWE0#u)J)aY#PnU{s} zP%i(}gB4Nw#9d!N%g-!xg~ZR2sGvB```JtTKTg(j#cC!|ZGNL;JjE|>Ygm9Av;d*0 zW(Nn>=4DotM)T$9=`3NQ*BBALrqK5iOfy1C$-=ll-rsdCl;kpmUKB&;&i|E+izJrtOK7k zwMRq*VSCCvEGHzrEzq=@Ca-~lEceN8&>lx%;d_g2*z+rgE-YNIakL8L)_)i=t&jT~ z2+%&n4K{Cz6%@bTS=0{2Zy8aLq6g0K$#4wC0&(%yigATAN<$Mp{G5qa0lWK4rp&F^C%5ksaQ z)D$^YUNS|+Ahmdo%IWo#MSDR!n+1P(4xP?=k!X1ieMDV~-BBQ12~FXn%EKvR-UO>x}~*cGwWl<7duyks@|0!BcLccy zA0#UOoyp(i{2R)Dm)^Qj`8OsXOzHtuP5+DX*<%7O(q~ubv&Xts$CCYuvX6;-JfJRc z+8atcptQYC>W!pbP}&=+rX5i|7tmnwLp#znwj%+ZMg)s=0GAnNYG9@jx9x)e3uieM z&hj$yK6t%IahHdJ|L&K6{!ehtU;gbsT;?EGyvv9mt^mys<%kL?PNk)=ML!$dO(Y4{ z5+m~_G)kxnaR5JdQu~T~2I+f=Xjmh1n}u&CU|)F+d1orX_1@r)jaR`?sj@>;b|_`R zFx8+CyMw?b#-wwSom#a{sa6fSHEx5=C1Bb|c5C2>3$@e{;XRO@8L(@`fc?@*ebRNP z7M;jM{4_5E6=m;NDa#}c%qNe6(^Pdn2{QJxPl&8};&dlIx&25|FN&JXEg*kYiXnj= zrT6kjus(MU!8J%U#+;5L5PRi*mDCZATqh&jmO%@87Dy~-#C6`v|L1@x4yD_mv;FCU z0*`UFE2*jv2{4Z4f6~2c<&var$0lvvoe$tToqZ^2o#MFKjz-(-t=#=%;w8`b*- z1dgt#OKgEu!q&&`&VT=HF(vdz%l$x?g@3hLGRu+BwT4+%V=_t-$N8A;h-rQFFgi8! zyYp@IpJpOx@VYhn_%~62P7;NPnxAc80{@ACgMH1|Z?&NcoMAB)3MLA~B%Tj-4&5u@ z!^(dw!t7Zp6nzi5@9wrVk5jQ{_D+{`;6jgrV}!&!qs&0SZa;hC*j)9%e-bx;Dr@`3 z&t-^Ow_3@MZ1rT?y1{Mz+BC?b<2dp(1GKNSHWG-f7(9jB!sx-tK)Z&$-QAIE!OmV7 zRofjbjE%)iA5HKa9ZgTbu};Vvh~ioQ=l3~oZ-Ejizo2XL+Je6i!7XXQoKV2#X&)?V zm>!1I|{Hp!fu%d!p} z6NIFy)s-#pn66Ryb={7vOhTfq@yml`!h));SsO$PggQKxS&LV*xU?D#Ea_U!bjj-s z*A|1#$Y#F$o1ETLL%O$e zO_Hbw$*DKHAnkri2sy)|FXpW`?qB#>Lk0lOmJ-oexXz#h%xw`-3jJhB)k*}5gX<1! zYwpsSUo0hvx3N)I#3$AV3f7957tX1q2Qw5|K7lCfb0`_N=v%~_`K97b>{M1~?iXY_ zwQBvMF~mgGI#)xcZ(dU4@7t%XdFgi4mbOF&`VAtOSd#fTOoW z^`S`hPCS!VA`kXK45E}+9{Za}Lh*bmM>G11+V;)0=N zgAKHu*l0%|r6@TqxOy@UcE;kPFaG{kiS&mhOKnVg2Si))Pj7uSXU(JcvGr)50)< zbtC&;@#Hv%Uy(w|B;JYik-8^h+eIj|Y}{}+v5K{HD@}ac7g+>!yv`K%a}Imj!7Wpg zQXE6})NT^p;SBl%x>p-IQ{wMMZb7DjbUnQ@RUL=G=Wb?brXnh?^Ni78m~mk0iGrqa z0)|z!%dWG&u+B1X4Qgbo@yP0qh!@R>2Py7s)#H8D(qkW>ZRfCFfg9mATC%!YOVO)X z0TzSyY08L6MYsx!O&xU}*!2?$#US32xxe%F6S*rSd>vD1Wa0`D%SmyqHtmrC1&bQ5 zLoI5&4q3c7=KlmwQbr&fgoe)}k0gO2nbV)zlTYE&15$3A6r-8%0~j^Jd5TOTD1(=h zopGfy1hIZ>*m=MegKw%hU!90yD3~K>#1|**3hKz!cAkZ@H)Ho(IJy&YVa4P2pTo=P z?hrn7(*^1yJ?=y1QV_((+nz_>pze&InMKk!Gw;tyP#i)iZ7H%`of5$VLV1f+AI{lfb~YCK=5G1-WdV9Qj+8J)|H03vY=E|B454& z)Ko)FV<^y6G~r5YU5339m!lfZ<7ObsC z3B-IOhzXs6LQKZWEk-}C={eUlCOp01nx03T{aiI-pYws2d9tQp{eS@M$B0XEaiBLF z{xp^052L79S6xJsb*-`(NhJ%n0zUI*=!ntK8owwTr#pKU5F$+?jY$e)su3Z~fpni* zJLcB*c+7YRDrz`B-m`f0u|dcjD`yIHxZSeLs}fHQWs4%sWS!|Oh3Vtj238`C(XV8j z*nXsp@m@q;cGFnnvD;NP$t!tb zq;2wE2fq^TTvCOvb$zex&FYd=iILi@O5ST_`gWne$?J-hEvHn;3thX8h+SUB=ZYVrCz4z&>@nLED0!ef)e0xvHrV2l^cPZvK=BM)^>|M8D;QW&;Y=ay2;$Dn1 z1a54OZSWGWq_(Di=z*P`1}gUTLqr&&7HjS6V}!sY`7H%0q5U4!E;mZzBy$wsYFR zKs!a&lMt#sHNy7FJJwuT(D13Q*}rPs{)jvH3wN+44Xp_pzn5;FG1z;8de2a}W#ipQ zqCUya)R43p<=s!cBsM7AqmBj5CiayLuMHNx3q$1L16v`1@gsj%c!wV6RUa3wbPS*PjIZS@J40leDC&~FGqFpU?oRRM) zgms%Lc?`jmB8BeXyh>goa6heMNptWIqTb0(Vn79NsQzd{$B_?-zE zG6T@OEEy7LV}ORKqA^zmrevB(_z+jYI{u>Q_`Q+V^P3(RjlcRj#5`CYFk!l_ojTQ# W!`CN!Sh9CpfBs(pb&Jwvv "),Rt=n('