From 6f91d35667fa6d1ee9234296c4f40784e716c91f Mon Sep 17 00:00:00 2001 From: Takeshi Date: Mon, 12 Oct 2026 13:08:08 +0900 Subject: [PATCH] Preserve reviewed native hot-loop candidate and finite acceptance evidence --- .../native-hot-loop-r325-r329/.gdignore | 0 ...ild-actual-independent-review-r327.json.gz | Bin 0 -> 5773 bytes ...eexecution-independent-review-r327.json.gz | Bin 0 -> 5193 bytes ...reexecution-root-verification-r327.json.gz | Bin 0 -> 3818 bytes ...02-native-hot-loop-build-preview-r327.json | 56 + .../native-hot-loop-r325-r329/004-ended.json | 49 + .../005-started.json | 45 + .../native-hot-loop-r325-r329/006-stderr.log | 0 .../native-hot-loop-r325-r329/007-stdout.log | 0 .../008-compile-062-phase.json | 28 + .../009-execution.json | 173 + .../010-input.json.gz | Bin 0 -> 137961 bytes ...numeric_core.macos.template_debug.dylib.gz | Bin 0 -> 153480 bytes .../native-hot-loop-r325-r329/012-ended.json | 35 + .../013-started.json | 31 + .../native-hot-loop-r325-r329/014-stderr.log | 0 .../native-hot-loop-r325-r329/015-stdout.log | 0 .../016-link-phase.json | 28 + .../017-062-tree_numeric_core.os.gz | Bin 0 -> 118411 bytes ...18-p23-02-native-hot-loop-build-r327.py.gz | Bin 0 -> 5091 bytes ...-loop-build-root-verification-r327.json.gz | Bin 0 -> 4534 bytes .../native-hot-loop-r325-r329/020-input.json | 59 + .../021-guest_service.gd | 1708 ++ .../022-simulation_runtime.gd | 13548 ++++++++++++++++ .../023-guest_candidate_batch.inc | 395 + .../024-tree_core.hpp | 78 + .../025-tree_numeric_core.cpp | 862 + ...cal-actual-independent-review-r329.json.gz | Bin 0 -> 8877 bytes ...eexecution-independent-review-r329.json.gz | Bin 0 -> 7215 bytes .../028-actual-root-verification.json.gz | Bin 0 -> 6582 bytes .../029-candidate-guarded.gd | 11 + .../030-candidate.gdextension | 7 + .../031-driver-before-prepath-repair.py | 64 + .../032-execution.json.gz | Bin 0 -> 2205 bytes .../033-input-before-prepath-repair.json.gz | Bin 0 -> 230512 bytes .../034-input.json.gz | Bin 0 -> 230748 bytes .../035-adapter-owned-cleanup.json | 18 + .../native-hot-loop-r325-r329/036-ended.json | 38 + .../037-engine-native.log.gz | Bin 0 -> 6581 bytes .../038-outer-owned-finally.json | 39 + .../039-process.json | 140 + .../040-started.json | 40 + .../native-hot-loop-r325-r329/041-stderr.log | 0 .../042-stdout.log.gz | Bin 0 -> 6669 bytes .../043-fixtures.varbytes.gz | Bin 0 -> 9748 bytes .../044-protocol-report.json.gz | Bin 0 -> 2507 bytes .../native-hot-loop-r325-r329/045-report.json | 16 + .../046-local-phase.json | 185 + .../047-local-profile.json | 20 + .../native-hot-loop-r325-r329/048-local.gd | 285 + ...049-preexecution-root-verification.json.gz | Bin 0 -> 5171 bytes .../050-protocol_helper.gd | 292 + .../051-p23-02-native-hot-loop-local-r329.py | 64 + .../052-corpus.tsv.gz | Bin 0 -> 452756 bytes .../053-execution.json | 40 + .../native-hot-loop-r325-r329/054-input.json | 48 + .../native-hot-loop-r325-r329/055-oracle.gz | Bin 0 -> 16483 bytes .../native-hot-loop-r325-r329/056-oracle.cpp | 54 + .../057-phase0.stderr | 0 .../058-phase0.stdout | 0 .../059-phase1.stderr | 0 .../060-phase1.stdout | 1 + ...oop-static-independent-review-r326.json.gz | Bin 0 -> 3058 bytes ...ot-loop-static-root-verification-r326.json | 113 + ...02-native-hot-loop-work-contract-r325.json | 45 + .../064-thetree-numeric-oracle-r328.py | 84 + .../065-thetree-plan-local-r329.py | 24 + .../066-thetree-prepare-local-r329.py | 88 + .../067-thetree-prepare-r326.py.gz | Bin 0 -> 4144 bytes .../native-hot-loop-r325-r329/README.md | 3 + .../native-hot-loop-r325-r329/manifest.json | 1027 ++ .../CURRENT_NATIVE_HOT_LOOP_R325_R329.md | 17 + ...checkpoint-independent-review-r331.json.gz | Bin 0 -> 7902 bytes ...-checkpoint-root-verification-r331.json.gz | Bin 0 -> 6033 bytes 74 files changed, 19858 insertions(+) create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/.gdignore create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/000-p23-02-native-hot-loop-build-actual-independent-review-r327.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/001-p23-02-native-hot-loop-build-preexecution-independent-review-r327.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/002-p23-02-native-hot-loop-build-preexecution-root-verification-r327.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/003-p23-02-native-hot-loop-build-preview-r327.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/004-ended.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/005-started.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/006-stderr.log create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/007-stdout.log create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/008-compile-062-phase.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/009-execution.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/010-input.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/011-libtree_numeric_core.macos.template_debug.dylib.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/012-ended.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/013-started.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/014-stderr.log create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/015-stdout.log create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/016-link-phase.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/017-062-tree_numeric_core.os.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/018-p23-02-native-hot-loop-build-r327.py.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/019-p23-02-native-hot-loop-build-root-verification-r327.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/020-input.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/021-guest_service.gd create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/022-simulation_runtime.gd create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/023-guest_candidate_batch.inc create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/024-tree_core.hpp create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/025-tree_numeric_core.cpp create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/026-p23-02-native-hot-loop-local-actual-independent-review-r329.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/027-p23-02-native-hot-loop-local-preexecution-independent-review-r329.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/028-actual-root-verification.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/029-candidate-guarded.gd create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/030-candidate.gdextension create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/031-driver-before-prepath-repair.py create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/032-execution.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/033-input-before-prepath-repair.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/034-input.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/035-adapter-owned-cleanup.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/036-ended.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/037-engine-native.log.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/038-outer-owned-finally.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/039-process.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/040-started.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/041-stderr.log create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/042-stdout.log.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/043-fixtures.varbytes.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/044-protocol-report.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/045-report.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/046-local-phase.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/047-local-profile.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/048-local.gd create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/049-preexecution-root-verification.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/050-protocol_helper.gd create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/051-p23-02-native-hot-loop-local-r329.py create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/052-corpus.tsv.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/053-execution.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/054-input.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/055-oracle.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/056-oracle.cpp create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/057-phase0.stderr create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/058-phase0.stdout create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/059-phase1.stderr create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/060-phase1.stdout create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/061-p23-02-native-hot-loop-static-independent-review-r326.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/062-p23-02-native-hot-loop-static-root-verification-r326.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/063-p23-02-native-hot-loop-work-contract-r325.json create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/064-thetree-numeric-oracle-r328.py create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/065-thetree-plan-local-r329.py create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/066-thetree-prepare-local-r329.py create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/067-thetree-prepare-r326.py.gz create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/README.md create mode 100644 docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/manifest.json create mode 100644 docs/plans/original-completion-2026-10-02/execution/CURRENT_NATIVE_HOT_LOOP_R325_R329.md create mode 100644 docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-independent-review-r331.json.gz create mode 100644 docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-root-verification-r331.json.gz diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/.gdignore b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/.gdignore new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/000-p23-02-native-hot-loop-build-actual-independent-review-r327.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/000-p23-02-native-hot-loop-build-actual-independent-review-r327.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..7f1a2942fbea3bf764f0d39fee201884dc15cc8c GIT binary patch literal 5773 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/001-p23-02-native-hot-loop-build-preexecution-independent-review-r327.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/001-p23-02-native-hot-loop-build-preexecution-independent-review-r327.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..9c1982838ea8925f7661205aea68d2f2f69e16f8 GIT binary patch literal 5193 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 DpZiM> literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/002-p23-02-native-hot-loop-build-preexecution-root-verification-r327.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/002-p23-02-native-hot-loop-build-preexecution-root-verification-r327.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..af31fdd609108756a0d4744ab9eca4270690f4c7 GIT binary patch literal 3818 zcmVr)H$bm zX!Vc;$sSoYypXjqvdJIFBAWmPvdbdbB*>4MI6(eIzUp~Mwl8N!Ff?ug24>jZmzTF$ z-#zDhR2BP|Z@vBYJ3BrcOyBvdw~zZ<`_VkIx5sPy^6K!ADP=tIP6|HdBAs$gfxU0e zlR6(Og^<)mQRjLYsWu%xTa^}aZz>vyO7roZyURYd{d%lTuWWPNukC;<{~eCM{q`^K z9`D}D@!|Y^tG_+i{;>LDyI=o;kK0@C_Gc!?!|KV`zkTxSe|Ylszdrf;AAk2B z|MI`T`R^yc{ zC4cp!dxp^UtsRaR{r2XI-^0jyGZF2+DDa|tGi zxw}}ZsSJGEgAT1NCa1-Zdy3PGO8RoU2UJ^>JT5Y;DV@NF0OA5Zz4urv9vxAW;0xNX zQq3ilG$MMin4tC0axqxX)>Ct#*FfG}%8u?kK7Y_@2idQ8xY%8tUE$3=UW;8`>mTEl z(LzfFRft>o~Sp^HNs5zesbzh8e08|$9D9Xa1r^KFpqflGR&CV3C!}`(f4bN*_ z?Qb{7^`jH0d2+cf!DhgOwU6e9r66iPwiH#_6L(EEx=TJdwW1+qtvaZBv({WrR`a>R zw!PhpJu9;p&s}vs%EQa`Mi%U>P)5>q752dT1Jm@=$T5)VqJ}d zMa4=juw+qd&ZR^hDUPnxJXkQCrIYxc&_zm%<^oMCfs}NJc+1j~O$#PYo2jOfd@fcE zXnFWq3Io#6qQb{&CzZ2@?j;>ctu5INgHcTc2}o>a(fm}!j>;;aKk!<2!4LI7DK|)M z^{&x~>WV8Ct2<}JzKT3Ti&Qv5451QU^t4s6ab7D zG$ZZR_w$7BFP`mBf$cBO?N#6%jyNP2>y6sZ@UTIUx|^eT0p_VpK|I*a)lo9MaDx$1 zR2#r_JiK~!uBy6W^}eTtm(d#K6JUADbtzgEUq)qa>^qDF%}F$fW$)8fL~{wyK*cWmx4{mlAsfC%MWEWL9ZZM0T_tw`@=W%^mq&5jh*Y z94ah^P^A|SqdQx%X1(`Q9Z$I*xRlG?R|^%CLs)9JY!Tgq5M(L3P$}ddI!P_CW3cwU zx*|TqcBNcGbTe^Ql{Q^PuY=3Eh~f+BI{{Af3*gw`1R_eUCkS3{83q)Ahic-i0LX!_ zJCY>DNWPgw2{BvFgCpW(N#{{ByKniYoU&BSFX7XY@6fCvSxfHIx`U`Rz(Q3Q+H~v) z*&Yp5+2hQB=8Lhx5f~tKa;B5+L=zE|Z z$0#%;qDvrCJP0j`kdh=(=?H=?7jUqH1sX2aLKQE$r{&T2YrVE-rSX_=W)418808f2 zz&5ufF-Jp%-T_uFqt^*k&Jw%tO*s@r8@0$C&?OD+Uc?Y8u-)V74zWUxIE9 zow1m6Da`q%lng3VLrMeA8CsRdV4yY6yoQLID@g&zw zX5Fv13Qd#U?(z}K_HcPLTyM_isrB3IOWr@q@sbyMk`g#$3B(bp396`NP!E@mFqfV6 zL9z87T5z0v5{|=Ei%kU#v9K@<6OM;;W?hLET)iOgQ^uMSExCYHt=GmQm7X-l1odad zdmGTUxpZA}f}c(WkRcHRD2g0QHnoyl8m|f=@9lOs&usr;^;6lZUGi?X`s?lH2o5={ z-nYkgv)$Q#^*NYW9`gG6dGEu&-QFB8e=f)8&#Z0_`@5o%8{S;M`|bkeL?23U6qjg6 zZ8V28RjCzF4rIv(E)f)yz(zjRpreJLY{^to(vngvAfY}CN%dShYrbfGGZzvbJ>rcX zPR$qPl9mil4AMIzu?KOXOHHBSPKYwwZorHl(9KoSeReMbhmDjUxgHUXqkXNMkHrJq0gk4I8 ziI8w6G`1Y|V-8C*X;uZpjAERFgIVen!Az89oAGE+1SGO1v9^S)AutBueH58zLN~sW z+FxJ9KE=Hq+x?@%>LZp<9{luj_w2xT&Ux_u-@JHwx*+`gz>dfD=K2&>mr|CxX;gK% z$*#dMhT43d(bF-A8n&q4P4ht3G8rP5Fb%ENs*Zw#@H)fp&8YEv4#$Np0%38%7J;fr zbRC&n#d902jaldLbhUtJhxzIvdDz1a;_&KF85Pl-)%*U+1&tqe*wewRH*#~Uwvu<> zT|M?IIUE(%WHCQ2?#O}HM`!0ca)dU=YKi(R>X;ZmaQ6lwM!;fqp&&@b>d0s5PI3)2 z{_NuiEzbWK{^hYRESvh2>hfMBco8?}^9;$78}4_2eT_sR3PK{#U~|Yz@NZSvhw1US zq7gbgJxb*bO(xj&-VO)gxB7OKs z=8Ot?g(u^{ezt$3Vxl?2%hMYl>-Niy>D6~eyxVUD&z&H0=awkVg0~hV8%Z*bnTs|I z75y!)M`05$uJ)RHWgEWXrJEa4WHOX(EhtnNPSMV8u3W|#rp{5-7I8yi_58B{HT04d;uOYc(G3ct!h1MZ!;k{9%2rE+@M=dGoRJsz zzSf-W&C^xiZjT4t(A~we{adHjFfuKUcTO9{fgF$fR80y-=3^A~#?{Sbi^0J&p0O~D z*v}b$*DT{zxyJCu$9uS4AMIkdg^l~_^wj*~y$u@4!As{clG6qg&8cOFNYPxI+r5i- z3PqwGdQOC^49bPZ+-EA(&LW_HXJ4NW{%#`r+BPp-`CVeaLSkP%=KY#C$JLJI3pC1l zbIkFI_j~?od4Fz=b&38{fu={Wo+M=UIY*{`ejX~%PzDTB3-Gc!;N@U#ltZw&27m-J zYSZ+C*N<-Hu!42pyb{z8Kl=11AAIz|$DhCV`G=o;eD-uw9S(Sm`G&3jr@emGT^ z!-#28KBrP6$uLC@&+zUkw;ZMiLPT|H$m^1EDmjFAxI3Tk4-}t%_Q{Vw`{2QYs}Dc^ z{DU8Vb_d8Z7OwflxiC-%TB-QTA*mv*l?H#C99(WUalWv)5T^x_YF>?D3iDhpRZ&IK zzdu;a&&yrSCgE#4oZJI7_opn?1l5EQi}xuTVtVZ{6HHHK2uf^`C0eLRLctUC2Hsy~ zL{i`d(;vLQKRCcI-Er{MVZ*z_!|f^mFhA}W@}e;gD29PT$enPjfr-UDl1HBe5d$uz zqB`a$c&mfr4zPIW4U|pQ*}dCy_#BW6P$%T+>0;IIZL7|!ZezQ*??Ekdtzl^^R0b}9 z&LJ6Ub*Pm-=C*zdp~MXOrHZ1-Fx#ZaPc*s~9)prAGU@7!v3q?knv=py)^(KV8|<7C z*D3~CY$Yjm7&?L;HK;!d&F8tH0jdSl?pQU)xvDDR{(YkNdw}=4WH&;A>cd?Mgb=;kLy}rK!ks2A_Ix%EkAHvn#|jYSj#mtt+#T=!IKtqY g!_&Wxu(SP~mgE`U|L}yje)ZP>1BQp9?o>el03o7^UjP6A literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/003-p23-02-native-hot-loop-build-preview-r327.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/003-p23-02-native-hot-loop-build-preview-r327.json new file mode 100644 index 0000000..79f0b7d --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/003-p23-02-native-hot-loop-build-preview-r327.json @@ -0,0 +1,56 @@ +{ + "plan": [ + [ + "compile-062", + [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "-c", + "-std=c++17", + "-isystem", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include", + "-isystem", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include", + "-Wall", + "-Wextra", + "-Werror", + "-fexceptions", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-O3", + "-fPIC", + "-DMACOS_ENABLED", + "-DUNIX_ENABLED", + "-DTHREADS_ENABLED", + "-DDEBUG_ENABLED", + "-DNDEBUG", + "-DGDEXTENSION", + "-I/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp" + ] + ], + [ + "link", + [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-Wl,-S", + "-Wl,-x", + "-Wl,-dead_strip", + "-shared", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a" + ] + ] + ] +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/004-ended.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/004-ended.json new file mode 100644 index 0000000..0c5dcdb --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/004-ended.json @@ -0,0 +1,49 @@ +{ + "pid": 34717, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "-c", + "-std=c++17", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include", + "-Wall", + "-Wextra", + "-Werror", + "-fexceptions", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-O3", + "-fPIC", + "-DMACOS_ENABLED", + "-DUNIX_ENABLED", + "-DTHREADS_ENABLED", + "-DDEBUG_ENABLED", + "-DNDEBUG", + "-DGDEXTENSION", + "-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp" + ], + "pgid": 34717, + "ended_utc": "2026-10-12T03:51:07.694369+00:00", + "exit_code": 0, + "duration_seconds": 1.6463062919999993, + "cleanup": [ + { + "attempt": 0, + "pgid": 34717, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "remaining": [], + "cleanup_errors": [], + "foreign_process_or_group_signals": 0 +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/005-started.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/005-started.json new file mode 100644 index 0000000..0d3d014 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/005-started.json @@ -0,0 +1,45 @@ +{ + "pid": 34717, + "owner_pid": 34670, + "pgid": 34717, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "-c", + "-std=c++17", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include", + "-Wall", + "-Wextra", + "-Werror", + "-fexceptions", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-O3", + "-fPIC", + "-DMACOS_ENABLED", + "-DUNIX_ENABLED", + "-DTHREADS_ENABLED", + "-DDEBUG_ENABLED", + "-DNDEBUG", + "-DGDEXTENSION", + "-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp" + ], + "started_utc": "2026-10-12T03:51:06.111332+00:00", + "initial_members": [ + { + "pid": 34717, + "ppid": 34670, + "pgid": 34717, + "args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os -c -std=c++17 -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include -Wall -Wextra -Werror -fexceptions -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -O3 -fPIC -DMACOS_ENABLED -DUNIX_ENABLED -DTHREADS_ENABLED -DDEBUG_ENABLED -DNDEBUG -DGDEXTENSION -I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp" + } + ], + "owned_new_session": true +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/006-stderr.log b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/006-stderr.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/007-stdout.log b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/007-stdout.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/008-compile-062-phase.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/008-compile-062-phase.json new file mode 100644 index 0000000..422e439 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/008-compile-062-phase.json @@ -0,0 +1,28 @@ +{ + "name": "compile-062", + "result": { + "pid": 34717, + "exit_code": 0, + "timed_out": false, + "error_lines": [], + "duration_seconds": 1.6466069169999997 + }, + "capture": { + "passed": true, + "cleanup": [ + { + "attempt": 0, + "pgid": 34717, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "cleanup_errors": [], + "all_captured_ended": true, + "foreign_process_or_group_signals": 0 + }, + "full_input_inventory_before_verified": true, + "full_input_inventory_after_verified": true, + "post_input_error": null +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/009-execution.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/009-execution.json new file mode 100644 index 0000000..77f63b1 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/009-execution.json @@ -0,0 +1,173 @@ +{ + "passed": true, + "error": null, + "phases": [ + { + "name": "compile-062", + "result": { + "pid": 34717, + "exit_code": 0, + "timed_out": false, + "error_lines": [], + "duration_seconds": 1.6466069169999997 + }, + "capture": { + "passed": true, + "cleanup": [ + { + "attempt": 0, + "pgid": 34717, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "cleanup_errors": [], + "all_captured_ended": true, + "foreign_process_or_group_signals": 0 + }, + "full_input_inventory_before_verified": true, + "full_input_inventory_after_verified": true, + "post_input_error": null + }, + { + "name": "link", + "result": { + "pid": 34736, + "exit_code": 0, + "timed_out": false, + "error_lines": [], + "duration_seconds": 0.210839 + }, + "capture": { + "passed": true, + "cleanup": [ + { + "attempt": 0, + "pgid": 34736, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "cleanup_errors": [], + "all_captured_ended": true, + "foreign_process_or_group_signals": 0 + }, + "full_input_inventory_before_verified": true, + "full_input_inventory_after_verified": true, + "post_input_error": null + } + ], + "cleanup": [ + [ + { + "attempt": 0, + "pgid": 34717, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + [ + { + "attempt": 0, + "pgid": 34736, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ] + ], + "cleanup_errors": [], + "binary_checks": { + "file": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib: Mach-O 64-bit dynamically linked shared library arm64\n", + "arch": "arm64\n", + "dependencies": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib:\n\t/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib (compatibility version 0.0.0, current version 0.0.0)\n\t/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 2100.43.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1356.0.0)\n", + "exports": "0000000000000828 T _tree_numeric_core_init\n" + }, + "object": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "bytes": 368776, + "sha256": "4ac5a21e47a4441374131310c44474497b5fb5b28f6c6e75a5ed17243616687d" + }, + "library": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "bytes": 417184, + "sha256": "64608dccb3441594603fa5561fad3e2e90b055f32e4823c4864d2486a298602c" + }, + "original_inputs_preserved": true, + "bridge_compilations": 1, + "link_attempts": 1, + "spawned_children": [ + { + "phase": "compile-062", + "pid": 34717, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "-c", + "-std=c++17", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include", + "-isystem", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include", + "-Wall", + "-Wextra", + "-Werror", + "-fexceptions", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-O3", + "-fPIC", + "-DMACOS_ENABLED", + "-DUNIX_ENABLED", + "-DTHREADS_ENABLED", + "-DDEBUG_ENABLED", + "-DNDEBUG", + "-DGDEXTENSION", + "-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp" + ] + }, + { + "phase": "link", + "pid": 34736, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-Wl,-S", + "-Wl,-x", + "-Wl,-dead_strip", + "-shared", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a" + ] + } + ], + "SDK_compilations": 0, + "SDK_archive_reused": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a", + "bytes": 2284912, + "sha256": "4d54f0980c3f445f3013cddb859135b619f28a91205fc8b9fbc9d10bc76c52c3" + }, + "SDK_archive_rebuilt": false, + "old_bridge_object_reused": false, + "Godot_loaded": false, + "selected": false, + "unit_accepted": false, + "performance_accepted": false, + "limits": [ + "Exact r326 Guest batch bridge one-object compile and link to authenticated unchanged r133 SDK archive only; no SDK recompilation, Godot load, protocol, performance or unit acceptance." + ] +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/010-input.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/010-input.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1306bc5e22942cedde77ceb5fca56dcb8f1c8822 GIT binary patch literal 137961 zcmX_HWk8f|vzA7>yAkP-?k+*P8$r6eJEc*&Q)1~Qq`Nzo4ry2#r0cBuy~p2p&(2&E z*Th2}jriuzKj_!F_R)#TkKbrG_vz)hq%lv;?d{FSbPM_dS=0-Ne$aR7Xu6u~<2co^ z)Dx&L6!nMV8+XB$(U_wcLvMZlCcVY1ePf}ashQnQz5UAVH6de2wXJ{o^k`JOYRl~6 z0t~n!f1W0PzCho20YAF=b1V5iKHqP@?!>>K`eTVav%UaD?pa?zxd9i~FDFWyw4KD{ zFVG?{+pMnu@`+m!-}`8X&R1|JA$iBMM&-$<$m7dOfZu!sdB@ZB#>=D8>&oltLcpWQ z>x0AV4LStu1UzPn+{eGVK5g}BbqWTgIh-~HJjiV5C68Qpd+=msxG_xg!w&D zGmD|t?=Cq6ko@4cz+@KzzXRat+VB`%k1>dlHr&0eI0*aNM+rS(oc+??PzjIwRge|K z(3bU4d_J!>!<7RN#%&@$N3d*B-yqhYF#C|fnt#0{dqbVOYnt*_q^nXg{{u!`a)Uac zy&qA9%xQznDV$-O!e&<(Z2HmJQ{Eh;@^03?6^B$$c4@dxPcRq z7A5~cJLh9m9&^w>s#Az=#Ly46wo{j4sN+zqEShtCN8|oWU$ex3G59f_nyvGBZ(oG5 z*#F{WGT_CE;*Qqnf*K`*%jZqcj~218GU>|UoPxNsQ;e5;r5>>|)BDr*>|VhMM8L-KA3Jjtm_yNT%cb z(>sj=M55Td9`2V5>RlFJK#iPL8R8pdVk9mtXuK%2UW$i6@X5+L3`Ef(h@#lkBNUFt z0|nYBZ;2-oiYjK5!f^5nBTM^733qIAIPi^wO<9C~_{q1fw`=3fE5PJ2=dg)4ip#ALQxfX5 zG+gsu`-X))^`>q-@3lVYyc|T6zg(jG80Pp6$A6}~l+Eo~tgPqk@XFEXmjS9=ppLHl zjDL+Gc5@Gt%&n?R-7I00m1Lfr^+iC*-D-Qf)AD~K=i_XQw8LA&i@m{W@`VrQPKMP6 zY07DhG!T=`#)*KpyN(SpxI$r#++`boKht4i!}s3kWw`TB>GikLi*Z=Jh0(ETtN6`< zb_^y4@tq9XMWsT6r!(1Q&mhqqdiOxr)jZd6mciR_RF!#0&db+^!Fa!;PQGf9r%md< z!s^@Fl@ghKF{hjU$}WHv<201ST;chbbge{w5}mo`yYeaWbB1UEe~^=0xzdTq&2zvV zIJ5J9=>^0iBC_FsH9U57_PC7hdrWP}Yb)StId`y%a8^-r!-DOe%>dUVp{7_Z+uqZr zp@nI($ZJ`vY4be%^J(dJpS6=e;JV*q9wxRzI8rzPt-*ya{@az0aaXn#fr&RN2;9sI_18 zx2EOiES{nk%PUJid`+YHv-9teBBnz%TR3@M8v2Szci1E8HNFY`*4447hgSVfYQa{5 zpKab$k-u+-&H|aM@271|{Q*W%zbfTxYVzIfG!S`;Y0qM~=2Gz-pM}}(o=&^7V-%x= zB=^vMWjzrr*2KxTMYMbh;7VK6@?;0`5x&JnkXh%W3fUsM1G)p!@}XJ1_i~`)%zJ>N zl>kKwB6&({dZhIFlRQS`Thv`fMTFIN7q3vZJe#W_O20o`lj-rscTBQThjlU+Vnv)l zt@vAm!syIVFVJ{%=!SCT-Q=QcG^9QJ$-_n3{MK`EpN@b|r?~;)@lKZ!$>O{ZFaaj5 zIxB!lA+!mK)NPHikH)q|jlvCqrVTxtaI#)|Wi|b~xM{+)gE_uQ2u>##P(lbxm<)wy zTo|Pc6%&+ajAlMesz$t#!u+hTooWxTdC=l=ncJi| z;vU7292awfdGVCZ*uJ)BPuG3UtC+FAsY)S`&GD;bC4tC%-VCs;V_s+=8EfCg;@!jIg|l@eSTb!nj*&)%0r0)X z+}D=sQ>C8B6pPxE(PP7o216-(g~gzpBPre*<3E$R3#ryAYpyOc(Zsp&p7L1|%l^o8 zlKxCkcwwkW`xrPtI8}|T6NvI4@`%S$Fu-Gs-%0B}%}}#y_!-}41yOIREb=7ds{=Fn zob~ORF|4M;(IU>`2$NN}Kr+`cE<^*C4vf~W^w_L44;zGU4Se5B-sBue5$pta?SFv1 zY2Drk19te|=-Y#mHmo{cFA5upYXCxkG~t#J^nu~6Mynn!D%+(+Hwz5CF?~P%$dSgLv8qW1m4STX&4o;uacE9`i=2M<4u) zfbCn&M~jr%zwduzJl0J(v-5E`02z*Fd60hO21xy|Et$sE0aD&v4RjLr6mo%o^s?j* z`@^_j(;j`JRdz4tt zv&}~UWrbHTENYzcWA?U6SaBim*a_PPgsiw0{!U7FF~+me)YkjY^YYc6(rMz6Wxb@( z$C3s$38rV+;Cf5T>asD4Hbq+O$Y&hFKE}QQv5~gOjI}_6o1Lm!!8WTe<4EN;`=4ul z8kNPrYeulH_P4T}_@kuH`c7=G?PZoUB2~|c8~(9<9b+v3)qVCCmjD4Z)bPlxUH6G4 zX0AruBcGZFqptgWcm0oaSCUHu)`C4A<5Ur~>v%_9ZZ}QXngZ1uqK0Tt6vmIo9koW7 z6w*PyN@OeJlKz48EQTe`I_kgAUowK`#N;Otiw2qiaY43ePBxUQw-xh zuu^hs>;Si;8zjXhV=ZQUutAa=LfJG%6?BH*(nvulUR2@r8zl$Ev*yPYCm|u<(cscW zZ&^!y$rJd7hldKySAr7To=x9%Eeo2iT9Ym``yBDGSj?uy5$h79wm5h++nZ2+|BhmW zzxD?h8ZX!mdBY)8j~Ooch2mImbAIG^L&}I${ebzpPlU}~hIRWn%g)KhNa#CHDQLl> z;UOaXO+vvEC1$1j5pMTz-7T|GbH6Z9Es$(sw2nh8IW2*il%;vaoNtxM9|_ZzkHXbUjbgC>I1iqITy} zrkgOtK#IIkS8e{TUfG}86h%E`v)zm5;Np1~T3%ujRc&a;jJoWmw_7k<1+kKrm(sELi@@{mhDNM79Tn+MBdW37yyPJ|C}n>2 z)FA3yuba1CNbfd#1}z`|WT7g?hKII!iay7%B>t-}BJC8rYX$O6Ntv6&m;-gKv&c&^7@12)Tgm6+kHILJeatWm>Q>b%Z7CJK#_P0RL^UB`PoVwH!^WTUFf=#7(Uy z%gf^V9i3NUz8Si!rs#&B%wX;TQ=7i!@YFW^!XjQosJ}dw3Bgr9E5&sWd+h6IDT+{4;79)%yBcr*fTafQ30L z&b#M57Rl#lh2f=<@Xhtm?|kjd;Q)IQJ_XA6q_Q03EtYeCA%ung zF1&@KD~vKMI9P0&rm#w2;QfSQ&1R0FZ?=|W3ta1gT;+Po{z?p}VyBQkt6OMvi@g#S zNGa1u(l!+qTVG9LPvG^I-l6bQ)s6lPL{j30DGs;uF&7lFr9dzkX@pYwgxgtK znRPur?M=@&i9SRtwSC*#zf}Md1`Ev<4na%ncl3RL?uI$Sp(H-PF?o?CEGSBmAVOvR zh>0L+K!MD&NnZ&BhW~Yk%hIu zJw#VX2moRfIu0>SBMnbKhhJMFL^Y5No9>6i?o~FUT|b`~F3; zbvgP_StQ}8?G;%*vB~Dn+&=LAyM;xp_T-P1m#C}#*gZ~WYzd$I{+@R2`q?qldl@9j=Gr@~1 z*hOAT@v9T44@hcntNqy5Hcmcf-f)clpAsOj0@-?+j(Uo(S!@>#0M|+kcvd_VlyE=V z=u^=IMdDW5c%UJ8MS+-P+ zc66oP5?tM~g|2kc0Bz)HDm~;ZHjvDx_j>a7;6Q6LW@ddsK+uL$Shl2A++A6s@vV!k zk)zj{Sa7>x{1ay0VjjESr6Qc(_5Cm;%GOO$OtX$e3Rf25TR|-fNwPRsJWsWT`>N)m zUt}l+sW;x|46RVzuU6cBt(zccUbGNab*s!1aYE4<0m(oq3b0s`8S$RDsMEj&*}gM<1r8r zzKi%Yd`5r#rOTleREbF3X*C`kMpw#^+aQBCLmIAD3Tg#StD1@DOgT3F-uZ!q7DppX#pCUcM< zx+U8#6&p;>%yKqybt!r9bI7m_i&aEaU4O%NWoGTv%EULt|0~1#T9nmOiz5t)n8xna6{v*&e(_w0xvoa=z%%z- zp`j+v7fCxS`jWjd)U;f*-N}E&xf~R~Zd~I6T%EQhhNa`T*-3!S^fnGEw{YbN(JFFs zClt2hTL|0m#chCOjP%^Ys)*Z|FT^J0_8awuGN<>!f(HnSSe%UOz^o`ob3XRZ2N^Y+ zA>Mrxcn4Si>Q2YQY`$3Y95x@OYd5<0>GehPm15%psR5moumS+z0Kbve=h-MDvcTV%!P(_WxBL zhb6Pa!W(1adufNP)rhc!@C{=r=kpKa8TgWz7*FEQh!x*`P#sUUgsA_s(iF$QkUw#3 zcvtp%jX9LJTBU3R?{}bt?`~wV<#?0x%Gy;1H|fj|&$s{Fm8>LsGEEtGiE{nM9=B|= z!ZwuCZTw@|geve;KqF$3^zr9J!9F7vMeQw!m6|(CGFmQ9c<7@g+3Mm1*~W|Hnop5F1sSQL7hLoM4MnI^sO?p~^TkLgOk?SNrUhy2Ikp z@9!jOFH28U4~nG!E&r*88E7)hu3~Z&1nF$6COT}h`<2RR*jsrN-Yi@_5Ph^!b%Y|3 z>R;O)@G}1=LMG?KpoO+6NpQ4F7o;Nds)8f!rR)O_*ROb`N)&vZoL zzKclmOCy+ce?swe-}tQJ{ftX!-@2v?-e=yJNvosDZX>V(EkjBj4Y}7 ztE)1PB(8>{fy&_ld-V8*A!kx7-?;sMzFJMD{hMQXc%0V-luQgmygP)t0~L;<_Vm+Y zw^^H|Nm_aPTo^&`258tOVgpHiO^|rFDa}CAn)O;(GU-0P`&x(Zil3N~z1NJulB&?d zlyNM9%$__l(Qk>WDEhafg>Xr44Whf#R6U8iV7h)*jDm&BhsNwayC{&lg)m}{4^?9s z$_U&WifyTqH3*S$faE?YvaNTxAFKEjbJ63&vr_#W_+1ev4|#);eq5aHP$PW*GTtND z^wU*n`#-XpgH`S@GeR+k^{&4o$ulbvx%`J~Ssvb}EuEyoe7#97pCwU?*4XHVhrd89 zYrV>Xa*yYu+QOwULQ3nt>uu%rfOW0;YMn+CCzjG?F;A3ohoTBo)~+aJy#AI5NahRk zAGulcHAA^D!}VOWw69pj1Uffp?Z_UGwNEIt>yo?KCSYs~xBR7hCsvg&D)Evb9SpV2 zPz-8!2V`^Q<0MdEWgUOd3YGNzaQ`$j3!RDzn21B(3<%bL8S!)N2g2p(1kzq&eEUY& zPyDqi^;|6yZmwg>7;rH|_z@9yg=r$iP3bQGft@94rHNMOj`v(L!37NVcJ4Boel zWlCNBvVsbWS1+);qg0+pLOy&#oXGWd{kt3s-B&l`ELc@{qhtdfIuK95B-gezY%g|i zofRxnZWg_OnxAZtZ<;R?f}g4ovm$rd9zp%`Wn-&{)#qLf;)D$7Njk4mQPN1*!@Km@ z1h;Tc!`@|mAF`*d3UXFO$(VM5#F|G-osw1L2d zndZct%q_XpAIbVp10f*>kV9kB?H4yJiJSfJ16T>geA@1Ny2`!rUZN78g8Q^_MPN>p znlpRzpZ-VZ%bUPR0Vh6e$!*gI>rp-Q6YFv*b}4L+8QA{%w*=hqZ`Ri|?M#gfZkhgw zXdM9c-nquMJ73xxTKryiF51;~G9Q&u{e^jaOT^`&Di(Gp{HX*+JpBY*$I`4+W>}R3 zrX=i9auj=$Dh;!2h*DxNq1Gk3XE=o+%bvgNAyqGPPIM)DyZzJ%I3nDIFZTA*EN>c| z6wVj+Qg)xOC|!DOqlOEs2R5A&aB)6*AEn_gj~42Zx;w)R@@vUoJLjslLtv;zelw?n z0F57N6=4d7|4JSy&u2`v@d>IZc4NK=*k034ukGCT?BsSA{s)N5oaqqu^1U<`OhyLP z0jC}5rv@!GDYje=k0QC;Q(0($r;g28!_P=E-GB6j0c5j&q-KxqF*V}lnp5ygBU^3o zRKdv>IJy3Q{JRi#=Z802I@uk6>SlTB%W?Noq0@EDm4+$RNvxFxb9#fGjj+qOP9g`u1HoAYKg?e2)=ODe%y&P#aOVR13F21pEigDB`K^NiVpsXB> zd&F?)Jh21non%1i8szsYt$=r(kgIDXCU|%UXHChW?3~koK?Rf5NMhRe0XQideC4+1 zKMHQ37}(JyJ|=;8<;vEZ_dN54%5$5`EYXlQzEy|5DRLWz`HB-rN3MV*w#6C+KlSdR zgXjXH0ltsY_7zJ*C}prp#CX+rN)WTpS_P93<(iqY-GuyY1wDtS7urf5M~d^mBq~># zW3lO5042POd_9DTb$>wqgI`8_ek+zXo>T*A=3TGRo@}`k_Uq9zLn|Z=rT!rnc8)1m z-CmT)6OE>JIX>5czek2x+bJu0d2T+uNr@x8^W$?J-X{s0_@4wlzv*%|0gg3b7f$Uy zH;{uVLeUM`N+6f8+LlgIxe(_`X8)A$yF|6-y9Y=|+ula&UinQ3^IkY=(}P0HiD1)L zw7*{nrJzA+)K5J>;gMbalQdL?I1I}Q#Qb>2U`WlEn}bPgWjnquDpui?iQe94EYi|+ z;jaXZzK!@0)zo1GW`^sSbW!oRhOi1Bze&fRoIxdDn*Ecl_{y|f@fm6<@I~wE(w$e} zakaq}bpyINVLejp^Y#Cc7MLmZYUGD@`6`X340*KQcO(8;>onmNb{}b;d?&fy)GxdX zU)I(_h`NP5FVJrB7K8*_l8w#1Y-^FN0{>2%@tJcrnMdOM>j(^3gpM`bggVy!mPBbt zYtZBRaSr@gtSgiR3*F+DYnR4|ViJP2#+!UU7T_i>yK*l}Nn5_C3bI~m zmrtb0Nz+$iZVdl+MAuxRWfJe~Bq;vBpAQf|4%vn_;x*mtx&IE}4wh0PT%rA%H35TZ z)K#7!_8mXO-H>~iarxI@2zJB+w9piZ21nvxyyKQJ>q=S6xSa_ow}{jkqva#O8_lm? zI52&Fu2o0YHr9V7*Z^*2T9C>3>i0*Fbbp$4>pTV?2CW>bI3xB@kyq}Z_;kTkSWgbK zPLW>U-TVjhk#x(bhe!h{J@`FpL@MSqCHuT=wL#sAxrEzv8lthIsMI5-)HLnEMZ}2bDmC`m*{~YnzK+PKWC7NQxIHe1x)1&wB=J>@cz>v$X6e-NHUUq z6slC?cKLW~PF8}DBn9GXc)vhlR?PKIF1MXb08TpczTDyum4E=eQix!&NfVI5@{H}X~}Kwa!hrnGR}pa-9tWFqpCLi zt|XmC?e3&}%OqL-K|m)NzTLf+Djz~kZM>AslY|vXH709J5`Os5F##2prZi0obEm(4 zvLN=EB*Eis@mPy4HKYC0jFb5YTQMmFEVS#N!6G)67lPbL&B_7vk(8+uJL za&ebs;iaqvSg1lekc9^(cOeq3NfSf$g;GaB7p~33ak*yakxM=ib!`@g@Sa6zZ>f-( zrr!yOx4d8fnTarHTjPn&1oH*p7|b!bo6hU_NY{4r<{~N%k6jBNk@?^Q$;xnLhh2Vq zO5 zXXIM3yB*>t8IQBb%&Y^2*TeStoAS@T*V(RPu$<4MFD;Xq1z21{1|xpDfB>9UhW(ID zLz2&o)M;b2c&vKOl9MAb$vh3sC^*NVDKZ^d#Xw~lyg=N4?fwiR$u2afD22Hu6*|Gt zchHQX^9Cv$6IV8Lvjz}sHpXr8+Z+aMgw;Le0P_2n*S`~LxvP(q`!J9DH)%piqlE`K zHUMQ8@aQ;rDc2i`c1zc-mYnFuuNVJ?vh**{d^r3edN3icV@!HxPs9SHi2@M$I#f*b zlOk3)WjNQ9jp(3Z<@TS~8O{i8>1%~HKH23WVCugEA4*{4IeVKOLuJE>nka(($QZDz z1b7IQ&WQIO{&fX@*D%U4V7^2{)9$mO+KjR>i#qreNiz@u3A)?&QgPEj}>QC8teXg?6b-@w0wazl8+`Cz7&Is5G z|HW~WgfrzrrMd31?DPxX1b1lrW1u%&DXQ?QRz&tOr)~(l8j0SA7G0V-NV?Y8=&ka) zELInB$mF&iJa3mLhoX36ixh?is`+wWi@M2%k1eSDBDnqL=&yZJrGL@YKao+d{6brV zbLvETY5daLF4+`gq~<*K;pNSfgWn4Gv=UzRBnbc5J4CmA*=G@CCBf3Qny4pQi+;bn&>DG_dd4VOcjg76r>h_SPrUQZcGBYd1W?+;(m=Uorg|K zXxR{-dXIJYh@Oc~qs0OfSZSKrmOzBOe*_300Tv>F!6^Py7OcVFn<8yus5dc+eC~h6 z?0-QaM-Ad8j@#79^x33Bp7y`~&p>+aa71(BAu&;4p~yipKF30bun7uDPOYzj>sxhe zBY2FvOvBO}(S}2ig5UIqZWYU&AntvMToO7$L;PYPTa}Kwq`9@T`rs?WG(j0Lut#FW zj{7beGR=X|Y6C(o5z0Ke+l-H4$f5N_#1oEsikz9ec@9$ZB$6vus^f&>VG)!9&R;RL z1muq)LEtm5#rnMIEiJ1e6uAbB&Q|4S=2>SG5i*h0ZYpqNfMW{{k2L>)r?3YDto#?m zhk)EEIEt97;5Eu}2en?xQx~J?%5-2}e)q2!3P#s_=+jk$ntSx!YAbwj7mlGBv z8bb2YqI+6&D=f$uTq)KYpC@b#yggt8-PeWOhTol$4tC`H#gApYE6C|oh{mVyN7lTy z(&Q*gbXF@Gvbqh(G?w987hR-5U~Lw^y5!v!0QHZE9l}8d}M38mpoE3WnWwUrYPG}CVSV_3YL~=7`GVgq9 zU;)PKpy48&3@XM8PuBhCgM)Q#<_c08Hi_xzsC~sBSK3cNy2%3o5JmD#+iu<4d0R$8 zgqD|bT}T>O|E+WE{TnYcagE{tReJ|Vh&Ov&$J)IV=}X5~Iw?V@7=_Ymj>L~1XGc3| zKYY!u|JSl{U zWeP70T{&AO1Jt!02ns zBATO-(_lktR&mKuR$>wRd6Ye{|I{bx$E0@Q84jfjpWjS_Wc zHyzeuY*0IjZMg0j9kFt3=F_E`@w6dv*y@!lW$^_I#<0kVzBs;_mK@&C)=!CWh11G;NmqdTugIT3vC?Ez)m> zTuPc$_Lgi-XH!M{jXdYtxNV3EK7LAE4OAx|*N={UIgxESn>Hv+>rjoF$E#T${4QohLi7<6GqhdrT zDZWw7A4>94p}9e(nSG_vS&TMrm7;H#oh4`1u=mmpgIcQufK}O`PYtTtRVJiyXjFLr zzkIAY8q6$XoIzQR_Hjrvf!;$$S6kR=iOU^LdxX;B8+s7K;J32gNs<#2i?5Km?%5NB zF@U@184*5>E3_F@N(E$Uw-Ik?n;{J$IPL4lw_uEL7YQkDFF~zsY$6Q&jRs#zjxAZT zO;js5m3ZKyQo0ME$7;a<-JfQnMg`Ad(IKj9(=N6iTJ7Cez;O%2Sy!GnI3E10ul*t0 z&K~3o#tcVpEX9z{y?Jys-1wFVu7e1kK}!&M z6gN#HH^z9H8qtbaXQw{RNR7nB|M;YyK(S(Z4()YCrnvom8fs1^xZK(-MWZY@ z41_2HoLE(~#0Ql5LozIcvCj5-U9%}r3{N-N5z)L`z`tFTaE@l$FLpb$dWYE#tx0Fp zGuJf?3)Ns4X8>8hJSOWtBZc#_N(8-?!6gy0_N6eOJr8*trg@uSO6uRne_%d!Cy4lV z&Z2o)>kQ(3kB~LnO0QyZSu~AqzY`~$ZMQ^KZ0I8YkQ=WIeeLv6v6@eCQ2TD{6js$* z_4;23>{A)APKC8}`0-d%Pg@>;eMkS1*Yz%sO(4;{?P@k$^DjQlnrt^ps8<0u zWHfM^5h0T5lRV38GG9r7JE$II1u>ku=$yhq{toDmEcxLg$3Wl_Ipp-sd!ZNAJ2@YR zAr6Ffi|Iy6K#G4}HbmGeUb**}dK_h(P9-(G@v2ehq>F;84%bEB`enh4U`_ip z5UW*9PK=7UWZN4o*?M&><$5VGmd+?5$bF5{K1if$m4c&j+H^D2Yy)+IdYIv=f|vTt z?HviNT3j;n|>!^ ztFaU0TiCuIE^lq_jmgyk)tWQWin9tf}Cm@#ZE-uxty2JrlJ071N zCq4h3s8}%9+>oFoYTU0*)X7iUaHgF!LA9aM)~1A<<1weXw60&Y?|t~;U3=Ax_vb`Q zNX<*hNG6f9Y^u>!ju2#@7>! zj)%6098%OEjx(IR;T?8MnX`1BKuD&ljJAjM99B)$Xj!~}y3M^HJ8n@2oUu<16SnbY znOo!-gzsKjr0QFIsti^(oem5Q?B1b4@J}?ALFu?ds>f^p0|g*JyZNxy>XcE9NEGGL zZ@Dz#xk?onOEeptZ~^p zXsG^%xh{=dGlF*YdGVq}YcVRebfK!;`wtcn0gIVP?>BuAwBVrtSB=l+!%Unq zaiRh+JF1rcB+5g6J44>)VL$#qHBnFEM)(E_2`;tHWyBOfB`uQ(Y7N#NyTM;p4aGHi zm48571;dN@<8pQWMf*s?-N`01VT*z1Enw<+)@2=a!eGahQTs?*h%h2yUd|1==zX(- zr8n_^^pd>z)>on}ai3dUtJjOEe<6oADgnRsYHNL+Y$7-;;S1@y|(|4Nd4Nlg9tIAL;N85*?>xSs^;!>LFKkS-jHD zC${QJ>1NkO6Cf6JPBcTMKVL4Vz4zeSf|OsQd!ZGPrg7CGz1t2L1QuitJcYq}HJ1?O z(`iQBV8&5C$D}E9-UhpQ_UNBN}ZTJzb+}6nj?HhtbcaWbolKkZ;dwC2pxTL|8UAFwFBQ9XG^DI9kXHVmcpk* zq0}gPNdkL>=wmSU-)-22MyjP**3W)ym5!U)(J_Oi*+q@pCE)3rb3+9@LQ=p^j)od? zmFwTNB%m$A!1TK_;}VoV&Tutgi7L2&j@QdE(p5aq@U1dKsC7Jld_0NDH+1RS|LF84 z-~IA4C&zF@&Jsl_q6wF(2+n$2{y1XI!;iYgsPqpNsv23tfb)P%5mLv_0!i3^(a@FIm>2K!`{ z{LXib=;h3P-}jp&NMAIYEmDA?_v4`M(g@A{fr!lMyla9VauI#qE)J{xw^VaGSqI|MWPXfcB9goR zQ0S7>X6I0yCCC&|%9>fN?$Dd=f-Ep;?(V{$=}#<2@e_u!jDPjNl~0DWy(Jb`;OEU~ zAXl53gU#0@;gYE#J^!FZ9z-9{L0^lht6C;5{>tMei&3b7j^5q2KXh6OayT?dFsFEm zWG!gyUH_&-v-!q+t34^*CORx%%(v6X zieG9r;`GN~UfiTQs_z?OjJ?L43PyvGLZr?9O@1JkVYg|@d3@HXz<4ZSnUNGX>#$Sj zk&`xO=)D$Xru+2i0wn*n-wJ8}y0U`XG2i!n;5h20?&=U1Pjl+XY6TJ}+gt)(8=AVo znknOR=3Lv~Et?%B`jyBt5W?zOrfGzy!vYTm?3i)$6&>vHS+J5Zj{dNdIr2r?l?)Zr zDM>+k7Kxhp>!{vax3;fiFKbgIPoKP|F46FgFWHv_-8)z%2qaX;?RnE2omXUkeAaub zI{&|g{*|aBNU$Y?7uPdh@;Lxm&_Oww#Wb1QzD@4&KDjc zjt-AI+I{gk8|JaJm|x$>A=h%ooVY%^4-~2<1j&7OhU_CD2SaTZA?tW_L0P8sfim<* z!FEoORq5Gs^7+7@-`P_)Ina`%hV7%qTRda$|LZ3YDHAlCM^v3rZjJ-1PxQwcc-#zN zL=Zop+fj~G&f3;?%d%%R37u^3Icz5A(+imTWx92%V@}&N>k~E z%suR^g(xmpROA>5s87Lz#od(ahgN;PJ!kdh3Mg&-*VqJYu+CtZ0p$h|o03 zxS}+=ORh)+f714}EO?D7?zzpdfYqjO`y_wJ^;NqqSK5uF*N@hJ0q^|Zok1288TT!;SOmpR1Zun5H zU%<;H;7Ti(^Q+(QF!J_tPtOG3-}xg`>&Mtgh_vq?KXX#Eee*JM# z%f~uW=6-6Dvgyz|GCQ`1U9Pw`loduc6^48Xhd4`a=)ZT|ETk|AZTg_?V4%uJ1802l zjfgfPit^1F$E8&MJ`!2?D{9n534FRbF68^9by$Lz+gXnNX@omo6l!Dv&pK*JOzgq>u)DCq-r<>@zP!h*@3BJz6@ay9Vg%k5g-HzDI4 zB@Sou5Kt_FxT^QOFiOn{No;Vyt^wNukt^LbmvWnQS*{IUh+j zvYEz5ok!7!;}qK1C^TtynD(E2SO+$yqp9537o@6PJ1529pszl-H3H|y-GldO_76k8 zr8!&Xb&tVJ%TQ2Ow2T{B=t}V?ww6wzRXTn*{C*)(_~2D?gKxWiRHG{3#B2%gJ1 z`TUD?zBO0T4Hie!Mn?%-%u{@bh|eYBc48oAmQgaf=XbDiyXEdE;##0eXSMt9bCz;X zzNOE~m+#TAu*q3;hvD!zqHW(PtIv-Q*g}_q92p?nPKTptdHwEaVV=Sq1;zP@OxpCdW%X6pZO)9o-g4l76sbm5lG@Vi8dE)aDne`_5|MakpNJNrYzG13 z3V~1PE_#T@{hx7g*Qe^fkAcZjF8)3617FkVNumd2g&3#>^P0&W6 z2j|Q1dz!OZ(|Qs~!Bm_^$JR^DBMwXQnQ z{116rWf2I@ZdN0O1jWtPA367LI^5zIT`kHcyr$pP^kwuyWAxr&>9o-7iwyi4XpOhU zX#E3pF+PDApSRV1hVn>IhbTIfflGrVH{KRO&->e;9iGr2Q0X~WE0fgCcjiacn7YYv zIv*vE*$LBkCDImYSnzHX={Nzvnaaq0$`&J3hnS~GZ{Ktusj7rG@srU#=cNwx&@0GEqevn)- zh{JSJ)rguPnDgSZjDs-7Fc)1C4>lRsfBK((y9W*r!~=7>z*YK9JN(A-NmsGRFBpiU z<6PVm#=`Y8e8p#3jU{$?4qm$y_44g8Q~MTkXW3Ry%IW)9$8SD9xt76t<-jZ*HO_Cy zdDjHP^)W==+OSj?I-RNv?H3e15)}%2jJM6-ereA+arAZe!M`+&U*0^8!?uHO=AP6q z*JaLC8SjD`kEKaM!Wo`WFYo0gdsLmB*RA?q89P^TS!X(4gmGBX+BRo=Ltoz_Y6xDyY}HhW4X z*a9MB-kImIlXaAD`Zj%5Fn;p)(bx?}deKfUFDIZ>l+PfnL}f@29nL5?wSOFcx}Bh5 zLEk{ubMS)Ea4yKy-JfwuLA~>E=3F3yO}BCoI4GoMObM^Svr7%Rn}DS5zm`h8`y8-u zWtcd~oyLA;=#&M%ivCeE=WRqRJssHQuIa z8QNpGw@_w<; zr&8C643Z#TmLt!cMh&eFgn~Lj07He|rE2^DukOVE(R2-rbv8}(#%ye(VUwn@Z8v6P z+qP}nHXGY&Y};mo@3wuvA8?<&yEAj<%-Px9{|s@v?QWUL#Iff$k^5!n!l^n0k8)Vs)Xu8p*m@o5QlOkZz^Kmm06lpZePkYg_U}dtG=vTF~fqz(c zJxNx(v4UPL`gfsvulhdS@En3C9rq0`c&7cl~dEULV`NKQaJ)NA>4o~B%`p(WM zR_QZz+?L(=hDK!M@)C_vI;5XYQfoq77EfL4!QxcU#90+};HF}L@t4tGd!*c#vEc4)kylnTsEH0;mzgf&pT0@NNrxl1@#zR) zHgmr7Swu#&bvf}^=0aVSFf!Y#hYwXjOJ$B-pq%C`jGjU4rNn)?S-r#VFsfxPcRyT0 zYZUC~^rgwJU7TmWbzk)d;wWk$+h>v~jA{lL7#W*R9NQBzR*#Jpd6g`jVg>9aZgmdJ z0>9`NQ#fuP(L~1klB1L=E(W^kFq{6X1n{g39A_&E_m>GmgAYpN#9B7jEpah`^F|SFXb)pve@q@9e zne531&;X(ug$5am52xuYXeabJT3Xej{4!uuidgW3U~JP~(qDeM7q!#nBrS}fz(B@$ zWn4F-Vne8}G7pMr?*IhzlT2%sN%=6; zXuU#_-8VNloMWKX%Qa(nEP>|NB=wQpz62p_zNqrjhg>HoaqJypKdYTAxkBr|{#ws; z-;f-Vh-+k?#2E8nh}t)y`Ks&)(vS?uD{pit1D8USXDDVQvnK-Ws7$ruP8cn0sA9^{ zw+ye93(3dgb4zDY$M#p&G^-rJ-wxB@(626+JaEPYMDOb6!cejs_ABaJWSYYkN4%HK}0AY}G>zi56P7q|*E(1h&Pl1IOl($bX;zc9 zCc9FMk}a(UUd}C-+grWx)SxkCXIY08eBblGuCTvS8k9T1S16ptRt>v~OP+8$Qn}x; zw`Dc`0&|&5jcbvFEt>&JV4C3Yfwi+z*4LM;3u9V}^y~h-5}^qlESRB}rf=#wN%H9b z*xqWObwoyAb}liEvZmkLiaaT|BKD%y$CGR3w-?>r=>rRoY))U#>SP7$294nP&khm? z1WIJAIx>j(QbSa?zqmBGw&}R9!$Qy)2g5C~KhnU@}!L)I7y~)H%)?Appm;ukfOy|3^zbD$E=YIX)?)|`{@ib zP$SSCOy2spH}8FN_!T?!FsO2l5N=zCr;K_X1sz0c^i2xp zco1jyOz>n-yZA(IpWp0YUn-sbchPztYhe_JfSkS@sOfSk6`!w*9{u;7R&H=(n66d6 zSJ+0W@+@@?_5X&jqm098rS(_WBp`wxc=2zjqXA=t+%@#E&ckv05ou;I(agSxa9)Kx zmh$#*7IWimMwwwLj7;+}iIlnKvmQj6jT}gQD)TcoTjU^dL+gDZ(-5^xV>1f(CFSM^ z`&tvP-+6K-0{sJMptM^pv22+;KHV3WwEBQdRyoQMP{DoU8ezI>-vAZ*#a{JD#C&U4 zWVGQ6e_|D%{}Qg6`Q^KkW^pt(`Td+H%+@~mrUq^Vh4PN_2)EGI6~$BqI1LcC$2!v3 z@m=SF^rszi1y#=m)jG9LzVOQPS=kRlEPm;O`dqxeW_7BEGpfT+B@lP1ssFKS~|a}=fD>KHWs(#f2X`6s#Acd9TJ=VMHQa%A`pLtUc$z@GHS zSd86;5fr!vS-V`4*QvVCwiLx$e#$Anjblm}sJx*p9tyoQ}kRgt3 zxR%okrZTqrtycKG7%+9^E7%F$z-4;YnrO$H&qvBk9JaUgY+BgnV}96dipiB4HX9_3 zgoFjdS+Y4XIh09-b>8Myl+`!_;X1(uI$^=KE=LPdq?|zq^A{Td#p!ax@OjHCaxmZ} zM-;RA{$5iW8q_UGCRDSGY+=<^skh-Poi)sMl|3xCcYpbRNI)*pJu6VFH9a7=@o;~IE zNgDfRc`6|_{Xj=GXnb`5R==jtSZT@xd;J#DMw7rW+HJ3#Zm2g4Wt}2%sn5krqo$X^B{^Dmz3vVw*bV*e@u7FNH6orSweAXd~R9%>z$1mFp4P8cnG9PX(8ib4ZL+5 zEYzq2l}gcVj^`SD0g^Z@VGjs`b^8q}o45rOpTA5h20Q}?cuW>kDeM+~5@b^}J@Hdg zHm_e$*7H5RB4eLu$FS_TRHboLr9TGW+&)78$HNrL)!Y=~mW)K;-ywJB36M2uorIw= zLAei>@aeb2>>0DbaGhX zJWxNuwhT^Rpr5+78<^^ayWe70%Hd!_MJiAwXhhHM3uGz7Hs+4o=FVI62br}|Rgi>5 zTKrr8qA5Hq2LEFTHN3)vFb5-37TcKtJz^Z|xD$pXn5k16E(pJGJ+(r3oP7o-Ko;p% zZL|?hgVstmVm(SGLClk4;Bb|=<3|(~U{b|q3QBjjvJ!M7^rV61TFc z_D5xLW)Utn5NgUu=nJa*UlDLYyWRO(eN)QtCvVg+C#3+XjFaybzzLkL&(plwM0BC+ zAavIvIPgsSNw^Z_%K~3LsN&WS{}R>AI6&qa$QNH^2jTPt z>DAJT35PyiOj_Ewk zZ~U|gnz%jfxjT-&tF{={!D~~+bOT<^{*P#T9rq(hgSxXJGCs&Rs_HQ_6pg?M5?8I$oH#5Y=vbu%$c=IY}?j zAY&X{sLb?TSXxC9ZyN}OA7&+LD> z-#F_FDHjOTo)y`i?pnB+xmHEYa)O*)dMgNCJ7-@RV@or%S@~G0SDl;VMEk}$BX32j zb@mr^rEVdokPdjzp+=3CHOkfiTZA6<5L(jX{iRIABt^l&*!b0d>wnBhfo@n(&0%*q zLN%d?Tvc2{9AI2sy8{Vr=7(~r6pKX0d|7j|;dDXJp!I{X+S$1tuWFkH4YS)Zta*pc z-UqWu*|ZxRXYtqo->X`D&5rU5UZItGby4i{2z zW(hvUevp~;@(DS?IRjKLK6o%Pi!TYXleWn~C|y)Q$!XUV!2cRMucVtnFi=u7m@e1> ziuHwY5kD<5%TN)Q?~LGPU~AS`i0f}8G*7*LS5#(etSbC^{3RemB`tzxDMgo=m~Jfg zNk~NM<}gHRivfL!NHo}n_pc)hfTI^c+tl1G zPwWxrvkF2n$~6!P%ms_?%=SF$X>2nxVNxtxg0+VfX3*@#sy!%h2oICr`o`t7>8o-R zmGfD3?WbJ(H2)vY9t(BNLX4+6(GLk0+$(Bs7}~hrqPbS;*NT=h{Cw47K|c9p$!8ux zxXr+IqU{js*RMh$L9<2N-_{^iHf&I>+GEiNEpoACh{bwRO{eU;MOt?RHn#Q^(>ipB zHZr2*ND7)E{W6s=+v-MBnnX^mwhnLwcPj7KP%#5PDmC1$DEiJ1@{nhD0N(UxfUdnF zEOyH%)w9___%$Z;K=)Wc^(jHQ5U(WkfPq$P5X*9a7{RWaPfo|p|D7otlt8L7B$-=} zUnDxJ_FzLj5Qab6w0Jaa+o2&zxR9;{0nFiyV{)s+3Fxltm8pbI^%dx-bqF^7=0>^5 zgg%}&7u_DArz@Po{JDOhbmz5Bq-?nt>Iq|i2bhM5riNxG)thRdv7yDI`=!qxAqs$6 zU>bO?Pj#b?h==`(>ONI@++ec9n|Kezi)Op%Q~ZIFwAJyDX(c!8tyYw`s!W`~;jfg^ ztCg72mK^BK7?RhnhY5|+R|h=*GQVQBD-PLZ*1Q1wyeC=;{4XLF`$>X(DjZu!%?S=A zQ(9;OR@2g;oD*R7ZfiB#cp_t?HrvUg6`gvzX@v^O7()T=&7h)-nnxBn0Ppk@WO1KJ zld_oVXpa7me@(6_fIK9njsi*eJ6)({GinW2v+j&S7xU*NqsSF?d=^QxN+(DuBH#Uge_krv6)INY zdxttzBa-dLjCofh<$`#PHdWicYLZpBd9@tFcRr|c#t8?rWa&TOUy-x{Qlw!h@fn#A zUUyOs!|)zq0&LgWgb%SesZ%Y;l2kK9uBDZxdc`c zZ>c#msOUktPt_=@zTSOh&NIZ%KTHR=_= ztwNV#oA}ha`~Mhg_e+xU0YEaRin$^T#i1|eGJX}&C&2YB!zk$b(Ta{`q2d#;T+BA^ zF{lMh2&*pQDmDvwwFVX8aeY#2H&unV5uWKG=Yei%%)XR#uc0__HyU41eaEgsi(CCx z{pZG4Q`6WB(Qvfe+ONHs@|bUg$f!`rK#PDz@ob%uL7fJ zgI0pb_7#StRe{bZQE$4rdRRR6mo|{Gu|1*CARL`U(6+}6GhWo$-@vq=rCoO}T3&yf zhF{~S4ELP8u7ce^-9u6nIBSupo83 z$HZ7~OLGw8k=No_BdB}z(*e9`rL^R0MHO}6S zZ#=rizdA33-xO7BykpW_d6gKm)eFr902F=EihQpkQN$^gMFVz>xB`vcRW>wBb=&qg zS%PyXr72!OC*52()?G^atV&uh&f-oDRAMJV-;|8R5$5J+3}%@^tr zf->q#(R@aOCb^*M$((%osVjJ4#15nByBZV&?hOe*Cli#_&&-kAmfJ$$x$iS=m$e_;8o zRpu%Af5{jpNAYuXU8UkW_7mf61^`Yvi2MTGppZm4w$RXX31`>?Pe3`)8HlhCt-uHy z0)kxds8v1{*XqN!=otkYzI{DovmuQuRp5uE1!W-&c6k6ex&(9vX7u zDkhdQ0L=>k`vu~qHn;|swdh-9VGNfVCSGi%yLXb-vbJuVh2W?Q$V7Xts2C(O+go6D z?5E29HVGek)d-pdRvc{L5{bMQRI@39_VTy#JDKCT?O`UFp;2HxZ*M9v10Mzd zrx%#av!O4U;o=B9$_+S+Rx%>(f9jVpDmE@y*n=huhIdR*sF`HVg zxH&bERraz|?m@w+Ey|Wwqp!})d_&ulP3(Hx{6|R*+&4$v5Oqd|Y4w+;-{eijtt9I6 z0|#L$b%n23Ye)ZiQE94i7`g`go)(q`YfKT%PZbl+>M;Gmb`0X@+Wx^vYR1KbA4)8% zbqe$+e-;VIeaGD@<7UTyV>CKTa{J9kc#4W6SExf6>X!2rFgA%z%xNSBf^lh#-~Q9R zQaumMO8^pqUXucv(ISMnuH-+_5tn~h(Lx%bLg!6+pav{|+6ZiLv7^WVrkdn7&jV4- z>U3ovkxWhFPm?>{$$f(*xx)^#ImX0hcr#l#oScSLpvw8EzU>*!e}uI-R0_ZLn-Arl;HcZy zq+T@U?X@{Hs;lQ7=?N|UCp;=J7N_7xbrd8dGw6_iizhLn+xwa20Es558vICO`m{Dz zae>Cs&KxB0kGPZknL#%n_2e9^bVpJ>s56H7ZuVP&Iu zEg656N2*WXSF?1!taC0(=N{{}P4vS=u4#fI(R zqR2xmCG-C0j()mz%wP6deDO1RB%#O>g=*=4ibyt+e_>_cWsf}g=RV8EGDLI-%l0N` z6Vz&OLuVCMT9$o8JUi6pb-_&INjR0Y%WN953PLo^+UEoC{dx(qNTJT*klGc(t7TP~2VXyshSo)^d zc!Xwx73L{>@Bh^$LRp-kF{=@BUSTleoz+`xmth-QHn!=a){=J>P$C=BuQEEjPfjlxYA~w$HY;+-F}=VIt;?^2t09mq1uA>*Pb3S~@*Rd;Zxr z^;*J9?J!;Z2v3kKw5?b;Zz}CRGHuUe9Bnl)0N6WAukYW9#3mgSei^_2E3wGjr><^n z(ZEoQYHXyb2aw1n{thwBNPPjV?iq=%>#@f0kOFt{+Q){z`&)oV0|iaFXl6eBd3VqO z!-aLuiKQ+z&O=ot42EPmwo49N(GNvJ?zzlhf3Bgx`Tyfk@;G<_5~CunO>Sf!eVFoN z8T&vXp$!#)oKKM)E&#{#fFNU|=&x=>O` zz(7h%bIbkZhCpS34_DI=7m&02pQld93mz4S>^4-lu+mY4A_uLOjRe>aFC-uORjAPH zBn6*vWP!q7TMl((9{+Cn_g*(;XDU!=z z;=<3(nzaW3i3h}%%SM|NB*CGWV~8p|wZDtD>!Mh=*NL(&m)L|yMro>Kr8;eM(ht-? zQ0u^ZyU4Puu*}O+>wtWvJbcd~oH(=gSjZpaT-iqyW5+vb&)%Kg{0p3A1as-+qHB0_ zwHzuv)r~g}*GgXJdN2VHQN`$DJ|1VG2F3}AN!dMeT^(Ed1o!jqT+K#W^-d2BG-$Fm z?<~a)KL_+w)WDI@Gv@=c!7Q7WL9=Epe+&7ixBuMCSRA)qId zNomk^#vp#e2>AOS(GFsYo+A%lr#4tppVw@sZuoC%T>+J4sfo4bvrN4{Xf~;qbpiG7gQR>*cABeH~DI30tjTH5zaOXQ_8} zSNZCMT9x(lnW9qK3Ky27?Ux8g*z!WOi(dcVz{ZF?Ab5t0QNXrsKQk;6H@WE^ z)Hn90!DVeJB+kpI*-sI2Iepcm(8+-dSp?gkQk--?UnX12E-E@}L>2xC9nCz&&^m2~3dz^Vv`bOdD#JNP|ens*MM&T$l~_vz#WZ_f5m?`iciE>p6LI zPW@^(;35H)gmpAlbeU;Ag2zLg7M_7_wX{szUrmyA8yc$NKLMzvlrhQ?EWn&{QLm zuiYer;Cn%F5};h5*QI44Wd@_q+UMmSMxR>x#&J~Z%`CdLd5UX#+d(P04yj+V%uwE; zT6yois_tcD&RBp(TRchHI)CzvycRNAZ{i0}ee78?rUxMUq&OkSOiU9LJOW|{?mJ92 z4*OswjG`4S_}xZ?mB6HkzkB5KN=)i0I}M6Ph#|nFY`s(6q&{;*-Xn%SK?+Yd|!p*@eu`X^BXs^AVmNQovQ7tPnrTO7j#if z2;s5bS=_Lhe54>;ejpu-T6_lSVArp<1rAc08l7+6k;s4GHXl>1F2@NHPMVmCym}bo ziT$ORyFwq7WW7Q&nzQ8P&^O=v3~w)Q^2HtK+c-{Vocbqm=l{1E$(&5wRx%iPub7V zs_q(QnnykUqDjGvr=v3*aFIF&H&zb|+1cU4em9i#w*X-_8|dlUnJLeNN`(8tw@ zB3@}^Qs)pT)l2wOGZU36o?T;Hp0@uFU*hgdgByti)+g--wM8r({6B01xJdB;X<$1< z8x}>p>WsAKc-=zWbV&gj$Cy})MT(Fallubms?J3aDu=m)^*=I}8pl4P8e9w@9N$Bg zGpmAERid8q<*jw4kbxj#ET~bbT87WY?aM`QS&_*N05&Y7YVXO}WT%o-R@3>Btu?{! zI@_OZjH4360r>Et?DW}}SI+L08(Jvz8QvZQQv2uL_mJw4b9Ee8A5+EvUdPfFNtSnr_lRuw6h5B4m zT?(P+iGAO;3@`D|2$GV^; zvR3loSu5R@7jH5D*mDXy{Q{crL>V`@z8~jlPhV8>UM6H?-bd6K8jaD%jcN6KPM!Oo z_F{Pe&7uLFr3Y*8TN6+uGj|1RD*Nf$v~lL=(1=5nx{2liS{CoO>lk_Jtw$2>y3f+L$J zal!oZ=obJF55nj#KUz|;?l9(a2Fg>w?PVEpAHP;dJJnFgD;Mcj-x<`Y^%ild!rJQ6 z5q)d5@Ya^3g4z|My9;BCJ!4??FY~xE{`^azXC-D|1$%}O)Fl$;S8G1~&%rwQ%b6i) z;j2|>%k09UOy6IblI)}`AOAqllrfqGBUIQsO&P>U-Djum5kVQ#e6oYpX9nb;&iSOg zU*K~91z4E2ltnw6T_rDQk8VKs=U8J3VZ%eBw7dGT7d(1=H;(Us@K`FkX;&fAIU) z#pWnYJ~7L}R}A8IxWt{=ETRM=@TgEd14+8T}L=_wY)WF=vG4}Vbr)Bqf;nc)bP z*#u#V{Ws;JA}t-I9*RWxl)7Qdt4xLgM%J*R5?n|X>i*pGBfgyfdLo|YR{RSA@qKy1 zw&%6xn(RXx{k^lk)pbN5O{-`)-EM)=;xiEqDcvYHtixa*4ExqkFRhk0Zu7UttQaV?$pnK%P9tUd63j~h-~}3NRqi3QlEHadzv(|^ z?xt*K8>-`7p~a4>{095mS_7DYM`;WL}A|{{c#CQO@7KjZWbsp;Lu%{6wHMe=VfLLS~a`- zS22TO0C2CA`-=~t<#HxCV;P9pgI56dvfkZ)`yfB_8BWL#sfTdQm&)F>`i(JT-#78G zlk-Z8K$q{3y8bRoD{_U-|IR&|s|t+eWQVEzs2JBK$W0xC-`j8)r5ry@0^>xtWKjvb zLC3C&t?eU)Y`E3FW{vq&0|l6S0wrL1NH*Z7K{n>8F4I4A15F#qj1rOO>bIDHCBB+x zC~JGb1m_C6j9a`Q^hc%I*UEmb1wShBS0-dLuMDVg+?rTYWDHSMu?RH*WQORLQ)JYs zUU0a;2iTHV{gXO@t(;BDARqV;d^)62vr_WOlNZoiO+D-w%l1f}E9ia7ptWup?AF2pvrH|7Bxs!Tou|%$-sx($sd*5Wu-tc&D{ zKk-qS&AZd)l4$w} z%*DR-Et8BR35S+-FxL9vc|ym^FHqp-OQ75C!@ z!S4={7tS|%SyI(J+Y&-8xXQKq`s<4I*7$-1mVws~z9Tvx1?6$LZ`^%lbJmf9jA5|u zug)nqyT7w}J>F-hPGf1FwJ-1HX!mVMTB>8@#%PHnjlzz_mS-_);eK&N^DrV=G^LrG zx4ZjKr<;u(j16YGZAxmTc|AG526OB=Yh8xA<~y-F zI`ulcr-)G~Zs`_7(sG_1SNbz8$>f+qJU6XNZt-1c{Uc*EO2r=Tv;p z`gn8lY)El`gh1@I#F zxSEOGOrhN~M0d#peD}=z>4seEd2#AR*W2Uc;`WsDlyzgj#GX8wKe$(^k4 z6t%SX(=+TAFQnoDWeALx1#U)S{*P5?yfI(f*_X?jbuxtKb`=giP|?UZeG(%S!z4p? z^*DWp@NtPc$YEY(D^1-2v_=t8=*G2jC6UgV#u*;{!MB6m;wfH_ZVK&lAMK8jSrXCl zcKlrV`p!}|FRJk1(IQuKrpg5gv@$5ppYfknwDW7+Z#x+QWnxVuuR{|LfKKOE;7O0< z-`g&_WASgm8^)-)zJlV97|f$A63EHHNgIOqo)8*Kb&@1-ZLLrkT_V*y?7DIElZtDT9eh){YncMI4a<)Vk&Izj#1N@5(u`iEZSc(`23$AIXO^eEVX zBanf_P?LQx4K)ecvR*%+nU3cTYnoT6#-(txwqz5{z$W_{(~C8 zZdVm2QbjsO={1J$xH^iUjLbR-E=h=k@bMd6`$6Na&HMGba(CWKz02#W4d?hV>vuoV z4}{cKNqG7NHMa#WiA;n|D%9ab>hCt63z zn~e#X90}H?Kr@{n+O)_RGx#BpbmhggiY&khS`1z+Ah6(&OU$J^7dI@wBql|p5_vou zf7~5@wClWFH^UY2e(-+WemoI=EPlLhI5Tg0z3`XA5h9CaWCNg}*>h3MYjfw=UFp6y zwk0SY$kgfS)_|e*CuLhGln;M3+=Q8b)VhS!>t5t}M>l%fPQK(Vd(XpkJ(0#9DJN`E zw0II^I33n0?^9l59ays)JMylog! zh*C2Cf)1Y9fE;8v;OR4uw@67fAguIN{|% z>qGtX&zbY6%{>z$NqP3x5Ht53u?ygHeHk!TiB8u+U~L`fLp^)@^T>ln)jO~z$fPKs z4UMs&tAx#~iBXSjbPijtqB?MZQANpdzKTQ*Xdd*7qDYZ!Vk~_7e7KrCx(5O{hp@rP zdhn}OgDx6ukC)%YQ}4I;Ue0#}qA$Xg^Q0^ZtUn*BWR4HC#X=3Irrk=JbO%QYt!O7I zIb@kLKT~0-#3fUO&k{B+C-OXUR^QI;BB1BkQK#zt)`4L+_#Bmibnw{$SHKvzEAA)0 zv^y!z3iR>9PhH#0QrGMkl2Z^ls0^=2f*Iq^Uf-lmq6^WdL<+AJ8QYOgkmpa`N_w~w4vwPJ4~VKK5}2G`@&2}7?&Uub6Lvy6h`7fLh6QdL{ z+RSTI{U!QfJ()e^EtrHl90 z-@Dl8FyQPc%wu2OGC=UoZ6?_cQbu`@eCcsLE&80_;c4yt_P%)weC~NxGObTK!PYwl ziK5Y|{;6}pq*8YRJ)0gSJgU{9AoYtl6X`(S$%+j*&aYn=Q_rp1+imZ6u2Zi~))af| zTxM!wHSGd+;{9DK{?Rw*?c)rm`!*ctX9Ni|Tm!8krJg3Iqh1S2lxlc{I z?73-tmShMPou1SMOhdtf6ptOnuG3`Oq4#e-6k&IdI>su~*2^@TR|c z*Lu^>4zwWu8&hSBKg>uTQg>A9vV2)ZfR8dEb5)KVEi5i)THb z6?1pnv2`h^RE9H~Cj5ZLM(#$1FLdI&h5WpclCO_$Qa3oiRgl00NwwA&!q8=zB1^co z(cUWlzF#Vu$uvZIjsK0QJf_a z3HUgKIuzgh&|?0kDBaWkdiuvb1p7x9&&w!e>+LHk9KMs21=Wl=f9srwWtJ<5g*atc zU`pT80PMJ*1z2_{oaw}H?^;^n{oc;$gWvl_GV2x>FWATX@uiwnvkdS8G_(#cj)ob8yE%6hdi%TGL^w%jxe1|)Stf6m(L@pP%#>u z@+;FAe#N`#7-iEoe}r!%Dka@&2o%8CWG1SoPucP1YR|{6f9G%TtEgNbDI@25mIGB|JdiYL5((lBNh+&~hDXCKqGOW_(PnhGioY(G zQqJ1b2K;*L+0@cY_x8F2nXU}ZT!3)trv^oI&9?8?Nxo}f=rlttg;gQ?_$j7N0^Q@| zXisu8*WX~tvr7Ge{jSB{`FerNb?z=9YAlJr-Ro4sbeZux?b}cdi@sixRe22cz)wvO z){ucq_|r(Lxfw{`C%2Zq%Z}}IXX`VP-Phe|DCEQM-%H?Eg&-y795KL7rnsPHKD9LY zk)jEp5iqc$oR@#oo^1MUaWP`=-lVkA^`ra8CGUwW5Wuq9yA`_FBSzHnFSCHR$eP+c zU|mJ>Bi=${fdwcSvbWq@;<=NNF$abU9H@hUXPf6{zh-*RH8(rA4+=q9U(JcU+1N_N zANhUlU`c{G$S^ySQiM5Q3*9UHCT`w?CsE>t5V|hkgt}HjJ2urcoy_|5b;aFA`@1I2 z?s8$MOIt6~+x21gcZi3JwW|GD5Ip}~MEgYg;1RR0lCqD^Q>Z~zQIT9{8U(o4Al4qz zi2L#0;R>0^2k&oAPviI9%?_f1NRAWqSQrj9*yAO&+~l=K12ED|H2|{U-Yfu;VXbQ7P~$AKcYf3J{ptPO5&L6OgR60#__%C-nOeBV zUKDqG#jp@s@+zl5p3~P^=F}-2dZvLoH3+XvEm!)!rRn8r+S}`P|L}DD?hXRsr6*dC zwbxF%);jR^YpuQb45jTV{5SSY%7)~F3s1)!0Gnd8IB`@^Rn`g4jR)M@C;~-NX9hYIpH5bb4eQJ7(SNg37W%j(7QVv(aKc#YtOUd0ElNL@@@pgI=mdnx6PcKIEvYCo5@F$Gmn8Q}KUL_g8Jk>Pi z@wkEX2H7eXsjZesKk8vKv-DT22qG5qE^_cuy{s zZ!u(d6*<~*8+%re{YNS1Ok~kV*_pnp#ZRn$Qq_!Y8pJJ$k3UCiPcs&9+inJ^@{rlIwZ+bqHGTm*>8+UEE-#QL@2BZg z518H)@DFsdTqau_G*M_H`Q;Kc@Zea~!^%A4dfXfEFevMIsHuU$whJh?)^JdC;V#yc``xnzDjOCjrN7T%}ijpEo_tA=D!9y*9Ig4YpQyJUX|(&jTm z%6OW#!6|!;|2Z;A3N-x#((>czfG}_B2%YwNo)Ix>SeN(qPASQ_z~IRT5CLz18Sots z6nv+Brev5!W3CjG^3p0k5BXaI!ursA5;4y*W^~QN!S2*cS-|bnw5p&4E0!B^pS$;+X8aS;+8ddl&qCDF#o+iYB=wlx{X}t zBVLF{w{<)7J0Q96PqhQY`$6pUgM$^63=J@;;6j7!(O|~psRHg41Sed)W~sZ#+u**R z1AiqjVtcDW$g0$lfGH*uUGzO2fS*Pu(o}*-=od@2xLi95d+NZtP6Q- z53IDeR>wn*zH*&j7yJwCb-`=k&1k^w?V@4&BsheDNh{K5@_807Zc!ZzYMy?h%tF>Qlte)Op8M z90xN1i(Zf!HH;%&r#;{D#;ezRK7{B3^6`2s+tfAtYp2IPi^X|C&=B>8nQ>bKYkfzu zxnIX-Sm3A7N4bCh#n1Z0(cX|O;xuN?U#-3REAP~39#8j;A9u6A@83Bmu-{Kf5eD<3 z5045gbMg?}NlqqsvaIKnqXg87=u(id9rx5L` zB`>hE;^muP^!FPbx%aSV&Wm`J6ifDTRCmHx-8|H&!L9lRMqU;T@N29RdOjePsk9b~ zCZJW4i+=07{rQu- z&xrE)?Sy=<(RwlNf7Q3)-3Twgyz#%iinBj?;?qnHymHvn1^hcxEW)S6vGFU^|5DAd z&3DT17?9qQV+6a(%Ms7h$Qe1luumys z6vO$wQ3lX>?c_Gv4=8M2@Sd-wS+#^>SZ}Cbt+ZCH;`&K0Y1}< zZ1I||@$|vZ3m6jz0lZk&=(QCbn-QW62$cjl640YHoRl3m@jxakiVI0WFQTnVpU9s* zeXlp~EPVF!E4s!%Kk_MgEaOn-W6l~KEbtAGhFT}$z&42sk8U^#2|wP35ek0U0ZL{s zR7MpEcuxERGrXo(eEryG`b6!9WHE}VB?tBb#LhOF^jytCo4^@(b=AS!C^VCiT%rz9Vvs;$uNG_-Jz>R>Xkd;~ z(;RKjSb4pAJvK<}F}&U3|2jGIk6--w@9*b#_mXcu{pb!X9}cqDp_}7YIQrf?#cCg$ zIcMF1-^9N#QUXw`*`1$ZD*q4DU-UY6I)47sUiTzd&;bTVl)hX@nsk=hK?3mE<*bEX*_H0U!}A=e0^a%{U$#qzdl>Z& zOSu9J#?JwYbKykEg~6wZ$QC}gWr{6;nxA2&|6CRQ<46DW=Ku3oD9pX=C7!}%YR8u? z;ElagEOk{H-5sQ$#jb@mQ!g`Uqs&4Ej)_0hK|C{!dYcYw$aR0nRIlt--*}Pdp(frq zeuDp1p;n6oItsn4=y8rNA!{9Md#~8I*+Zur0`e%o}08?lQ7-NBjoPhM_2DU`(O(hYWSGWBu!U zJTGQ}n2AN3xbiM>!3RJYcLHU`>an6_PylwVGnqRV(79FCPJrg%ar&I(_u;LY$1WPY zXIxgku16g`{UGrjZUq`U_hAE6C8kgjfm)(&z)iJ`kfT(fteKK%=!k@nqNJ&#?9pk) z2=F=Mys{VFdxK}zi%Z+NOdGK|3E{{Qpwea$~*|?((k>JJ3rxY#125=Dm4xnm(6$ZL`fHeSn78+z7@LtJq?Nc_w_q z?FI@#$7f}Dhd%2|e+_4N`oQOX?*U(uRqqY)W0yXJTdD>8Yp%RumN83c6NxVlx;v7l zP!6s*8M9lWZyVsp|MkVc_^W!rKOT8d;^B0}weW=ktV)XsjwElnQ-fp|D97hs< zqOKyr|I1lx=5lVn7tjJp(5XpVa!YbnXFvTHag@$<`s{PGCAYS#s>_yTxk*7F5J3Wg z+!`w`$^zyMO=nugm0lW5VgPgqgsv?G@dP)YvvathT78Wn4t9&bue&c;%s9;}QUL2M zc(GMd9#uV}VQVh-v>Iz}sCA8lLZNS*6Ic+aBgt6T5(R+o?cMFO#;AR`MQZ!~80WaK z@J7)_bz3$up!8&{P|zlz)44H6blAdKndR|&pqpJZcf_u2f4?0E1sJ`HYd^!vJ)3Z$a&&tUYidwWgL|VzE;*u0yh8)Mw&%Z zDLuQ2d{Z>Dp}x%*#rS=y^j@)MloyTy0Lj>PKbP_=kfg){J4-?2D0g3$4ee)L&Ra~t_I znc-SRV%H!ZpVn)>^4T8N{llk|R#yKqKiEMLWP9E7&gHNPR-K8IiU0yc-h5Nepjb#b zNecdfIuJcCvlbwhnZa{{nfa4QSD(DFeXT(ba+J$!?<}J{O%+M20HE`abv}e?$xq6%iM9u+zgh% zVc0~~z+3u~AcI}3krESWEh-;#>w$nb|nNH@OyY&e9ynNjCc{&2hYs{C(+t zOh>aW>2;_JY{RT;!fRM~v198V?|k0{+l{kN!*{G;e=EwGMt{h$cON`LZ(ZzTg{6G!3kVK|3eK`CExT)mdD8yT zZf@tzvkW)o3XbuW?S(hy&4&g4TwZ)%Tv^@4QI9FyzP#*t?g91RoI#0bYLWV#h#5TvFFK|3#x=t$YHMyTA2|Xh zoo?8itG*VH8yGH)`ATyf=Ox=q?<|&#jX*81D{M*3!whh>Iu|*Hft`jTv#pidD1A(A zrH5k9fd{}*#)X9ZZ3qAFHv@nAc>n$v^A}g$xL?~G>|T0z)X_*Bf}B0FOQa4pyXLY0 z+s2B|xE7_4u-uA>CLJ_K1#~!@wAUHq{T<}$$~#|fC^Ma!#2DrT{Rfiut?`|^`{=>+ zMxU)}1a28QhLn=8%MZXf{C|jRmr4G5UOL!C{=V>rmu$-N7~(|AtANylzyQA|33Xb` zFcS-lsbF3ZTxX0O3>g_26lkpJC=7S8EcD9Gj&_vu#rOFNA_Q+edX-{>g0?+M4M~9I zx`(gy8V4u$)!=8#b;?SfZ^$}1v~P_ohT%v!D)94y_|R~2Vd3+aKE#Mkk-S`r>miQ7 zs>KEuVF8{boA?6jLNV!+=z~uy2NEH`G-ReSz=$;XSKH(uXSuTY&gUKEl9^II4PK-2 zmuB9@vqjrtn$f$udKPNM6@(M8zaV}A%OU)-^5TMFY}wtTef|BgOSLQOZnUEMP{O83 z0NYD3PSC1OCa0vv=%-Ylv;q8Pcv3E_4-t^S)PQ9)RE`hMV2|syCON=WuCKi>tQ0oe zMvi|?tF%P{f0whC5eJA+bI3R2AHc}~>1MoW1QtJ-Z;joatv-03@KX{-!ZyN_Hfg6{A#Cq&igM9&!Xo~$ECEFHgOJ`{iftN2xg23 zOF4T`@j*RP%35mTK(W*Y+gT`c)q9%Bh1xSx-K@^5IdSdBOm&=R?b*mq;x&=$q8lv6 zZli&pQy7Z<3PV!_7)ZgoBAoSR4S!WB`R6H^1SFj=UG#moPk8(Rg-%KR`>w@X)WZeF6i|xL@ zuk75!#(3UM#q#B-8x}(HBj!$#<={cT)U+fRq_8o@_nGUW2=OWuPAZ`8%YZQDQmezx zT^`^|uh_`W$89GufoX(5jdBSJ(iKC(vFp_<8-x&r3cRYinKPfEazxfk*>Yt6&|3`l z$JqOy>sxh;dGrX0oLc7xky4xO0A?40m?JQ9Xw|rPgk1n z-p~9)rux~w_4keJ%xOx&i-9oS!>TY}UGf_Gb3^8n{aacY~c=r;I}ewA2-<3UXqyG(s$kGm?UMFy@@t z`pS`GF@!aGeA#gSGMEAh{OR_Sai@p+*Vf`2cuF>BMsWtTxa>KLwYp$Zd3zw4*DEgY zk*60L3O^02pniIq1k{3BK#X&5GR?7mbZG-Swb4M^Do}RL4jiQ*yVWe-u@P|1>X8j$ zsHPR*0iHxg{`dEgS1m~Gh}L)BQphQ1B9fNGA|;Z%}pKb7k^)O=Yx7N=N&+uoF?jmcxElrTki-T z%cUHLfnER#7SN0Wu!AqvLCId;^6MUR+~3XH<3q;ZmOYnu31xG}jh~2x;8e4>eyW$Y z>1NWo3XA7C&=Ein%xnP3gzg75{Xz0M%){19uQbQe4)XodJ0%s}8s4WC7VVO}I8dme zr4ZSkVv3&@D9<}#oZ-Rnf$9oJY#E`<4x=1cb8%(ejdrG#HcPi)2_%hV_+}I6IBQaX z^(BteLpf57XD5>uj&fP-%3t0u*V8c0gm|q%4tA3_7hHtigrk+$ER;toxhx;p9XZq? zx4Jku29`6&I>1_<-Xpq#sk4itr?tZ@w|AVyb99#ZcGdG+cbfv&Ef~|&bk(I<8*4>kgvBxBb@#PDPo^xYnhV6UM5q+MBonAOH!bw0T z!MDHgQK-3arbdiHL!^nLW62Y_$2yR(!>ep@uy?$P^h$9Zu8^IT43N<}e&)TM9tI=> zg&-$;&$ih*SG1gqfwPFtw)%*ANt59#DgTR|9~MEbFTK%$Uwzu_aLWp)9zgb61Mf9H zF0nHy!=k|TKh@{1_ykqqq`MY z6Wn{999lnEx)!~oP#={u`)tvH@U#s2i_pAuuW>#<+>YA=v^=h^d>&g|+=OeB_a1H4 z#`MBNvI?7Y7)_;nZD7CD#uV3)pFQwO%-UvQhz%o^*Bj+$ILvpe@2uS#0A^K!waWW# zNdT=tYo`jgZmGwd)GMLMBnO-|=3td~lrgoL$6nJMm4>dae2!FNOPgZO)+6U>i^Nn* zJXPQ0Aa&_{8mTd8r#|8EYs6&~po_Gh%>)+IOL@Ijeul%mt%fUr@8(*mX5qYXcCZVL z*NwyX(nAf&R!-Fw&RS^VR}~PSZj>cUT3;~D*LkeRC#9{GH-=Gczq3hGA7xcQ*AYC> zYR}WvNHInP89^$F2tJ6z8Ptc0QWL);7H6EddFhVv+SU&AmrJYf)M(B)OVqI@WNlKx zjaONwW-S)#ppIxPy`OFv2h>;Vi?hS1;5A}hJ5BRo|M}&JHtcH)pNE&SIbs?t5Gci^ z=vnzWr+K(XUa`$c@yb>YvKyBwn^$kH ziYj1k=#7;_QXrMYeo%DKD?x!9uGSi$M2A0eCo4XWA)_O$? zX3FLKGw)9Js6MZzEltiu@{JV;DFvDE1~^V`)wK|fH`t&&OFAOSYb{$Q&0WfS{sIX2aOv#pXQAA5>6v>gDO-Q+x*08#)0;lDiqj0#7EC4!WoT1+J zw;JgEeP`z$cFsZK!>`rG(Z)5^!5e}sgZGxL)C_!5`>2hQ7@U_|IpowWO}zl&fi3Sh z(@}xug|#=znwo^o8I6WS99UTqLroruSxYJ|@Sy|N;3Scv8e?Gu_JSPUs+PcJ{}nD} zqU*c+InMJY$_#^?sw}z{Fd<{vr~*a-dh#-l6gMf ze>h3HKHkjRN7!NfVh;!U&ZXryd;jV~INNDUL|$+vi9Ry0(SA3eDMavxXe4L00IQZ)8S=q2h4jDnqq*2_!orey73P zT|S>h3IJXjFuk?Iqp0)?Yi|^VZ}!YlF^1aIh(P!@L4UG1WGk1zg|uX3eYTynr7O7N zw1pfZ%Tw1##+tde80P1=&YL*39}D=FBq5izW_HL}ry|{md>(Qf$nF`mL13spIW1&W z00OY6Wux{B&uX9aPEWtw+}YE=?jL?VEN5L^c_ZYc5H_dqEZ^8UsZzm`a_01~Sw>#k zEB+8ntrgHq>KdP#-ji5rAX6(gy`-9PZEx@IGB2*a6E06`BT_umoF)Kcp`>v}N^d3u zX$;{RAz1U6p<1n!Rip?>>6|=rsqg=<&3(TAmp$Bke*PAZK+4yb-bmq_^Bu(j5@#xO zSxta0t&i^E53Tf462A4u!F=FVI7kgC9qb}lb3SHvb~Ss0S&np>OUv(+?bWE$avC5J zoV?t`bOYK{GHu?UZw0jpjrSxbX92}Raj8M!;aR~$>A`DZzbi&IJiQ+`~vCvyCvN9{; zV{i#Xb=y>khaceRkEgM1e|>xy*x9lE#w8C(_@+E|G)EGuJ!<4*TjNM1nHBIbRNrez z5uZTTZ?RP^ze+t1$)0K9$t_3L=j!<_1sd)au^beq@ClMMke zRsf>3y3W{a^lre0)k0Pd!=59WS41%Hgbk=8Q9G*4ncB+#6P9~_XM4kbcJ?XNQmFTd zXyv8N7=;r<(&Dk?ok(bL0C?j}BFu#ZcWYoOsd_$r!J0eF_w65kj=Npj!3J?_b+g?q z)2|}p6D2?u{EkAp$>lV`Q!+JoIW@xkC|QaKd+KXS3Dh@*IOOeCI@q;~+}~Aa}Ec3C!IhpgN$b2L>H0OX!&;U!2E|L^^;$U+++dXqoI-|NQ2tGk3z%09Ue zK<6~g0VK7=vl6bf7y!wqXo<*(1y(LY^WuD?vXWoLK>jWb62wN<`X~0Z4(wsLwCMTM zYHOR*zifcs&(y(iL!EJqHat*5FJpq&c}`RuE=1KyWQhPR#g<>Ol>*pRUuBB-cav)i z@0|gbG(^Dc=6qPiiJQ~UnjP#j%d)F=kwBx!9mc)iSRSF>ZT5?K*V-|#Ac^Wc!3`r;AOGeh3933yR!*7nN;<>Qq z`SB?=Y;t^86hHkwO3fKqc+5O2GO!Q1_7tmA%6rdTlZr;xQC6!Sq@=GTh{CV2#IX+Y zrYfGeYKzo?qyh~LL4XT-;Qbh;cF-=&f?{JKt5lF5Ma>{A@ zPBp>p6O~gIMb_es3vr~6C@p|bt?C`8w74*-r^%7FC8RE+&I*!x>H2VcSI0WW+t4fm zX{u!b$hS_EUmJ_3bC9S8ldO&dg2-7{kESk*AJgSd(JcJKBrlueNgsbb)GNL&cy0jk zVYA}Ts127z0Z4&aLk6@r&p`+Yh--jWt0IShD>@ID?~5Vns49ROrHXa84UYAPZx`L$ zwNik(3J!is)K-q>CUqLb!qSAFew3QcB1IZg%8RP8`G zb(^zz<^qraqyT{MuC|ft=z{|?7MLA1;#L_%w5|JYQBn$o9W(YS&0T5~ytJ>QeB;8( zJ0~`c(c?rs1TN1DxZ+vbGl!hI!fz~9R+JYC;IkSM4&*~xKo>pD7B93lJ%0K8`Qz{Z z{PmVQy5nov{4$=7yb#{CgN@6STDIuSLORKP4zI4O09dr>y+5H;s+)G!+cP^MqK2^8 zahZ5QrG9w_IxKIu(g9AicNaUA^f)df2cP^&^*=>rD`n=0xKO6xz`5WGU;9A%eAG2O z0IQogej`b)S55W&+l_vCy1)7SP4%B&?w|f0-0Hi1Y^YfS;%*iAm)X^_ z0~U^6R_v=SH~Io63U0=#3*mfGrYSj^i*jBvf(t%0PO11&i~U>|+t|xa?YwC?cX^mr z4V6KxX4ow@!0Bd`A6{u9oJpnz)X>;W_?VmkolJu4G22lSUoNh?feL)x?ga?c&exW} z7{C$=Y@*Y#&WraAl-e&ih*d>WsSal?ISbAPD>Hn0oiUE~m^aONVF@;;->?bManS3` z1|Crs$DT&b9{xgU^lXb4n-##@g`!qsnaFRt$0UE%Fdn2l{PObWhX;gu^Ifi4XpxEm zHE}L*iLnUS97Zt z{3ov7Qr1}nARD0iBrrIOPYu9{({$r#o;@~`!rx_&kyv*0;rX@oV7PsC0~-@l-R42F zs1vvek;#dRHL<9`vA-4Q$GN4m0a>@Ss1RmA*mHoJRS;eLo4U$+vyF~+rOTVxc?Sq2 z$h&c-ps1WMCC%GPY?1~gDHJeCpu8oz4g^_CXD@IUAIV?xu88zqUj0oD_NC4B&jWT! zo5an>LFu2+JBO;mOiMfhHBR9G)lD%2H)aV4?GxaVi9Y()D3mxrA7x%Ew zk=BX0`b5;oXO+sDld8J1tF31M$;E3j!7n{#Yi14%&PAsy`fzCw;AxcS=lh4Jf7(a; zjiqXb#iQ#>pO=Ca@!Rqy>e`$QVJIa(sJ7*MaNr`$?_~^djle3NsUz@q8M&+xGcER# zxbX(NyuatXy!>9gJZeiNQt~tDe5%r5;92@gJ`L7VAc$`p z=gaLs`AoH6$) z3D)DNkFXGuIFdGm>HM2)^Zu^0X9GJYQ-LxViv~HH;rM7g}K8azqgtj z_{X#a@5-K-n_>p*qJh2+==&MIb8YQ&vv}m1t(XH}s09W=4hQv8&tZ`O(+2P9-YW+M z7UN}X!k=ws`~!eTxLTp-__tW*5YKsO{hf-k;9S;RPKd;SI)0`GPeFVRfI!RZN`f2@ za?UZ>ks{43|CU}080xwtj*0C(3lIX`-^|-XIQoS(H>%!qsGC|!4rn+fiqwywsdfS5 zYG4bV*E*!@h_uCVG+xf5mqC4@R!2`9-s)asi9;OZ(z-ikEfz=qxrm=UED&SrF|;X& z9*xa>8If4V>MLt8qq?e8WpR>bn9jG$>F8Ne;lBUb4S!rfxw7;|?cOGYVKd{%(M19I zt}Y-@@U}Ej6|xixxLXDiZZbw5Rclowq$vQ%DxocTgINx7mKT=a*$lzyB76e01_r+J zFy!Agw0hr5Hi!S_9Ku@Rq*_;%I0ybTvQM*@e$hC$cU0Q{&2B#G@Ah!>aDV^l@d$^x zwC;vJ+g4?|?|o`@NX$b4dSxQgx^6xRd-x`m??I+&9^Mr87zUr2gJQc;y3YDqdmQ2^ z*Vf+o1hJOm`0v^?=cL!9tIskmRx6paubY$BLu1>6GwX;epyGaZK;1H`TrtbKefXpl z+rX}F^x^3kC)rwcV+z9NHQ%ZMC*m~b+c=I-4M+uvX!-65(gY;3EE_Yqnm~yf@=r4b zkVDGWl3r(wgFNKY%KQ9dg7V~*N{TIee3R}pTD7xWt-?w<6)*Xu92*pXw*k#LQ`NL8 zxPj&?Cb_%0|7@qxQy;J&JH|aW7TtJ!$~kV9AAu-?1xizzWXVajyYmjOYp#aaS_d#a z9HlxOm0J?XwJy|wGK~hb1x}uZvus9V%J$3Jk z3%&)_RrAVy4Pe(Ebn0c8_8iV`@1E>|Ba3bxf4#js!apvpyLGFwS)7%CQ$<*pm<*^b zv50dd7unJ3qa+w>7|urF08GFXgi?f@QIK|GlKEPL9O5L`*4}xUYmJl!R4(}1Lr>0A z*ru(t)E8vs1gA(geaiT7!BQRvEap(yM&K^zUhu6i`tjybkpdq--akDaNN}#Ly&==K z8Bu^if(=-;!#6^08Vg6jdB9fy6&7wSz&7M)WT93)g=4i3r0QM`T-m?HFo*ceOY85f z5D$K}Jc6*027%VPvys#}T^ya^Pebz5bF5$}DRD{!ND@BXfbjYi8u&-IF{0idGg}X% zJ(pMB7*grdW*SP;1M<*_0I0>WrW`itAUDk$WvYE`X*uvg&hU<|3gCX2lnY8({d~Pu z4sn_5tM9z*=ggE9d-e*C(9OKp1v+a>rA^=b%!_E&$^f;gt2;yuzIL?Y zeYMLbxcx8tc=OrrKYu&~sD8iRc>^|nrkj0w#RG1E(y7V>b*bH8kH8LWTWv)C{iw@Q zn@GEqis&Qa5G-Wme(6=`d_%{0!N!_9`>1o!5=&3BuIi^O-lGDf3b~xP*f=941!UOf zf%R9m2^a#u=)kR`_7}|XbP~!rh|+E>xlxO`-QCK$>aEx4+~^fPk$U$7!9f~j>I?OW z;#|pvHB!Vu=oY~Iv(8>Q{%^g)4hMR~*|Iy6LkhzSEKqwNz*sEq>Vd6Rm8zc6B{u)M zlv3${96;)x@4yx3NaHN~oMPIi`=h<$>zW&=vux3}352~CC_2~(ht98xZ*NtV8k4W= zd2Us-YJ|l)&W#kAaR6likeX(DjUf(qi*MK6cT>t~Q$pqF0%n$DE1JMVr~{W~^3zc+ zrizoP05ZAc4@J`ypSzxZ#!K$yl{bb6rwdjIEJzD{#qPnm z={ZljmsD{)G&uM~nVQUdXO@T^zmtHC$x4hmehxp3%)px4k0eUU(SwhQ>JjcP? zh@*q4$64wC8pTZjbJ%Ci28xmpT|%f92KC6VndWZl!#wmleRI)`N|DXm^a_F@N~zjL zfZ?b0!G0KoO(0MOC$qSK#|-I)U(gY8D7NmGi_1Z_F`3dZIpI9kxYSeWm@WGX%fdk;m< zx#)Q+_HA3SH#y1^jc7B>L30N_M|=C2XNaIAM(cEBqu?h-cx%(6&SU^Nb4t^-epc~o2G#1O0 zVGe2h%H8^Jw~u@)din)9l0Dk%_Lw`?OY3e_i);=Z5PZP7u@fN`;bYF(jQ!uedN3l^ zpaJtQSu6_=0RGKePMliYkg12g+8~Gc%C)t3Rur{@Kq3JM-m=GLSdX`=vQ!2~D0dbw zvemF~jA%rlmTA5wmn$N%UJkzhx_|gMZ=N2^ZXWdR*8`)=<&`(2z+BkuLP>*-UBiJ6 z4bE*(9w9e-(4JMR2Z09ko2ynl#|L zOix&=Cp>r%9=?pHFAw%r^VR_aR#gTVm=N|fCEBy8LYFlRLmTZp&_#)Ue%IEx@NYI z_Cd$*RMxybt`qF~(i^NQZeIFYrtB$xMZD3}bh+#u#R7WGh1!Lj7Bj#xsG#0cN1jKz zZ&BI^VaRxcU5@ggYs>F^NyI@4vYe|faw4%%V9lkJW0-LU>&*j8<0FZDIclzljzj5L z+2qruDFx5F<9B_qvwXkghLaS(DY_hE@gWrsxn_MN?;H$H10<}A(w;1^?~x<%gaakj zXqdoP<~dfM@fC(R$~(4}-4{x11lT}xEh{-K!Ffbhz@4>*;1FeS1LUWOBSRJ3r7*%o zdXq^pT*+6x;^F?JsQIO{ZtCW=N1gil$&N}^*EeupiI9RXn~wy^@(6GeNxj4lz*kf= zdl9Ty>d7OfYSmdPhxdj~iq7#B+AIgZ-fW|z+~?&@?ClrCS(?kFcmo2|>dW#Z<#F-; zJV)uNwk%U?l{MyCy>vhT9~)n%t~wKy({5Ra_s1@ejW$%4RDVKu{!wNWtn- z5QiY}8=u4)l9LYQFw$-jxY?!EJ!kD8G6~XDQ+u0rj`E=wcCfSRDLUUMK2|w&3XB|l zyoOkci`K`~#kx{G1?gC+x@AeN<`JXgMCf|WM9&ESShqP_b3Lq@N4&AD)l zMwD2S2Bm`eY%`OM$}+cd?PX@6#0C<#;h=p-t*{U_^|eX*pZw#^pDoklH2=k#?}4( zHT>!4_|Mc|R&aU0l&8voXx+ z9B;MIPx7MkJ?sO^NIMpyokr0LlFv$Tn6wi zh|^#cZOW*zgP0G*CR@m3krg>?5f7Bdp5$4(jP&PaE8xJzBz$4)(Hc#c+U zU|sE5=to^$NOg6kT652(AWT~b)#3Ctgs2);HnzcXj;GsYu0JMd{7kpHu!XI1^DR;q zI`s^trnCqT6OfS=3bLo-fRUPv%mK>y1(c)LlB#r$x|l9o$UXjmnGScVE8Ez685BW3 zWVo7rPN8_qb*kqpSntA`xDnt!3S`bn_e(%tacUC{o5ks?jP);rJ>KzNasTq?fN2{q zxmaL^z!$)kH4f@wa}Wl&+L{6eA51`8sD+b82nz>NlQbYs;HRYSjpq4je)QcIcKQ%p zCL=6~ucaZ-RL-|ARtiu-K)OrPeLRhmL2&2k6Ac_-8gq7lSF+1Uf9wqKZruN755FJn zL|f~ho2U7_+414~3UCrmO`efLAIM?VXRk4GqWj2$HJ1fQiQo!wn}hG7MYHB=d#iyC zccV*t*mNV}y-Xg?F$av=aR)34|>m`ANjr+w06kcW1!- zS$_2G`Wqd$+Z8}w_#)~82W`WL45+e~WV|YwY8nxjWgtpZTho>4Y{d}r#BYmZmfvci zpXNv3?_nSQM(E{~L`~UJ%xW$NnPE0S&0<4)n3b1s0dOi)QL+LH;L9Soo-;RX(@g($ zlKDLC?)hUd%s-?|-rI# z4x}DEaQjRh1a~C=2D7}o|XAW}{(bpVDU9o<9nGK3ztYov9b1jS^)z1JBZmZY8 zX8(x~w2X$&Y#C?W{uk><9={fr+~ULAyWjNV?VtDSf0n#GJ)HLTZkBrWUbZf_%jSj2 zbh0wil}o$=0f@{_{jldZ5kc}F;{4#aci1to#S8HW5NXvVmaiJ_k9vyF5BBNy%coNt z%yE{wxcK>ji+Qt@!?7D6O*0LQIJ{(Z(n!X@%aSgYl}6*MYEHzxdhfWse-k@Z4tf-SE56Jd@ z1r2U3O4;~Q5V5Sg7Y+60^RH%~e})g8ue|YI-dvs!N4tV}bL zQUlqiLXop%t}WMB87>yqEU<9Zb7WPDk;6P$)*MHw@ZaEu595vY1abMz?(}Zhzr)G@ zem5KafGuy%8WdM!j=HEX7&72+ve4#0T5glC&Mjo)h3ZIYCf-#na8_g~u+mb)8;$p` zhubIn4}5O?`uYC$?&%-D>BCR9;O3S#oUo;`DNL6FLts(9jTK+K0~#K@S`?o|0wQHy zes-_cJ8Ugco2iq5n5rNbKW51LyQc>o|3+r~c0=dB*tUoCa;kM0yg-aA<<4P!PFx0U zbw!DZT#4P%D%A%gjYXo01<{gPkw0d^&#=$!ZKd|F<#brM+!9CxB(% z6m{m@C5M%=*s2Q z&+$$zaZ}Bvuony<4{h|u)(4m?vv(?{$>OBZ18fM22fvGOIg3VhoAfs097bEN z?_l5Mc9H_(#$g)(dG(}9(GbQ~is}jlz%3v<;2=`jgwK{kmo1r|HD5h%*4X}HAL-cN zs6#yO`1x7+-5qGp@*9Gbo6Tj2;rPoBY>^CkldF*7NtVsJd3@6!^(g=_i+wfa7`TKWd6WHRg=-CK|)+Rltz4 ztPIew{bKa#x6gkC#Q*RA{ICE0fB(-vKE10kF06Q7PL#F-3NP@Jx7M5mpEw4}^|r%7-&Bh_s=d?72aO&y$Rj2vEOU_JkE_*bF!OZGXv=_#Lo^=97R z9a64;b=~t=Qe<;ZYM)3v2$}$ZB`)WUAJ(KbYV|o43f{Ebq;g170nP@5hAa8Bkb_!y ztwG*9mb|$3{%OsoDTnAQs9BfBl7$%x;_LJgP*+1JWohjlM~nl|OAxUU%>}<+@RPfT z+ne?A{{G?S^TX|U|2O#;R^A%%BAZ>#;s&6Kk1$Vc;uXL)B5ZIX14T^M1kek<Ko5fNn=R4uJMK1;md8LRB21uNIJ_2)rMgy2ir1IaoPd z={nw5xYqDG)4Fb&&!=0Od9$b`^5yRKKfl)ub5JFr15H#9OgC`7vEVH zR9du|`RLx-@T<8v0COd93XEp4lqg>pM&^~7PdI*t`0YCm*Ie5780Nj3onKt_%oMyo z-Hyn?n|ExmE5%1(eoNI;m;(?8463+HL3fVm0`_g*MU`HLdzP8?uQSHcF7l?1XZ*Bl zcUGd}dn~!)+jiEhBbRgZXE8U{S_*gRMe|xx;66H>`I7yta@8d3_Rjw5M6!io{&bX= zTv~gh_+WF=Q~}Okt}7MniFjj_0F-AZrcG%8AUomssggOsyAO#&!5pQA!HUhd80IjK zxwih!8yE+?R}xF(lR6Ma%OfIQz)SF{Hj;K&ET=wF3qn1uM(uyfIBQ#S-EZ*04R8Ia z06g^RT~+J$Exm#GwnyxCaKc_o<8}ZGj(*f`8acZytw>B`eu=co4Ew zC++HQu*+dyb7lFx14VfCl;I*P*HVCA@@nMM94-~v4UUkK4WYOrCKq+p(>nOu0J`-8 zBL3zcU;wkvTd=(Qhok)F^6DE9CZ?^6h+1N60JbY8Evz{0K69ALatK18knkFzXfYsA zOV0TKC0NNV9M*A|N2k zzgH|qVF8vqUpLXi?FVe?&KH2`C)GK!XD1eBxMs2i{;6Jui{gl zJ!JOjh*2g0zX$NGiAcnuy^>t7a|ADdd|{;+5W}bc5lbECQakpsGcr}zI&7&enFa(Y zoUZCJd`iGW`cY|+atpHA-@JTp zNY|Z+FM(b5;8yQAhNU5|)iqk6z!a#Zl|IKz#yiqDI6JJ)^#-#X?>y(r@6-iHyzVI@ zn)}5^7B+X|MD-BH0G|qR_{=`I4A!L{upoqrG=P>wF1gDBVWyz=GJ2!NcM3R&I9TJ@vBrT zDg2nV4)dygJK5)82rQ+ATx&C3 z&vt+73OUN1zFYG=4CPJU4z}LZTIP^BUsh%Lj&jmv{sj8%XiQwCFA6!3-h9Keu= z8KB`U1QYk>feX+?ltzifwQGj*qdAtQeG3T9d zaLlSJ69H-(b%3`zO09Fw5&*Qm!7c|n&c)?-PAVAEdtb|QoP~HQk%btR2MnUFXwMZ) zekNY}z!;HYF2&6<)<8n{zFjrWpGqKq+%SBz+oPQ4g)MB%ajT(h>dgbbc=oR&5izpl zu&m<%!KbndHS|`I0H;7$zoa9G`>dq;;25wJsM$%0!u^1q4s)g*+t@ket&i$La9TxR zDmE~HKrA0>6?j-yPMuXzO3k;K#a9P|<-syj-plSX7DtNRO#A%No_>Nqov*(2VzF7* zH8~iu8U;ykiUbI`fm*npW(F))5L3>mLh#{XB>ds?sVpGs)~njvjB~gXZSP=bP+HAv z3>BD2YY4fEbCi?RR(z*Gf>mqPdk&{9JcPV*ZI=1&HRf2mO!Up=6$RBkKb^WG4tAr9 zo7lLW-tMT>>Tr;X)~!rZ#~GQiO?Yu&UI7rzYx{x)`SNHh?p*jVhJp)y{Q`VEW-f ze@2kHyo(K$Ah&s4RBPq{`CKV_xA=_MH9G-fn9FKdFk+~V{)8h))mt^hG?#@sZ|drg zS?g!|*TznEYQ1{4PXyt7xd=MP=XgYKojDf|uA5>Dqxv>tjW8kyB#guX5;?S-L)m4r z=T76J9qO-D&zW1;#7(9ak@Y#Mauzrdn`?o)tA(JP6>=)?2)@UL&rFI7M9X}fX3ws) z{yJkE?k|5|d1nBMy@GqSm}~0_f4~6>C2~-5bylk9YgubDsZo{*1Aw_Rb(R84Sg(`W zXYq?aN|C;{Ssi@E_|hKE%+y4--s>B_@6OSbU5avmXT~9t1V_VH4Dd6gv@Bq1mQJ#! z2uN+TRCQ`WA}l{*sKY#I&pvkEA!$X%x6^>a%zNy>mN+LX#$jb}x>$~a^F?ij%(BJV zV9CYX$S~&hf~lwbPx@!=|O@T-p?T@ZgrZG#~&vuXi0 zqQy#+GCijgN^nvZN0F31L4kt{Z?Vi_4s>n(on_EHd4V^ql9O8s6bYOd)Tf5u%-H)j zR!P!^2gP0NTk48fmAr~|y^e^!diF0$$F_%?lfKg_t=@dT|9CroKgx~v?d0645Sq6# zoAfw}ODdIYH2bd~3|G3o-bFuxq+2?Sj zk7|6}7~b<8ZT2QromqvO#U90jAkQUrR-rDw8?awoO%~@K`WH<1tigg%`aCU@bs z_2pe`$eV9wLCGw`s*9z;CAm8CkSf%ljtK{HR*yKZ?7?3%X7k!>UA{QZa-rVAj~VMY zAKSH)od_#%=;~>dvF|oJI80s^_%4vfU>mQmh+U)4L7^QSTPM*vXJnT+o8M!yKg7nq zmMI+UR~xIJ_l~(ui8F6;$dXq3iXxd4SUDv?90kk)I4ft%<9q@~A!Q8&}|Y>!Jymz+i<2k5Sh^T{ucK3qTVNQCnl_NI`P~ng|@7 zo+r%$geAelb;j$Ba=6c&uf9|2jcx6g3s{`%VD`Z;R{h0{z%sL0tCIsuqDLwNfD*MP zWW5I1(1vZA=CeJVv~TW)9n+G!z2Jssk!)*{JFC9B;fb#!3#Vs`Be!K9k+%Ez>=?JK>WnLe# zGpc*!F`Tj%QmHesSZ3zT2ZM=t=1h_+vm=qs-G+O-{q*JIGs>N}9~dZp^FP<=Uf$99 zd3C{W&+SOVwYFf%wX)Te1{qyg9&mfj?yQYG-KsvX>DU>OvzsZmlw5m-_r18~pW=r5 zcD2(V6DKiF=S5<&-T^r|WwCM3)V4$m$;eDLKR?L(_`Xf4ip#{se6eFoOd_XIwN0<>bZ}S&2Cz1jzQO$rkX6{AA`Y=uA1gsIx z(lphQm{JX9@-L-$&L-W3*iQwnF18nG(TThLk-oqA{DCfYWe4Z6TL4+NTK|Fb zi>whtD`~MN)5N80Fb0rBk7L#@vw%}giiN>k$b2l@EX9Lvt+!k0NRN797dv~!U=-vu zxK9$Pg)kvga2SMO7($g~j%_ANkWu-j-X%Jrj&5!$BD+lW=S;i@LweSJ`oqyab#W6L zZ9Z)a-@7gvKosYwmBn@$q`Z)M=3TfYVC`1Q3MthOY@#L6iopl=(6t4!9~O?@LN`YTkDYKk9$~{>Lde z+M~W(dgJvWZr=KN;PIJ94caFs@y0BsC6unp(eWdRl{^BBwTf~?&qUN$4~*$cjrk2` zIox|Tmfxwgpe=^6S^-fRDK=jm&KGi6_B~EbA;@r(!!SXw{ert#(Ag{g+hgea;t^rp zSEcrw6Jt2qb+&h~k>Khk#iL+f&I~UtMEnN_ivtULZW0C%W7WDKzqp*xGYPD%DKd0*FN5nlaCqRtYR4i&7&g zo%B_6>8V!UEcB)MjpjMrjV^3q_Z*Sb3pfhw(ZFV5gE^wt)AT*%1#%zAVG`%aA)JJj z05h%iR=lJ>_ZjIM!g;s@eYf^TBhY5MDrd_Lai+0)*Cg_aox1gluf#E~5qJxgk@cOk zR;regNujvQ^BO6x1ke*`nw*BQAG`}6BOLYG60C(7Zav#tu#342 z^SRcF38^?w@Y%|8@6s!q4^&&S7lglG;RkwysS(VmOSIXOYns!ud$BRZ`C~>bcKYrx`PUx&Kdr+?V#S@wi;J za$U@eoYf(mvqjOZGUn{8*o=Z$O@Y!_^9sFsHoWu}XJzjc5?^gC{E(pzcdKjr*om1^ zl+!3RmnJ-_0x2QK<>*1>3hyF;sHVdS%-zXkPd*}gldbV*X#ffwE!GB=a%&DEF6`OUaV{*6Oj&SmsrjV%!Gp<9Uu&M)wR+?+)?DPV2>~D7ACist zpWu_<_~Ebi`_28swD%S)+qZ%9!T|83tvikCf~FQaOf@;p1YCUT1z)$v1LjuiniOj5zSQM7sRD$vssIQg zCw1kN1{looWe9M3E@0#cye(<_ivIfEj`o|4)pt&=5Ff;+7~Et_cg!tvZ0QCRVsX{N2)yW7)4-GhC&eSCWO{UC?Au=2UX#O>akzCubT zjaq#Ftts50x88D?9O0la6JKzUg8J+pUpK}I6Wo1PfEkd~*IVT%hql;I^vDxPDi7t+>LB@S^GghQCvM2HjSQ@d`OCwusW{XKp<%u)Wf;>P%` z%?X4WTA6anEjS&(s#bDHZi0O01V7;%7@vh2;mTg+wPq=qJtSk4ByPVEj`NGNRdbDO*NqgSyo@W%Zryb6${9Jj?<#aq84Gg$Gpw3LBiT5GNS&Pyx*7&cK^j zu+vTehwbDcWbove z7tUA@F?3eR!{hL;Ci|lR@nf&DJx2Qa){gR*E35DH7ho}qoK9mQ<_!0dYz^Sc_mXg! zkfS|EL`UoJqgcCNz;a0{3>SuM#~1&Vb$!zhdW`VkOG|Iu?B~tenPE9_Byo+rC7H!L z>w&|Ho!2%xhY2)sizC)7`fmB80kVdKmP|%?gI(U;XLc;V^LeNiv#K$9cnpGXmlbnB zT1F^|9l$+CAHu2KvWH^GL~gY*q6|PdfSYT^nFxP(Cr!kzPve(Ekjo28@1;9~d}p|r zN^6;8Vfnpx!&xf5%r3+8ulSfhkO-;H8UeMQ|B zumPWXXsqv?1OL+|aF|xKInQ3pl_X5?W;Q^aW^b%~HTwQpZ+d&T9`rd9a`N%#=kNFZ zG0kiCvC$|~Hw+2X~MDXYUOMn|nPGT7dxUhy8(Z^{*qOUbYFaxRP%2J0zsCE3P z#g6i<-Fw-qb_xs#piFHJt^?*Ac?QX{=vX6=uCI;H9kP?=?(7 zqfvanW}-hQV*I(&KeO=TK~D727S4@S{1##FDQoRZPMQkc6lg~V;A5{tQX1*7-fiYAl;9c=_q&FvyGjV=_REybMV4mz5@OcK|t1U(=Sd^jG0_5X7~^| z3Tyv0N&&p)@Y>a`hVoN&DhL4U-xxDJeJn&Z2W+__hJy*9J0Fm&4Aacr->roPM zRiP*+N0(^HEC2u0y-k-~w~{2dpI_0Z*Hcf9Z(!N0+01Tg&*K0bQnpe|c4qRu(!U?G zAVpD%8<96MiIJC5FQS9Gr-;4dqku#qKhW7Lf9^ey}YlZyye2mJ0)(6ml7Nu z3!)Wagy>fqdYW^Mm>f%s9RA~5n%xyR$1uuo1*OEvg{JktZ0uMN{r4r$s~u9=3M#J5 zwr2D_B#{_O?u*?|fe9N?W`LK2Sou_Kl$9sgsj^FXi#N28{&Mg$m zXeCYcOI%1L`XJOeP*w8+7EwnPsz`M(3oo!jx4ghoUpB@cB^ReR^t@Bqw1~i)>u=r^knn&-U)= zV}H7T_`GGE`r+A*qF&cGu+gR&q;AT$BiecseEJN?TN_7;IyVP!OmMRXgkx3kwZK*= zFUe7fAzP|Lk<|cjRu3$}XPW~4cd%pt0Vy(% z0sk2YJoUSk(7I+Y*cnqS;mtNX%*l3dW^Xfa<&Y$SwfcyilPA(iayqqE`Ix*wGQc}L z5A%oh9fk^{J^0`|)CEl{$CM3DNcO?0$RUEah#q|HW`8i%v#S_xzvJ+jQ0vz5{e zzOj`0#h&i+_aIV?pxe#4Sp!DN8I7=DA1>w7K$E3G9J_@aL2Aw8>iy!sjOwU1|G2>V?DPjY(3RCU9H?%- z%lABilTv34a;Db0g-_xsI7@{nGc4yMA-B1lg@t3BM1`OQW`ALjgMI&GVd9 zH*3Q*nac@|v|M(;kOOJk122}PV@_9!#6GA2&1$h_Wlirr+sJ$m_`hrItK@f2(37?%=G)gIG?{Wv_C}YuOmSm3s2!*9PI zeM!jZ|FE`wu zrzs!gAY03BRDh-IHoH%kr05Vj16XLErD$z+WLTuZCbc>~$&_0Aav+{FN(Um&1qn!I zoash;9OWaImfl&%Gm$=godJ|Q3>Q1KWCz%jQWl4AFo0?t5AHiCfR6yR6hZ?879E!M zImxk6WNX>2u^^lM+_6)j)J;SX?OvzI=m2XOF%w|}879L$IB%C7RFf~ld8#wt#t85p zxzQenJISjeNuQN;W<=|&Bx8*mGI8(-pd0`;**n+^T!cCsH5&z9+GI(;pCC&6PR?f) zcOB#Lquw9wE9a}9U(@)!Ik&li<)xf7;8SNwjk021JurRAwFU?DGtbA^gRPxrdmaW=ru>zEv@E^(m z_+G~p*kGkaA$afv9y7fPhwp9vY>)4NrGNc&BlPg`aoAB2 z=E~|D>RD-1Jv$E$>jtJVb1_yb_a*#~jsU0e;18iMUy!zNp6YN8#9)z{Tva~jG1 z-k$&U@c8S&lYZuM05ApdWjJYLF>~8mi?46K#?TOpU5jG zq{%Sn*La0lj&hr8%kO+3Xq@H%mzk4@clErK6G&Xw6%rr}+n&j(Qd%9T4|D?@BP9`z z%kl0-<9vAd7aaR@dGv8P>f+iPDo152-dF&*BPF0H?}q@psk+T?H=Ko`yjMjW02Jk#rnaGW*kVhN=8 z2J&!f5QqW4Rq;c3(L9KO@Ml9vygxvg|D~lj`XDyvg-GH3j1vP_0{jo70`+zl>5Ssw zEP#V!9y}~SqI?aXUch+>V*2b$-X90k3>0~{2I@Jtz16QgD z%)Tv7^~~ zbs{A30_#Ljg@J&r-N4XUN?DR2Xm@1#iQiPvjm$c&DR8_xExEPQRVVt4%GfFYh+o}5 zJRcR0F08!KGgG!6yeVA`%Gnh7c;F{>4R}PAs(r#tYLb>WPIosxaf6D&nP9|WIELYW`R0a*cWs}uz1>RFUb4eZIXfTolw zF42L402hu-<>xGkS0BNHmtE)<*}ctg?o+qzWM_j7(s@LZ@^Q4D;9Ujr$Bm)Za(8hW zg11IzIdo8ys!{4>_n*4Ts_z~Cbr6HUwB|V!Vkgm7)eW+mfP{0dl{n=P=~Xh&VG9YA zesqp&NMNeeWimH8DcK}=7B#c6;ucFB>ngA7vPq?93)MFks*h$ZfOmPd=-C)M3OT%( z_%=9)K!nv=G1nYnuOL?)|#C!=v-fUW3orMU=;vnZDQsaU%{n{acqpK&7MYV zoI~JR3%U?)00@`yu2AOetU?aATjeNMxw87cNYasyCZL_cKbj~$xC4pkaE^)JEQ=h& z$Tx;krW*VKK#1y?MHE3e?KjOYia7WFfNGqVSKly=_gmJHY272Bbeg4+Vp*ZU9l)^{ z>ma1&ns(QQqZ*=%0L*bLQI>9Ld!=>0kMo@EVDJ5)Qhrx>l@6c-ONP+fXj;MHX_Y!S z0Vbtt9LHoGU^%kQF>+d!%X>_8YV3J_)V1!$!QS)trO%B5OuL0@njZjuNKdYmkb@4+ z5C8xS3B(*YX2~eXMwW53JlH~TY`I#%Gh=ez;4AEMwBKwkzt3qD-#_PcfM|joBwtzx z(Oen@XNM}QAX)58YaKu^tqi}3HtPzLuca4m-2b*afcLfD>C@BQ&+m^YxY)7$M%>xf zEnZn*A)F3j@s<;x>zr^Ljxien=P0x5D%GO1fN8lUc_@`g*)i(EYwdHi16|s}&Ku@b zT5Z+!=*n;ad^5L>XcKICoUq`h@2;lI8|ailwfd6YEpqf}uXYvdeA?Lu{r&Ob{{E}W zgM*yt+Vba4lylfjUWwE0dI5=YIvgM#`xj>j@TZjFSQ)XabBt$*D=+XYhmfSgrpLJI zc%^-ga-x^Eu=C0}l+m4|XuctRbM|Xv3C05V%vlhefO&v-;8C_>$Z@q+lsb$$eV*xM zBOS}6&el9esK0?*_ivp5i#R9ux< z-7S_l)<<5)q?U7Io*I9(gpSavK!Cny5QEX`>CmLsy_NxswqRApN^0#@{o%Sr5fygBB zKg&`-HINl84v~Al$yVRomu}j~&iiDft11=erw&#M>a>`0X$UDpIavv;Jgu2i9Gy+B zHM%+KXfctouYAp5k9Pkl5dL!a;gjO`!H#u(1LqH=Uh-yZt2sq7DlQ`y;~*yXw5r2T z)YsX)V^RA$4KoiKBeK2e5~|OYf&*x;w$V`z_3|e6QTQ5_Z^qJm&bqwCLQTEu=s@r? z@0GW!P1X#V0`74kjCnvHi7vHNt{UnyQaj)4(^1}ZeFvM>VR=(4E+ari=^^s;bt*RI zB5cibl3C6(eJg!b5Y#2JCsup&{ubrpYSI*L0a5=~jz;bC-E(?VU6}=~%U-=1Ouc z;-rifLg4U3(9@ZudIe(U~;1jj8dYLQNS(d?BJyEqP9xwV~CosVQPWXQ0W9j9*N9z{K)I9bClz} zu!EhV+^df^II0@Q!o;2$22 zjh_0M5B8v~3o(6A3&?EJ$IB%;odwd9eTtRH7DYyK$T%rSW_akc%~8 zw+kgr`SU&0pA)Lz^^fys`{plOR~J4f;J|rXcZ6ywHp!vP5<2KYU&MVT(!rU4cj8Qj zpQPF%&>;{Yyaid!aa=;K?PimFb9Z@h@tyJo;0HFW_+=@L3~H3a2-(0CW|bI5b#>sE zGb=o$a7YV$a=sKY@zV9=R=C$WVXZ-ydqd`1p5v&kuh?^ z`#?wu0s!o%GegK7X#(p|dbHr^#OA;JleXaM&XhE z@s~w6M$^abQ8eID@zmtlC{LSLk_n8%3U#0t#GJC~s(khwNgNfbbVgsTmElJ1?Iv3s z>K$hb?=7s*VXWL*!`04S&_K$7daAkRzA=|zJ)+IaY< zJyKcBz7*9T=_nUBaIOj%H>bqP8bZY?$uoumJQv#>h_5Wf=rU_@;&RU+SW^CeKzvai zoB$k+fb(h-9qK<7!4ZZfLibPO{_;$E()@fT%)gV+0;2B^zZzWB^Z_ zQT2b*P%I7kV>!K+zGUN|+VrGO?%$X7W~@*Vx`@u5a#LH*RI8kFhSwvL-~SHnRh}5Z3@}W&o2Y zsk8LQxeSUL#Q{@$P!fvmsdVby?l#)fFL&$tn0vw<%Ww3pr>$6}Q^Q~_^P(0H&Kf|D zj|m~n(h33RPjh6`U$apWrYNC?s8?j_GBEsCn&-Rt(#96{T{O=!dz?Lt!F~Y)CYlRz zTtaD{9VV^`xM=}w?i7!9l%WY7e>z6)m-L9q^iscvgEuM&L(K=p0&iriMgUK%2tAp``Agf8bum8Y9u0Gy_l{3vZ(`| z<9ywnd8ql+b!4;Vhu}k&tXYu7ePq)_a{~lIU2---!UK%r#j_NCvKz*b&9Y>v#4>~>Bv8mfh!@q1sdXP#>27j9ffTAZh>uf{MXBP z***TYu_HZXYw5ju1b(aul9{K;%)yio<#Q>e@`~eSOj85@M!;A$oLem#rKQ(WaTi)2 z{=Ty>3Grw*`OCr^oxq#dd%>kPA_oe3XKj@{PH(rl#Hv1feCh$PR=jjsX|yRl<;ub~ zkSv31-E5M>J>_iiouYw5lC=z^-q95NoJUHUInCjam%J^{ zsXAkqVLqk8qaEeXRkvD!+vYXitV5VvM@Ss;>P7};^Ex=vV*>Zb8d8clDrq1TgJuto z-Sco7xL3T<8i)JHUsv9F&pSp7I08Uwjy>`TAvJQI(h9zS6SiKFczCSfHeQ>X%A1Lr z5RI3FzSktr-@!dDJWZW>TsFdYqv;2H)J1V-Zk1uoqw*N zk`ZvDjav-yJv`&q{yKcrF$!o(a-&i=03icV4Pdm?Ak%zSS11I;iPFQznQKjbNDH!N ze~I!v>(j6APP&BS{$c!joO5g}ykQW(ISprSw}M~*w30{t1Ks4p;ydf~W<$oE#%s*UVLu(rZiJw|#>U&IB)K;HP=QFC zRN?e&Z@q=aLDJjV_v42T_rHJEmb?4y?%juvkK-48vUmUIN4} zG8Ofg%@Eeq98$$ulCp-2(Wz^74!{;)T(H>s8aPJ9td6P|E>B+E-#7Q2eLL7GoIWZ4 zQ(z5`?8BQiN8x&v_ag=QXb4)3eg}l}frCh2wqi{5bz>e(K zim;z+r0BqBheX^9h&x-`B+l~y=_vM&x#A+OYF1;5Jx2Jafa z%S$HuytBVJ`hgyFY59#_O`x5v=$(@5j)Loa=eMFWLz#2gEA4Zn4_({BPM+0L^$5`&n7K_rL+=tiiL(GXpGbljLV9KOaOA5}35Z6K zx4olf_4*nkz3UGj-%owK`}Ruyx9wzO7=+(^%p8>Vu(~)aaCiphv3h7OWarki%y$mtumvSGBEwz@sNZ(y^QOCQ-1T@9h#;9$cKhx=x3Qg_dSEM^>UWHz9N|%nVxjnjGg-9G>{O8@ zab8c?i&JYSw4Yg6`|iu$DEDRD&b$72H-G*P*>YRbW@iF71tCRImT}lfK76EysKJuo1Vmd10f@N(@?AQnwJ> z7x4O+qkMWfn^{00(1@13>I%W5M%pAHJ5X|9JOq-sutApw}1PS=wTa zos-jAwjt{Axvc;I0JhiDL^8O}SS&m&Bg^E>96yJ&&+CJk7+ zt^M@!{=T{2?AyV<6V-g0dG^vn9-~rM!_TAui!-*kTH$n@+`)|zv}4WQ;gFR?4PLDj z%G_b1uOuk%zWD%{7uVi+zD{+^G62#cBcf!4mO-_!(0yBMm(2dtQ*F0l7D5?P-1N)G zJULK4WLGYfVZOAxgI#BP{hcX&u<*3H+*)nPlIwmT3J*X=!71}2wXhZf&yre(8o=}b z@V2mEIRK;^%=6{9zmMHOz(mvnGgU+_FSDcvLxU=BH5B6{c^Sr}Vr(sY6t5lt7c8H|J^`j2w&g1z^6zbboI0unXaxJJ@=rs%}$20A3Z#h-oc_?{H#!sz`XFAW9)v zX%LR&Y`ry5JA^il>+Ib^s=0^wdMh35Sl4#3^SKIe$rl@8aB>%GVl6xIK8fZwm9I0F zYi!i=12Uh%1y*CQ87Oyfyqiq*y&~7{h~;9It%y~uiZxpmoK1YGKnY8x)2V4Rhm;ps z@TRSgPz2a~;Yjji0)&fSyHMtj5vl$gB2*fs7@Igswb2pJSBU{Y3qZoP8I*q!V2gv} z@~PNI;Dam|L>#NN-(;%EMy}`I54$tDZ6oLIB{ggo{nRXLPA>^S3qJrZ#Hg*!nnGYz z;o|EIM?tjK3ak2;56$`3LJTX#H{0yHdD+Fy?A0Bp4d;)V+P1aGmN>jAAleR99gaKCLW<;+iFv-hA=w1wi)Guqj9I@$RRgAD%xx+PmNM?)|%|PrvjBeVpIeXRfZh zVUD;71Hf>5E4KWqO4-Eet#SlURV^#`l>n*YM9irsx;XOPMYt5O0*9iGTMhE9edWcq zcgB}KffAdaFi2Eh)sEgMN(JNOLG?CY5^w0z@HO}~P71%p*e?KE^%udCbRXl2=>rzH1nmeI+0#%nj&D}^N&#n!i*`>QC-U$ z2M#80YlJ%2P}fSHud&Mk{_^trI~%{n?bO7-O&ZXry1S#Ama2YPJT1HAY8xoRmm`o90 z%ji8&eV?rZ<~4d(kchxCX3g1pfTgy_mG0Qzkq&fi3ww){n^Qpy*2;O6&igP5@2&y& z0+?w5lbXP|VCcGP^*uGMW!W61_6ygJ*x@Ig_wng1=H8Ad%(}Ab#%)jB6jNUav#}qTx1c9N;O}R^Hnp!IoypfN;o8 zGN;TU)u@`8oMas%xWRE=jn@=~qIJ`UH7Pa9mbR-VdH;AvrJl!+ch3h5%e%Jhx!(Tv z_;C)}q;jz#_?Fy8Y_Y)_0jzrB9JO9Rs8`O2%5gP8?4@=c{KT!w%Bma9ahQu-SbAr( zZ*7|C|Gj1zS%6*G$?H-|%Lz1WTC)OF7xs(Hm+#gru_9jjAmV*V9~Cd|ob4znPC-z&9B* z3Sp(TZl~vpMk2sR#5Y>&Fpt`|lf9DI&a_S%MXi872jisMo~Ry$XrvZ+Z^}9M$X-kH z5and1<^dJ$BBwlUw10fMdv8xqUsZM;@wmQr8@w8%$V#aLKf&{1q;93Dn~ibmDP9F1E-2l-NQ(rj5UKL41{BjP#KZZ z@=d@V3<0{tY`(2@k`#B;-;XJzdCfHA7ySU9_p|Z0H?mUN1U8|j z7RGd?`j(yJq)Coz9TACr;*`YZ`MkcYQ^7f>HX}l7W=oL|QOB(oIm}Hit-a4tC|@Wt z*-k*Q*#caPh-w;GIj1JgQa87#?94V6$4+$osSko<=H^wr_l5Sq8xMMKPvhHNFuFhV2PGcP&aks-Zk`2+;Wtc8gtAI@@;=}DWIm}%y zF23_!03T6CU?Dd#3c@RE-VFd{c<;fu5n+m$!lQWCi$8JTn1wYcxq)0>HO#p@>2Z|l z^5W;>T6wd$OBPVtsDSqsuEUF%G1=xUo|kpf3!6+Fn+w^}H2AWD0Iahi(8MA0Ri-)2 zZ?0}&XUTiz0MSr!Zt_WTA+1?qHD^7qfVgrhPqNix;}{e$$ zBh7`C&rE_~vZagcg}+c_MU3XEdcxDw+DW0bRC~NfC|`RUt@+6n;YPd zGN|)-gBcEUjg4jZicG9kE5c|6ODq&532jWpA*!{sv5=r0XKrb4F0lNAlFUg7YEo6X z%7oV4BmVoju?G-*9>#?(th`mFw>?JyWG@Y~Xj;0fqX1@=q24w8VHc{z z7B#RVUkhBx`+U1qj`EZ%tM7aeNH`v8u?|)nxKON#LpRKqAa2$b%UJ5d5_2_ZE>?=` z2*&|&N8h(~lo{dA2l>nP!si7IX|w1KzwLnowO2O40HWZdvhz-t1i@kI zr6%phN$5cSz%Xzij{~%vOJfyxvq_F}mdlIp9LI5DiNQbqob!W*2OD-dCbY+UB4q9~0Ecg1mJ$@Pk^8WcqN7-I@t9oHm4n!)48_bn~OF@V0 z09FNDOSx3_d}Q^`JkWgxjShAB#MwW-ubHQrmYYp-l&f4`e4np$-rd3}MpcH0HYieF zvjc-hlpUH`PfzKrT)_jau?f#q@&b&jVeasir(f@m^^rdoJogQev?;LzekY8Y-Xmhx zObyVc)%RF(IMLyTlS8%P){$V^#9{JuA<L?mN{JuW`1r#Z$ZP?M6AuO|GoIACLGs zMjyGj&8O7dg9d~BUtUyt^3Xa@2PNv+6YoXh{G7ypTNFHk@l5^cb3A*T1c*4 zIUEO!Kd3FsoaW_Z8IlS=JlGz>2~JcC6lkG5(o7>+N>{PjABB4Q^mO<0`vWi2win*e z5Z=_ScQK4U%g~r=OHq1S!jW)ulo7*3>VZjWX(84aXPDEw8CZz1I2TR*%_cd@PcARM zFY!1;O%mNu(u`Ch&)HR>o|X;k04D`D8m)J@N@)cMrLB{Of@jrAxC%n>8GpWeulMiz z$GiLa?!&{~`{yI7`d?UlOUSOd%}(~HrQu94-J~`hf=tSssqGwlsiOKadQ}kLNV(30 z^93;9ki+pS7hYwX!yM=826px}4tT{3EU45XA@ypth!ivLz;fDYUP{65HT-`pwu=Dg zq>2pQ43^sGJWI#jJ^SIt!~5sQhx@0a9cXg{=NP8tO=(vkl+X}eScbsMf|OEk)s4C; zAg?Rt0Qz+)(B3LUF@+6FYqgKjBOOpxTucX?r<`)@@ON# ze~`74a+=0;6*gQs%t8SUhhTlpP#^T}(dN7U^KS?F&R-YY2sofOo0qk^0CDS3)|{@^ zsKE-Nqk0la=Db@;LD>(Gig1{qdhjQB(L{tEvfBnnImh{;=eF2vtl}4|>b*?I38iHr zOPAF-jwKqchtM*wL(ko)Lj(^&>oC?)euKEm~E}NrQMsi*zs~mwy{$q+s86> zuIz)A)1!KCeRdpy6oWtMIq@1h>C{z$>cE$B*8NsE%pYFcSe82_1H^Zh8apBq?ZO!< zAj2iYAhCf9!2$;SSFNj`S#2~Nj^^w2;{8W`|LeivDjffan=1o0U>{uU?u&dNFh)0wVDiN}YB-@eCP>*l&!wU2(YK$aJ#V-aPA zIDtnil>x;7xJGwMjm27(E$;*QHG>p$>IE<^T`6n3)gp)a$fdRSksMFK4YGY!Q@dfK z^Qr{)a0QumHd`@7U<>42Mi=;vPZpFy{K^9TYi9Y1LB0ltkd8d!0|}jI?@`}POa{_mM|)7A>)nqILuEjEWNW! z!%{R>jn^oM5v2jaig(IFf;qbc0Ncq@9Uq+UngXJB^H~!o1nKp9wF4)JURrXae`k}> z0E)W;d>%SSYk|)+&zk!L!V(oh#U>Jt^BfiFdoi{!cM#wN)*r!m>;^L&>ld$?8`>ix zqvcl2rP1P|BGX#az~mJt!dHsSX$bI+QW}zw)g-ajMzpVS?lQ*n(H?QJ@o($Cqd33( zU>gO=yq6l1Q5N0cA>L~MS{r!{N%$WZ%is_P8$LC}jFPVR7aTe+^zx!R+d^k&rz2t| z7#nEp^2n~1=kQHJO=-G-!!i}*4xr8TX}wDWNA!))7cV7|yT`xCi{Up8yG6aS`WCBk zTW$g*&Wbaf008#|{87e?4L>?Q0wZE%H)>uUrV?1J+Q=c79{mib&h6J(=Rlviwu7Bi znC}#|1H|`|WQ95#@-2dB$W7Y>u~AM_!{4bXsMHmalv`iZ&8R+JE%V$QaC2B~^p({& z(Cg*{v9e&Ms>L2acbY?f$%XiJM2GVf(o_f6!hcLuMEwI}q+PHz49CgD$;9@=wr$(S z#G2T)ZQGvM*2K1rj`{U{&UxPN7j#`!t5&VOyLOfFh~rOu8(K|6KPzBYp3#@H542aE zvS(bEd2L2xBv|1>hXP)FgaHx)T_B{I<<$_*gsMY)z$>sj_sPB@})mt`tr3I+ry&z#RBj=gBFZzo_?1K<|ntH3`kN5!ASh;_CC2-vRZN>jLAC=mUJu*KafO5qz-lYsk<2Am02 zfUxgUp;koi?a6Xv9sozm)IZGhyLG2kf-p;p6MJOS=u3z>lx2$(6l z{qtN%w5LPEDro7rwlKqwk9S+)mb+=;=ZO$~W5c-zTEeu@@lt%=n4432zOX+N2=!K2 z7iFjFK)5os#dkAj%+@-rE0@0;=&d1T_cWFS*H}o3+x8?aq+%8)CCVO{!?d!D|3{xk z>Mpt6BMQzt>suxEsbH`I(c0b)ey=#t1CNYE#`>+AAYqs41ZiVaOa zeU(_+vgj^lQOgw7rl3>oGqRC%9qgg7!Z;Q9EjbpmT+i6?U7+Ljl?8q;A&bY=dLyo^ zcHzclQ%%$ErsAu|qP}NR!PbvH8{w|$^Lr;_HmZEOC0FF211!40^jXa-V5jyeWtPm% z6fbb&30}eiEw*?p%rfmVlzd!@T8(>A)4>0f?K4U0hBb} z2~C>1KyQ6g*P3qRX~!=0Pa!r=B8|2YOXWSr7-4=i-OzsZa=RQW-Fs$B!wTB~P~eW> z6Twj+mvl!`f$BoFj{CrDoZ^KUR1F7&gSAzHYI02F8pk$(?lrR7u({Gy*;`*R%?VuH zz1p3A@`(0#IyQgXRQKG?oN`#`iD5gJ90oP3ITmx$haxx^s3V2zWSeUa5o6L-RM1bD zl8t5*s+;@(lFHndvk^4U=dW?W=)JK&AFDdo5h;P#{0Ch!h^_^`kpXm^Q30P}yAmR# z%AIG_4C$u}MI&49kL3!pafHxnz;3=g8DO8zV`mptUe2$4*$XBIGTF0mff(w*+n)y} z(s@OLe}=sZ2al{zg;rfopb76TfNeVY;CdVVGl@_YG?3ObK}hMzhK9=dYoNL-_ecb>0y`8DhOr*tv`FJ*3*d!)00(-f?4+d{`#<+Pf z1&{=&Y)cq8SpQVMOV?Bbu)-IXjpbO_GE6X}z4kB(lJRnzC=xqmxXFpBU*}q70i(ZT z8T2r^_}@b{au{ek9C>=U960(ABA2mz#E_{XZE|_O+PT4Rkw(27Z|#yzIr;S>TXpf} zRnIzv<2;k7diGw|8gAuNNc?p{sf4i#noSvO)y=}OsYL5+rfsOGHH9LhoDV7^Nd%-s zg`2oq;qQM72(14Mk@J1~Q(^Vp1zwKzbZz0&YVU2Mum6Gf_$sH29Ull={y_aR-F?7b z6%SE5t6x34duYwm#Wivm<)PmrKJ;JwO37b4hV)VaUS87Wv#@V>oH#ea+`O;5-aLYB zLeosRs62!1qbng1Rrgp!DUpk6_EnV=W4t7*eN}I3I0?8HGfmCpPh$mtR&bYa>|ZyK z3l8F+?_t04BZBzMP4*Cyl3Ukk$P@c9I#p)+ANA2s!hsUIRZp1}E??D7{2tN;A*08! z@??rD<=TJ|`0!8^$Nl4TD-0;wTan3E%n37&HaWFPmqHDh zNn?}OZYSnSLhgHd+^H27GfBQ~$rnB@_#{3*UYCs0!2MkFeQGZa4-jQcX=HR9E@`KZ zCBSN?w2`d~YhZRWz%_{JUMnS@vuXt`!BQ%pkjnTMe*Z}_jKw!wAR z?tsgtpie-{Y@W#)8`?Pqyj?0F;y$X+d7;I{%tr3yL0f%wq?iI#-YyPAbec|w|{wP*#%J4=XrQafu({bWOLHGw4Sc@oO;gU zxNnRWIJC1=^d>jv@o)2O_<5JML7QIyTsYE;YzRsii_#F)o7EH7x&WEl7%H~AQa(gH zj-xK%k4x!RBgKcTF_jjLL?&(j2ej`2KFZY4I`2qTyBV1T^MpX#oLCE6J ziH2K{%R~O8tvH=~Zq{_kRC?ODzxIb6QCU#1lpXg$g8K;BryuV=dAfW3+(^22-tazs zY5+*FWZe<2-HQ8gpg~BaaP*AEqE?n_D4sqUbA1IqXNlI6ZWXuj+p_`%C89;vX(;tvk7O;RnrL6@Vj#YF@nOQ^l z3SC*~Nik#`0DiuXb{4@q_Uwwk$Y#9`DdaPXl*%oJ#?f&IqB??Wwe1e7BUsWlXbEM- zRG9q%S7y<$Lfqi^m9OV^@VaH8Rx)aE$JE<^0Gw$!69jm=dOUrRW{ZOubENKb08?Zq zYcy!{2N1jcw&BEzy-H8z{wg^0h#*p8j~fP(tlj6=%vTioad3E^_aiRu{zT;oK|-rU zPzT1QY%18_C^zgy`93SiUt+rRhR6GO6xD6fE z-<*$Hes8k|mwq27MQbN|ScD^r^ecz*R3VeJ#EX;nad7f|y=lc^%hX<_j@H&b%$8t?;&?3lU@4CSUKMW2!epw%*CAM!1n!PN4b16WMNA#v1Ld&{3J>XRL z8T)J8XihlfEVS37M~vNB;PauR=6zD(ucNH37< z1{HP9mu;5KB<6ufvU_CQlLuKrsO7Q%zkL|XGlYnwkUWFtVOF)gom;=R1p_uoSsWW)(gts)Dc1k;dfUL&xtpQ z-cCcw%ArMD6>a@_Gx(~263BdGm`Jll&3Jlbaxb~$o~($P_6UVb;VFEH%=Qvo*)#pC zlvHpqvK~R#rV>sYS_X=YkSQ00UK~yn)d@_i$+^rhHLpE2{mZI$ou?P5x@wRkC9bFj z9u$MU{Nr2OTIObn4-#69(W%RgC?*Se*8)Tn+=7zUbGnTWw_EAwLJe-JjVxIhYNnL} z@@f5mKkpzPS5zVB=mC_^iRgD{4+EKrDf(SYfxG%v%>vR4vm6oj&qdqd5xwh}H2Hyp zMxeR7_0#O?CBjTMG+-eepM@{-l}yVnnHIBJs3yx?kogDqX&)yuuI`3Y8(NBBn*Vmk z*#G9UAEwlT@dn%=1-FaZM_^_MqJjtq{tPr!DC(HfFK!;R5y;*7Y;VKtqU$Sby+fe= zNfoUY>{K4qgl`U(gGh5S#(iX_w@Jr1b*6B zegfwaMetponYBe3s~bM`Mgrmt>I)+Lm~y0j0CsA<{-I~<>b}DkU?w67mqfbrqMq{> zJ%(M9Y}4}Y4-pdwA_&tFDoSfcHCdX|k}aqyvf9>9xC)Se_o7<93vlHr1Q{XCNI^U# z)EH!l*TS3+BndDZ5(4BD>U4T0_F1x)BJ4mTW{40`8P>ad@%O6*AchK1bT_vq2lwwrf_u}x4S(Kc)ZysTNQ$- zz@Ye8fNP7;HR_LEI&wRwspV)vp@I^RR6H!>GI>h|P~L^AwlNZSE1I(};lTkPOq zOhW{kZ}7?()>uIrA27A;V^T1fA8kzsftOx%Ph@I0$bUfNt@7TMb9$-Z{p{^`a7$D+ zMxgr6xl;W7Sk93}O&P|%K$!94Vg3Fl<4-v<+dDx8<_h1?R5)~4(Tj~GTdiNcKKEn6HbASE1 ziRMNdl7!A4;f}l=(wRrU28+|}gcawe-yegmDo2TgQF}zz(!&^Xz_&16d_c+QJuE0oBi_>9zU+0 z6I(KHNiaY07lJL*VR#Fem?Y__S_OcgGXl$d_7+Hy&H~#D-vE+Y70SiV-#d{=h$TS!#*4xfFd0ouxpzZdywe_+M zsFZ>fkXZ~0OmGb3W?&DZOw@Yj}GRl_M0GQIn{kdsBN`VSm%Te?LFI<-B~( z;c~-#!DiM8GUK{)iWYh}n21e=C&l!@XiO>y$ZiMA%tW2k5K-xL zO!KmXKX@uqNwgxG^VgbY2>3K!(A8`g5Xx(L@Gm;&8uc+dSro6%=-zKY(MWaN5clIP z+uA;X+m?d-zPicrSCBwlVr|e{;Jk^uAHd*VJDQS==VoDu)ylmH_?cv0tjJ+#<>8n` zkT>7G#AA_bHgpE{&9=m~5lLT9g??PZO!`hqN0fskTB{s<1PRWbrfq}XX`5z$E1$he ze0;Ebv>^4=b&{}J$f^a4bei7s#yKf!V@obA8hcA>w!oP=u_|O9L=6K0}=>BXuHXk0%I2DHljJ9)7=CvNcuxeci>M|>_41z;tf^>Ln1WN{RGB9NLULio3^WagzXG~AdWG@DtrSwM))B` zKHfeGI7l-uiFJc|w3w`%GURJ)?v|53-_c0S*Vy*!Bfr7D{LUd*wUZWRx#$%BQzdA6 z+#%K)u77+Q+oEmPsec8&v`Xee00zh zmRzUVMp>?GA@GxT2>S^VCIp(a7Q4+O+^(jUz4hPwp3d}E`Y_vew6ij7-u?N#c)Dn8 z*xt&#$cw>ZE#TQf%$i-cMFRD1UuJm>Bl1KOwwbuf2<%x5Jv1kA=@%D&S{81R};Cogay8Z&T?@X?KVc#8-r}PC- zuzR%HZJfqk<`~>KOPKG(=7`15Pz@g>nvK@sjuQTpbHD%Dc=9K(Ub~ZUOq=*FK#E4@ zNiU4%@>X6k_~Cd8@i3H8|EERxVDXHa^>zv|`NsWX$E1`d*kDY6S95ykqZ8`7n_qd! z&DMWD0t*89TBORpHqQoE<~95g@@Nhg0`7JYPvY+phk)41pS+FFue8VL4@42E*U8Ge zH&auZLqVe>nH-|siqoMaLWB%Aj~8aOx;SNcMwhbVD$_4+(AB-m=jyw~LUo{Gf(rF< zHi!NL?qkh~%64=VzJ=Oj_7VuVjAqG_yn{)bc8TY92bIvLcCe7Dh}m#`g}RA`g9xjE zL|N56b>M5r;bn`v;TMmp@UrY1AoU!@tx%Xx@HX=AefxhFeK=~N+)C8iKgt(dV^M9K z@&^w|oGsKln4Ie~jWUJouA(c(@1x&hC40~c_7RXIUf6be!(Bt%4(sz&G3rgxLBf8@ z#}~88fT+wmz?_fCWqX{hbAkr8;Fxe`cpixRncjSO<_R#;RKgJ3_bBay=tAm*c^FF< zkX>T$jezixUaofM&0)$LPufm}*zb^OXQ5o5J-eT*bb1H5VW{9?5t;gz$jhBCIY{c( zE-smwBn~mYRTpA(a~YD$Fa@&pf3>G?w$2f*@$_z=AZ4%hgKXpR+~GrW7IK1cSr*a% zU~zEO5an!Cn*r;Tr zc#QFn3{Wg~lsz-Fl?T>kN6>qMPXenRaWjKH+2*4m9G#Yfy}TY^ly_TL?T zj`Ti*{Sxk9(dSBae2h2fsfr-6?^R+JCDCuyfLxAt7>A*e_umch*A9Z7WBi~8)6iCq zzvOD+oTd7yh=caks@K!cV|D~$EGi};^~2pa^%RU?1N^qax^_)Z9RvL0?Zf-W9LJbAjK_bmhY; zi=p>t$dwyO{{)y7Zr5ILQ=vJ+&Sd18`K%=0zJ=9!KO;J8)4}eqR!ky}26>m+H2rOT z(1E$#b~5i3WlH~ioW4m?9Fssp4WAp)o?c@6mf|qd@}*ycjJ05$iQYO zqf|d&`4|}_;<)84X%DY3f<&pok(?SInJmV}?Osf=Km*!rAHrN`8hgQlkDxY=;qjP; z!w7dsvBbo}t){JF*kiguNGibo9c9D+`4JT;V0m}>3YNC+xERG?e|)i;tdkf(0^$Na z@I)J^I2#jlT^dEef4+1w;WeX4mMeWJZc#j~Vz+UmbDjk2JCLOw+Y8bv>4<@sY-A|N z!i9H&I1e#Z!KvNY6@eu)o$yt%KeqM%GHSlsTs0xgI%bl8JctbjT#e+7OXdDU6{3RAcKm@HE@Xw7mHx2( zJQe+afa>A*&4*Q_<}5w8=C_m6TH<=!{cNTbF1Xh9Gs^j;}%rPOH=(zkxD#ASB=$Ke}1lfC`#im2{iS@wyVMLI!N1NZ!K zHpzm7`I3Ag|5ks@fg>N|lAYH4mtk!8T_i|TyhoY`_;Bv?`8XrPMH>F*T!*~w9Ef_0KGUd zQ*JPfe-|y%bQZ_1Y@QQKGLX{<``_e7^z{{6PP;r|APym<@}8h+8uJVCB{jE*lFLsX z)!>50bC6uz@M@1ot87@u1NxnTP=61ea$HnSL$NEIL8}t4k9u)i@IBrU5Qv-C%@mPi z2NMftxdvwYt^ZXifKea90gm{c?A3$^Sod@m>sw_3s*ITo>hhw;BFSGr%!4)0_|Xi@O3LnC`<}wBAc6-iURZcYwCP4S)o4;k3Q@%ek5jj z2G#ab3n{}!Vb9yhswd>NBQq%kihgHtOyyZ9pI*hRWlI|eM!RQmGe)T!vxzj21R`?IDrB}EpG_NB2pKCB4HtkDO54zDvW>Ysy63f^WLcHNT_TM zB#w65)ro%(GuO_(x1K9bmZUyE(@K(Cu(gGK?lIAp5?uqdcZh~X(M0YHx5IS+3|b=c zdKuzf4uJlOD>+Rbmmx`e#55tYLu&#Rr<|A=-Q9J}Q17_qq*i%_(M&FR4>$5p1J{!; z;wfAc051Cm*et{YjVvV9QkxYMb29Zah{HX|5GJ(7cAIq5LKgYwM>m!G5aW+AZ-Ms! znIOrI&qmTf`zjHYH6@)|M&yth6Ii5tW%pDy=UkM2^{xpQdSo)~`srl??MY|Kx=SQT zRWE(_JVf+7p~YO>!*DQiBcp*?KE_mD9dzVUSVt$C#t1Gb%sae)8s;ZD*>zQ1cMh-j zIJ|9YUKS)0?0D6UL~K_-Y^k=nvg^l5rTNpD$Ig_0&0;sTkKv&MXS644ta82UV~;3{ zPZE*nbHH%12cO<5l6hkRc7L?neVVo&-_L0~4y&G*@IpU?ti3|ctmsADyc!rrIN^|s zt4zg>s7rSNpw{Jzoyz0&)h+V&$k1mkS;Xs`l)=%(Evv!>!tNulb!A-f*aMblw(sdq z_Wz0H6Brj0=+kKf{8H52;@#CG6P2kI00N4|hj94}(=+x1=q?1Ry%RHP3VjhY#^p65 z^Yp&(Qc3s})K&gO>kJlyl$@>?EV$81HFW(GD|eE?eo^;eJZ8?5yfkEz4E>+Z`o>}S zIBoo?NdZnRkiv^89ct{?QrH-UP?*0bodpdta_k*@t}EL0o!h;kowvCanj?`b(VW`@ zV_QvNd3G!9g``tj(Q7G#a^2%wS_WCCw>P$D3%VL}7w5zM*+d?SX$A}%QlOJh{Of1A z9^0P?@b8*g<6YxonDp}y`umwdMHR6`cIb;IoEnb9161&nOZSkf2-pL zYuh_zm#=P2gi=TVZs{IJ_&Hc%)9c5;fG>WPyFw-3A_lzG%taB5nbP5Gi=G>`RVDLH zZ)|xEPH~?lCnNDRA$cI4(li0+W>%&z!RwBljBkwW%9@gb2VP=}9L%^qDYqSO))Pb) z=0GKOG^tQSYyZU%{X52crHa?MhPKa2r>oz?6=|!^PQI&|p=Z;L8O`2jzd+H@0p|jd zGE}ezkMP^L{{Iq{gH1dL_pdhw0aqO2Z4%dIa< zXlmJ+dsfkZ5huM*)pL_VZ?tIS$TB&f63HomG?(kf5B8SA6>9$5GWNK0H1h` z-c5XxCnmVsuBmQ&*02fNy=m%;ghoQsVv_JTCk9M~#g(K@J8<KddV2ExHYhlSIHTA@zxd5aUgoKaiE#6}mQeEg3BQ z9=1KSf6T!abTdTodmK?|L9(%nbJNUs8|kMg6U(+hDaOs^LU{&Mw8O8pk5GAJ;6&NC zO}CRSx$#r8=KZvsxP822%dhqC#@5u`KWzQl~t1wjVJl&C);_{JC2G{4}l#{_qZB%+tI zCC=T6=QN}ZY3&ge{=T;mNw@6O9eQA1ShGCBmDf$H(pBi0S#dGV!w3LJ)03Ex7FZoI z^FJH#y$1gVRcLba4acMhnBUSG4+jB_dPv}xcGGrR9x}JUB97t0keyH0TRlnC3-#I| zC5!2hGJm0QP04_aC*PCUeYvu%W|&!QQ`|8-A3Kw0X|){rm$bCH#MID;kwx5wcu;4Z zr@BU_C8JeM!I;pq9^Rc4G%H6SJi%|5#`AKW0gFUrzw9Jqwxkbm{M)78UG;jH==-o> zrH$pr=^cJiWYSiD`^fqajw!{l`Bs|6xAS*pd-0+IM)|zrONnx$nxtLIZ`+lmsJ*C~ z8!V#xh_Z$rPL&;DpR|fsyMm~kmWJ|HAT|;j9H}!^Kfw_Wpo=e zkZ=3pZaNmsg@(lPr}{1O3w;2)|1%b_#_(<%i>t_U0(r zxq{09+pTj-Gj3nY)hC}n(+B_dW=(u-OMO8f^-3vTJ)e+LN4BjIf0wj#YR1d+YXMj$ zxfdunE|G1$a>3|93St@4)$d~ao{*Jab|$xb>#GZcGUNR`*yL)tY3i1Rw2`_TeuGmA z{LaWYYlSTRHgte%n?U&s1plxSz687&t(k~aYG*~NIfJ@8rA#RM4kQlGGj{?hQFXCN zbHX6lz4;j+=zrn=nZ7=c4+ekuJg`ykAQh6vb0U=9_?xxI-E7 z{PSf^K0a_IIa4NN|D>>38LC*jzI3USJ66`@t!SPabXY^!Bx#Ki1wh(BaQ|&AXc}Z! z*cbHNlwX_qVOvV^)jxOn!$VvKfGR=WDL{!Nx~2sY8^CnwWuLfuUUFAbE?$sI(kvaR zm6rZKi`#;3pm*=zW(DkW-t8zgnOp zjmi)tx(f%E9Uwz^QzWRR(Zcwd8|4ZIjZj}P6+6JCX?$JOo5hwR4GJV20Zg}^Q&y9S zo&sHu?Cg(*;fCs>e}rqAAy-!WYaUwWV>SvLevW|Lfdw=eE?oJ$n<_0sv7M)ZF4eK^ ze*cYYX@%QV@29jsUAbpn*04CoEl1+4tV5zcelsL49bqqRZz#iKq^C)-7`@2#Pey33 zHY-)NgQH*8JJ}moy1~SI1EVS)HIq;qkjR2b`salnk6Mi1%o=yJ0d_yPo2{w3xRkG@ znZnRucTi1R$@mDgC!O26hIe_v`~kk_T5YCyJZ$P2d2C_EGX`!P9(M9pu_X*|t1>+% zuI9rp;Bh$P4deVhmO6%~qyd?~MO6Hh>B&zXRv5APqX9ST9{}pdcBk`buPJ7w==M+Z zJ6f#juz2azN$w@{n?%F&+jW(uMu>SkQ(MK=IU>U|@yy^lY+aH@#9F5U9}pX>J0Rbz z<%#`D70rYmghrBN0!y<<=)BU(5~>|D3_8|~pXZCf;a~|>2rKd=xQJqTq+5hm|LTox z?i0SL*QqlcS?nO^x<3uZ5rncHcg7R7r+;$n7JEU$)KS*n#BqnAT3kB51M^eq7G z6+mS6))@Mn4)Sq%kxy5MOh{fTqqDMK8wd78n`E=+4toTY@iHIf?xoT0e&_Qw)ge~2 zuHEwvvi^W0qzhh{?-m@Zv=?0uQBBz}$)W<{ms4(s$S1GF=_c`DRU(14e+FEMI~zUs zrEv=ptYUx}K~r5QcwWn8@0Z7~XHB?&1^i%WiF50ZpB2HkddS-xizn5AN?^hL;^~*C z8Onx{EhHoJx3pCdX;j?0#vUFLR=?V*8AdDk`Fn)e6yQVG0YmI$K_VzD#4sJ~1s6acoQ)D|sPQeBdN_WRA3f%^Aq;bYhIly_)Pxys)3@XZLzM8d|0X;EHYjj9Itn6zG$M|s#j4qJ7+?F;G+uoPwNk4&gYIgC? zL3T;$hVhZptF8ZiF!nOkrn2Z^5J#rD*nO+2RA7ScXm_q=%c#sv!LaJo<2OwSI`6Gn zOk{p8Gn$n~*LgOXNGO&U32xxGIpz&zp~Ip`SG%Ab&x6|^GUJd9Uz}6)(vef^W3`PR z`e}mMqq>dwHvNV)C*GdtOGs$4!t8y?CV%i1KNXi*fGPgJAeLR?kwV9Ijxw$5t~a&L zWl|v08#q0n(v+v^FO{uNFX>XTCg--7GlziiW30eXJf&92YR66NP#-g|X(t$59OoC3 z&y~-`r4lr*9uH#2uMUA4!>&B0q?=d}tjm_y`q3n@dz7+Lzs42!e67__>zTO*&z-D1RqQ=3Og`#O^-L?E`;7?rHo$MSXZYkoR+`t!Ap;K|GF%RZ6=CgTaBGHR88+mr7tV z{|J>zumsObW|i=l8Qdr@YHg#d5mA+c=F8axD6o@3-;laEOlZuj2Hei2v3Y!(mru>v z%KHEozmrJU&L_a6)y76g#)!P4`2_lZfgn>?(nv1X-IH|Q2InZ(wK+qqZlG+d0+mX~ z&ti-Pc8PrGuf4DtMPN2SfByArYwHHA+bLEW`Gn(UDq2ZBy!kV%?66nBcvSbdHT=Rl3w;@cq0{Jw`q`236Z7 z;*DniPfGrfPp~kLVC@cGV4@f8ha|&hfbqGQ<|zp??OX)D8^D%JzFybYvwQd!G@)Yn z8aE|JE%E`??7ghdzW#Z478R6FbIF)v>&NsZPP&?O(6#_?OZ3fEi;nzJx{&j@VgD-Z zv?nsjxd|L~i>`jLm0|v%WLmmfQ6R*%&C9i#1)Tki|2cptDV4Rmb}Xw**=2^ayUfB- zf9z8N6iEt}+3FF2Pg`h{eU0KD)YMOAa5$yiqD>r|Z>F#gdY)lAI9|SD2KfaJNr9<( zGPqVOXB_JBW3Gww=w)2yOF~G|pCbrNmxe>{)mU#(3#IcVL$JE}WnfxWm(XuVnaUY5-`$c4P^gZv zo0fAi-FY1wU#xb?sZ|sQnXy*yzh5*YQ5hKexD@sTynO+u8sE?=R;@;+-ezGor!*PS z^H7SKSEV^!RO%abwEyhp=o_}SctK<@-Sc&$r9lrr=;Uj#p4WnnH!#{LmcUeoLyr@IJY6R(Y1+4`j>@-R zrKXNTsi83&+RM`T{9mz3;}=;1dAzUuj^B(aD^aPkyh$IsO4#GmwU=|N`u9Z|0o5~; z(Atg)mxlIX&;K{>3*$5;{haa79K!KJyM<@;3e6QSaT&$79PksrD+kBp_xc%p-o%6aE`WD47o>KT@*hojjy7 zi+(YYWwTDp=wMkP+%h^_Oh$ z-+rdyD&hn!T#uY;-}rpbxShHGnb%;=?`--HYhK!uPDv=#rBt)t{XcX5({#Qs^3>U( zSwc!J8OlKodEUcNCiv{@XXxMj*wMBqms57(ze}#Ce3r}akX6>ArRwTR_BA3i83>L~ zv8%=8g=P%EEiq(Qqi}G2%_Org+aj@@lLx`(-&T*-fX3W?q64_pa$hi7_2@_V(4KmZ zToOhg76P&@7yqmuZv7AeH#5S0^%TaE3-<(Z0yeN?GX2$b8k{^+cu7%0ov};T-;r7 zFgU}+^4Su3?PX^~=OdjRDbrpBHtMR1AwGh?!{M|t}fZwXjz^zgLvi^eTj=y7x| z(;IM9-Co+pBcC6oRk}%?&D>Tu*g6Jhd1!b^VN+l0i@%H!kKV_SHcWFu_-{*fC zK-**_(9m@!<2$$db#8<@aF)*jGW5Dr-t27*3k8w>vy zx^?Sv0{^OXo(6y<;H9?aa)P}|3qbx37>kT^YRczI4!9%C>P$DY_WZA^m*#3&QZ9j4 zBz{v~D@8|jg+ud4pS)=&glhP;KBiQrLC_(K{q6Z=UBoe}*J3tgQo%Z4;@p9tg%9t7%!6g6s?-@_OD@#<_UiX!pX z>fID(kE#ks#e5WfH}!NndVdLE8e5t6J^t^oy;3pU;~RuXP}wA7o6J;@yV?LMzMfjk za^hNC?(F|^si;Hy3Nne1wmxd5{#hV&#moE0V>Zvl+4bJ=iq@j0fCc#uSYboYvC+a@ z8uo8ae>Hv8ojBbG>Y6Hj{#U%LjBUAuWX1C1a`-M?FDx8z3mM?u{$6dbjW-hUG*8z` zT#D?z@CvB&9l%xp532bUbn_&PZsFivCe{u4;nhVEX}C@X#@1pF4%l?Kx+I3# zVXbg%hCi_8btjMbD*K~!>piT?9q?<^+2K21`HNo%pL?}JY1MJcM3rS!CQMy?2$aVa zz`OfYsoLhjanH)01k0;k9OnvaGLes*Igvg}8TEzfpbUng5Mc8Mj#|F{|L&LR^kpHZ zs(Np_U;Ja%zxd-F?Poe%Z~z3Ev_Mz2RrL!j%7(&p`{1-7)~X3lvH?hUp~~J>vu)P| zoo#p)JS56;t#Malhld;Sqf&*w>z~7bUE5)@vf`)J`5nyvZ-XMK2ZdLnJQ&lXA?F-qez>s zN1(xDnx3l~h?WD!^(h`J7XK&s&)$5yTmHP_rI0uUX6pQn?(NrLn5!mIM(m_glWiQf zLR?p6yn6!q$ed#KrOp7}ok{cJUzTM(XEM=@pz^0A%r}Q-a0y#hR$1(+Z~WfqTpXmJ zCRuh`K56LTR@wok40`2E%iv_ymx*&b%1uZ85Dc$#mNo{e*dl1km1*P2wiPx-f)*Fu z4_v*x2^?!+)Et;op5^xnW}qA*wt+5g!@ zZJ`Imb6BpW7@f;98`;&d%4hKAhq-LsHBmhU=dU2crO3s+0xQ%9A?%5$dT@%? zYP<$;j6@r?pdq8Cc34+c-OIwl$wf8ox<9c9&6WPqQQRVb4{e`_yL$BoeUQe4We+|9 zPUE{!@L%XyYTP?#w)bc!ng9@3VTbY6tKdiXn%!jB*@pdpSBEzWF$HOHN+m}bI(J?TK3*rxrr-qJ#t&LdYcp0CP(ifJS=Sn$x8%>-Hi!vG#J#O%pwU@SAa;rxS zVd4RI76{bHg|`%JZQ2ODF45RaTzF!YW-*@i@e&0uFgx?qM z1M)k5I$viu0)AadH|sXs!#{T-u4?xHd#4H;NgRoL4FgdkHYaTUIT{)qG}QnQ8JgWe zfF#2ofY>}0+?ux>2m1qcb)?hnJyYlXn7R8WFIp)NZrwC3yK+`UTi+hcW*+prr*3!L zBYrCedZ$XlfMvqU?pE@TUu>}NN)6n`XTKUW(P0u62!;czR&t(|qP?_VglGeB?>J}A=N@y^594A;r#Jio}dQMNRB5URTFji{T;NvU46DbkthlM>jC$PKxeSU;6X8Ipj`cwm z*@KqDz|u{JRGUAvNKxC^G)#lFxTW;X_6{isd^|kg2<)+ZKWsc#D$#u14)tO+cnLkR zGhy(VsdY_8X(j%Wxww0A3d_r63jBs!Su@g#u33(0yJb9ZC$c9M6rq_JVWCI;K0k3E zOIynUlcjMQ9-F;N_jKs`$8=ra{c?Ky5=28O@O%xoPs^J(@jhgQz1_Cf`=+FCPvHF^ zwVgpul6jL8KmMt{_YsZJ1O?B}%+*-9Y>aNnH_K)JsLXEsR*tI2O1#iCtVxa3iwaSL zLk+97Y6azCVg#XuPN{zVshdM?EEC_y;sw`yFk=^lF9Mz83C7(_T@3S~r*z>13cAbi z5!OA=SohTX#zjAc8Zg4HUvcGLxZtc{*H(F`+dk8w5o8vuex~bWInDH$mbPc24RJXA zpN)R0yl-SkQ;Br~;kKt~i!du{?IS4`0SlsN7g;eyR`5Ht8%;X~hc4hIBS_7jPE0ME;wPtll?^V+$qbE`EpX$P@V<;~vLXi3?7UuN(W}B2udr zTB5jwn6Sn@8Fw=iTAut`;c;#g3EeTRP3=W~(R&OE^e%7MHy=4U+s;|?CiwT7XQ%f_ zuFAQ?Yl<~0=nB$L9^#jyG37dIL9-J+tI)6``pq83k6!P$*Au|Sj`wHi+4~lQz_*3> z+x5wgAD~x6{A1($R>8mzmF4uKj>WS477dx!)r4mj$~y9!BK2(ujk2g1%!2XUXl*~y zDbSm@o5(FX#Dkwf0M>kcHgCW45uk7q*8BZM_2dS0K+o4f9-OvcXd2gh&63>8$fR(6TM*x@0$>u!*;kO$^G0ryiZDn~HSHI$w~9K5 zw9PrWsVuBREsw ztLrOhh`V>V?7NfTEN%^8%fCQ~@!YA<3(Om&@9>+K@b7F#?8RPZg}>J&RwEvWTFPE+ zzad*)BR!opMFSKbl(cK#-ObMa<_N=X*lyk!0d9*v?g4eZ#KE5?Z}#6D^;gz$06Lbd zINn!=Xz1@zlgFH29k+>JaRR8>lL{LGS2w<&pM<~wd_O9fIx>BB)LtrO|EmABDBX7M zyr-mYPuftWmWUu#HxIWvSa+H8xqCxh>m$5;p;z`|{ek62^o^3}^SScI)H5pi@X%)9 z_wm{m=k+IUFeP}yl44^+JK4-;sLdleyStFD&ZOlBu6?Vzd$XZ~2m7uDKkPHgfl_Y| zaFePM2<>DoU*_)@5b%7vpR7jHSjI5h;DG+t(Ce;8W=TxR1`JofxNH2Ox)auI(2r|Z z+g=s~x4&*LEeUta9t0b__FXZmLo0-~5bl4h0|!2nyY1+1@My7B;-5cE+`nz#{Jc$Q zdxU&X%L6vso0rU&9J^Mf5HCto3Tp9RTCX<;rP%23iP|m$IQFHQo=Da;CZCaR`2F8> zOaKTE@6q%Im=-~82psUHgv=~a`X1C*q9K~#E$EJJ?wXFl(3XkODPJjOj<>+27FfqO z-+bQRSiN6wF>`M$*Af`AHzh&>iG5d#O#2|L-iJjN=-NID3xD+yusP zc}=nHGz$EzA-z2PMyyX+kwFS{+>pXhphl1|}L zi2&3-Pu!-Oc3$Aktsd*(jkVrx!VD7-cSMb z-znWHW&V)4KbhlQObzxZgL50Agst~FF8M8icUi~k z-~aIaBIoBKU8yr%icrYg=BTY#>)z42W|MsGXV(9PDZpRzkh4;W(y2=D#iu-yh_j9H zzAT#n<4!GNI%f7=m3P?fcK;T4|NU{D_ffXv`$DztM@RCky%F1@_g3GWnLB4SZV{ws za%)$06=8}fY=*Vg68nT_afszk?YZ)~b4z>Eo1W&Ku5gFDxb4=K#H`!@b~O5O74Soa z2(l+vF1leowyfLTwhIax^N!Az=bLG;U-mhu z;OF-}?9CH*AJc;WmG2h3~ybn`BEeJ1R6r~)e~Mu z*N$6+2(1J-KGLm9qNsag;700*R>12lbZ^;XIoQi3Yuq}nocv4dh47yN!wU$I!=k?H zd!xR`N5gM?UmpN(pDG`uzHe9En96sUrz?aoN!s!(oV4q-(@Lu&`kj_I4O&;IuV$oZ z^-6|ed|_6=C!PQQc)G^GNVjDh+qP}9^f9eN`G(Ayk*a#gGxkc6tk@3koDb7K6RN ze=Z!aLsJc3`&OboHX(cYlRV!iXA8YQcrI|A*<^byU0;iOV(xlUsP?Ud6qxC^ui6p{ z)ZpC;V$!x#%9m?so<-<@i+k?%-b9_##zdFPJn%<(z*(MvCAvEq9v`KO71G&Y9$TfH;C}T}bo8fH^>{ok)vfcEE||n5o5BG)iz9|&sP!l*6x1y$ zRgj}yk&apLjmH*PPVf~W{i^PO#KvY~_jv5fsP!wTd@0jq1P{Ed5wTYaT%$QZ$CBvm zPwE}56YbdVd~RAFs_!v|;K#ltAi7*Sul7JLqUEz-Qy=)UF}v~Ysws&N^GjriCJjS!-j(t>Jlz9IP; zUJ-$QW6|{Z%l_I^%kW@Z3JKuCwUMJ%DNyA}(iJ;#pRt-6KPS3c&o(G>A>rsJ8PHj( zTqgv11IB)xriuUsTnH<%81OOJM|!RxiQxF=K%?GUuwz_=>o95LA4pM=*_qw*JTm41 ze(Pyc#82sBJ?a%T2aa^HmN?j)YWDRyrOFx`%|@`KXHl{C5Ww%CvTJ{>bB>zO4(S=0 z+VkXz1@TVzqv?J~!{Uqqw-Umh?bUBN!f%MFy_GA2Hpe!alKE85x4q}5_0iU&$hSQT z#J|LnmbGfefA5PXrX#dR!Rb6fX~&g`cnQcePdwoM^^N-8Dbk+{rxiN1ctVR9++~eu zZAqxk!-`wisns+M>x3TW^2%&Ql-d$SqPz4raMooQjr4EA{NX+lG`N&%Jey-(Z zAxf~t=Q?%R*6vTjVGINKW|k;-7(>BKJZsCc+A47A5ps)u5fina-8%bEKVmP1bthY zlbI0bGV^7}e@eSXJpQ^VALvi{dWoFr;WCQQH?e3{fO;dgnKTp>>8Pn&LE9%n8e%Dr zX>N4_|IGUG&6bbaSVhe-@W;YzOzh9)96v}0S9|z@h*kx)7y_{nT%^csbvY{==9904 zF*fP+eFkCwo8?aDyXsv$W#z>#s zX-!@NlKh4RE4h67{&;fVV0yf^Nr~G}EE%thnuLXRp8=#5|L>Wx_F1>`Up1Q9ZPnlL z0fo2nWte;7A-S#n-dg$&!fM!VeMSCdrzXCO)a=k1l$VdP}_z{ZiT zbx6KNtCJAQSZ7fL&qx67P4zlC7(c%~3({XI4baf5v3u>YIi8f%hjg>?ma{4?F(5N% zc%p5`L9Gp%8QuUt#u_Y!k$;bc0o_^SFFUUu5IU9U7?!6L3L0J%Ntm07jqII~Z?!*<$n4qr0)#coQM;NM3I@Rr$}%WXCfrYluNTs8>)BZ4Ce8%Nfu(ggG_tY z!l;>bsy4f8@2ZJU77gM{=-3k@u7EEDxxI+u}Te%eGv9TnQI;P56vH7oV?G^oLnN(;I zHko)rt8B3OR9f#*-{?O?;S#%a$ajSM(-Cj~z<9Z)bTwOyj~Dxhp9-CHZWIYMYr0Qx z@>I^Dbf6${%sBr&Su7b8%2!+_ranU*z?(Y6JncM8(pZoT%&n#Z5e|s%>V^`v)i^wo z*ZHMcR>jep+AY!v6m~a^Jb#bAu@AssP}lX@r=~WIoA}>r1l6RKn=@(6NtslenBGDN z`|{}cpZ1m@(kS#V34-4inmtpGAiLZ9a`&BfDnm0XI;?&_sL%C*1{GSebzTxG^+@SoXbTb=fCIc@u>3S;f za^ZBTy#Ljgs1k0z?s+r6^OqW!<3E2V(g(K1xDBpz?$ihi;jw2MLALjMS!_`(Y!`7N znd-nah1k^O*PFu98HP-A6`LWsq4b4Cm2skCYTpoWU3j#|sE%>4j2P5^nn=WKKW_kn znNdCZw{ejbLsHSs_tN5Zl}xKjod-)RGiRML9N4@1je^1j4Ntf|ND~7UOP;#WM{Ui6 zfM{d#UuF~)q)q8l>lxZ7)D&!SFUQ+ByEEkt?-&z{CI{IpxNJVG=@R@aSE~B%x3PJaD>w7*WL*y z4H)cp%)<49vxgOmmH>tJFb$jJb$oG)NcG95AXy2TJU*3+Q= z*0WLC{Rt5_CJCIJL7)}9-ja>&gJ0s8`c^4MEW&Hw0yI!_O~EC1C0Qf!l2FM4S>m+I z#Ir_>bubZX#4ei701melXa?pclvWlC>*y7^jGe|(s$9jPO&S%dw^%EWSfk*TLzMvZ z6&lp_%QR5(?`J9Wfwy0&o}TL6;~`|S!8;nIN>^Sg$yy($!3^-vtiR*};x^&$Y3}MR z240cJGln)h)!bY(0Q?k|X0FlL7q302;9t8}s}orwka?C5hr9EW+vY%7BYqDHX36KU zshscvkG{1*(Kuj#wq0_R=m_q7Oyh{JBGNZT7zu5C4Ik z)Gye%2}8Z))*d?;noZ$FWFzCsBg4>GfRwQ#5k`7#b{1#|q~V~B{>4xOHR9$-D zh^CAu)` zNXG+!!7jAxVP@hL^gM#}C(_GK03DPVN;3H@>QK@V5seSS!EAiQULhpO${H8vpukHF z1D;7x6>bjWANT)cf&lu?X=h@##!PEYj^+d*wSm@mVmc;{i8OJ=2XZ$?ZXqqus(dN6 zm9aPU1NzgS7c*J_Q^%fmnG*M=t|wfA^vg^sHQsMR3Xv<~mUO@pQy}_G3QuyL21FEW02BiHQEc>80?f~H5eAN zSr5m@R&0Jj%``(|P;ht7teIW_7(S3vTRk^87_O}3+heiqm%`rc@<>kIooIyoi0bc$ zcaf~?fE()tqg1_gU1So}$jmJCFQvpqQY47EP3Ol3-oAsH75LS=U2|2*LAIKm$+pba z1_6%vIo%L{rlWQCKg_6up!t>_jYT$f%kF55|6_3cX(eTyEu{D)05ZD6nGvP`%3?*% z2hOZqMd@VO520Y}Tzfl&sKw_6>c5H;njmJ4mU>#t-{Xlw!{Beviy6iMnOpOZ!JnV{ws;xkHtP;*2Ri(uo)}}4!Yd0H2 z&>SRj7eruX3z-1q&5VEpqUKr_AD6g)$uX>mozbP1vQHNTE^-rWIg+m>)8S9}0!Ls= z!s%B;|EC7I>TGF9W9B1?*Py4575+TPD6bAK9ka}&Y_XqPcC!e1vbc%hzrz=A=)%xH zx$*1$k|r$d=bgFqDD5P~mi{QnewBKrVPg1xeupuUZ1Tll$VRvP_}_Kb{TGpd(0>+L|pcf;UcbkMSK`es7*Fu8TPgPbNP%l%zwn9L8llhJ-K-NrHFBKG zbe^(_Ys#XEC-EX1iz|vAdDg$h5cJ&L1SQnMMhm9Z5q3VrR6DKb1sYI1jYz#3o~M;f}-qbaBdHutAs&dU0MkQir7 zLiU?y(DO|F8~XmM6YoqWIl$u71oJ5{*{l)Mm#U5mR}+TZr7{yfuGtdjPB~oB_8Ba6Mct1fqY-h$%`UXNH!_#M^j??Njak=Oi5bgMBy5Rk=q z3N$(64hKfH^zrGsiu4-ypAExEY!zGX*E~Y?A7I83p>9ZjX^+Cy_N%S)yOmgdDvw7U z2Qsx*XJ_AF&$afnzQ;BP!XQ`gdV(S6uvZCllg{qvnXxy7+dxlOo1sqZ$vTNU5NhQu z`=kX3)eAsUD9$FiUQlhFQW1$1QSi-oGBw;R!|1}s`!D30sJj$k{TUKtYg#8hF1a_A zy4F-W;Pn7fkGnluQ6UiL#<#51HHKCq$emI(J|?8!c}190Niz3o9rLlxnNMJGzP#<( zLt)Nq=lrc+qv;XSRyiu6KYcyLxE4rCSeuI2kqn>+-0bn7ux{ip-omPNd~}@{$RI&~ z+z(%eL|D9F!khsJfK*Gv?n7q#KLm zHld)fi2=QIN3PZb1~L9CilLItsVAsWdv{|x9DEn!}ebKX^!UL=D%XJY0r?+(vHn_ewr1BMr9Pf66QHq--ABH7eH zQOG^%fSXV*rV%dI79^blfa=AGHgb2Ea#RXf`#(tA>Vh7OL8kscCsH}juTXIG(g*g_ z*70$|5u~>tzXU$t92Eq#$-|5n1EkZ@3GSzLesxvu-d3xqIyquay6KbekJ1P<8R8b> zN2tTo+uM~1W505GIP&FGV$?hcs#y!iIy*dvYmCTg09{`qZMmM*kIJz<% zT`h$XTDxn3fs;-$ty3RRSVDF}?YxeAb;7z3eqVSvmX!Bv2l$nOA%`#WKnH`x>%h^x z(Lj65YMLG@<`spSbmP~?+{?oZT|1E9tDb|n4_q}%Vgu^Jt%rE>-eM^?mUKV+kL zY`b9AFiQgj+Fxl|?gCx9u-D>Do}xo-y<@mKPX0k72j$;e3?T_Ks^zdXwCwk}DK99g zbb>7$ZCl)sHtj$I!d1|1bP!F1hRN`0n zg(N?Q!=5BfrlBZ@(P?zk;w%2X!M(A>mIVV$?BocN1D?BQ`Vk{7nv%yl?L%mMz_Bbl7~%)oY;tJ;f1*C9#M8CbI{J_xkVb1-{nQ%DLY5r~Fv zdS`8=8+I1mv;^-wk8RCP%RPtth*uvA`H~>t*bykOr!5|Qv6^br(sPp1-ZFQcDQn-R z@l4R(yHf2DH@Lk-bfT$4nDzZTwyOm~Hted+)4lC8CVIT&9XbgBSAhK2^cGhW!{W8~ zkW*Lx+rrSVo0?J9+eh6G@}1<%#b}{Vyw}$ZisgBy3C+NHP{^exxC~F7)awr zS6ik?1QSaD2sc|tvL3AY0$V$?|0nF6gv!q9qONyP`5C$T1K1$AH%|_uy0}U8A42=* zWpBr#%y!W{hW25do${r`(Yt7bvs1hKY#-0)n)dLQ`$Aq7?7_9{CN4+VAaFSJ1U+di zCTo>#)m2=pkshD8)i5DFd8xF^Dw6d_CWWWx)$BDt02dRyXj{>f#z*#V|efxPcqzDU1 z!v1D9I75entxWszM;nVy@W+CrpED0O*b1q?o8}EVg{PW>NNLXq%u40i2nIlUcGN0a>1np?7OXGm~#1 zbMX9yO&^vhj3t&E&ndZI7NDCDG^FSkJ#T1rioV><*Opyz!CP$oSr?jrlbh<~v-k`0 zYCYC)?NmOJ1o}0@&Rj3=QqS`k%1-Tlti_0?2N%Exu>v8+x8pNT6uEkcvw}Rewesli^FK1_dSbKF>OhuvZAL2Kv#Ta2lzb`W}7NB<&dsWgzTkvWAW z%TyF@5TP9ggR zyyJQ^D``Q?g@H&$;_99lo5xr4jX^is1FUu%h}AmC+Q4*iR}h9v)yiLN=`F-5Ecwf* zMDhXU2uT%N_8oIL!~yR5R{8@9yyt3GI5T{Jtzo@604F-p{sLn1fF@uy?#0U2==Os1 zw0o?A_}d#}&7(->YUjlqRQt=1D}&<4`9AtJ=Ag-?EJRqGQu{}q5=}ParFcrsw$oWLA}` z0|M68ukRn3sh&dSb0uHn?`z;DD=H%|UB0ckwbvf&ajFA0dun?bg`)2@#@yC0;bzTnW~d6%jlx_xQN{fFrs8wOLb5^G}}JbEOYg zI+v_W=wX9~#1ymu>L0kOh3@7mEre88gDho>Y7u^!$Q?le5@sQgd(kl~L@i8yMDRiZ zOX0~UB^syz0|)Fzi%Oj9z)e+2y9;e8aV-;(k~`3P=E;>NJ>rlS7dLlNm>B{dC|mf5 zOK~v&lab!XJ!5Rz6(H&*$I$mn^o3lt7EUw$_oBlZov;>f0gI}EH68W)rpW~=$LBqT z#f-+FiT)(j^XdA?nK1sFHG108m?qM`7pH!tidM9A;Cp7~G_i5w z{8T$!WM@XwFHA45Pzsyg*W=;^auTS_n)C>bZMBGt$c($KU*Fz93W1Y8A{O~PqGBQq znmfy{m9dZVlZz(*7PP)f3q4?7abHI=Vc?Nk>42(-dRI@_cij#Zyp+;;&8rc zK%z@V^b>aFt%=g73H^r<3|YBH7Y&)@t8wVcn1rn>>X9$G{b!9gCbnatjeSuLNUnky z4X%~s@w%5Cg_`>|)tq;3R=^$~T-P262obw!SN*_Tz&Ds$)fDu)3oS%N^){&+idfR{ zz5h(82!h=EO~?pXZSt$On@NJF!2bL!1>UDy>~tg!zXIITiA~4BQ{x5L-N!v&e-I15 z-jsX7KlGlqq-=urPU+bcn>i)>_YU8s4E%N8gFnm4NC}kb4tPz>)BWdZC zvHb93n)%3JEHgY9i&Mh*okSuo5J8uuD%Ikm-)S{LyL43)$KNwQnYhdb>*w$HueAFE z*>V50io&v9SSQVt(EaT$@+#;G#qtM2e4_-0?Kjf?debH86ax={pwGj-`YY5~@Z@2S zZSdtv48)#dvcZM!>*3>=F5nqHFW8vdzce0E=h*cu-+w_DG&6@%JM^WmBhI&vKdp}ioS3ay{r+!tx$ik>?s>- zHDN3?1uXqQJ)oEQ^bEq(S*wcudU%HSX&tP5RM`i;}yY0pfAr>@lYsFAeI z>S#ERlwH~c(XwCzXWUZ~+neY(F$Df`Yw)p}k3ap*F|`~iP>X9I!;&rXN8mQrf{pGP zKmXtyoW=6^GiWul+%mV?W(8*aMW*E$WPS)MqbH21yFTGv?oFoz*)3g2cI)z&^0A!q|?@H}@kg&_}P8fE=lC@b+%{c|zDsEV^ zU4&P2cDa)W!WDPl+Mt0|$E;AI)xIy}vtzCPV@7{+#yneyC9DS4Ko6HqfsykfJQjd1 z1fM}v-&L>~9rV`mIb_MG!0$2WvsRmLPY)Ym4Q_*T4RdzZa__Xe<}YI>$w zerciEv4~-RPf?7p3T_?_c~e}qO!q3T3^6CDa;pGOU?XC=m9pT!Z6#@T4w&=}mu{9p zdlXSzA8ROgQR?G9z&t>i)G+!Zo=%l}k;qLu`lBZbbKc-GI=2JGA~sryOa^{qRF8dU zNg)^(pX{C&`9Sa^|Ed{RVY@GjzV5s2YVY@fK@e}Tv3INmGz7st`|5_36JFZXdd=Pw zf)Oev+)k71E)&*;&eSSdSg+OPIdeIN)PJnpe?`n4&-W^ZBXP?Idm3p}^LUa&ih zWgS10yt?9%-X$aLwG1jB@ak3g;x;gc*lSI`h3g5q8r#aPV=0Hq2L8UqfC<>`@ab;; zvL{*+P8c#x_Mk8MJ6iX^xb(FWXrm2FSyM^Z@P@%!JE)6N$Jz8)zdK=3L-Pmac`LMm zL#0zq7FC{|ayzOw(doRqDXTu#?HcdX zfs5Sx{1Pe7(jbfQ{Q6T&S7Zg-WJ*z(LQF2VyO7*{5! zRBK0geG~%b)p|x^KXJBf42LiMWEwQl06_-#Z@A^0GZz$$IIb`Mqs z3bJQ+H?^w9$S;>GVGx41>dY@v>yffvOIzqA?t!tuBI!;5=Ztg5f@6jWpoGDyNN9Fq zlh{aSB*9iwSrhVk*jInWItyOJq8r+j%}hCrDA3&6Sk*&xN6o@QtUPW_tK0NbIvRx$ z34@0S;HmpZft?Th&1gtgb%<2AJOg;v#>mtlwRKr5L(78do*J~(C#7X&;<4p$T|i>v zqO_{~m&LhJ9o&yq#V&{dXh*JH@w@MpJ-aF?p5S3nu&#@Jvr%lh^xVkZ)Y+0#GHgav zWzj;>cYZ2rT8Zgk`^sY#Fq69GX_%-y2G^nqi`BH1Q;q!g99+5q_&TKcHG8iAMN=Uy zv2tTs7osA5SV8*3f^s_ko6^qa5;r9YE3k^Mm*K*uE}0CcF}2KnS0t^kp#h_s%4s)y zw!F4y=o{@$y77>}w2NOJMcofn-{<$R%rvv|%13Wm>#@~Vji2fh78%?h?PeI4m}d2H zr|a)zp=-9t8{;t!x0Z_%TME9rIU?_T!av~~Tr|lGmAkynCts$YmlsBL;{yU+oSYXm zvzuqbAlYst8`-1FLb)3AKq%8{SOs9%h_t(2!A=sL)@H4k@3{)Z>C`9B^<;tu3pEL7 z(-#=qQ$|!QqmE7;9xFYq)OP==$>Sdom!KEyE(yj>!A5EI*XE$gdYZ4+b}}qWEBI@y zyY*l3P1PrtV~N5TSd*0KiOtOy^OP0!~;M!iNr4|0_dwkpP?f8eBNlu-ck+brSEO@>y@STv2MwX+Ur)a+kRc z^(g2c+~&gbcUf4&H=uv8Q^K(;$h%*#Hp|CS-j)Ct<=8A}?wou9sm@utw$Zs8W#?F$ zEYh9}$T^-)3tpfPy%unh)L`mU_z6_fu24q4B~3U8><&l?xWL#P64Q$-Kvz2IRhMt4 zlsnN^Mg6*1_i(eJ?lM$C<^LLwva%A>rZG04TIFsq#jV<-Mh+3zZf4*Fh&?E~5#9eU zg<~yX#EenuF0|N%CAYR`{BBLCNTXc6p#90(UP5#PQGk@h=A){M*e3|}Sf}n(=?!v{ z$TYD5J$898&z4FZIfCYoxjUT4IRSv4plbYO{xdX*)NZ*r<~{N*;mZcsg-*!V?T$LO zUUSWM+8(Og=g<8MZD)3wIEI>cfVee2>h|Mkt$gBdOeJom1>rjKvGsBC5~G+oIdPT! zGdDN(DRJhUeoH7EVSdJfafAbXb8(*y(L)crk|CJSp-<`(a}%sqc6#!>xQCXu)XZIL z=ZJaY2@cu)GA3|wl~sr~q5NX99Z59@L$^D|!MG^G`s?wdCuQG%PX6Srcg~%o61sZ^1A{Git5mOxYRq$mtgDwPvNgfa+E{i9xA^2Y8@pz!WAb9Y$um@^&wHqIn zy)~Lh4j#yitoRfjmOr)1mD3zJ(4}|EfPo8ty@Ve$iRg7P_~_t%xrj#3-w)FGnBZwl zsfhQZXm_N<#T=!wm7|;iEXcz5Ecs@i^#?(F`d0lf*O->*c=e$q#2>t?F?Nm(Nm2Rc z{*h?Z0L1OF!Jg}TL|rJKh&zOYa&ZsiC9mfGXrBHh-6;K%E%+b7Ji6wW=?_wwo_(S7 zGCl+BhWsWy`cvkg!!?5;z#~IY9uqw_bvMxYu z?Mc@7kFM)(`{I)jE{6<|iD`&vZoUjwCi=JC5Up)t)opE$3%ndZToF`2vObfsU?QNE z$uQ-YkAHyG4+5R>lIjKbuq*5bcGWVwy)?=d9Ny=glxF2ypZv77tP6OeTfZZ|6caW{ zJ%I@G2o9352?Q92GLT*TCZ}`1Z=OM7aT$F) zktrvuzB5q>Mo8S~ZXcU;zrE3*n|}gdX%30FXKzj_cvqIU^q`x(i#h{-!0<6v!r=7k zwg3|fh}pSBv0x7(C$KI7u!!cl!M~WqG&x6PX}aE)u7>P&DFtufg)$DOib4T;5-^N6 zRJ4pm{lKnPZcxFkp>XB10TNW@P}nC~YVGzV>XipT=|XD5IVnL8__Bn{vGft^{W__m zBPORyDq1Xl4;!3gRh!~Q$|v%|QwcW-U`?kwluDCTrZsj#0%Rx7bZluUk7Rba8zgOK zKZtojWnHgr(gS~%9nZqs%5v8IS_zql@syI{63kL1v9`~9zCz_1?-92LHX*e|Za9uB z3|TIy!_y0ha(V6j5MtHaJwNW;Le-hB{bL)m&VqOqYN*KZ9opxQtlPxU`n>q+HqFFx z(3w15zEasNkM8TVW7u))_j{Fnw021fW#|{ZIf;4D((~_?X8ZgSTqu@0fYBDpPHLSR7ArQ8+k97$hfS0BAn=H-wnJjl-gd_&8%m)AssK+Wnag`Q)R!>i|{vdbXt)L zWUO4cK7I`OalvjDMu|A3T`7IjIYsMUhldcuFVkAcWZv2cDJv{9a6z~RE0TiH=))3` zSC(X><4s}-MH>Yi=s@V-JP{X!mcIfw>G&&fcQ+dqi3+cOSU)J8>3PBln!n7vB z2$D|Jn=zg?2!pR8OoR6oy|z`#z5SbV0n^OAuJMS=5s3{`EFPe!#_T z5xw3lZ*nRY+rr-yD<_Dvt%t(Wu_g)Qx%gz1ebuZ5`iK~G46@Zb5M^Y_-VhRuQ0}Ho z%1rpAFssI$U#Jm|lCgD~>-bo&dreaTuD0$u6@aoIr_sCO_I6Cv9c5rt(iCY&g^Bc+ zW~20R8Nui&N^;@9VQXhpNn=3~IK&ZKW^w8eLQG0(2r;{?$zy;^4zwyVH{LV%;8d6r zyi$*+llVq-?UBGweXoztX;t?}y>3eSN5=1&I>1MVff2#$ai+h&OLJA1Gf<*pK4IB` zgMd8EBQeG5CY@u`G9y3ck9%777gFa>{3+MAQ*+%vN}!|CZ*eHDy36on&|7Qw0Gqx0 z5=gdp3%A@@ou z1U?D8XwO3ce^}Da;tUKig190h?9OO)5a#*9@+AL>?H&z*8PG#;D8-erCy|;VNmyHm zXHoJ6Z;ZXjGi?*l0`B~mYe(Iyl#{L?Ed&S>hW(f=M9W14DAWva2g$CAus4%sQsX$B z(Gqx#KkNOls&Y@Llgs2$??L4D{VVur6KHFUZic0M5#@R!lo>LbRRyD1DFCW~GPtnP zrNo?AO8KV>HG9`qIiOM{kc;U0$ZQ~XpOyqxfMk%8iy2B((8i#M>~|JkF-b5;Uu*6X zcyg(su_W{h5(ljAd~+ne&JfsHvH?D=a;Z7kKaJWJ_H5wMCc&j-5u#XD zH73UO{?4bgjHaD7*j1|CT9mlE9~Rt>C68+d_p{AMNS_1KQyPc)v%>Q|#|Pcm2eG+} z>&niN4#pHI8<*D6=H*Mcb@2~DhmhrghV><2k~)f8IZ1hp$euRxvwC$iX%u+K*(D6 zY3-Ez?P`vCE}vojguEUGsk(5(AO#u6@jqzbB%gFkwLKeXuhr`;{CAGyh6$o(n9Wrw z$rps3#GQowCWtqMYxRuw`Tya--vP3#1ZlPULq91LNYUWi_Cu8*ErCaQwuhLf4sy;Y zEtb%0&?zYoDt<8DvuAgMJ}X=Tpwkf5@SFWQFO+mR5urU`H|m?7Z@OLI0S!POR||j{ zuZ(7zK_=^a6ZroWO*+vV%MjP`eaT`b7?w|(?P>V^n*1kTR}9#a@hLoy>SaGBmH^i@ z6w^kGf%+>b66;TR(M;YbqCiMqb+xO10#~P9%P_2jo>oq-^K1PkJX0uRyS@4JuP`(f z`WP$XnVpQDn$;^r;gB!OOwUmzyn6jFb5`{JT1bZdRiPW;4wxlHKhzCMXS`b2RJI`3 z%P3sD(pC$m@M&4fn!qRGg__zmt-eR%m|L2&ZKm>Qr35k$rbn$Xe)xPJ>!$*mZ*C>K zG5u1ky*K;2!^&OfktH{ekS%J5YfC$vz!t+6(9&j`b_LPo?DyGICVXlV`3vF5nMm&K zznR-2$_eVIPp>)fH;|nO-Y;vrya{(+FimxC+dY%d!BSZfv1AD#Dl2FoQVflTUh&L%fiNt?nX<%SG6@-$N3IFo#zYjs46kL`xc>7}!pZD^dEC7+ zMYha_AR$QDTB($8%XIJr-b##UJv`YQ^Z|d}z)GZ`#+*)!qh5W4qeg{Quz^mmaNf>b zK=&4nixCrb@%5>VJGN zi$uUx-4?aZjn^gOq*m^{%aLcP1V1sxK+4fow4*f*wK2W5nPs_~GP0@Ixx)%$F6Ii( zG5I}b_acVu=BLO3LlMqs)9YSS0gg}J^Ad)Xf3%M?v}qQQ{~wWd=J36HIFf-HRi_lB zyu>k6bR5fkL`Z|5r41E~e!q)hs~1XF!A?i*nuZH<0fBVtz;|~+%@tw7H$}J~A!pFA zR50q@Z;)ow5e|Id3^e9#PC=~F2cm)7sHK$5)`OeP%PYLG3nrO*)REx#VS*viQS|%2 zsjx|J&sa!$XN#ksmlS2l%b>Yb{>OZx@&VzGg-i&6aLmutCk$eRTPq?5OyC|hKz4Wc zOVH%s=LB(%vj%dW4V^8x%TnVh0ViwxPD-|RGqM#eGq5mvlls^`IZXc?{13w^RNu%Lv=r`Pz}TpPq?ldh;SH00C_q34A5_E*1@P?bB4m1E+q zh#k{jJx`>Mu(}WR6!Ll>=QjQOv7X)eF(_m$bod?(62)Q5DlHJqy7d9G z{KTC;j`z~>(lVcLT~D-`vd=EkA11VF)#~5 z1;H|qW8T$--UeyCSbX|^bQG`-CXm*XvleV(n=f8=oWlalTlW};o-X~Y=j6PrFK98$DFTCGRh2Dw1--|!b|9)^7G^K>jUY1?|+u?33bHvoYE0)- z1y^O-a5p z-WflSi_zn;O}uN0hrgR*^W%lvk6cHzd3c$b>v-WIZoT|0iaxFckyRo)yY`oRY?+QC4|Fk2t zRd%Si1;sx09l38p!b!jq%y~hFruG&$_oJ7Sha5NO=Z8q5iC1-KcF)kh&v@H8exa>! z?Wp08bJCC54RCCaso~JEEo6*VeRfw#?NxbbB-Yl0xNdo09mNq|1dyd=wSjr1ce&rm zP5sXg)Xi>9R zbC35O)E(%=8wm+f||Z+FG)8vc1tr>g$7c5_1T3cd4Z z(^6)&=r2Oe3dV0|oHsPVo8t!IgbR0B2nwvLeiGzwGC$l1D)6Y+6DOWUhXpq)4$J|n zI358lx|aIalu4NJ+c5B;)VVB5nRU1}&(AD(w(X;uef7%qz$a zWm)G~9~@O~M4z1D=~-x{+S=1WpteTltm|^k&vyg0o^^?8+Y5}#e1w2yK6F#&3N+{I z!1BYn-NDjg(_~j&ozJWCS%!1XHC~Fpq7oxvvlErcdy#1y1Tpe7_`)hVK=E#NO zNEwy6ehan1k_4icw{14Szi=D-hmA7)R7^yGcHP3h0)3DizA9E6-Hb#04#S#Q2^7YP zlr^gzpN<4imI7L1M=rPLfyymYw;J2#9%c{Z9;jm>0FLqv^BqNuY79I(=+o zZV)`{w1t@SK6+pCa@ns?usjbbeEY!|!68$BS<;vl93Fct=9m#%$GKGM-mq_MDhln4 z2EaVjx;=$tRffW((>&{2aV{YGXF6ud&Ez5*YGl>Sv05q6A@3qYM6qw#H*9w=?s*I2 zWvd2rb60uMzdvrir6(_5dT+-I-Hum%3`YMQKO}y;<#uy-_j-OoGI)03+73^g;H`=| zWKbK1+1n1kFI-75RW2P2lWDLbwKE9Jls#;1<_%i_BkpCEf;M``*8KgJk-qA^o#kj~lF}uqG3eDJN5bv0 z%F1VOHLe!pzFOsnOFfZS7JHOn%MrI1hIwUFvl)K`B~eXzHu*IT{PoI;lRW zE6Emg%Ix%20C8(Q&=P&(Dp@X3%=keBzX*TEL29g8?qL?Wwm~$py6Pfy2TyOW-I-B~ zA@6oRtwjBurX@pt@ORv=2{>p#<&P6vssOn9$ZEzAepZRuH8lYBkMbo&Sz21 zRSV_ckArmY_xt59VRKIGbsH|^`Ci)L>FGRmTGo3$O1z;}9&tNdA!`keOtb6~4zvj< z2mG+93q|gR3bw+ldnOezEv?~*Rs`@V)QiVjpZ;3ta3~fSHBe_vhon5-VljEisp!X` zi3g1e^X?la60peI$&{cAYm_+8kl?iMDMBV5Ut#I1XT)v)n;rMTDEEk{rL+0Dk(GFr zjv4)s^VKs*An;B0TAJV|5-=W`ERZ$xO-d0Q)&g+MXe0q@=nrHXe%`HUkG;HPXAM#= zLZuU?z(;{m)|9Un>dQUrAas@wWukZY_TSgTHpKkUz@!BiF6){BHidG#y*|A351w|q zGt{?KB5h-^Lvy3>^A?BDi_MV+fvc!)99SV+=qHsYI7$fPCpa=YyU`j>s&7s+n5ni2 z>Ytl;b0rwAae!_Ox}rnM(y3gB=giMXr~XX-Mfp5((6``T+V%3?R*Lho83I1_uzx<= zM(6$(`#sX5*j>dKqJN%V96jCwgknPZrVCfJ55nP5*l4^fQn~$BBgReZ{{T=xufH!| zBXB|qNoGPWv^gJP)(sr>X3wmWm-SjLiV-Bc5E%nroNu~03F4t`Zx*ugFV0eEu8x|Aig&*Z~wA{vJOtVN_kB* zBLf30#=yr%4g~=#gMVWyGQv;xm3YcJz=Nb}dmrFv@ISBN^D6Y;{Q8$)|L&Ww-}PgB zxf1YzmE#~eG>4>B4Gx>7@KZq)PPuCZdh;W@q+h^hAk6-`d zSHIm`0&M8&Y8;rAQ-FJvQd193Dt5t{GGQ>X0&-BvIYy!AH$tmp`wX%HR!ywKum0GA zZ$LJ0ZVzw!?K&UEW!)xUN|5>@{uxji;evCoU{T9R;w0SIZ4h>kzRdZh`h9($JKLLJ`8aV)>6u#MH2M`KO5Ie7)ePQ_ns4Xyr0qsWI z;ti>k&qL8WYql`JD6nr#3T64^06NgbaT3A+c9{XWT9p(cHQ<8okTyLKNA_%iYXA}; zlQ_)Q02a&VxcHql=T~>^k+pW2A`p{J+6La30fJ9$F$2sQV*n7x4+NH@j_ULPp1x8c zrCSedUSZ3KW6zF{Mfdv_MemmtMhM6WbRhxN;y+;kcozU%oR6M^VRGE&N7Su00YS4N zYnWs~aE&S8t1FW(&M)8o<&MR1d9^r56`9z-_5?Gq1Ef#WRKQ-<2&e~&haWp9AA~^h zvPq0ZU|EO-HQ1FU@AAbRmaMml5~+dus3o{U@|)Z+8cf8G1z9Q0gDgh`pMj$^5SWob zY-}LNKv^lQEcvsxyN-)n-2@fjaAX?*Ol-ex9E?Kc9AH~lg>zC`L5vnaD_}dMc%`Jd zWSFQqPnVZ=AX9+{?AsDzT?M{i@e`35rGV+0Lhb>OGguvwOrtE69|P#84qi(MoVXX{ zso;ph+W2gD##KLiSIv5V$^@!fwa``LKrezM_z+dLfc!GTe&BGjiHylxpE&`3yk?FF zslesnlnGuBCjOaAzaILRTfMwFzq)*NC-N#w-p$tpM10^o1(WVo5dP`_x&c-5KKB6d zV}(;mw9iOL7NiZNSU6W6cI+GT@xPtP_4$kN;>#k)j}DFyYL?IIV{QdV84<)|RXn9C zn?`G+X}-+Z0SVg}iS0|xbrE1?Y50<0D3m&nw=V2j$C&|sd4p1QFzBC2;=vED1=mN%ZM7ShU)``VZ6njrjAnWwP=_1>!RcKWBo^ z4cOh65lRHnQp6*+LRbUR!E}f4>8Uz?!p^3B>vGC@*<@q*5-<|!4WiZH{f;uJ7xrl= zG7AT68bBsZfc`K#^x1p}31_sao?uhSlmFxJl~C}!S7r5$$vjPzr580rN?(I^p5X+%O=5|MGlBIW^wBdi5Je|R7C2f&183k!6QA8JK6wniK8Nk=a;l}4k{72RiNS*P{vtP)~jo!SHx8wZk zY#!vz7u^sasZ>Zy*xB5chyWVE1b8D9UC#n`Rjq^5x=o267*i<@Rgk+H-?Ad>IY4&$ zDOPql=q=WBUhNtQsI*#2P~YZ(dgEk*f)gNTvv!_y`lt%FwHap1aWlYsy(z2Z5t;Gl z5CY{SBl-8U(avr_2ru;Z>T=ImkioplCI+YuS?9%C&aPukQXBar>H9Ki{gG=KqM zZ)lDeF2Qn8l4wZPo?#-HGv<3oFVXT0ORmCM^*Q!SsKRx1i7Ez^yvR@%WLuEpMjrSJQR^XCz+1q^c{uzUQ; zCNYGWKsFKhTTMuY6pVv^nVbfv7LbpoI?QPX|8V{7u0y5ewIjd_fM#>qRGo7;4x)-O z_@K=jQP91ac~Q>F%Q6Ag5Z_ZmT2EbL|NOr1Zu`#P$m`vx1WLU+oM7I-<`nk_I_J$J zl1z2Y_HHAXdP6`r$O-t}IFM-uSRo)YAYAit*62>L@2aspVb^=|l6DDb0$c=Z1wJ}r z?zYq%D@9acf(2OPNIs6%0Nm&Zo;{R?3>9%;Yo8}A;MKls10O7m^PXLQaMP4B8*{hE z=I&VO(SV-83z3V!Sli^x9f8R`a=AMpQInJ0<@(znZqED7*^M5)*Ml2pe@mQiuJ|B# zcF-HPmhTNwj2yJU(^MC0tdP^P!V@jfvu2V^E*u7v|FmLMI<@p^$`3qJ@rT2 zwGHd$olYoSOYiswfW8)Lvy;PZ1hh#U$R}7!6HcJyuzOIF)>w+B;J}KQ^6)S43s2}* z7Z>OJh5f^{bO!4ksBbFMcE$hukO6T)q3{)eJRk`Xz|BVvV#OA~g*n_F+`4k-TnBHMS||x-(=>tNs!#L@$N2LS zf$#)n1$}T$sc}xxpOUe*#cKj`#%B1;fmVQgp=Lr6KjAdsnH0CJPh|h&{5kUC6l;%Q zNtNqS@K1#=EUh3Xlo=!M#JT{40{Ev0z~y_2z|XV zpSp!R3k4!e9|JLnpdUPi^%29sb9|$xAP$`J1qYq**tcMRWB;(n_d$>IlLt2)G^?(dpq7udkU_Vvm zVp0=3StyR}R%hFQp&hFdtY@1lAdP2qob#lRa?=mz*SBXZvV03D_{m9l_rk@8x4TdC z^38e(m>||x+>pjw`2k|B)=sP}kPUCg1Z)a4hth#sg*OxIRB6==IqfX4{z4CDx8ELA z#@Y4N)x|C$0JmRN_KXaag+R`h?o_G)XyNS`Iar}cVMnl=J?V^@BVL98mu1!?;eUla zJjK|*ytz2LmIFL**GSl~z9Xi#DyvCt?Z}jrW(s2OK=U`3(Om+#sh{S z-gPYPaj2X1Za4vFe?G|dwH|I>;?KRrpIhIn`(+@bxLT-)zulXejP((&gox0AwiOH3 zc}=X%2p?I+8GKC@5FNncCYtnULznkJXBSs8_7@kKz$_^P=w4_EkgsdY!&$5z{;_y) zokljsi01upsX5ln0X9;eR1*SNG^3ng^!MincCp{Jv@Rzb){ho46I*w%dZ`&7MzO7! zrm<1vHAkS?UM#;OAzB#q@V0J|?7ZR>x1-HOTDTJng|v#T5i!#{SKQ>YQbB~G?*sf> z0Dq8aGfgpkTu+_qD3P7pd33LQVglbi#=P(4a1QGKN)Esa`?o*VECn5bEJFmU%vHf$ zH2EZU1WvAto-ryXRx0!o8^`W|9$*nY3}!`X?fDb~StoFNetGv51;D^6B5estXNp-J zsE83@U_gB>1B5%z4v60<>NFi+=s6L~a2#O-HsJfSdx)L4KV0knRm%Ep#sUM{$f{-7 zDichfFI+4P>E1JgflO(sC5_hD+lzlo6_oy8k8VsHEns<(a413%rmfC!3?&k35;q<2dg!eVd`_;Xm^jY2x?DN@uz!oO zyqRv(foXdDMUAKOm@^T_(Z_8ra3Jw%Ncz+2fNKM2fr7RGj2@dxJY^-csoLB9s)n0knq{j+lQ=pMhJZ#5UQDx!huyD*(@PNjvtg17xn_x=EM)2UEjO$poX&@uo5FqO z+9i(yuFD>QKeREVA`MCE_@!o=8_sKwU4=IYh^>7jK)(umJ*^&yYW@M{0zTclw(II2 zBzv0;P=_Ig$A7xw{2DegIh+#KO}Q!n0+am)0QZ2>H4cufbObODGxpw<-6>Vd*}G5% zyMH<##RH-|TW#2)8$qh87Z`_tIt&(5Jaz$@FE~334)Q}*_U86L3U#-&SdwLF9yy-D zAt{yE-grJMb1-y7ev&4(vi`y%yv4v`gOOw7BuQYtR6>4$wcl&My*k`?5{g>|1l_*J;DGnOJa*& zjc}Zjl9k>7yxg>-E1(Vhjzg(=on3iSQgJorrr|h-x-|E`qnq-Qp!AA>ijAgEk=x;1 zWbA!lO$TTnl3R)d1{CkF**M@?hulV1W2>HYbPwmdmnu7NfEqkvCsI9|a&Qg{o7NIC zEMhDtXN%KFp)}sy_QJZeAR__5YBdp&`4sDJ&R=uD$DV<8`6Pt(Dcz@FqVk1zP$Q^M zDt@uZ%T;h{Ygw7tTpzW-O4i&C57dfqJkv=AZZ5x1oouN~v;u<0hi7~N&`R!>(tu!e zNs`aJlJLEP=eeyiF9M(1q9O9Su(H4AbPLZe@2W^JCD^5C8p3uNF%{1@pFvRxwuceZ zTN4d@Y1)wRCm1zB11x)ITK3kMn z@KS6|8aBImK+w?-XPY`G{9Gyj+t52}RY3+}=`J(&-%?~YD{t922V$!@8&TDu~N zXP*=+D@{#_prtbn5AtGT?|e6JW%6%Xdq8*(fHFA+U(0i=#-_%Z zo*+_Vn@pf=idGv2NNKeLXmo(m<1Z0^*!Ns0fzc5Sd|o}F?-_RLQi4$;aj$6U!0|+g zlxRnpR4yH9R0IR8Juk?B@BK!uoEaH}BuGx64>%hgFvj+~O@3F0u(OJRmm4e2lu|{$ zjzIPR?vli)$*Hk+wz0g&I#*eFX@CF*3)B%pHG;9=4^oQt7?Vz3KL=#KywZsVAPu;_ z7)4IhnSpu;+6B=OaR=njBA>gK9R3$wOtAu(p~(R8=Xj43y|0tlb8KIiFE$fDc{sLo z3ALnopDC^()s)^VLbp}l*)%gk4;lvCLQ-IDLT9C!$w%3A>IxPfo7Iy-u3POTsTnv? z$&*hW6)RVH6^-x{u)wJ!e#Qc1?27`4glPbQ91g@i#_szt`wv$MyNBY5w~|`n4P6fK zPzyK_aTeVu&LCO`c#LaUuH1m(fzSGIZG^G9GXBh-laC%2V_ERTj`(0JmS-qD6DJVh z92*X5$T*>)grvz4tN4F)=$q|6-LlS-)$l+u6)WdK6sP1| zaViSzwSYa+El30#B{>HRr*ZhuwH|5Jsf&n{w5+`~NNzJ{wsV9&q##c?_-b^l6OSC) zV~`$syAca7y<4=&5FWvi?Ky|Ixx{95#6^G;n?4-~k}FdeDRmr#iolye|Jw_#fEZkC2v)Pxt? z6!eG)1rCUPR4_B0I6v0ia|}LtxZGLKx-O8JxlI8AfcrW%Kl0)B|pi0lkbwjEQQtQr8|=A(hJ1+1{P;0&KF zL4@XHpSX)a7kgpp&ezJl)RWWl?gCIJI9{lNvpS;o>hO;W=AGdGEVu(yrf-WEYFT`15a>&Y>UB)2!5TQ2qdac~6w0tTHo+g#saR{4T_9F4 zehDBvIP%)`A3qB2ttJA}Qu2L_klB4TKv}^Usdt*@bd&8yNYx&&jXjl!Qb3b9HEjB{ z?Ea4cLAD-a(#f&Yx@7`_EyE;(Bw1$@H(bb^LI?sLvY!Ru2=IfLCsI8j;~Sz2W+G!& zU}Wd+w)NwS)m{P$>$^1IRu5k?dB%|VGeH9#i$5zeWCUE~drB_^MgWvZ_r`O|B^Et6 zpGP~=s#6!yvG;PVGvTd^(G1%w3lKEUV67mLH@LfOD&mFZla5o55DTz+9lqt1f)M_0 zb3b`g+lAw1S%(LHWk!vrA^r5inWVKf>!{MII)H1nf+Cm*<_ctPsANr@NwDo!5$Na9 zcAdPCWqonci~s?{ku5Szbl}urDn$(V0uy!8J}fKM!DOVtrz_Hpu;-rdg|e!B{M6vT zz5DGQM^Km5Iw~lP;Ov#0OEDgau#CWo;1!^#GU8XMDD_7h{zR@m2>kBusTf>dFrit_&@NbHh;xecLCL^Uvnhl`=XF+`0JlF@1MwQ(V5V$gTmV8#k-q=Qf;E;sT^B z=Mh*gdszDM5hsM8Nk0sdH>4DnPYZ#ZZAG2V+#@MNg!zW2piZ<1$i&NYuubh4KIk zPhMPamvecli(3g3m7CmP`*NNWd?1IyTNG0H;bX$#nSF-Q0l0Kjd;y=uN|+~@?(bjR zrMjQ>Y=uK+4HJ;n0n`LaY5Fau+8#{?@=clgMS;>~fQl^wOH!oJjQ9WxAF#Mf0M_wE z2n@OKroL*4e!B|-TQrt3#kJ$aX5g6|DQMGU;1do@nj&JcIptj38*k0Bb_q!q(Y;tx zsX-Wp+7p)7`f(Os;>I#k=R+hkH^5YisuIqt_~wyt!xP0uE$SjmrC! z4C2e8Rhh;IcIkR*6Bxva*aj>P)KLSw&G*tT+H*3GHMK5B&Gb5{U_1iYRyGcxv=5&E zqy$TpfuLOIjf&F|;AU*N(28-O55#H!J?6n+a)2Rzs*%G;WTIwK#34UU+nSN&KHc@vZI?e!~imeeU zp;ez7I6lxFTsHTK@DzbkjxzRL+0@=DB7rO$cdGH6FHo|lS_(U!BU@70Xr5V?9()IP zt|0j_Z3;(7j4ia9lZ_+l@rIrJ-0q`a_M1_-s#2bfO>sRX@60fstvx2rthOM41Bm1- z)kNt&Y#pk#^#p=d@40FIvb1YwL3wMp7Vu$hW*W2c&YMI2LdL$TY0hz`GL9g%{(+X` zR!z+Z5t%Un&o`tSJ=MI^@A}NTCaqM3AF+x~i&o{-%5IHkZz((o%i8%2f^eltL`UMpy6z&G66ZD-tblPMOadU; z2G=&VQ&c=5^>_;|;&}bgL8JgRMz_`?=7XCYYw$tmZcS`m4s%d9bMJ`LoUZ|A2DHd9 zsJUj@Hx)Vp6vg6lov}y*iJoBmtV;#~#F8It*}HDY{YGOp6|S!HgUne>s?s{CTAbCl ztn4SNxhc>>2HA+foQRtZJ|%-9Iq>(Qysp02JT~gFyG##f?_^Hz(7{+2_BCG2G|S-* zj>WEZ80y3s_&^)r6(?i+429nOSdS!ASmg@C3FFk23K?edKQOYp!d*9RjF8 z9tdj?rk$O@W(byz?^q*Kb1(ARAi8a!brr>d%!raahenSwZs@$DDz`3C4t4x=SoI)- z68Z|-c$`1kcHHTKFF$P}1Y?;enwsnvo;Q`Q&0G1wYD$Og^PhMnEzy?%Y& zXAvf1;sXEzGQh4woa-4Y0-i6ybYAfx{Rh}5YDX=FV}nd;eAcphf^o!No50&0-KoGP z%NNUpXxpLy1#}Ba(g)yu7KFe&k=2^VUI!mS1?C1LwK$xHstJND(`P->NPTm)Zy5`! z;__asQP{`H1s+3lswG>QfNxH~2J5a6z6=vG1PX%t1fP z`(1koB4tL_{@OF0NZgQWUCeni-r-!9y{=B)7j5ak@NB}ql^$sa!1<7k&PgBcS+iSoh_d| zEf9)K&4>{d`3x?Bj36=Ch%8H~!MPRWxBa)>70Y4y22l8b zi8bM~C7i&rb0AZyI5f8ZA)9e&hUr5+@E-3NsN7{V)t2hL2>t^bzj-BR-^$Im08`hy z@s28O%N`OW1K#k;Oh|b;1F)|ri~~T?9JNKYZ5tZE(HEYY(8`iKnVIhx$J^Mi{ygMX z_8acpdSjK$+ECnschXdVC1?>vU{(O)ghbnIvB+iyEZuVK51b~9k^ojuS;TvnaOa8@ zc?q6KiT)74&iLp%D+P&?%~(LgDm5%8GOO!AT9YMiN*Ugix(ALv(ZUYX|OF=X~6j0UtonsSVqND-b>eYkh)=oV~oyCCyqPi-JhT)QQl? zmn0vh0|hvu1=~eAU2*F6aS zTt-(LI5!Xg_BOUqIQ<-+(+1*lZDZ>K<&ZaqbK8L@j<@p7+gtt1KB-(fvgFL(J-`F3 zRYPboSkMX_;5wkpj4~=4a6*EK7A&o@B%uH$#vy!sKi;})Ip1BoxbE)bgip@|$8rPZ zjai+cSS!G#Gdsk`#z2$pWYIA-efb(*uo1}?q~ha^JG8rE3~L{kHQFRPO=lgFA^>Tc z9Dc^aQ;sg0Y(`~~=|E`IRFKs2HUlPx!V*f8PO|T=2m_X|B$E{^)`1+_38Ge8u%4Ze z>@J5d*yx%%>^~M5xi4>{SXi9RnxhW4>L=KDKF+TGe0hh&nKw&SL4+0%H#WVb5!qu7 zAgB}^_N1n8qC&a-Uy_jcr1;ZGYwS~ELj)g?} zK<-u66!H!lxT{MZ7SscasE99A?`X~kzBLV2I#_m4`xB1h&DG)d9yK9EyyXQJF&>yt zVL8+$V8#ofRyjM+B6)NldZh%r=YhaBv%JmN!WpK~&TyiQcdcTm%YrPHU3rca^AorV zur&kLbJ`+uc$c0V{MXxtU*8!soZd!LJHRz ztZbMW$cn?sfnFlD%mB>5oDeIG#Cxgc$JQTd`?vNnFNM{R=|im4Q=il(vztIo19wsK zVm?==Qc6rxo%n&@X0#_Z#5cJSOJ|EAo6Vd7EEof{-I_ee_CfX|RZ=PLn>a7gbicJGon+lC&}bZ{1rcpf~EHJlJGMhO!i-SNkgT`Btj*4pLjjg(gsb~9igaD_|8%(n8ime+UTqL0Jvic$6g!2onsCBU)};c94_xL5TEYW zqgR1Md$E1iFgXXo&q_hbgw^cTcvq7PlxO52^&@WYDI@COK*i%%@POrW`>D?@+i<&@ zF-upfMFqpj*NMGY4Srz;HRA=St2$1Oo@{90TR;J`$1+l^Ur#dbe0OWj@_ye<_$mci z0RjIvjhcqh$C@{Y4TKtzyjs**!f;w+CgoE#mUZ;?N4=GEbi8~dzj{USWx z4Hl2=rE*&XQ1PmUbH9aDs(ZM^fY0PG3*e(}7a}@~lz`J}PBzi+n+RIF?6^fJX_*D; z4k0cm(g;gh&Boq|Us$+YCy)ZRA)1Ci$ywB(F{Z>gjyLg#YaMrUPo&YM6kr4Zvz4vC ztcyssTT9`dhJ*)J3YSI%_uDN4ww@1i!2B*|>Q%+o^fU|a7cd5fT{?@?4V`$$y0PrA zo|f9B+x0b)Am~*PYQe{vb((3xloj{_gteFQ#f;N?b>Z&V=p}>ad%6oqtrPeJnN2D? zL1qiy0o}MwXO&Y}O;##cc5wZ|$-O>ud1}MGVg$A7~9#3IHIC#%Lz{z-5l35ySf~l{=O(EvKq@8%v%7e@%QX1a1vx zq(o_p3=Sr6W!B?XgY*&+yBnMT-6$TYyN`CFdAmUoq-c33tcXM*OM*W;kR?(T>}5zG zSB^qR1z37(OH13Edz!3scY~-wL{D5jzyJ1>me>9X0kHGdrH|R;F!sB48S{?O7^Un8+Dc1S}!y}_u&qk6l?6ieFkuapE446Myn?hEc zT2cfgtXvbzncS>(EN<87*m7Uk)rH+vWBA+1 zDwXpEqmd9nNh4CxiPqh*dU<)L?f^GIiUho^Dkb2er7|j@6o)-!#6StaF-oTI00}wi znL;dLff{9g7GgN^`V-lhZ*`N6*%>>H!?Wx)pc4O9^&CoPrkj)y1++@JZ&L^PuqdpT z2E4J8b=(~C9t}ZY)6cy1&G}7#)z4qOldrmY$y>^`F3fVYLE(foUn~a%vHXR@jD(L1 zoA@Tq6LMK<-T2DU3?e4CX1nu3`1Sd8vdxxvvvzJk&$NGc*3Zu_u3qn~5TM7hjiA@w zT4MJn)qNxJn}norN(VLxaygsL6kP~dB>?48EZbOZoB?q4exqJ1i*+yb-Iean?g5r9 z3rs5YlS4s7wbaRC@7$)O>Zrdj4UEkSf{0Q8ToZD^a0qGOwxGqf+-2L<^$&;h*Wcd0 zKUOz8ma&^`IrYPDa*%}sA!l>RBtIu&M4^6CZM@wZk&~TALB?;`y_P&csOc=#u6J0r ztrel1?5>tsia%g?NK9L8l|{>NcVodB9P*~Eeh!vecf-z8F^xBTE^*X{_mMrQ^RAtI zw?=2L-^yX^t<;|Qz^3KVC2$OQ)4WkD?rWqHk~5KV4{(WCt?3*9xlJer|KVU9Y~>wR zZSmn&4viIGH|uH5e%X*W8^UKvI8pRO&XNs==e{wVdPIv5zz3--U*Mez+~k0S8nyRq z{z88CQf|LLzj+r%Um%RWeD@1Ga=q($c|kx@s}SEJ8dY9)xu~s@?{Ue5t?)uwiNx{2 zNkd=)Wxp0D%Kq4(>mT0J<(IctZ!Xs0VQED%$R=Eq-VvX1fDw2S@*lNga6)i!E6Zqt zp|VZOed8~#{(N?!-|NL4N<1q#2F97Uwi~wNgr0iM%^+-a&;$w1GchL) z2Ju)^o&j=&S!3q2LH}INdTr6^U9>(gQ+Y^+3MIa?q92HiJ?x|M9iNl4W?%!%bg}at z+#|&|=`MGQ^iqu3?%VpI8)s+jn4p(4-eQwUMcvBjNe)@tvV&I=7~nQE4S}x5&Yor7 zz;hbB0^EjxQ`)P!-=34t9dC+OF*sBYY!izC-hhRH!`%TA1t>UJVt>SzR(MBDrNr!F zpr{(6UXlLA)81z3kJ?D~M9C22mybQOTWW~9T-ksVK|OKkvmp5NN>xFb6sl?+o(#}$ zoy(wF9n>^6X*1tv&dL3Xc|FxTw(a2LUXd{^9Dr{Vb0Cxem~@to%novD9T0hEb50+g zbxcYHQXI@3JAc%rvDc&Mm-p33QQ(oHYCr*ieZW40A~9K{hKS{vGb@r;&K}qZep&~T zKOodZ&TiC`y|R4pZayXo*1|4l?be;hi_2(%L`-kIqvPwCQl);T!rv$s6f}h( zrs&?8dtV~I7v=og7VD^xZIktU^`9ew3h=%#Sho3Dm{~kH`!-dmaad{%ffL(iFMS>5 zKC$I=FI`?0CQ3w77DPjBY=Lcv&7&jiGQ|!oB0G#l>d1g@%_$&D0@iata7~t(?eoI@ zy;V!gn{&=b4%jVUfXM;~f$>zI#{Sq2517sL)W9r>iEs*GP)q|@pbRQn4u6C}50D91 z_J0+}_iZ>~q(DJzp|dm7u%LF9h@?9?SsrN888|2zVMmPPz$xIHs(TUTZVB}0mw-0{ z!LgeLfYPxOX&O_hROz}iwK+;^6&$iK5^EJKj(RDBbRGC58gK5l<#e6Jbz8fKc{unW zd}-tCh{HW6&Z7lXQceq#lnl%cUJa+PBfj|xuSr{d_uh*As9Jw7ErjLG(8vJ)z;#%% z3M4cKpquNQM+A%uEH|j@J2!=K!+{2I>vI;0pf@+OImV)sW7}Hf9sw4xNx(cE8#N7Z zr61kRpq3B7hL1K0o?<7`T;q5c#3eTC#>BZM^-ELV)xz%yQQ)L46|%5aY*;B&7-W^K zQmZ=zAl;l7FkG2?d%QUd}puhe4v(!Nzy^nOr_%NKn=Bb8#C9YYc6rBYbkOAJF; z%?94A9-srboXxDjn6(YVuCwTK%*WYu>I&l9m-7HDU;uA(-RR!3{2mM$*w+KpTFJn@ zoP0>FhenxrL}=b7!EtpIgN*j2u|KLK>bupRby?$7+axishBF#RmOg--m;jO(jb-lvSscSQ|)I zEa|L)BCObTq|$nyIVVe$C%cYm97Hg;PLO6C$8>OnT?7uV;;gHj4_u>kEMT`T!5;vi zsJn~orOCH_J3lXL+DoVFAtzR}8xvGGlnNjX9KZR-3yRs=tb?jx)Ct|RV+I>-Ih3>J zgs50x>G5`*tQfPVsYWwGKOalMSPZ!-PF8QAH&}B7A1m+G7M5fq46`K^{7_(5+eISbgC21_6fYT40#HMLx;HGLrY!SQP zPPgx5q4#yih}{T}g`))rGK(mbfI(eptk|wYN2KKn=*Q=-#xT&+Ce_9Um{IO9{FCyl zT`{P<>~diH>a@I&t{rA`>_F!G8t5VjV#%E(TOvte(+>7;ZFTIUq7?nqcAQZs=M%eD zdGm-fUMWtzHD&st?4?tzD4clW1G>O?*2dt7a&m0utTo^q&&si!@33|&zuHyR4$Gt1 zYeuqaxr=4-aRl4IsVl%tbpji7D*Iy-W0DdJ-vkRn0K%zlytb&}K66fvjdgty&?5Yx zAZ+&x${$%NhE483S7!1`XPDv!x$cDH_X+xjowt1Ha-G$A`*yyUo!hD+ZthsV<3CCW^Hp|wr~kjQ|ad+$M&iN(&!OrRS( z{J8JEmiyjoRf|}Sp?qVM?$zg3a@C2nNp^l|Scg%wUH2guWMwMIW#1YQVF2m@x24y( z#gc_awK-r1pAsjnLFXDUZ5xz##K}5wexDlG+HT|8a_>>X&BX{HXr+y*HUcge;mz1U zDNzAT;H*tgw0%m0U5T6JY@^qVoQvkT;oP#CDrWRVt(f6Dp z7*v^6wj`s%P*X?fT~(xC6w~3eo7~bGs7;6T1+H5G!wTzeW8^#C>O~B?}n<&2f`_j2$eE4RrW$NPV3&n1W+$0GoM)5T?`_v7C|y z#W04gwVn&-xVvFlzV%F22?f3qa1TdeSSx%;&!ysoG*C2)qRxwZD3!2Ci))wEx7P1dct*P>K#>)OB)7-Z{D}m|{?1GLA6FFwOxxOg8t*7_(5F7_{!Pn2y^*%CgK> zvWoYVCP2_n!JLOSf(5{hT#mcjotgs3De+kN^Ijr$0@M#Ws~X73UYFCg*&x- zirH?0-8S)!AEma@!J&0(|5xmORND%oUO`)Yos+NIyqaMr%w;hhKf3Fui(s_`3i#uT zilv2n7%ueE$d~Le>LQk&FKDQ|3AH&R2aT<_fy&utKiW^7n|o(Bid*Lr!!s*%Jr7iB zwnB`B6F}{uPV**|*p^bRRXCU@D7g&B(G=$ta{3g|VS|*kHsagbbU=3lU7C^l8jyl7 zYP&jq(;PAo72g&WVW)w5Y*A2fbX@_x4B>2~zjl@Gtzj}t;Sj*_k_C(6t?_IKKqMR# ztXM!wN|n~z==iYF27Yr_E!b{U#nBlp9tiC4HUvgr-6H^VI%8@{^g}`{xpaKgW`OfR z;AzH2H#2gp&I=m{ASMQ-+T@MLpNROm@pbPEyJctOaIH20Mkf(66k(B0z!a3;^}I2l zNJFEhFK_E3+YrHpwh?yvY@Uzj@C6Ju{!(TZ8H6&AsQrmoj{+>v8mgNosG#Nq4(jaq z>~{36frOqd!vbDmFUGThUhns;*!BEQ38ZC%LxMOC(-t=I@Kyz%O8GF`92k2Z-C1zT zN||%fnUva?u3iw(@n@msp0hZ#9D>0K&V%=r6+0|Ygtdd;B3%Q|R!>{0XlW)^M>jag z1!xOf@>HJw)GoYtSGAs+#sR2GGv=ypDiYcp-W8>O83OW%6)a9O=NF<-6RSs$njC86 z)u0>a<2imewR}!vvT*ory#WVP{Er|RfN!&jHYg68u>uM)4n$E!qJDBKofah5rL%j^ z@9#M&OYN(fi?-%xp)#!ls6)D#jruB+Pmd5=cG0iJ{$=|t<<PrW_8`&1bCaL1M zrU0T5bM*tf8=H={r|Plo@Y`pmfZQYv53ybl(DB!fWu9{=PQ8W_g`J*#YHlX+>YI&k z9{bJEjF$oeo9UmRm;wB87@da4`NicA{;0<{uisujUcbG)yB}+{-{m7bN31|Lu z;qm@sd)zZlShmFjbZc+UFn#l?Ts<8-kO>gNq|7Js639GNV<^L7lrRy$o4fwyv)vX4 zg`qd~TXuNA{-=k#+Z~IvB?SfhL^VMkGPFPdzUFgg0d$T9ISEMCB}esJiaIn)DJA?z zz*~F>FSSj!aQa=l`qXgv{V)HBfAzgy-@g8N-7pNcv8pnGzM)$1wXkE^-!kb9>+!j$ zm`{G5DWsH9>VRYcfLbe2Q<`i>c-fMZ*HzDU5ynPXy=mm zbJ%bG`0R83@aAu+zxZKqTqG@Tx+Y~1fE<0{gh8fm68KB(oifru)CtF+m9gMvgA0wR$GCFW}!VRMNKm8 z7(AA$V>5!;SxydD{7@NHUnpf|DAfoE>`uh=p1J1jPGwlP?v#>AJ2e4)8S20|1L`T+ zky(*{^f;;JFru>0Pn25@1WE^)mXY((y#9FI*TamQSGYFo1x7y-abofFJ0myWOF2TqBl z+9P}WdZji9z|W*#X`3}_JC!Wn|8m8D-uqh18>?&(K^{saTQ;lCP14FcWG(<5-YnP3 zZzhp_=_!wGN=T- z%XD(v+N}9dY3D@|eRjKF_dPB(W>U+RtqWM69xc)x3Z^t0OpWxx?E<{U<}|;TCP+RzpY^npqNBP9c zp2|r4hpWn}x3ke@`4~FDM)5Hckg8It9`w|JDQM^A4*qa3ApCv8A1>J!haU@zro8JB zGC#X;3Lmq`7tA5IrUsj zUkN3wSIjMMCX7X;l|;cq?E__HVnKMRloLH{e8$dhfV;xEz(T3+!53N1(BQYsxCrk4 z@jjAcwwk2fWmgzMB~GUbqmH{ zPLl-k1mkAoo*kY~c-s1l0eU!beON{DczC*2QVa#qv)LrM(@C(s} zspV3GhrQ+U$&PtvlXTtkM>|jiL^Fg;2=jH3zA?4|{UqioU859wH$ifiiJ6!PIDE8#T3@EdHH@N|dH)nF&P~R$EDoNtWYb{pQBTeQEOd znqcDOR;JR~m?>|axJtWCgs)f7?b+E`WQWUVecUSOFZDo+Cs_nR%pzIXQuYb;`WUwe zCn;tQmkb~*g!P@Be~Sehzsit z)O0k3p3e`aZ~ZjHe`#>uLD=bE6!IzwvKLc=a=# z>&4M?!%NX-rmk8v%tuQkGgDhpM>Kp>kyYn3e9Uo2uV0=#VH-q_zzY^K?4hF38&8~k)p2%rismdmq>vGo!P$7&~$xAqo1Yi0{OUIl!>3<5*_ z&W@Ovl5GFvVikMw76(UySe#+OYDQ0p2lfgV5OFU>=hH245P zoNpIHGT@0#V_C5k0Sow!s_SetY!1{fqXU348eKB+E4TnouA?uM?^iko74^hu&ccoA z{C+lSBuwJF17l7p$G1P6Mcdl47M#3(Bc_B->Bc313*?NkWt$i4g=fvFN|tQ8L(Nva z?ePd_<;Cg8G@~6uSQlACy;ttZ$&+nIv$J=$kVrxtwgu)07e5l(48)&KH`|EAwKI_Q z$0y$nOxMBnzwO%Nk&7755eJAE3x!`E1-|@jkBL>NdLBWj>__WIf)74g94yqXKO|il z`ZdfafGi$YHmpd7f^ZX#jZ24UaeMsv=JN8bHPGMC1d*jf1agL~Ef*J*Ydmm?YJIH@ zqsGw(0}tjw-jGQEN?byrs*C-Y7}T>&kic+hyDN zzpe9sd*oey8X}z?t>o<({;y+C6FJSxV&_ZqD=wX=&Mrf zd?W3a?+V8+RA8@)zPOgTNSB7xqwdd&NZUr1PtNHI4vC(wt>n#x9>QAN?A zhF>{|hx4z_JodPHGu>(X*1OO1sRcm+3m@+;%~rQ(R!_5|n+}ZSaJ{FLV7bUM_t!Y< zn@As0I9IkIp@0`Pt|#@n+R91OxncIjA`?`&pqL1B)@yjF2c@>axl+$Yd@WansYO{S z1v=gE{KIH*xLhugCY_4`Fd|yn0e7jfP(O-H3E)@_<#fy?$4VDHPJ3R!Y`3Z06Xd0O z(La4Ozs_DiO*W(V7d-Q8#yf7%#qIBlE(!y-H)m?LHdH>s&1@~G{e3V;SryIHr|gSH z2%aDxLn?+a4S?80+2!RSJy~qX-(g0N;zTl@+}M<`>ANa^o4_*?x$5`omAT^R<~CD^ zoORE_kBVppLi-N+m~_C)7tY94OzV|1sdlFozZ%JyJmIv=Oxpwa{@hZkrp8^u{40z&k-52|iec~L-kFV4wQ6-Cme|G?zjvdBS-Im>&=8rzck&h`c<*KJveCEpgP7M##16(JG3nLAbnrDcsriM46Ro zua9(WjcKawkD%#MROsfce}S7hLQ(>rg@OMin+eqF$;se5%TPnDwUu|ggXzpZ)R9vV z;lB&|$b;7-qBH7(O<|D(Jj#tC{>$a>keBDJgv%R7TK20XU2fRguSY`U7QtV;QQ(hP z(eW5*@Pbu#7H{8p9-WjbP${Y2+`87OaCS6ta&TLTrPiWF@j`dfY2=db#gEkl^t2-I z%jk~mnj;gaIVrs&&3V0~uxS^Dv+EE}pX_jEC5@7cXIr=xCHGKS9W4_<$eIKQTG?)J zgNqU^=sN)kYV&-E|_TZ4NljoikJlzwh@4%xxr{Wh~!Vh`R6^#Gu zKEHnsdWbx4F?{xYPEk2gjFz%YL;`*2QG$a&4^yCx_-HG~&gz8U78X`bC(i zQqRGdf-dC4nYk-RreM-B$r2LzZ30HLCQsxQPm`0saGc#-wHwk)To;GmNbO4JM8k$h zGX8ey4b*q?ti>^nd`ENn36Johl;D8EhIY1VQQDJ_ICHTfOyAV4B-*K_)C>)`)q^4^ zHgrn+TiiYRYvez*74(vM2%owGZw=^$D=xVNrQYxdC>Mwb`t%;eF^CVh1Pc5(OobxK2J-l24 zzo&{GhM`4$vz4q0e(Q7WPBL?fJO0NzR%Xf%{=n%H2(sxp0nC5ijELuicIgA;NA&M^ zZ)O-ov#3R_a=R@_eLRV?e6H zeH{zAE0Oh1^EGc{%7Ab<^OmCmJ_&bKwHvgIV6C+FMk<>uNfrcaHzrDNHI-`1Tevlg zw`WcUKzAO6J$RC9XND(Bv@{1D5T`9&(Su1&2yYEa9$@-S^9k$D44wBB#zW!+6BvH0g4sdm-IAN zlExbL_~NDWwDqLrz3WBn38J56YO{E@bgP$3u0G&=g7#}f>M|BT35K5sHF-_7rdQaN zcaQ2{{($>YknZE-ZpPCpyWZL^Hj=)Sx(5=a^>dbeImEqij;Skf(`R736Ja3msP)cM z0ogF=Ljp|&jLEW2WMqQsJs3oPaX_49-hr91GdG+E&5*S+?gWse9R>MZzYyYdk89-3 zA?ykrYdp)DjEuyeT{rq6>qePrV#|t&=d7Om>>o;Qx%D{6wa&|oFi%tmQ`Wa1B~Sju zzJIbcf3RhLBhVzbT;CPD&W^f;Ag1lh0+j733W*zG;r@W_=9){01h zBCV|NmYvz#8lsTxQ|oS(4Vx|9BaO zoX%m0tfiB%0U;Btp+eZq9Cb|xNg1vX4`fc&w=`_JBM-*e+$oxH(~VBykJ=4Cs;El2 z(DIoTwmU!OnoU8tO5FWZoymrggTs8AGLaeIUdKpb0Y=>noB(^sYHKpiNx5#M#4+75 zHS~IvGy|il;)+?p_n6GGgfzPT@O3lzxP9dw$7tEc&9Y$n*6ji%B#x;{&evKwUa(uECCFm%RB4;g|#6MuMfnr?AQtaG7N34z#-69Jvp zW(th??L-vKrI{p&*}C*UP9`~OjZd8EPPQ>)R0K7K%oFuilvrDB)N^AZjjy-^P8Oah zrYhar8(4U`)-v)_HvA5&2OT@ogXE{`$(8!?jeDY#(^>ht;U)B5&58Uzi}UfOQD2P> zl2x5zhS1gr)8q;977}Vw`I_)Z?D@FU|3{9Lw|XXf-6MT{yo-8X$;^|-yi42nC_C%e zz1~6vi)KnN&_)X>1b%C_xSA%PAYa)lll6!BzBBvdXC~J1+6mChSfp1Q0s~78DbN_e zRiRM)fr#yS*q~$r!C^fr^lZF8_Uc1&Uv@y`3mFwR%yPorRp+_8|HAq0siQVbk#Ty$ zw7L~q`q$)<3>lm>hr~`jphiucbRjeVI;{rb*WJq1rneHa@mWH1;qSDOS~XIbq&Zce zf+N8!a*{dvo?c|G1R*4zK*{2c2|YG_1oEV>?Y%KDB%1amgVC8c*WUiX3+s-<`UcxN z%>J=ND0hq>ACDeC;XvLDFO@Q_#3h~~mKs+2xf+*HdX%?wwYA2IzHqvAWVZT`_spp4 zsmZysYbR`V?$!Ij`}(I-XmW~WJsgBdu-Mgd;N$OZP8B3G(T_lw{S|JlSwo2Er!0!u z;`CY#vFA5=5tyu~$$oT}j++CZ&afi}XBvdG7ZrBN4u-m972&v)aFK{!m5DY!+CDQA zp$lm1P2Y4meo2*!PSWSgtK&IFWP+NYW-8KWV{t-Cn~??S)6Tog$nPwsRos-8=tQK< zYGupxAz&@}^Y4m$d)7v`ZIDa+@Vi0ZBw$KMqRi75#{lG@K2*JKSsrSfzC@>a#yGGH zxr>^-olZI!R@ua-&0AYrH5AFLy>oZ*A*l4q?POO$OIX>HfawQ?FGny4%7&_jN|xrt zssvNnOC5w7J?t7H2d(97ulg7h&uFrd!ZubXed6-JxJd?cEuL)0(D)X#r1-wzlY4(Q z9c|!N%B5T}Ih6VNSFncWQ(f3JAi&u}7dUhw?lB`tK2dt(&DhxAjGDljC`q?Xi-ziL zZR)mTLjTrvB8bAOTz4m%9Gy~3_%HFXSDn*VJe#r|+YT86d6OIzJk~An|S&QfE?j9v%>d;c#*-!{g{ZkPcaU{SQJ~9C_8m@IcHmU z;vd+n420CoI7z2riK|70nGIyWa@DKa8>C-FAb&VrOcK>Vy`$xsJmKBXOT7Bq;4$!N zEIv5Y)&!LE$`ShTc9ASC;OLdlV;Bxpzkdpjh5_}wVZGQE-{qD zjLKtl)-xATFH&0g*nE5aoKb=98~>w)*iv6U8Lp!H8M;=espPQu-Yy}X|FD^`G>8EW za>$n4E*1KEgFq1Bzfjwll6N*vx3@o3LF<#Xab zT7EP6)ca5_w=s6SZDM@o(FbNB97%-QpGQ$U+oJE5j1G@iM%Z7nXy)S)d(avR$#*5L z^V11O2J6wS6U~vq)ITqKI{S;92#Zl)Nn|8puxGAAa)a7CgI-E`N|KYS8_ixn=V9Zx ztCtFC??_CNY?Mma!bi%&aJA8=H{pC^{(Zsgz%>i%oUYL+?rr}Eu z1#8^ikg^OLN%wEkT)byEgDUR3Adwy1WQENUK;dTIH*>Yusg^)I4I4?F63!n(_eN$I zoQb^+ackj?*4yp0c-6rm{0mP85l_$-e$kU_uE|a@QjVCjI^zb$NpVgP|8hGX(FE^D z|30r^F=4ITcvEo+JXcNMXy|=Pa6s~A0W9YqSJVfUe(#gGviC5@41X%r$s*(5 zz<@g=LyHIfYPv-{(7~v&na$eyv4O#|IkVJcwIrj1;F0L!uT-wj^t{qihi znx(C>g=8i(O=rM?iEpTJUC>QCQzf1vKIb$^PkzbBVxrNLaHTAhae|Ct)y{@}`kDNF zkW>~U4?=xI+zs1}3bry8jqSy}-4z`Paen0qSGWb3Cl6x^#W3xWKqQTU?_^8|swi=$ zKvvl`f17iOq^)d`Jo~B>+WqQ$+!&#z0|==}jZ;DJ7wMf;Zwva#A>dTPC05)NqrZNo z4>-v`3$7Z{@mNX}4Mb9-EbL3l2 zI^2s^Wl%5X0dijaJ* zoET-qJdgCV_KNAW?xyk{sWIQ2U(fIGJ*uFLv$`-nvFa7BnO(l3Q|k!~hkt9CInTE* zTV@~P7m0I0`mn^mN6R;ZAY2^>X^TIqwonGtQz)D`OX(f0;|aeuGSZM^s`iU){x}Ah z?>P}K(Uu>8o$)6Q4__i4pwCCCMF=Qpp2T$9BSRrcbNq_Qio`|ADQ=8amuv0T`l4=* zG!z{OwkrdGN>detH!HuPYTXCldNtlfO}{~3Wdup&ZFXK9A-XS^{&nsm=eaizv70>4 z$s9&rMD-ym6|^@U-Oy*6U>fGCSb=6*^}?7_!V{+_GCwg6*$iBG;*ytlDCQ993-#xi zT=Yd^W>uJH_hFR)L_cs&`>L)>F#*aEcT*p5l|Fz?F(#>_A?Z|T{#WmWLIb_~4Apwe zM^mPUxM`jHW|K(w)jFywA+!#HV6M$4#f&4#EnI(vU{5Je$@RJ$vxb?ugVOq%PX@~q z@t=bqeq{1VmKc3qgQi~h=d6;-v?fxLwNGj?@TIQmiyak9P)AzRadU_d)h${Enme3u zaUSNUq6x&htT1(ijm`VX*}^L)&a84()VhZ2{7IbchZ%}^p(h+pg}z^%{zt@s`_oMC zC)xJVbwF*Pm<~{7y4L!X0~#WpbEtJ;wT;cel_rEfVs{x%IAl`at0}Uxl_L;ya;qwG zKo>0NLMc4eTY4ArBbpS^8H%o)vCCU(t%ZywV1@Yn!JRzq$oqAU_Gd>~3DxTr{aHWI zI7m&Cj~Tm!vRQg&6U`j{p}^rsO=a+kEbZDATBn=Op;|SKzU37bYy9zrI*bx)4LbI) zcttz-w=PNapq0RXK+GgPsjpF4^UQ37qa$4yu$IdGg~)sLS5!_8%Kd45@y0owHPHY9TIdRY$o7yfg!=1*}v4Lv&@y|wX z`6Y|FFW7W>U#1$weEyzBSQ`5(K;LZ`d}JatuTR)4#<2J8zFxFC)G} zNH0ftk!3f+$2Swqgd@kGv)}=aWySnGU`A>@)NU+OF6+Zqt3==a%OL}epNIh9C`?3< z0lCx<n}p9}+m zW_NuT^ZCjS5H>45>-yN+N5&vrBNO`pD*%n-X`=HYYvqJ9co;nj#{0&ztf z_2sFI9R>jr>vz8=pzSLkCxfE2O(Tp=haCy2N&6&kFc*% zgD>r|2#9V-vCBeo%8EK{#syP+NbAv;`dGtzCjZR#H}^Yyati>~VrL+tVHY0s@#WCD z%lm&a%+h}{j4!4{{8;i~ho)^)^^ij@-cL^)RXD2bhz~fy1shI$$N35Tj4;$i<1b04m{7Sh0_NN1f%Y{iIa??f%q+^Pt`tUp%zPI36h>KsQmDwGa9W=8T%-P zPl4QzC-(1~0?~wT<9ERHQh|aH^t*2jiK5L)ysUyY-va(Kn@pcTCgV=)IPq$D6{&`R ztI3jk%8xBcT~r7>iEjpW?Pug0dGZM~XXEUS4^T;4AGK8z;rug)nf7FXR7fzk^T{-4 z-4q(M+m%So@*x`wVC2bTnsF zw@A;q+CSOO`=rCvPhywk=zpCtxVZlF{@w1xww=A3FpOVP9~f=iWOBDCYfKg?YjD%Z z_sP9yh&5R^C4_Y~lv0H;%1Xv0{=G!CcKuXn=lTW8vWV3mkQw?%J$3noE9QNS-zMsp zunQiM-n$8t`EJ6<{b#}uQ@+?Sv;1H%<&ZBQ)cZ!Hx~C-&U>YDdqH6PJ;ytHXh-sk4 z1Y<==3uPfnIgMo{pYciok4~dSfvM_fbbvE)8B&+~+9&TOOd`|%H@!Z9A2_KJ)-+Ge z4Fah7Tl1HmHR}AKH)3~}B(kUXAosXI&1)X~e8;hF?dJm_SfKUh+kChTd0Q*@l$r(Rsj3O_sEnghfC$Nk ziJci${kOT~am`UTgOYEPcA7gR?N)!AEWT&A?P$^c0nZpn(7lNx_v3Po}trA zEqJ)O`jzH%-QPNdALG!L)xwhSKrt?5(;QOLyTjsd5s2ul)h!Alx7(I>X8Eo^j!8_E zf0QrMTdwCPjC!$RX4o_n`oeA!b!^gZHt3>ViypkaY_rV0R_@c0FxaIASEA*9Qk9=^ z;+q4rBMtL>I>HCZr+7Sp|3|{OKSm&SnYk?JZ*ujyJao60u~NluoP~Dd#T6;KKo;we zygwm<9Ma*0w`z;z5@N@{1-O7W(yh+1Voq}V>gZ=FaEk7}>^61&{;gm*B7{sp5uA== zzY^s@W|!)qX#6k3DeA&oU$-myA_QA&VQ4rK>jWwGySRZYC!LEi=Nqd{u3i|^lz!7g zhl?&0E*SjaT&!8!Vtp>`TO~e{;pfT1MRbfx*sdZ+(P^(g2l3xbtS$kEh-D`%W4h!* zi54CB6}ku}&B*LV)d__gIm%2|VHdSI-bEM>a$w=?j6(O$xqi`hBVhFg6wGC-uwiOOzQenq;V2pu$1+R!qmPQo}a!MO}Roxm}IODI-D+?5U1NmrA{D@zO?CqPGf%;T{p=YZg(&E*K`(*I(U(RDM+|(PR2Qg{8Z}D(M4}C}w5nN7GtGJW z?wR#{yxs=u7X}3mTUzmXav+1=0XYXuu59U_CHX~?67tdnGVb*{i7z~@P?lo+0rypA zJ|=}$2*sCg)#HwCzlt5PJ!Ja-zy>okOP77o_AlRj5cT4%FH(G(} z>Y<(C>>RQt{CL-3XtTqq$}&jtSEj?9HYY&TCfmi%UwU;VnCbNoIatt7F5KGiyE1tS zoVD@{mo@B4TFFoCl`z9AZ(9a&NT|?VX$#b?{Yj{=8TIkss#Bj zW)MDCwqL_H41e5eL(|AASiorh9|mJ}T)Y<+rHs^ljk{}2f_na7l%scFxXa-TU6kVC zAf?)`94DGwQqQDdvfJTAoSus+FVGR;6H2LiIQj}}L8%vE5ldTb`FL=Nu-+vY^|bFzp^_?Wfp;`v0P_*nxDyDGYtR&d zhXo%AO$4*7CjNQyOc4^Jy;^T9Fv+=tfqQNdtgQH4cHT*$7^uuVJd>;NbDLzUJR(1e80>9XZ6>CqVZc$#qZNj0`LS6!W2uo_ zcb5NQdBV$6Mnlcd$NSlqX-qA?HM)3LF(4?BM;lpw|It#kxVv5dI(U_-3XdzjzLS?Y zt6(e3e#($!ajtCUcwr#`4qA2E>GcnHb{_P8{aR5jDU zW8q@Zd#~qjb$PZB=QD7dIs)AhwpGT(KP$8oeoa<{RrF;2g3y8M2E6p?f<+jj(0}+y zJH1o9#2rf6=Mtf}!Hwhg<475)8ITCyq0(2`UAhmsw{msdD9reDaH|m|5*Dy48qJ%b zg5=TXimt_fCa(fN;oHi1kI5N}`fRa@)RN~ACg@?kVn9}K%^7un|5jS!qne?MPG^a^ zXgte2k!{<`7)mSy#`njXvr!k2^b6yjO=6z;oUd$253C_bzvYol}9@*432~lRgZhy)1K0xJ^m&dCa(>e=lfb>uf{c zA?rU&EJR&gx>}l zlp;`uxA8G(C1KqpD7wHKQaP5ek!j~bJ}(VLP$0`4olyUS6Xn6n;+)%vAINb0`s<*% zYsIJzC)o**hMua6Eo`v;4h5o7%i~6lUW#aPvMBLXp$jD8~NYeHGx?Gj0R8yZzz4DR%8-N>T}wDG zNq4RYR@PLE$UTBK9mgp{RJ$ut2ZX$7l|Z_oc%<$YAPOj52c`E-lsVi!<>};trV}kN9lNb~ zB)iL-fG$P(kuMM7mch#T4Ao(9W#cnIXv@G#guR}wZ*Y6Gt znWa*6gI_R$Zbi(jd2KF;x0_oujeZ#g!C71~>fM2;G zXKSXRyKc?&VzBaeLRC@Miz3=%9mgMPfhBiEC6mqw8~>=!obs2uJ!=aZd=VY-V`L6k zS^ULR#) zrj61s>+w|4~Z6+j_PLQG1@Y9_Zb(za!x$sqm!eJP!1@pE*T}=5$If50z!6 za3t}K&T>3L6?Im1UTk2*qW{jRGyI8AkYIyYmb;NX_|0KAZa#$b1(4|OA+iS!Xkuh) zoVP*nMKE>J{ca5hvb^SPlx34-0H;GWsOJ1O+I4Iqcw;IUlzmV7MneQ2*xoUQGD|wM zC4*Gk0%qz_1lw~{m5=ASA#Lf!j$%T!QLvBUN2GI)-7Uov$_Qgfwn3(h!mDc{*=pG0 zg9gT?m^&elmdz3lFxKrD<>BigcmoBGQ^+)nLOgK7oGU9|$8Xqh1^RjjRI1GB#v+)S zjePWD9+3<|i|NSY(|k8y!|lu73GWv;b{GwUA}U?H8Qet-6v6nDL3H1?f3>xl^}~Ik z<{T}&E`k5ex08?M6>U0C|YEx67&de1ZCp3 z2Ds?^yH`?>|7scvWV-n(-(YZF4h7td>byb#?`1%NGq+>ihl%dY_{o`U}>ZX8{8?{9W%=O;{R@Ac@&1tRYhYRofKrfW1qGwO-qInX5 zIK97_JzJKsI8t(7-jGN`q`{hAC)0a|D`(!{jQnj)4tI<(c1svr+8pYg7A|{OWy~}B zI$;ruy11v1ad#o|j3Z6*{~<6>#g|_YaNZFZ4Ve-i7q}S|SC_`~o3|rlrwz3A-Sal# zO6C$7U?E-cPQ(5nrUY6BAFS?_z~?sZvLB~mCn*0RFvN!`pVK#_f1pYEJV9eSl^74$ z3L^#ej}uX)UBTKhImtYzrYe|2tuwLCo)pr5@1m)XW^psi@j@RYFzX}DOvp5neY2U> zkx~2-mTwZBF8x>GNUcPC={5Ms{&edJUin;z&hviZeIE+B+-BKG&Xiw5sGVogsTukr zDjz4?|KRSwVWZ{A?KFW9iaK@hJfRb$i9^A@aN_L$;x#N68M=}VAyanfYX|QamMAd{ zZ)C@Cuz2Lkq9@YL!(uBho6zJ&kbQsPO)U-{6^P*#cxh)%k&eFdYGY+?#k(4ry-h{p zO9eRZ^&&(P_5qrSO6g8C0f})!O{R5$v!XGLF*mw>uATRP-R$qZ+6#sM*nRKeOD?d6 zwfdt%E9sw6QK1qN@P$9I*DG1R$6mPHd>~~Db`v_%*Z~d}NP&M434-(d*(HQY5$N91 zYz)G3SZdbmEkqB^2@m~_S+NvzSuKfAH#w|y)MkH9ZzNrkx4p~g9sf?i6iqS@Ij^t< z?14-1a6e?#P}$TmOoSiKe$~mX-aa4^;+yJi3I1RmZ&j%Kj~8e4_N;_^>^XqPMVo#Y z86(PYTV1VFRfQtuw*Z8HM8MZCI4XBJQ4H;UW1hA1@^$eHlzjD0^}0Vd+OSbN#@~9g zWMauIa$Nza-dPYl1u~XtUh`s++I$L61CkGUe&n#8C#f|U-@doXwiF{rT@f)UH$=05FS)O3Q>@SYnm_FsZ>no6OE)q}863S-jmY-H8X&0zYF> z*eC^qph04Fw}TgUMLE2d)c3F227PwTSBPNUQ5}w6e;oc*9={rJ^7rs+-ezLaj>Euqj$z+q338V14+-1E9CPQV=^Lcqe( zt}ZX4MH@n{n4XWYz*i;A9O{{9el_kTOwctVXcg^9O3$GFQy2V;hj`M^P z^M@k0FjU>0trfc>CE4o;%^AB;wr6ED7cNtmp#Vny&k6lU1X}=<(DDf_AwhW($6O6% zw)9#mCU5r^zn=Yk@Dp)^g+SbRL*{<~%=|5ht3}cO0GOCEhw3nYUClcM*!9H`VaN3L z*pG;nI|Gn_px3GO#$z6pD=qXIABA7@;d-9u*8G)^_7IHzJN$G)dUAa5rP2xQY`t#A zW%&Gu@=tTN8Q1a;x6@hnvAZL7`@kFfM)K*?OSf&w8_^|Y*hElSRWgub(}94J-?K$5?0!@UDbd(p+(j=@~I0%P`wsZV2ilAu&NTZT_1YBfJ0{aZ7F7Cj#3stzWpf8rN#LQ*#jN6}aR?&>|bTtKP%Tiv~NX~Eu-$pF~- zDuu}Ctr#O7edn<@6a6m2*tvU?#E?w!4v(Bj1f63@F)5p|*$;;SNv$*@3m}~k#`9~5 z=sv9L*Yn|#^$V|~GTmk6CINxX@}MIx6kFe(Mk}oGk0>^m=43AkN)t-;86} zS6+2Rly*)kNl|X5ca+MN8IJH;Y56oA#*mETOoKBZL|8^Y2Gid8ml@PRz&rn9v>d}n zKDiYzl##E6hBg4ZA`9*&j$)fyC8bac2@RvUlW{Cd^Xk`>S5$_PnoGE?Z?4I{YnBb- zl&+_hw+=JeXw4VK)1uZt4^C@Epb2e#ReLA0sa}Oq-Aj3g>@d5-~^51;9=rOH~sq)3nER5fx*@2YaR_E zKhBsyACovN5LuZngDSw3ympeURu!*E%v`Ko8Fqk?2HpOPn?8Rs4u);MH6N<4oMfa9 zD=T?>MT%^Xe*bReS~0ed3q77}f8(eCe-we0iKD+m}6rr7QJ#wgI~w1a^RLN1IL z98v6xSWW{;c}@S%e<4xj=#3ze>3jEIuIlG5-AYSnrUqDnHGm$M^mhTq1?ydaDb+ko z=Pcrvx3#jbpQ7@^Woq`F$a)uGq`vZ$SnyRh{3NrxM?@zk|HA5+X(Vq)KOK*!3YlV7 zwBSM%@U}E6(gu|iDl4r%wcTr<@T@)gS$$-3itvSbK&bBfj!TiZ1Y9#LAjf25sWmLA zK3~NdL`6ll%y83=$<^Wc@rydY@0SC!YdjpvVxeg^G%Owd=k)!aHNpP@FqpIh6WawB&1?N-l11RS+B2&GNw!G4GT0Wk7u-j?qG%+@9}8GL6IyN}QpR+W&SmQ??MdP8Xn^&t`oYsSp(!HEhlOOx#jHZw%(>4L& zqD)<(mX#7F%og%w@Uc~k{2&>$Nx57bJl-004FE{38EMvF2CT(jTN%t4^BHAi>XM@N zo6;$j0j9ezD{9(vQ=2BH%aEnBrj!JV-KLU@GeMcaCcJOPWD8~ksoY8+6S1Rx3rL1P z^-%t{+d^S+tq`$|U8Aw;vl_kXYyxza9sy0Qe5u!4tecg;#uMLtNr|$1wI^iQlDO0y z8-!qC9n`6i;`aFR0S%?2hF1DS+M5YY-lSk+2{*IzAM<^{}LM|XF9?pnqTlOLl;fYvCFp&U+QfE^I9HWpM9 z#4y}!sh1e2!#%iagY05=NN|e|_DfSh9zU}en?^HavMo zu>u#+m+~L~61V2_>>@li;b4S`PMhrX=&n%&r&(W@b_XS71kUHC0_t=Gc5O0B0LDVS3JmF#k7k<4ezRenDDt|&IZ15226UNH8Ws6FX&ySiQKC} zCvjpvGMSaw`}buoRj1%;=6f=lRl~1|qu;>A%LK#+G){x?^3lkqFg6ap`KKC0C-SRI zHpCs)e+{{YQ1_GPsJ+&gL3gb6ANz36gAd}URb!*A^6XKMA|xiU|i)sq`O%25ZY1u z`oAABOG=Iq)Y)Q*Czyq*V6$+KmO2;pVDp{NEUuo3%L|ww0xdY|#xSIULJW|Akc(&6 z!NZEwbUhcQy@d7dTW`%yybJE40-r&cY4A#&V#CtGWmDOaLoigbR03}W`wUz>lfmMp7??m7VPuVd)gZjoE;2N=ba0VsH?}pD>$xk$7wmUiJ zzK4GZ-uo#hJcyP&2+!}&TiBTmaTW7(ksI!!`odN;5w)AhMHj(tUv+E9JG6#6c2#9l zFHd)o6zs=~+^4@K;md+cTNsi*mk2P&LdYsnoPt>h=~e(8&iFbmReL$<%)cGQ5&dkA zo_fO$!s5N7lc47h4i_73piZE0j(}orUPEPzubze>;9Gm%$d(nNyhJob#}3LY z>sG>9IPNh1yYe(oTvG*oy)>iMbr@!E}mIrk|&V*$7=lFdb2Xd?b;m#=;1_ z&;CKRX^dFN2yZV%A1}fQ+tMnd#cy#B^QqP`bACq@`Y{fJ5f&^bzuN!*K#MR+NU6>g zp2_~-V{nc2B9fb);!ynA(;=lUa|q1aL%um=i!1`AgX@Y$;A?AC(LM?hgOj+!#ITsf zu|uwF^HThs#{S;=Qr!0Zul|eQ$VQW}N$Ea0_&zYDLbH(dFIX$;qfN*N*Kjl`TfFJp znc~VhF#Prj-{+3T%>L4_Zjsj`hCb9A6=6io^=e))ql8KU6$;(@ia9%YhcpS***_&O5083)ZpHtvo<(%>BOOnpuo+GcL{41=Q=C{(ERrwOoh{xec_Vu%$@~HZ=?OuM>qh6`vG2keH#k!z#^zTf8 zTtlcAaRHe(VPzb)w3#E;LKCEmBDe2@!< z`q9|ry<)my;J@Wh`D9|dvqL@nmx6*3k`GIHk+Hv;M0XLq&sT;TjxGbE#>nlcUXPa{ z-orkD7ggJ}@45cG_;Ut$F5L{OlPl+~rVswyZ}ap zbAM^FNZTig(WuFjG%K;mNzagLf3n`m7z*U%+9?X|wtk|evjzl_NSAE61iCzii5y*y zAGa*TFF3u=HV^5adOadeVlpNW9d-}kVnCIXu>2_f2`tn1;8C=VeO zk^L0Q7Wl8@jqUC2X$!OB=6VMzH!wXHY=N4m3ZHA>?7s;`qkyWX_v~xb73;esiZ_!SLC^KiZS}*dHehL)=fw z)x{xY{Yy+Gdc!t)69p0M?wEr)fk9r+7vBHsgw6<-0Wm!gt*9_xgzDhjbvxXb#ZNS?JGOVjSw!^rf_Yp z5%=Tq`2H8)f8qRg&g=1d9$!aNhYt@8&c-qaya16twVkft_RTqpKR&gy_JhCer^2d}+8(wzv zK9zhP@w@@dBf62{`EiC}2Y?Lw$hH{;8Rzh>%u@OD+}tfgYZo1w+1AxdzLQ*##zh{e zMHZ*S8PGtc8S>KjuA1r? z{VQtF&}9qnxop>x-nS87;m8FVnXI0ZF3tsu*y-Ems@D}s z+QKx&fMva6sp}_EgQ!;*D_esX`*kIn=s>T}^A)$#xy4CGsjcG-Q>Qjy{e8|jCRT>`zTPavbkvrs@cm!kpk9sZT8MmZoue7T>v>|! zM7DwSv*!CwQQ=McA%N_0Z&{^rS~SDntz2y1$7$xO^v4yDxp#4WnJzK>v&%CBgnf{n zkB7t#idvpBdH34M&-XUp=)XHuD$HRBFr$!+-w_6kCH&N20zmoSZMi?g1S%v=Z*Z!L z{K}|%W&*hmLk%Bseg(O>H>Obk)r2moHB>OO3aqh9Mo5V43)D!U@T0m}Yc7AtZubxB zgDVXY;XlnO%Zl=|)J}W9!uE)C(Jiiye6OXXJ{{EPeaLdSC9$I$=uxYdrCE|n3f)Mc zO74CCxp@B9IfYcuTi_!-xv~*lVoZv9?Al;r+}cEdT$EUPor4^@BS)4i!-|cXkrm~xJDl$y&hh^1@DKb{8THlX826!3N2_q`JgbGCU6bWr9oj*Mu!iNd;g;gtB5 zv{D|Rov3`q;cby{QK6q!btN8vAqn`RMYNkz9A1 zW43>WHdrU>$2|+Z2zTa?(HlR1NEV%2B0AgK!$M2Y*FaX=Zj$ypx0mb51n~!CNqx!r zMmK9eiSYm0)7eXHBcJV7_F1gTi7KC+ar&gsiRsZYjalr4rFqANxpU3lSJL)?J{B@a zzFG9q7Me+2MUE;Hd-1A@ z)o`mpyL%Y9s8Y&;_hzN!6Flzsp7sNK(Zc-lhV$yp8v7GV(Z#fD87}tJC#w@Wy)`U0 z15?^A^=d6kG1TtEUW6|%STA_`*G{&?In(&hc0F2xdg>G`AhMtJ0u#$u(#ehg) z(*ehn)hv*?Q$c1FmEi`+k=X?LHK{JSzP$rxc*0*+yylDSOE*nWl?%H45qTX;7F8k- z`Xtgf&W;H*FQTUe)Sg$D_-xH7O1}h8mgT8E^Y?3eq6x3kB+9x}eI`IjB1S+8GSX!D>xBByzRZb)(2*S!jZ{=y%bC$9u zhiUD)JUztQW`9YnUXrpWGZH8tN=~7rRuZ}iazPJd$BztwX_VxdVzI(}t+_)qmS}Ohj$Qoz z$Yd|=<=I2agb+1!H<8z9@Ue86Cx4EykZ??A^*Um2 z%Ul$c)W)stkgF1K`Y>}*UdE-KQW9Cx`s@|B+>)ih`<=h4h-uX=9?6scc#}HyUiQe} zaBXidJn4E2AGu3Mo_5q^Jn?;O+t`hsy8h?d^cycaTDg6G2*ZC$uAHzC!;tPA)L9km zxV9knZ2tdbmZ&+6ap2)!ip>B;%tcX3RT?JZ&{x2(Y~i0@Nc83IhfI*|ZT!DpcDtz1 z!;R=GZ1fe8w2vkIbG-V8C5=Rr7D&HHhXPl%Akqctd?We{boEb$go`GzkO-tJ5a~CG z=y;_t{C(xv;wt#xLTE%3N~Jd2$d_iHAh}v`I{e9cpz~}|{c3BnTEl^)>M(h+b;U*M zuR7S&>ulZ0wd+P*q~j9{^)6bJEf{iQaTm49|El(y3?h{eeyz;c^_ zl-ed-&op53EBY&0OkG6`^hK(nHz}Rl`D>6tUge94@drSV^V!Z$^d%hA-gUXR|B84u zgX_R=WU4$gs!xb!cdogSen)D25-6wC+GB0&?xka2sBa!=v_tmX#6dY&T{5)eQvX2= zmbemxTd}u6eW7CTPgbqN#!#gJ@BaAIH6dYnK)g3SkO#fj$!zza0APaJB;B(PMnOKNm;8YZ%Xn<vqG3hsc@~An9axCJtZcW8! z7DKMEKi9o2Z&1w~RbIz?SzIzXNvBu5~fUjHfjP#`&luv%6ko7bS{X zW*vR5nwb*A2=GuK#Ur^V;*;Vgk#g_eT&6tN(d zOGfW3$lZ;)DecfyHJBo5l7$ogD*6`v+*O{n2R3Hx$Tg&Y-Bc;`k`T<6U^)?RDW(U& zbplahCedZaz*|8HF)Mn+Y@u%5*G$9RR6Oa=bzu8`FaxJQ;Ql+TCsckqo;hW!VMZ}- z>OMn3ckU46&hZo^Vk2iXzN^+ni<#%|nNDMP&v2dKjWOG zyp!(#8{(-#BoEb>cI}GtX-iPGud!^0zOpuk#=fL)Q@6J}^6ksb^CzJlX{@;1wm96L z2KgagXwI#1c-SSTDm*}4%tK-qK3QQbxw&7fe^~!Pq=~z<3~U*5%ooNo&iEnGc_svf z1)W@+8|WW))0BFB@O;mJs~_St1(jyePTzME9R6;bGwky&#%}6my-ZyeG?}LQ{z$Ow zOPK`+0W$O-ijbAAtj(RP{f14d2rP{D=*OQ6$Uf#k-1LxwV~HUA+le7|T}?Uiyq9nc zmW_%IiV7+GzHYsHm1q3USYQL4vLekA{o$|1zWcA4_7s&B;{cp;`n-{Q3QObJC1F1D zr{BdE7T)PL_{JdX`gx2aT_b+8&6X*l;uc5bKI5ENktB7JqW+hi5_gk zOwt`xgs#j97)sep4|fCWpAV`nNJF;$o4WtezH~S5802s}K`iWXt39YGRG=pe)%E_mG!o-Mm^w~l59UddEcu;!@jHho8hRtsGQ zOst@_B%_^A^_6JyoRN_Ez3Gn6=iXA5d2k0OlSnP%QWJ+~={I*t*MU$z&l(OMH0z?Q zJlnqbc#9@}rV_xmWip$J6IGfH7ynwHH#ewb@u)m1!NEJv!`@xFJ%1p0 zkFk}U<<4F>NswR0M#KPWl{8j6^zd|-n-KH+L(h5CPRk`7LalDGwZQo)k1p?_>=#?4 zI@@YU!Kp91G0o cRhePAkg>Ow^I!5VqfS^J>dNqzG18O$53S7=Qvd(} literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/011-libtree_numeric_core.macos.template_debug.dylib.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/011-libtree_numeric_core.macos.template_debug.dylib.gz new file mode 100644 index 0000000000000000000000000000000000000000..7a5e0297c351ae2235b6df452ef0ec343f4d6730 GIT binary patch literal 153480 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 X*R4O5xHT!8?RowmKcO46pj`$4U@T`u literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/012-ended.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/012-ended.json new file mode 100644 index 0000000..4b6a6b3 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/012-ended.json @@ -0,0 +1,35 @@ +{ + "pid": 34736, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-Wl,-S", + "-Wl,-x", + "-Wl,-dead_strip", + "-shared", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a" + ], + "pgid": 34736, + "ended_utc": "2026-10-12T03:51:08.344270+00:00", + "exit_code": 0, + "duration_seconds": 0.21052816699999966, + "cleanup": [ + { + "attempt": 0, + "pgid": 34736, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "remaining": [], + "cleanup_errors": [], + "foreign_process_or_group_signals": 0 +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/013-started.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/013-started.json new file mode 100644 index 0000000..0ca43d0 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/013-started.json @@ -0,0 +1,31 @@ +{ + "pid": 34736, + "owner_pid": 34670, + "pgid": 34736, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-o", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "-arch", + "arm64", + "-isysroot", + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", + "-fvisibility=hidden", + "-Wl,-S", + "-Wl,-x", + "-Wl,-dead_strip", + "-shared", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a" + ], + "started_utc": "2026-10-12T03:51:08.170135+00:00", + "initial_members": [ + { + "pid": 34736, + "ppid": 34670, + "pgid": 34736, + "args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -Wl,-S -Wl,-x -Wl,-dead_strip -shared /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a" + } + ], + "owned_new_session": true +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/014-stderr.log b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/014-stderr.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/015-stdout.log b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/015-stdout.log new file mode 100644 index 0000000..e69de29 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/016-link-phase.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/016-link-phase.json new file mode 100644 index 0000000..c671532 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/016-link-phase.json @@ -0,0 +1,28 @@ +{ + "name": "link", + "result": { + "pid": 34736, + "exit_code": 0, + "timed_out": false, + "error_lines": [], + "duration_seconds": 0.210839 + }, + "capture": { + "passed": true, + "cleanup": [ + { + "attempt": 0, + "pgid": 34736, + "members_before": [], + "group_signal": null, + "tracked_parent_signal": null + } + ], + "cleanup_errors": [], + "all_captured_ended": true, + "foreign_process_or_group_signals": 0 + }, + "full_input_inventory_before_verified": true, + "full_input_inventory_after_verified": true, + "post_input_error": null +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/017-062-tree_numeric_core.os.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/017-062-tree_numeric_core.os.gz new file mode 100644 index 0000000000000000000000000000000000000000..99ee5f90a993772638362b6ab2fcc9e6776956ac GIT binary patch literal 118411 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

AS}9l7%}3S51x;v3Qe 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/018-p23-02-native-hot-loop-build-r327.py.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/018-p23-02-native-hot-loop-build-r327.py.gz new file mode 100644 index 0000000000000000000000000000000000000000..7b9a35ef05b8ac4ccab85442e727f63d1cfa969a GIT binary patch literal 5091 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 F004^Az54(F literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/019-p23-02-native-hot-loop-build-root-verification-r327.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/019-p23-02-native-hot-loop-build-root-verification-r327.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1a412fe8c5eefb46225db95761f79b1e7ff02a6c GIT binary patch literal 4534 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 UfBb?U{Q3v~4 bool: + if definition == null or not definition is GuestDefinition: + return _fail("Guest definition has an invalid type.") + var typed_definition: GuestDefinition = definition + if not typed_definition.is_valid(): + return _fail("Guest definition is invalid.") + if _definitions.has(typed_definition.guest_type_id): + return _fail("Duplicate guest definition: %s" % typed_definition.guest_type_id) + _definitions[typed_definition.guest_type_id] = typed_definition + last_error = "" + return true + + +func create_definition(guest_type_id: StringName, options: Dictionary = {}) -> GuestDefinition: + var definition := GuestDefinitionType.new().configure(guest_type_id, options) + return definition if register_definition(definition) else null + + +func get_definition(guest_type_id: StringName) -> GuestDefinition: + return _definitions.get(guest_type_id) as GuestDefinition + + +func get_definitions() -> Array[GuestDefinition]: + var result: Array[GuestDefinition] = [] + for guest_type_id: StringName in _sorted_ids(_definitions.keys()): + result.append(_definitions[guest_type_id]) + return result + + +func register_guest(guest: Variant, emit_notification := true) -> bool: + if _external_mutation_blocked: + return _fail("Guest mutation is blocked while committed notifications are delivered.") + if guest == null or not guest is GuestRuntime: + return _fail("Guest runtime has an invalid type.") + var runtime: GuestRuntime = guest + if not runtime.is_valid(): + return _fail("Guest runtime is invalid.") + if not _definitions.has(runtime.guest_type_id): + return _fail("Guest runtime references an unknown definition.") + if _guests.has(runtime.guest_id) or _persistent_records.has(runtime.guest_id): + return _fail("Duplicate guest id: %s" % runtime.guest_id) + _guests[runtime.guest_id] = runtime + _guest_order_dirty = true + if emit_notification: + guest_spawned.emit(runtime) + else: + _pending_spawn_notifications[runtime.guest_id] = true + last_error = "" + return true + + +func spawn_guest( + guest_id: StringName, + guest_type_id: StringName, + absolute_minute: int, + options: Dictionary = {}, + emit_notification := true +) -> GuestRuntime: + var definition := get_definition(guest_type_id) + if definition == null or absolute_minute < 0: + _fail("A known definition and non-negative spawn minute are required.") + return null + var runtime_options := options.duplicate(true) + if not _has_value(runtime_options, &"wallet_gold"): + runtime_options[&"wallet_gold"] = definition.wealth_min + if not _has_value(runtime_options, &"credit_limit_gold"): + runtime_options[&"credit_limit_gold"] = definition.credit_limit_gold + if not _has_value(runtime_options, &"patience_remaining"): + runtime_options[&"patience_remaining"] = definition.base_patience + if not _has_value(runtime_options, &"state"): + runtime_options[&"state"] = GuestRuntimeType.State.SPAWNING + if not _has_value(runtime_options, &"state_entered_at"): + runtime_options[&"state_entered_at"] = absolute_minute + if not _has_value(runtime_options, &"planned_exit_at"): + runtime_options[&"planned_exit_at"] = absolute_minute + 720 + var runtime := GuestRuntimeType.new().configure(guest_id, guest_type_id, runtime_options) + if not register_guest(runtime, emit_notification): + return null + return runtime + + +func commit_guest_spawned_notification(guest_id: StringName) -> bool: + if not _pending_spawn_notifications.has(guest_id) or not _guests.has(guest_id): + return _fail("Guest has no pending spawn notification: %s" % guest_id) + _pending_spawn_notifications.erase(guest_id) + guest_spawned.emit(_guests[guest_id] as GuestRuntime) + last_error = "" + return true + + +func discard_guest_spawned_notification(guest_id: StringName) -> bool: + if not _pending_spawn_notifications.has(guest_id): + return false + _pending_spawn_notifications.erase(guest_id) + return true + + +func has_pending_guest_spawned_notification(guest_id: StringName) -> bool: + return _pending_spawn_notifications.has(guest_id) + + +func set_external_mutation_blocked(blocked: bool) -> void: + _external_mutation_blocked = blocked + + +func has_guest(guest_id: StringName) -> bool: + return _guests.has(guest_id) + + +func get_guest(guest_id: StringName) -> GuestRuntime: + return _guests.get(guest_id) as GuestRuntime + + +func get_guests() -> Array[GuestRuntime]: + var result: Array[GuestRuntime] = [] + for guest_id: StringName in _ordered_guest_ids(): + result.append(_guests[guest_id]) + return result + + +func guest_count() -> int: + return _guests.size() + + +func get_persistent_record(guest_id: StringName) -> Dictionary: + if not _persistent_records.has(guest_id): + return {} + return (_persistent_records[guest_id] as Dictionary).duplicate(true) + + +func get_diagnostics() -> Array[Dictionary]: + return _diagnostics.duplicate(true) + + +func advance_one_minute( + absolute_minute: int, + context_by_guest: Dictionary = {} +) -> Dictionary: + if absolute_minute < 0 or absolute_minute <= current_minute: + return _error_result("Guest minute must advance monotonically.") + var ordered_guest_ids := _ordered_guest_ids() + # The common no-context tick has no external values to validate or isolate. + # Avoid allocating one duplicated context plus a resolved-context entry per + # Guest while retaining the same deterministic order and report contract. + if context_by_guest.is_empty(): + return _advance_with_shared_need_context( + absolute_minute, + ordered_guest_ids, + {} + ) + var resolved_contexts: Dictionary = {} + var default_context: Dictionary = {} + var raw_default: Variant = _value(context_by_guest, &"default", {}) + if raw_default is Dictionary: + default_context = raw_default + # Production supplies one common default context. Validate it once, then + # share the same read-only Dictionary across the population. Any per-Guest + # override keeps using the all-context preflight below, preserving atomic + # rejection and the malformed-override contract. + if context_by_guest.size() == 1 and _has_value(context_by_guest, &"default"): + # Historically an unused default was not validated when the population + # was empty. Preserve that edge case and the first-Guest error wording. + if not ordered_guest_ids.is_empty(): + var default_error := _need_context_error(default_context) + if not default_error.is_empty(): + return _error_result( + "Invalid Need context for %s: %s" % [ + ordered_guest_ids[0], + default_error, + ] + ) + return _advance_with_shared_need_context( + absolute_minute, + ordered_guest_ids, + default_context + ) + for guest_id: StringName in ordered_guest_ids: + var context := default_context + var raw_context: Variant = null + var has_guest_context := false + if context_by_guest.has(guest_id): + has_guest_context = true + raw_context = context_by_guest[guest_id] + else: + var string_guest_id := String(guest_id) + if context_by_guest.has(string_guest_id): + has_guest_context = true + raw_context = context_by_guest[string_guest_id] + if raw_context is Dictionary: + context = raw_context + elif has_guest_context: + # Preserve the original contract: a malformed per-guest override + # suppresses the default context rather than inheriting it. + context = {} + var context_error := _need_context_error(context) + if not context_error.is_empty(): + return _error_result("Invalid Need context for %s: %s" % [guest_id, context_error]) + resolved_contexts[guest_id] = context.duplicate(true) + + ## All contexts are preflighted before mutating any guest, so a malformed + ## batched update cannot partially advance the population or the minute. + var reports: Array[Dictionary] = [] + for guest_id: StringName in ordered_guest_ids: + var context: Dictionary = resolved_contexts[guest_id] + var guest: GuestRuntime = _guests[guest_id] + var definition: GuestDefinition = _definitions.get(guest.guest_type_id) as GuestDefinition + if definition == null: + reports.append(_error_result("Guest definition is missing.")) + else: + reports.append(_update_needs_runtime(guest, definition, context)) + current_minute = absolute_minute + last_error = "" + return { + &"ok": true, + &"minute": absolute_minute, + &"guest_reports": reports, + } + + +func _advance_with_shared_need_context( + absolute_minute: int, + ordered_guest_ids: Array[StringName], + context: Dictionary +) -> Dictionary: + var reports: Array[Dictionary] = [] + for guest_id: StringName in ordered_guest_ids: + var guest: GuestRuntime = _guests[guest_id] + var definition: GuestDefinition = _definitions.get( + guest.guest_type_id + ) as GuestDefinition + if definition == null: + reports.append(_error_result("Guest definition is missing.")) + else: + reports.append(_update_needs_runtime(guest, definition, context)) + current_minute = absolute_minute + last_error = "" + return { + &"ok": true, + &"minute": absolute_minute, + &"guest_reports": reports, + } + + +func update_needs(guest_id: StringName, context: Dictionary = {}) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + var definition := get_definition(guest.guest_type_id) + if definition == null: + return _error_result("Guest definition is missing.") + var context_error := _need_context_error(context) + if not context_error.is_empty(): + return _error_result("Invalid Need context: %s" % context_error) + last_error = "" + return _update_needs_runtime(guest, definition, context) + + +func _update_needs_runtime( + guest: GuestRuntime, + definition: GuestDefinition, + context: Dictionary +) -> Dictionary: + var before_hunger := int(guest.needs[&"hunger"]) + var before_sleep := int(guest.needs[&"sleep"]) + var before_hygiene := int(guest.needs[&"hygiene"]) + var before_medical := int(guest.needs[&"medical"]) + var before_leisure := int(guest.needs[&"leisure"]) + var before_intimacy := int(guest.needs[&"intimacy"]) + var delta_hunger := int(definition.need_rates[&"hunger"]) + var delta_sleep := int(definition.need_rates[&"sleep"]) + var delta_hygiene := int(definition.need_rates[&"hygiene"]) + var delta_medical := int(definition.need_rates[&"medical"]) + var delta_leisure := int(definition.need_rates[&"leisure"]) + var delta_intimacy := int(definition.need_rates[&"intimacy"]) + + ## State effects are accumulated first; every Need is clamped exactly once. + if guest.state == GuestRuntimeType.State.MOVING \ + or guest.state == GuestRuntimeType.State.REPLANNING: + delta_hunger += 2 + delta_sleep += 2 + elif guest.state == GuestRuntimeType.State.QUEUING: + delta_hunger += 1 + + if context.is_empty(): + if guest.state != GuestRuntimeType.State.RECEIVING_SERVICE: + delta_leisure += 1 + else: + if bool(_value(context, &"work_like_activity", false)): + delta_sleep += 1 + if bool(_value( + context, + &"unstimulated", + guest.state != GuestRuntimeType.State.RECEIVING_SERVICE + )): + delta_leisure += 1 + delta_hygiene += int(_value(context, &"dirt", 0)) + delta_medical += int(_value(context, &"injury", 0)) + delta_medical += int(_value(context, &"illness", 0)) + if definition.adult_verified: + var intimacy_key := &"intimacy_night" \ + if bool(_value(context, &"is_night", false)) \ + else &"intimacy_day" + delta_intimacy += int(_value(context, intimacy_key, 0)) + var raw_effects: Variant = _value(context, &"need_effects", {}) + var normalized_effects: Dictionary = _normalized_partial_need_map(raw_effects) + delta_hunger += int(normalized_effects.get(&"hunger", 0)) + delta_sleep += int(normalized_effects.get(&"sleep", 0)) + delta_hygiene += int(normalized_effects.get(&"hygiene", 0)) + delta_medical += int(normalized_effects.get(&"medical", 0)) + delta_leisure += int(normalized_effects.get(&"leisure", 0)) + delta_intimacy += int(normalized_effects.get(&"intimacy", 0)) + + var after_hunger := clampi(before_hunger + delta_hunger, 0, 100) + var after_sleep := clampi(before_sleep + delta_sleep, 0, 100) + var after_hygiene := clampi(before_hygiene + delta_hygiene, 0, 100) + var after_medical := clampi(before_medical + delta_medical, 0, 100) + var after_leisure := clampi(before_leisure + delta_leisure, 0, 100) + var after_intimacy := clampi(before_intimacy + delta_intimacy, 0, 100) + guest.needs[&"hunger"] = after_hunger + guest.needs[&"sleep"] = after_sleep + guest.needs[&"hygiene"] = after_hygiene + guest.needs[&"medical"] = after_medical + guest.needs[&"leisure"] = after_leisure + guest.needs[&"intimacy"] = after_intimacy + return { + &"ok": true, + &"guest_id": String(guest.guest_id), + &"before": { + "hunger": before_hunger, + "hygiene": before_hygiene, + "intimacy": before_intimacy, + "leisure": before_leisure, + "medical": before_medical, + "sleep": before_sleep, + }, + &"deltas": { + "hunger": delta_hunger, + "hygiene": delta_hygiene, + "intimacy": delta_intimacy, + "leisure": delta_leisure, + "medical": delta_medical, + "sleep": delta_sleep, + }, + &"after": { + "hunger": after_hunger, + "hygiene": after_hygiene, + "intimacy": after_intimacy, + "leisure": after_leisure, + "medical": after_medical, + "sleep": after_sleep, + }, + } + + +## Returns canonical candidate copies in facility_id order. Supported canonical +## fields are documented by the filtering helpers below; aliases allow existing +## FacilityService projections to be adapted without a hard dependency. +func extract_candidates( + guest_id: StringName, + facilities: Array, + context: Dictionary = {} +) -> Array[Dictionary]: + var guest := get_guest(guest_id) + if guest == null: + _fail("Unknown guest: %s" % guest_id) + return [] + var definition := get_definition(guest.guest_type_id) + if definition == null: + _fail("Guest definition is missing.") + return [] + var ordered: Array[Dictionary] = [] + for raw_candidate: Variant in facilities: + if not raw_candidate is Dictionary: + continue + var candidate: Dictionary = raw_candidate.duplicate(true) + var facility_id := _facility_id(candidate) + if facility_id.is_empty(): + continue + candidate[&"facility_id"] = facility_id + ordered.append(candidate) + ordered.sort_custom( + func(a: Dictionary, b: Dictionary) -> bool: + return String(a[&"facility_id"]) < String(b[&"facility_id"]) + ) + + var accepted: Array[Dictionary] = [] + var rejected: Array[Dictionary] = [] + for candidate: Dictionary in ordered: + var reason := _candidate_rejection_reason(guest, definition, candidate, context) + if reason.is_empty(): + accepted.append(candidate) + else: + rejected.append({ + &"facility_id": String(candidate[&"facility_id"]), + &"reason": String(reason), + }) + _decision_rejections[guest_id] = rejected + last_error = "" + return accepted + + +func get_last_candidate_rejections(guest_id: StringName) -> Array[Dictionary]: + return (_decision_rejections.get(guest_id, []) as Array).duplicate(true) + + +func evaluate_candidate(guest_id: StringName, candidate: Dictionary) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + var definition := get_definition(guest.guest_type_id) + if definition == null: + return _error_result("Guest definition is missing.") + if not _candidate_need_maps_are_valid(candidate): + return _error_result("Candidate Need map is invalid.") + var need_relief := _need_relief(guest, candidate) + var preference := int(_value( + candidate, + &"preference", + definition.preference_for(_value(candidate, &"facility_tags", _value(candidate, &"tags", []))) + )) + var expected_quality := int(_value( + candidate, + &"expected_quality", + _value(candidate, &"quality", 0) + )) + var novelty := int(_value( + candidate, + &"novelty", + 0 if guest.visited_facility_ids.has(_facility_id(candidate)) else 10 + )) + var group_fit := int(_value(candidate, &"group_fit", 0)) + var price_burden := int(_value(candidate, &"price_burden", _price_burden(guest, candidate))) + var travel_minutes := maxi(int(_value(candidate, &"travel_minutes", 0)), 0) + var wait_minutes := maxi(int(_value( + candidate, + &"wait_minutes", + _value(candidate, &"expected_wait", 0) + )), 0) + var risk := maxi(int(_value(candidate, &"risk", _value(candidate, &"risk_level", 0))), 0) + var default_risk_sensitivity := (100 - definition.risk_tolerance + 24) / 25 + var risk_sensitivity := maxi(int(_value( + candidate, + &"risk_sensitivity", + default_risk_sensitivity + )), 0) + var repetition_penalty := int(_value( + candidate, + &"repetition_penalty", + 10 if guest.visited_facility_ids.has(_facility_id(candidate)) else 0 + )) + var urgency := int(_value(candidate, &"urgency", _candidate_urgency(guest, candidate))) + var utility := ( + need_relief * 8 + + preference * 5 + + expected_quality * 3 + + novelty * 2 + + group_fit * 2 + - price_burden * 5 + - travel_minutes * 2 + - wait_minutes * 3 + - risk * risk_sensitivity + - repetition_penalty + ) + var result := candidate.duplicate(true) + result[&"facility_id"] = _facility_id(candidate) + result[&"need_priority"] = _primary_need_priority(guest, candidate) + result[&"utility"] = utility + result[&"urgency"] = urgency + result[&"travel_minutes"] = travel_minutes + result[&"utility_terms"] = { + &"need_relief": need_relief, + &"preference": preference, + &"expected_quality": expected_quality, + &"novelty": novelty, + &"group_fit": group_fit, + &"price_burden": price_burden, + &"travel_minutes": travel_minutes, + &"wait_minutes": wait_minutes, + &"risk": risk, + &"risk_sensitivity": risk_sensitivity, + &"repetition_penalty": repetition_penalty, + } + return result + + +func rank_candidates(guest_id: StringName, candidates: Array) -> Array[Dictionary]: + var ranked: Array[Dictionary] = [] + for raw_candidate: Variant in candidates: + if raw_candidate is Dictionary: + var evaluated := evaluate_candidate(guest_id, raw_candidate) + if bool(evaluated.get(&"ok", true)): + ranked.append(evaluated) + ranked.sort_custom(_candidate_precedes) + return ranked + + +func select_best_candidate( + guest_id: StringName, + candidates: Array, + exit_threshold: int = DEFAULT_EXIT_THRESHOLD +) -> Dictionary: + var ranked := rank_candidates(guest_id, candidates) + for candidate: Dictionary in ranked: + if int(candidate[&"utility"]) >= exit_threshold: + return candidate.duplicate(true) + return {} + + +func decide( + guest_id: StringName, + facilities: Array, + absolute_minute: int, + context: Dictionary = {} +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + var filtered := extract_candidates(guest_id, facilities, context) + var ranked := rank_candidates(guest_id, filtered) + return _decide_ranked_candidates(guest, guest_id, ranked, absolute_minute, context) + + +func decide_with_native_candidates( + core: Object, guest_id: StringName, facilities: Array, absolute_minute: int, context: Dictionary = {} +) -> Dictionary: + if get_script().resource_path != "res://scripts/guest/guest_service.gd" or core == null or core.get_class() != &"TheTreeNumericCore" or core.get_script() != null or not core.has_method(&"guest_candidate_batch"): + return decide(guest_id, facilities, absolute_minute, context) + var batch: Dictionary = core.call(&"guest_candidate_batch", self, guest_id, facilities, context) + if not bool(batch.get(&"supported", false)): + return decide(guest_id, facilities, absolute_minute, context) + var guest := get_guest(guest_id) + _decision_rejections[guest_id] = batch[&"rejected"] + last_error = "" + return _decide_ranked_candidates(guest, guest_id, batch[&"ranked"], absolute_minute, context) + + +func _decide_ranked_candidates( + guest: GuestRuntime, guest_id: StringName, ranked: Array[Dictionary], absolute_minute: int, context: Dictionary +) -> Dictionary: + var threshold := int(_value(context, &"exit_threshold", DEFAULT_EXIT_THRESHOLD)) + var reserve_callback: Callable = _value(context, &"reserve_callback", Callable()) + for candidate: Dictionary in ranked: + if int(candidate[&"utility"]) < threshold: + continue + if reserve_callback.is_valid(): + var reservation_result: Variant = reserve_callback.call( + guest_id, + candidate[&"facility_id"], + candidate.duplicate(true) + ) + if not _callback_succeeded(reservation_result): + continue + if not _transition_is_available(guest, GuestRuntimeType.State.MOVING, absolute_minute): + return _error_result("Guest cannot enter MOVING in this tick.") + guest.target_facility_id = candidate[&"facility_id"] + guest.path_handle = _copy(_value(candidate, &"path_handle", null)) + _apply_transition(guest, GuestRuntimeType.State.MOVING, absolute_minute, &"FACILITY_SELECTED") + last_error = "" + return { + &"ok": true, + &"action": &"MOVE_TO_FACILITY", + &"candidate": candidate.duplicate(true), + } + if not _transition_is_available(guest, GuestRuntimeType.State.LEAVING, absolute_minute): + return _error_result("Guest cannot enter LEAVING in this tick.") + guest.target_facility_id = &"" + guest.path_handle = null + guest.exit_reason = StringName(_value(context, &"exit_reason", &"NO_SUITABLE_FACILITY")) + _apply_transition(guest, GuestRuntimeType.State.LEAVING, absolute_minute, guest.exit_reason) + last_error = "" + return {&"ok": true, &"action": &"LEAVE", &"candidate": {}} + + +func transition_guest( + guest_id: StringName, + new_state: int, + absolute_minute: int, + reason: StringName = &"" +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + if new_state < GuestRuntimeType.State.SPAWNING or new_state > GuestRuntimeType.State.INCAPACITATED: + return _error_result("Unknown guest state.") + if guest.state == new_state: + return {&"ok": true, &"changed": false, &"state": new_state} + if not _is_allowed_transition(guest.state, new_state): + return _error_result( + "Invalid guest transition: %s -> %s" % [ + GuestRuntimeType.State.keys()[guest.state], + GuestRuntimeType.State.keys()[new_state], + ] + ) + if not _transition_is_available(guest, new_state, absolute_minute): + _force_loop_guard(guest, absolute_minute) + return { + &"ok": false, + &"changed": true, + &"loop_guard": true, + &"state": guest.state, + } + _apply_transition(guest, new_state, absolute_minute, reason) + last_error = "" + return {&"ok": true, &"changed": true, &"state": new_state} + + +func enter_queue( + guest_id: StringName, + facility_id: StringName, + request_id: StringName, + absolute_minute: int, + initial_patience: int = -1, + enqueue_callback: Callable = Callable() +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null or facility_id.is_empty() or request_id.is_empty(): + return _error_result("Guest, facility and request are required for queue entry.") + if not _transition_is_available(guest, GuestRuntimeType.State.QUEUING, absolute_minute): + return _error_result("Guest cannot enter QUEUING in this tick.") + if enqueue_callback.is_valid(): + var external_result: Variant = enqueue_callback.call(guest_id, facility_id, request_id) + if not _callback_succeeded(external_result): + return _error_result("Facility queue rejected the guest.") + var definition := get_definition(guest.guest_type_id) + var resolved_patience := initial_patience + if resolved_patience < 0: + resolved_patience = definition.base_patience if definition != null else 0 + guest.target_facility_id = facility_id + guest.queue_request_id = request_id + guest.patience_remaining = maxi(resolved_patience, 0) + _apply_transition(guest, GuestRuntimeType.State.QUEUING, absolute_minute, &"QUEUE_ENTERED") + last_error = "" + return {&"ok": true, &"patience_remaining": guest.patience_remaining} + + +## Closure asks the guest to choose again, without charging a patience penalty. +## The callback releases the owning facility request and inventory reservations. +func release_queue_for_replanning( + guest_id: StringName, + absolute_minute: int, + release_callback: Callable = Callable() +) -> Dictionary: + if _external_mutation_blocked: + return _error_result("Guest mutation is blocked while committed notifications are delivered.") + var guest := get_guest(guest_id) + if guest == null or guest.state != GuestRuntimeType.State.QUEUING: + return _error_result("Guest is not in a queue.") + if not _transition_is_available(guest, GuestRuntimeType.State.DECIDING, absolute_minute): + return _error_result("Guest cannot atomically replan the queue in this tick.") + var facility_id := guest.target_facility_id + var request_id := guest.queue_request_id + if facility_id.is_empty() or request_id.is_empty(): + return _error_result("Queued guest is missing a facility or request.") + if release_callback.is_valid(): + var external_result: Variant = release_callback.call(guest_id, facility_id, request_id) + if not _callback_succeeded(external_result): + return _error_result("Facility queue removal failed; guest state was not changed.") + guest.target_facility_id = &"" + guest.queue_request_id = &"" + guest.path_handle = null + _apply_transition(guest, GuestRuntimeType.State.DECIDING, absolute_minute, &"FACILITY_CLOSED") + last_error = "" + return { + &"ok": true, + &"facility_id": facility_id, + &"request_id": request_id, + &"patience_remaining": guest.patience_remaining, + } + + +func tick_queue_patience( + guest_id: StringName, + absolute_minute: int, + recovery: int = 0, + leave_queue_callback: Callable = Callable() +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null or guest.state != GuestRuntimeType.State.QUEUING: + return _error_result("Guest is not in a queue.") + var next_patience := maxi(guest.patience_remaining - 1 + recovery, 0) + if next_patience > 0: + guest.patience_remaining = next_patience + last_error = "" + return {&"ok": true, &"abandoned": false, &"patience_remaining": next_patience} + ## Preflight every internal mutation before invoking the external queue owner. + if not _transition_is_available(guest, GuestRuntimeType.State.ABANDONING, absolute_minute): + return _error_result("Guest cannot atomically abandon the queue in this tick.") + var facility_id := guest.target_facility_id + var request_id := guest.queue_request_id + if leave_queue_callback.is_valid(): + var external_result: Variant = leave_queue_callback.call( + guest_id, + facility_id, + request_id + ) + if not _callback_succeeded(external_result): + return _error_result("Facility queue removal failed; guest state was not changed.") + guest.patience_remaining = 0 + guest.target_facility_id = &"" + guest.queue_request_id = &"" + guest.path_handle = null + _apply_transition(guest, GuestRuntimeType.State.ABANDONING, absolute_minute, &"PATIENCE_EXHAUSTED") + guest_queue_abandoned.emit(guest_id, facility_id, request_id) + last_error = "" + return {&"ok": true, &"abandoned": true, &"patience_remaining": 0} + + +func begin_service( + guest_id: StringName, + facility_id: StringName, + service_id: StringName, + absolute_minute: int +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null or facility_id.is_empty() or service_id.is_empty(): + return _error_result("Guest, facility and service are required.") + if not _transition_is_available(guest, GuestRuntimeType.State.RECEIVING_SERVICE, absolute_minute): + return _error_result("Guest cannot begin service in this tick.") + guest.target_facility_id = facility_id + guest.current_service_id = service_id + guest.queue_request_id = &"" + _apply_transition(guest, GuestRuntimeType.State.RECEIVING_SERVICE, absolute_minute, &"SERVICE_STARTED") + last_error = "" + return {&"ok": true, &"service_id": service_id} + + +func interrupt_service( + guest_id: StringName, + service_id: StringName, + absolute_minute: int, + interrupt_callback: Callable = Callable() +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null or service_id.is_empty(): + return _error_result("Guest and service are required.") + if guest.interrupted_service_ids.has(service_id): + return {&"ok": true, &"replayed": true, &"service_id": service_id} + if guest.current_service_id != service_id: + return _error_result("Guest is not receiving the specified service.") + if not _transition_is_available(guest, GuestRuntimeType.State.INTERRUPTED, absolute_minute): + return _error_result("Guest cannot enter INTERRUPTED in this tick.") + if interrupt_callback.is_valid(): + var external_result: Variant = interrupt_callback.call(guest_id, service_id) + if not _callback_succeeded(external_result): + return _error_result("Service interruption callback failed.") + guest.interrupted_service_ids.append(service_id) + guest.interrupted_service_ids.sort_custom( + func(a: StringName, b: StringName) -> bool: return String(a) < String(b) + ) + guest.current_service_id = &"" + _apply_transition(guest, GuestRuntimeType.State.INTERRUPTED, absolute_minute, &"FACILITY_STOPPED") + last_error = "" + return {&"ok": true, &"replayed": false, &"service_id": service_id} + + +func complete_service( + guest_id: StringName, + service_id: StringName, + absolute_minute: int, + satisfaction_sample: int, + need_effects: Dictionary = {} +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null or guest.current_service_id != service_id: + return _error_result("Guest is not receiving the specified service.") + var normalized_effects: Variant = _normalized_partial_need_map(need_effects) + if not normalized_effects is Dictionary: + return _error_result("Service Need effects must use canonical integer Need IDs.") + if not _transition_is_available(guest, GuestRuntimeType.State.DECIDING, absolute_minute): + return _error_result("Guest cannot complete service in this tick.") + var sample := clampi(satisfaction_sample, 0, 100) + guest.satisfaction_total += sample + guest.satisfaction_samples += 1 + for need_id: StringName in NEED_IDS: + var effect := int(normalized_effects.get(need_id, 0)) + guest.needs[need_id] = clampi(int(guest.needs[need_id]) + effect, 0, 100) + if not guest.target_facility_id.is_empty() \ + and not guest.visited_facility_ids.has(guest.target_facility_id): + guest.visited_facility_ids.append(guest.target_facility_id) + guest.visited_facility_ids.sort_custom( + func(a: StringName, b: StringName) -> bool: return String(a) < String(b) + ) + guest.current_service_id = &"" + guest.queue_request_id = &"" + guest.target_facility_id = &"" + _apply_transition(guest, GuestRuntimeType.State.DECIDING, absolute_minute, &"SERVICE_COMPLETED") + last_error = "" + return {&"ok": true, &"satisfaction_sample": sample} + + +func record_path_failure( + guest_id: StringName, + absolute_minute: int, + recovery_targets: Array = [], + reachability_callback: Callable = Callable() +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + guest.path_failure_count += 1 + if guest.path_failure_count < PATH_FAILURE_LIMIT: + if guest.state != GuestRuntimeType.State.REPLANNING: + var transition := transition_guest( + guest_id, + GuestRuntimeType.State.REPLANNING, + absolute_minute, + &"PATH_INVALID" + ) + if not bool(transition.get(&"ok", false)): + return transition + last_error = "" + return { + &"ok": true, + &"recovery_started": false, + &"failure_count": guest.path_failure_count, + } + + var selected := _select_recovery_target(guest, recovery_targets, reachability_callback) + if selected.is_empty(): + ## A virtual emergency egress is preferable to leaving an entity stranded. + selected = { + &"kind": &"emergency_despawn", + &"cell": guest.current_cell, + &"path_handle": {&"virtual_evacuation": true}, + } + if not _transition_is_available(guest, GuestRuntimeType.State.LEAVING, absolute_minute): + return _error_result("Guest cannot enter safe recovery in this tick.") + guest.recovery_kind = StringName(_value(selected, &"kind", &"emergency_exit")) + guest.recovery_target_cell = _vector3i(_value(selected, &"cell", guest.current_cell)) + guest.path_handle = _copy(_value(selected, &"path_handle", { + &"recovery": true, + &"target_cell": guest.recovery_target_cell, + })) + guest.target_facility_id = &"" + guest.queue_request_id = &"" + guest.current_service_id = &"" + guest.exit_reason = &"PATH_RECOVERY" + _apply_transition(guest, GuestRuntimeType.State.LEAVING, absolute_minute, &"PATH_FAILURE_LIMIT") + _diagnostics.append({ + &"code": &"GUEST_PATH_RECOVERY", + &"guest_id": String(guest_id), + &"minute": absolute_minute, + &"failure_count": guest.path_failure_count, + &"recovery_kind": String(guest.recovery_kind), + &"target_cell": _cell_to_array(guest.recovery_target_cell), + }) + guest_recovery_started.emit(guest_id, guest.recovery_kind, guest.recovery_target_cell) + last_error = "" + return { + &"ok": true, + &"recovery_started": true, + &"failure_count": guest.path_failure_count, + &"recovery_kind": guest.recovery_kind, + &"target_cell": guest.recovery_target_cell, + } + + +func record_path_success(guest_id: StringName, cell: Vector3i, absolute_minute: int) -> bool: + var guest := get_guest(guest_id) + if guest == null or absolute_minute < 0: + return _fail("A valid guest and minute are required.") + guest.current_cell = cell + guest.last_progress_cell = cell + guest.last_progress_at = absolute_minute + guest.path_failure_count = 0 + guest.recovery_kind = &"" + last_error = "" + return true + + +func note_movement( + guest_id: StringName, + cell: Vector3i, + absolute_minute: int, + recovery_targets: Array = [], + reachability_callback: Callable = Callable() +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + if cell != guest.last_progress_cell: + record_path_success(guest_id, cell, absolute_minute) + return {&"ok": true, &"progressed": true, &"replanned": false} + guest.current_cell = cell + if absolute_minute - guest.last_progress_at < STUCK_REPLAN_MINUTES: + return {&"ok": true, &"progressed": false, &"replanned": false} + guest.last_progress_at = absolute_minute + var result := record_path_failure( + guest_id, + absolute_minute, + recovery_targets, + reachability_callback + ) + result[&"progressed"] = false + result[&"replanned"] = true + return result + + +func begin_leaving( + guest_id: StringName, + absolute_minute: int, + reason: StringName +) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + if not _transition_is_available(guest, GuestRuntimeType.State.LEAVING, absolute_minute): + return _error_result("Guest cannot begin leaving in this tick.") + guest.target_facility_id = &"" + guest.queue_request_id = &"" + guest.current_service_id = &"" + guest.exit_reason = reason + _apply_transition(guest, GuestRuntimeType.State.LEAVING, absolute_minute, reason) + last_error = "" + return {&"ok": true} + + +func despawn_guest(guest_id: StringName, absolute_minute: int) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return _error_result("Unknown guest: %s" % guest_id) + if guest.state != GuestRuntimeType.State.LEAVING \ + and guest.state != GuestRuntimeType.State.DESPAWNING: + return _error_result("Only a leaving guest can despawn.") + if guest.state != GuestRuntimeType.State.DESPAWNING: + if not _transition_is_available(guest, GuestRuntimeType.State.DESPAWNING, absolute_minute): + return _error_result("Guest cannot enter DESPAWNING in this tick.") + _apply_transition(guest, GuestRuntimeType.State.DESPAWNING, absolute_minute, &"EXIT_REACHED") + var record := { + &"guest_id": String(guest.guest_id), + &"guest_type_id": String(guest.guest_type_id), + &"debt_gold": guest.debt_gold, + &"unresolved_incident_ids": _names_to_strings(guest.unresolved_incident_ids), + &"outstanding_reservation_ids": _names_to_strings(guest.outstanding_reservation_ids), + } + _persistent_records[guest_id] = record + _guests.erase(guest_id) + _pending_spawn_notifications.erase(guest_id) + _guest_order_dirty = true + _decision_rejections.erase(guest_id) + guest_despawned.emit(guest_id, record.duplicate(true)) + last_error = "" + return {&"ok": true, &"persistent_record": record.duplicate(true)} + + +func create_snapshot() -> Dictionary: + var saved_definitions: Array[Dictionary] = [] + for guest_type_id: StringName in _sorted_ids(_definitions.keys()): + saved_definitions.append((_definitions[guest_type_id] as GuestDefinition).create_snapshot()) + var saved_guests: Array[Dictionary] = [] + for guest_id: StringName in _ordered_guest_ids(): + saved_guests.append((_guests[guest_id] as GuestRuntime).create_snapshot()) + var saved_records: Array[Dictionary] = [] + for guest_id: StringName in _sorted_ids(_persistent_records.keys()): + saved_records.append((_persistent_records[guest_id] as Dictionary).duplicate(true)) + return { + &"version": SNAPSHOT_VERSION, + &"current_minute": current_minute, + &"definitions": saved_definitions, + &"guests": saved_guests, + &"persistent_records": saved_records, + &"diagnostics": _diagnostics.duplicate(true), + } + + +func restore_snapshot(snapshot: Dictionary) -> bool: + var raw_version: Variant = snapshot.get(&"version", snapshot.get("version", null)) + if not raw_version is int or int(raw_version) not in [1, SNAPSHOT_VERSION]: + return _fail("Unsupported GuestService snapshot version.") + var prepared: Variant = snapshot.duplicate(true) + if int(raw_version) == 1: + prepared = _migrate_v1_snapshot(snapshot) + if not prepared is Dictionary: + return _fail("GuestService v1 Need schema is invalid or mixed.") + var candidate: Dictionary = prepared + if not candidate.get(&"definitions", null) is Array \ + or not candidate.get(&"guests", null) is Array \ + or not candidate.get(&"persistent_records", null) is Array \ + or not candidate.get(&"diagnostics", null) is Array: + return _fail("GuestService snapshot arrays are missing.") + var next_minute := int(candidate.get(&"current_minute", -2)) + if next_minute < -1: + return _fail("GuestService snapshot minute is invalid.") + + ## Parse into temporary containers. Live state is replaced only after every + ## cross-reference and invariant has been validated. + var next_definitions: Dictionary = {} + for raw_definition: Variant in candidate[&"definitions"]: + if not raw_definition is Dictionary: + return _fail("Guest definition snapshot has an invalid type.") + var definition := GuestDefinitionType.from_snapshot(raw_definition) + if definition == null or next_definitions.has(definition.guest_type_id): + return _fail("Guest definition snapshot is invalid or duplicated.") + next_definitions[definition.guest_type_id] = definition + + var next_guests: Dictionary = {} + for raw_guest: Variant in candidate[&"guests"]: + if not raw_guest is Dictionary: + return _fail("Guest runtime snapshot has an invalid type.") + var guest := GuestRuntimeType.from_snapshot(raw_guest) + if guest == null or next_guests.has(guest.guest_id): + return _fail("Guest runtime snapshot is invalid or duplicated.") + if not next_definitions.has(guest.guest_type_id): + return _fail("Guest runtime snapshot references an unknown definition.") + next_guests[guest.guest_id] = guest + + var next_records: Dictionary = {} + for raw_record: Variant in candidate[&"persistent_records"]: + if not raw_record is Dictionary or not _persistent_record_is_valid(raw_record): + return _fail("Persistent guest record is invalid.") + var record_id := StringName(raw_record.get(&"guest_id", "")) + if next_records.has(record_id) or next_guests.has(record_id): + return _fail("Persistent guest id is duplicated or still active.") + next_records[record_id] = raw_record.duplicate(true) + + var next_diagnostics: Array[Dictionary] = [] + for raw_diagnostic: Variant in candidate[&"diagnostics"]: + if not raw_diagnostic is Dictionary: + return _fail("Guest diagnostic snapshot has an invalid type.") + next_diagnostics.append(raw_diagnostic.duplicate(true)) + + _definitions = next_definitions + _guests = next_guests + _guest_order_dirty = true + _persistent_records = next_records + _decision_rejections = {} + _diagnostics = next_diagnostics + _pending_spawn_notifications.clear() + _external_mutation_blocked = false + current_minute = next_minute + last_error = "" + return true + + +func validate_invariants() -> Dictionary: + var errors: Array[String] = [] + for guest_type_id: StringName in _sorted_ids(_definitions.keys()): + var definition: GuestDefinition = _definitions[guest_type_id] + if not definition.is_valid() or definition.guest_type_id != guest_type_id: + errors.append("Invalid definition: %s" % guest_type_id) + for guest_id: StringName in _sorted_ids(_guests.keys()): + var guest: GuestRuntime = _guests[guest_id] + if not guest.is_valid() or guest.guest_id != guest_id: + errors.append("Invalid runtime: %s" % guest_id) + elif not _definitions.has(guest.guest_type_id): + errors.append("Unknown guest type for: %s" % guest_id) + if _persistent_records.has(guest_id): + errors.append("Guest is both active and persisted: %s" % guest_id) + for guest_id: StringName in _sorted_ids(_persistent_records.keys()): + if not _persistent_record_is_valid(_persistent_records[guest_id]): + errors.append("Invalid persistent record: %s" % guest_id) + return {&"valid": errors.is_empty(), &"errors": errors} + + +func _migrate_v1_snapshot(snapshot: Dictionary) -> Variant: + var definitions: Variant = snapshot.get(&"definitions", snapshot.get("definitions", null)) + var guests: Variant = snapshot.get(&"guests", snapshot.get("guests", null)) + if not definitions is Array or not guests is Array: + return null + var migrated := snapshot.duplicate(true) + for index: int in range(definitions.size()): + var raw_definition: Variant = definitions[index] + if not raw_definition is Dictionary: + return null + var translated_rates: Variant = _translate_v1_need_map( + _value(raw_definition, &"need_rates", null) + ) + if not translated_rates is Dictionary: + return null + migrated[&"definitions"][index][&"need_rates"] = translated_rates + for index: int in range(guests.size()): + var raw_guest: Variant = guests[index] + if not raw_guest is Dictionary: + return null + var translated_needs: Variant = _translate_v1_need_map( + _value(raw_guest, &"needs", null) + ) + if not translated_needs is Dictionary: + return null + migrated[&"guests"][index][&"needs"] = translated_needs + migrated[&"version"] = SNAPSHOT_VERSION + return migrated + + +static func _translate_v1_need_map(source: Variant) -> Variant: + if not source is Dictionary or source.size() != LEGACY_NEED_IDS.size(): + return null + var legacy: Dictionary = {} + for raw_key: Variant in source: + if not raw_key is String and not raw_key is StringName: + return null + var legacy_id := StringName(raw_key) + if not LEGACY_NEED_IDS.has(legacy_id) or legacy.has(legacy_id): + return null + var raw_value: Variant = source[raw_key] + if not raw_value is int: + return null + legacy[legacy_id] = raw_value + if legacy.size() != LEGACY_NEED_IDS.size(): + return null + return { + &"hunger": legacy[&"hunger"], + &"sleep": legacy[&"rest"], + &"hygiene": 0, + &"medical": legacy[&"safety"], + &"leisure": legacy[&"fun"], + &"intimacy": legacy[&"social"], + } + + +func _need_context_error(context: Dictionary) -> String: + for field_id: StringName in [ + &"dirt", + &"injury", + &"illness", + &"intimacy_day", + &"intimacy_night", + ]: + if not _has_value(context, field_id): + continue + var raw_value: Variant = _value(context, field_id, null) + if not raw_value is int or int(raw_value) < 0 or int(raw_value) > 100: + return "%s must be an integer from 0 through 100." % field_id + for field_id: StringName in [&"is_night", &"work_like_activity", &"unstimulated"]: + if _has_value(context, field_id) and not _value(context, field_id, null) is bool: + return "%s must be boolean." % field_id + if _has_value(context, &"need_effects"): + var effects: Variant = _normalized_partial_need_map( + _value(context, &"need_effects", null) + ) + if not effects is Dictionary: + return "need_effects must contain only canonical integer Need IDs." + return "" + + +static func _normalized_partial_need_map(source: Variant) -> Variant: + if not source is Dictionary or source.size() > NEED_IDS.size(): + return null + var result: Dictionary = {} + for raw_key: Variant in source: + if not raw_key is String and not raw_key is StringName: + return null + var need_id := StringName(raw_key) + if not NEED_IDS.has(need_id) or result.has(need_id): + return null + var raw_value: Variant = source[raw_key] + if not raw_value is int: + return null + result[need_id] = raw_value + return result + + +static func _candidate_need_maps_are_valid(candidate: Dictionary) -> bool: + for field_id: StringName in [&"need_relief", &"need_effects"]: + if not _has_value(candidate, field_id): + continue + var raw_value: Variant = _value(candidate, field_id, null) + if field_id == &"need_relief" and raw_value is int: + continue + if not _normalized_partial_need_map(raw_value) is Dictionary: + return false + return true + + +func _candidate_rejection_reason( + guest: GuestRuntime, + definition: GuestDefinition, + candidate: Dictionary, + context: Dictionary +) -> StringName: + if not _candidate_need_maps_are_valid(candidate): + return &"INVALID_NEED_MAP" + if not bool(_value(candidate, &"inputs_available", true)): + return &"MISSING_INPUTS" + var adult_only := bool(_value( + candidate, + &"adult_only", + _value(candidate, &"requires_adult_verified", false) + )) + if adult_only: + if not definition.adult_verified: + return &"ADULT_NOT_VERIFIED" + if not bool(_value(context, &"adult_content_enabled", true)): + return &"CONTENT_FILTERED" + var required_tags := _name_array(_value(candidate, &"required_guest_tags", [])) + for tag: StringName in required_tags: + if not definition.tags.has(tag): + return &"MISSING_PERMISSION" + var forbidden_tags := _name_array(_value(candidate, &"forbidden_guest_tags", [])) + for tag: StringName in forbidden_tags: + if definition.tags.has(tag): + return &"FORBIDDEN_GUEST_TAG" + var allowed_types := _name_array(_value(candidate, &"allowed_guest_types", [])) + if not allowed_types.is_empty() and not allowed_types.has(guest.guest_type_id): + return &"GUEST_TYPE_NOT_ALLOWED" + if not bool(_value(candidate, &"is_open", _value(candidate, &"open", true))) \ + and not bool(_value(candidate, &"open_at_arrival", false)): + return &"FACILITY_CLOSED" + if not _candidate_is_reachable(guest, candidate, context): + return &"UNREACHABLE" + var travel_minutes := maxi(int(_value(candidate, &"travel_minutes", 0)), 0) + var decision_minute := int(_value(context, &"absolute_minute", current_minute)) + if decision_minute >= 0 and decision_minute + travel_minutes > guest.planned_exit_at: + return &"ETA_AFTER_EXIT" + if not _candidate_is_affordable(guest, definition, candidate): + return &"CANNOT_PAY" + var wait_minutes := maxi(int(_value( + candidate, + &"wait_minutes", + _value(candidate, &"expected_wait", 0) + )), 0) + var hard_limit := maxi(int(_value( + candidate, + &"wait_hard_limit", + _value(context, &"wait_hard_limit", DEFAULT_WAIT_HARD_LIMIT) + )), 0) + if wait_minutes >= hard_limit: + return &"WAIT_HARD_LIMIT" + var risk_level := clampi(int(_value(candidate, &"risk_level", _value(candidate, &"risk", 0))), 0, 100) + if risk_level > definition.risk_tolerance: + return &"RISK_REFUSED" + var illegal_level := clampi(int(_value(candidate, &"illegal_level", 0)), 0, 100) + if illegal_level > 100 - definition.legal_sensitivity \ + and not bool(_value(candidate, &"legal_permission_override", false)): + return &"ILLEGALITY_REFUSED" + var quality := clampi(int(_value(candidate, &"expected_quality", _value(candidate, &"quality", 0))), 0, 100) + var minimum_quality := clampi(int(_value(candidate, &"minimum_quality", definition.minimum_quality)), 0, 100) + if quality < minimum_quality: + return &"QUALITY_TOO_LOW" + return &"" + + +func _candidate_is_reachable( + guest: GuestRuntime, + candidate: Dictionary, + context: Dictionary +) -> bool: + var callback: Callable = _value(context, &"reachability_callback", Callable()) + if callback.is_valid(): + return _callback_succeeded(callback.call(guest, candidate.duplicate(true), context)) + return bool(_value(candidate, &"reachable", true)) + + +func _candidate_is_affordable( + guest: GuestRuntime, + definition: GuestDefinition, + candidate: Dictionary +) -> bool: + var price := _candidate_price(candidate) + var cash_available := guest.wallet_gold + var respect_reserve := bool(_value( + candidate, + &"respect_survival_reserve", + _candidate_is_discretionary(candidate) + )) + if respect_reserve: + cash_available = maxi(cash_available - _survival_reserve(guest, definition), 0) + if price <= cash_available: + return true + if not bool(_value(candidate, &"credit_allowed", _value(candidate, &"allow_credit", false))): + return false + var remaining_credit := maxi(guest.credit_limit_gold - guest.debt_gold, 0) + return price - cash_available <= remaining_credit + + +func _candidate_is_discretionary(candidate: Dictionary) -> bool: + if bool(_value(candidate, &"discretionary", false)): + return true + var category := StringName(_value(candidate, &"service_category", &"")) + if category in [&"leisure", &"entertainment", &"gambling", &"intimacy", &"tourism"]: + return true + var facility_tags := _name_array(_value( + candidate, + &"facility_tags", + _value(candidate, &"tags", []) + )) + for tag: StringName in [&"leisure", &"entertainment", &"gambling", &"adult", &"intimacy"]: + if facility_tags.has(tag): + return true + return false + + +func _survival_reserve(guest: GuestRuntime, definition: GuestDefinition) -> int: + if guest.max_addiction() >= 75: + return 0 + if definition.tags.has(&"spendthrift"): + return guest.wallet_gold / 10 + if definition.tags.has(&"frugal"): + return guest.wallet_gold / 2 + return guest.wallet_gold * 3 / 10 + + +func _candidate_price(candidate: Dictionary) -> int: + return maxi(int(_value( + candidate, + &"estimated_total_gold", + _value(candidate, &"price_gold", _value(candidate, &"quoted_price", 0)) + )), 0) + + +func _price_burden(guest: GuestRuntime, candidate: Dictionary) -> int: + var price := _candidate_price(candidate) + var purchasing_power := maxi(guest.wallet_gold + maxi(guest.credit_limit_gold - guest.debt_gold, 0), 1) + return clampi((price * 100 + purchasing_power - 1) / purchasing_power, 0, 100) + + +func _need_relief(guest: GuestRuntime, candidate: Dictionary) -> int: + var raw_relief: Variant = _value(candidate, &"need_relief", 0) + if raw_relief is int: + return maxi(int(raw_relief), 0) + if not raw_relief is Dictionary: + return 0 + var normalized: Dictionary = _normalized_partial_need_map(raw_relief) + var best := 0 + for need_id: StringName in NEED_IDS: + var relief := maxi(int(normalized.get(need_id, 0)), 0) + best = maxi(best, relief * int(guest.needs[need_id]) / 100) + return best + + +func _candidate_urgency(guest: GuestRuntime, candidate: Dictionary) -> int: + var raw_relief: Variant = _value(candidate, &"need_relief", {}) + if not raw_relief is Dictionary: + return 0 + var normalized: Dictionary = _normalized_partial_need_map(raw_relief) + var result := 0 + for need_id: StringName in NEED_IDS: + if int(normalized.get(need_id, 0)) > 0: + result = maxi(result, int(guest.needs[need_id])) + return result + + +func _primary_need_priority(guest: GuestRuntime, candidate: Dictionary) -> int: + var relief: Variant = _value(candidate, &"need_relief", {}) + if not relief is Dictionary: + return 0 + var normalized: Dictionary = _normalized_partial_need_map(relief) + var priority := 0 + for need: StringName in PRIMARY_NEEDS: + if int(normalized.get(need, 0)) > 0: + priority = maxi(priority, int(guest.needs[need])) + return priority + + +func get_observation(guest_id: StringName) -> Dictionary: + var guest := get_guest(guest_id) + if guest == null: + return {} + var highest := 0 + var primary: Array[StringName] = [] + for need: StringName in PRIMARY_NEEDS: + var value := int(guest.needs[need]) + if value > highest: + highest = value + primary.clear() + if value == highest and value > 0: + primary.append(need) + var observed_needs: Dictionary = {} + for need: StringName in NEED_IDS: + observed_needs[need] = guest.needs[need] + return {&"guest_id": guest.guest_id, &"state": guest.state, &"needs": observed_needs, + &"primary_needs": primary, &"target_facility_id": guest.target_facility_id, + &"wallet_gold": guest.wallet_gold, &"patience": guest.patience_remaining} + + +func _candidate_precedes(a: Dictionary, b: Dictionary) -> bool: + var a_priority := int(a.get(&"need_priority", 0)) + var b_priority := int(b.get(&"need_priority", 0)) + if a_priority != b_priority: + return a_priority > b_priority + var a_utility := int(a[&"utility"]) + var b_utility := int(b[&"utility"]) + if a_utility != b_utility: + return a_utility > b_utility + var a_urgency := int(a[&"urgency"]) + var b_urgency := int(b[&"urgency"]) + if a_urgency != b_urgency: + return a_urgency > b_urgency + var a_travel := int(a[&"travel_minutes"]) + var b_travel := int(b[&"travel_minutes"]) + if a_travel != b_travel: + return a_travel < b_travel + return String(a[&"facility_id"]) < String(b[&"facility_id"]) + + +func _select_recovery_target( + guest: GuestRuntime, + targets: Array, + reachability_callback: Callable +) -> Dictionary: + var ordered: Array[Dictionary] = [] + for raw_target: Variant in targets: + if raw_target is Dictionary: + var target: Dictionary = raw_target.duplicate(true) + target[&"kind"] = StringName(_value(target, &"kind", &"emergency_exit")) + target[&"cell"] = _vector3i(_value(target, &"cell", guest.current_cell)) + ordered.append(target) + ordered.sort_custom( + func(a: Dictionary, b: Dictionary) -> bool: + var a_priority := _recovery_priority(StringName(a[&"kind"])) + var b_priority := _recovery_priority(StringName(b[&"kind"])) + if a_priority != b_priority: + return a_priority < b_priority + return _cell_precedes(a[&"cell"], b[&"cell"]) + ) + for target: Dictionary in ordered: + var reachable := bool(_value(target, &"reachable", true)) + if reachability_callback.is_valid(): + reachable = _callback_succeeded(reachability_callback.call( + guest.current_cell, + target[&"cell"], + guest.guest_id, + target.duplicate(true) + )) + if reachable: + return target + return {} + + +func _recovery_priority(kind: StringName) -> int: + match kind: + &"guidance", &"guidance_point": + return 0 + &"entrance", &"main_entrance": + return 1 + &"emergency_exit", &"emergency_egress": + return 2 + _: + return 3 + + +func _transition_is_available(guest: GuestRuntime, new_state: int, minute: int) -> bool: + if minute < 0 or not _is_allowed_transition(guest.state, new_state): + return false + var count := guest.transitions_this_tick if guest.transition_tick == minute else 0 + return count < MAX_TRANSITIONS_PER_TICK + + +func _apply_transition( + guest: GuestRuntime, + new_state: int, + absolute_minute: int, + reason: StringName +) -> void: + var old_state := guest.state + if guest.transition_tick != absolute_minute: + guest.transition_tick = absolute_minute + guest.transitions_this_tick = 0 + guest.transitions_this_tick += 1 + guest.state = new_state as GuestRuntime.State + guest.state_entered_at = absolute_minute + guest_state_changed.emit(guest.guest_id, old_state, new_state, reason) + + +func _force_loop_guard(guest: GuestRuntime, absolute_minute: int) -> void: + var old_state := guest.state + guest.state = GuestRuntimeType.State.DECIDING + guest.state_entered_at = absolute_minute + guest.transition_tick = absolute_minute + guest.transitions_this_tick = MAX_TRANSITIONS_PER_TICK + guest.target_facility_id = &"" + guest.queue_request_id = &"" + guest.current_service_id = &"" + guest.path_handle = null + _diagnostics.append({ + &"code": &"AI_LOOP_GUARD", + &"guest_id": String(guest.guest_id), + &"minute": absolute_minute, + }) + guest_state_changed.emit( + guest.guest_id, + old_state, + GuestRuntimeType.State.DECIDING, + &"AI_LOOP_GUARD" + ) + + +func _is_allowed_transition(from_state: int, to_state: int) -> bool: + if from_state == to_state: + return true + if to_state in [ + GuestRuntimeType.State.LEAVING, + GuestRuntimeType.State.FLEEING, + GuestRuntimeType.State.INCAPACITATED, + ]: + return from_state != GuestRuntimeType.State.DESPAWNING + match from_state: + GuestRuntimeType.State.SPAWNING: + return to_state in [GuestRuntimeType.State.ENTERING, GuestRuntimeType.State.DECIDING] + GuestRuntimeType.State.ENTERING: + return to_state in [GuestRuntimeType.State.DECIDING, GuestRuntimeType.State.MOVING] + GuestRuntimeType.State.DECIDING: + return to_state in [GuestRuntimeType.State.MOVING, GuestRuntimeType.State.QUEUING] + GuestRuntimeType.State.MOVING: + return to_state in [ + GuestRuntimeType.State.QUEUING, + GuestRuntimeType.State.RECEIVING_SERVICE, + GuestRuntimeType.State.DECIDING, + GuestRuntimeType.State.REPLANNING, + ] + GuestRuntimeType.State.QUEUING: + return to_state in [ + GuestRuntimeType.State.RECEIVING_SERVICE, + GuestRuntimeType.State.ABANDONING, + GuestRuntimeType.State.DECIDING, + ] + GuestRuntimeType.State.RECEIVING_SERVICE: + return to_state in [GuestRuntimeType.State.DECIDING, GuestRuntimeType.State.INTERRUPTED] + GuestRuntimeType.State.REPLANNING: + return to_state in [GuestRuntimeType.State.MOVING, GuestRuntimeType.State.DECIDING] + GuestRuntimeType.State.ABANDONING, GuestRuntimeType.State.INTERRUPTED: + return to_state == GuestRuntimeType.State.DECIDING + GuestRuntimeType.State.FLEEING: + return to_state in [GuestRuntimeType.State.LEAVING, GuestRuntimeType.State.DESPAWNING] + GuestRuntimeType.State.LEAVING: + return to_state == GuestRuntimeType.State.DESPAWNING + _: + return false + + +static func _callback_succeeded(result: Variant) -> bool: + if result == null: + return true + if result is bool: + return result + if result is Dictionary: + return bool(result.get(&"ok", result.get("ok", result.get(&"success", result.get("success", false))))) + if result is Object and result.has_method("is_success"): + return bool(result.call("is_success")) + return false + + +static func _persistent_record_is_valid(record: Dictionary) -> bool: + if StringName(record.get(&"guest_id", "")).is_empty(): + return false + if StringName(record.get(&"guest_type_id", "")).is_empty(): + return false + if int(record.get(&"debt_gold", -1)) < 0: + return false + return record.get(&"unresolved_incident_ids", null) is Array \ + and record.get(&"outstanding_reservation_ids", null) is Array + + +static func _facility_id(candidate: Dictionary) -> StringName: + return StringName(_value( + candidate, + &"facility_id", + _value(candidate, &"instance_id", &"") + )) + + +static func _name_array(source: Variant) -> Array[StringName]: + var result: Array[StringName] = [] + if not source is Array: + return result + for raw_value: Variant in source: + var value := StringName(raw_value) + if not value.is_empty() and not result.has(value): + result.append(value) + result.sort_custom(func(a: StringName, b: StringName) -> bool: return String(a) < String(b)) + return result + + +static func _sorted_ids(source: Array) -> Array[StringName]: + var result: Array[StringName] = [] + for raw_value: Variant in source: + result.append(StringName(raw_value)) + result.sort_custom(func(a: StringName, b: StringName) -> bool: return String(a) < String(b)) + return result + + +func _ordered_guest_ids() -> Array[StringName]: + if _guest_order_dirty: + _sorted_guest_ids_cache = _sorted_ids(_guests.keys()) + _guest_order_dirty = false + return _sorted_guest_ids_cache + + +static func _value(source: Dictionary, key: StringName, fallback: Variant) -> Variant: + if source.has(key): + return source[key] + var string_key := String(key) + return source[string_key] if source.has(string_key) else fallback + + +static func _has_value(source: Dictionary, key: StringName) -> bool: + return source.has(key) or source.has(String(key)) + + +static func _need_report(values: Dictionary) -> Dictionary: + # Matches _string_key_dictionary's canonical lexical key order without + # allocating and sorting a six-key array for every guest and minute. + return { + "hunger": int(values[&"hunger"]), + "hygiene": int(values[&"hygiene"]), + "intimacy": int(values[&"intimacy"]), + "leisure": int(values[&"leisure"]), + "medical": int(values[&"medical"]), + "sleep": int(values[&"sleep"]), + } + + +static func _copy(value: Variant) -> Variant: + if value is Array or value is Dictionary: + return value.duplicate(true) + return value + + +static func _vector3i(value: Variant) -> Vector3i: + if value is Vector3i: + return value + if value is Array and value.size() == 3: + return Vector3i(int(value[0]), int(value[1]), int(value[2])) + return Vector3i.ZERO + + +static func _cell_to_array(cell: Vector3i) -> Array[int]: + return [cell.x, cell.y, cell.z] + + +static func _cell_precedes(a: Vector3i, b: Vector3i) -> bool: + if a.z != b.z: + return a.z < b.z + if a.y != b.y: + return a.y < b.y + return a.x < b.x + + +static func _names_to_strings(source: Array[StringName]) -> Array[String]: + var result: Array[String] = [] + for value: StringName in source: + result.append(String(value)) + return result + + +static func _string_key_dictionary(source: Dictionary) -> Dictionary: + var result: Dictionary = {} + var keys: Array = source.keys() + keys.sort_custom(func(a: Variant, b: Variant) -> bool: return String(a) < String(b)) + for raw_key: Variant in keys: + result[String(raw_key)] = source[raw_key] + return result + + +func _fail(message: String) -> bool: + last_error = message + return false + + +func _error_result(message: String) -> Dictionary: + last_error = message + return {&"ok": false, &"error": message} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/022-simulation_runtime.gd b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/022-simulation_runtime.gd new file mode 100644 index 0000000..c9c204c --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/022-simulation_runtime.gd @@ -0,0 +1,13548 @@ +class_name SimulationRuntimeService +extends Node + +signal command_completed(result: CommandResult) +signal snapshot_published(snapshot: Dictionary, digest: String) +# UI subscribers only need notification; exact snapshots remain available. +signal state_updated(snapshot: Dictionary) +signal definition_validation_failed(report: Dictionary) +signal save_operation_completed(result: Dictionary) +# Optional, read-only UI contribution collected at the actual checkpoint. +signal checkpoint_presentation_requested(presentation: Dictionary) + +const DEFAULT_WORLD_SEED := 20260827 +const STARTER_MANA_OUTPUT := 100 +const STARTER_MANA_SOURCE := &"world_tree.mana_source" +const STARTER_MANA_BUS := &"world_tree.mana_bus" +const PLAYER_CASH_ACCOUNT := &"PLAYER_CASH" +const CONSTRUCTION_EXPENSE_ACCOUNT := &"CONSTRUCTION_EXPENSE" +const OPERATING_EXPENSE_ACCOUNT := &"OPERATING_EXPENSE" +const AUTHORITY_FINE_ACCOUNT := &"AUTHORITY_FINE_EXPENSE" +const WAGE_EXPENSE_ACCOUNT := &"WAGE_EXPENSE" +const RUNTIME_SNAPSHOT_VERSION := 14 +const AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 14 +const EVENT_THREAT_RUNTIME_SNAPSHOT_VERSION := 13 +const MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION := 15 +const PurchaseQuoteV2 := preload("res://scripts/supply/supply_purchase_quote_v2.gd") +const AutoPurchasePlansType := preload("res://scripts/supply/supply_auto_purchase_quote_plans.gd") +const CLEANING_RUNTIME_SNAPSHOT_VERSION := 12 +const WEATHER_RUNTIME_SNAPSHOT_VERSION := 11 +const FacilityCleanliness = preload("res://scripts/environment/facility_cleanliness_service.gd") +const CleaningBridge = preload("res://scripts/environment/facility_cleaning_bridge.gd") +const CleaningPolicy = preload("res://scripts/environment/facility_cleaning_policy.gd") +const UPKEEP_RUNTIME_SNAPSHOT_VERSION := 10 +const WeatherTimeline = preload("res://scripts/environment/weather_timeline.gd") +const STAIRS_RUNTIME_SNAPSHOT_VERSION := 9 +const TRANSPORT_RUNTIME_SNAPSHOT_VERSION := 8 +const SUPPLY_RUNTIME_SNAPSHOT_VERSION := 7 +const INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION := 6 +const LEGACY_RUNTIME_SNAPSHOT_VERSION := 1 +const DEFENSE_RUNTIME_SNAPSHOT_VERSION := 2 +const PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION := 3 +const CONTENT_RUNTIME_SNAPSHOT_VERSION := 4 +const OPERATIONS_RUNTIME_SNAPSHOT_VERSION := 5 +const MVP_CONTENT_MANIFEST_VERSION := 2 +const OPERATIONS_RUNTIME_WRAPPER_VERSION := 1 +const OPERATIONS_START_MINUTE := 360 +const OPERATIONS_COORDINATOR_ORIGIN_MINUTE := 359 +const MAX_PERSONAL_ACTION_POINTS := 4 +const OPERATIONS_TEST_PREPARE_PHASE: StringName = &"PREPARE" +const OPERATIONS_TEST_AFTER_FIRST_MUTATION_PHASE: StringName = &"AFTER_FIRST_MUTATION" +const DEFAULT_OPERATIONS_DEMAND_PROFILES := [ + {&"facility_tag": &"hygiene", &"guest_class": &"cleric", &"time_band": &"MORNING"}, + {&"facility_tag": &"service", &"guest_class": &"diplomat", &"time_band": &"MORNING"}, + {&"facility_tag": &"lodging", &"guest_class": &"mage", &"time_band": &"DAY"}, + {&"facility_tag": &"service", &"guest_class": &"merchant", &"time_band": &"DAY"}, + {&"facility_tag": &"lodging", &"guest_class": &"noble", &"time_band": &"EVENING"}, + {&"facility_tag": &"dining", &"guest_class": &"warrior", &"time_band": &"EVENING"}, + {&"facility_tag": &"leisure", &"guest_class": &"outsider", &"time_band": &"NIGHT"}, + {&"facility_tag": &"underground", &"guest_class": &"rogue", &"time_band": &"NIGHT"}, +] +const MOVEMENT_CREDIT_SCALE := 1_000 +const STAIR_MOVEMENT_CREDIT := 1_500 +const MIN_MOVEMENT_CREDIT_PER_MINUTE := 250 +const DEFAULT_AUTOSAVE_PATH := "user://saves/autosave" +const SAVE_LIFECYCLE_VERSION := 1 +const DEFAULT_SAVE_POLICY := { + &"enabled": false, + &"daily_checkpoint_enabled": true, + &"autosave_path": DEFAULT_AUTOSAVE_PATH, + &"autosave_generations": SaveService.DEFAULT_AUTOSAVE_GENERATIONS, + &"auto_migrate": true, +} +const RNG_STREAM_IDS: Array[StringName] = [ + &"world", + &"guest_spawn", + &"guest_decision", + &"staff", + &"relationship", + &"authority", + &"defense", + &"event", + &"loot", +] +const DEFENSE_COMMAND_TYPES: Array[StringName] = [ + &"create_defense_raid", + &"register_defense_combatant", + &"register_defense_asset", + &"start_defense_raid", + &"set_defense_retreat_policy", + &"queue_defense_skill", + &"resolve_defense_round", + &"begin_next_defense_wave", + &"retreat_defenders", + &"cancel_defense_raid", +] + +var definition_registry := DefinitionRegistry.new() +var command_queue := CommandQueue.new() +var id_generator := StableIdGenerator.new() +var domain_events := DomainEventStream.new() +var world_service := WorldService.new() +var path_service := PathService.new() +var mana_network_service := ManaNetworkService.new() +var weather := WeatherTimeline.new() +var facility_cleanliness := FacilityCleanliness.new() +var cleaning_policy := CleaningPolicy.new() +var cleaning_bridge := CleaningBridge.new() +var facility_upkeep := FacilityUpkeepAccrual.new() +var upkeep_settlement := FacilityUpkeepSettlement.new() +var economy_service: EconomyService +var construction_resource_state: LedgerBackedResourceState +var operating_resource_state: LedgerBackedResourceState +var inventory_service := InventoryService.new() +var logistics_dispatcher := LogisticsDispatcher.new() +var logistics_requests: Dictionary = {} +var kitchen_production := KitchenProductionService.new() +var supply_management := SupplyManagementService.new() +var auto_purchase_plans := AutoPurchasePlansType.new() +var supply_logistics := SupplyLogisticsBridge.new() +var elevators := ElevatorService.new() +var legacy_stairs := LegacyStairService.new() +var staff_commute := StaffCommuteService.new() +var facility_service := FacilityService.new() +var guest_service := GuestService.new() +var staff_service := StaffService.new() +var mvp_content_catalog := MvpContentCatalog.new() +var mvp_content_report: Dictionary = {} +# Cache only catalog-derived immutable metadata, never GuestDefinition objects. +var _mvp_manifest_cache_catalog: MvpContentCatalog +var _mvp_manifest_cache_generation := -1 +var _mvp_manifest_cache: Dictionary = {} +var progression_service := ProgressionService.new() +var operations_coordinator: OperationsCoordinator +var relationship_service := RelationshipService.new() +var event_service := EventService.new() +var authority_service := AuthorityService.new() +var defense_service := DefenseService.new() +var construction_service: ConstructionService +var excavation_service: ExcavationService +var spatial_subslot_service: SpatialSubslotService +var route_subslot_path_adapter: RouteSubslotPathAdapter +var facility_infrastructure_projector: FacilityInfrastructureProjector +var latest_snapshot: Dictionary = {} +var _latest_digest := "" +var _latest_digest_dirty := false +var latest_digest: String: + get: + if _latest_digest_dirty: + _latest_digest = SimulationDigest.compute(latest_snapshot) + _latest_digest_dirty = false + return _latest_digest +var latest_save_operation_result: Dictionary = {} +var latest_restore_safety_report: Dictionary = {} +var world_seed := DEFAULT_WORLD_SEED +var save_migration_registry := SaveMigrationRegistry.new() + +var _clock: SimulationKernel +var _state: Variant +var _rng_streams: Dictionary = {} +var _executors: Dictionary = {} +var _next_command_id := 1 +var _staffing_projection_enabled := false +var _movement_credits: Dictionary = {} +var _hired_staff_candidate_ids: Dictionary = {} +var _save_policy: Dictionary = DEFAULT_SAVE_POLICY.duplicate(true) +var _last_daily_checkpoint_day := -1 +var _pending_checkpoints: Array[Dictionary] = [] +var _next_checkpoint_request_id := 1 +var _initialized := false +var _active_command_minute := -1 +var _operations_enabled := false +# Transient in-tick execution guards. Persisted timing lives inside Defense. +var _defense_round_attempt_minute := -1 +var _defense_round_attempted_raids: Dictionary = {} +var _defense_automatic_failed_minute := -1 + +var _operations_tick_blocked := false +var _operations_runtime_failure_latched := false +var _operations_runtime_failure_report: Dictionary = {} +var _operations_deferred_runtime_minute := -1 +var _operations_resume_publish_pending := false +var _personal_action_points := 0 +var _operations_test_boundary_hooks: Dictionary = {} +var _operations_transaction_active := false +var _operations_queued_domain_events: Array[SimulationDomainEvent] = [] +var _operations_queued_guest_spawn_notifications: Array[StringName] = [] +var _operations_flushing_guest_spawn_notifications: Dictionary = {} +var _operations_queued_economy_notifications: Array[StringName] = [] +var _operations_flushing_economy_notifications: Dictionary = {} +var _infrastructure_failure_latched := false +var _infrastructure_failure_report: Dictionary = {} +var _construction_completion_transaction_active := false +var _construction_committing_notifications := false +var _construction_queued_domain_events: Array[SimulationDomainEvent] = [] + +func _ready() -> void: + # The autoload is also present in headless test SceneTrees, so merely entering + # the tree must never opt into disk writes. The playable main scene enables + # the production policy explicitly. + if not _initialized: + initialize(GameClock, GameState, DEFAULT_WORLD_SEED) + +func initialize(clock: SimulationKernel, state: Variant, seed := DEFAULT_WORLD_SEED) -> Dictionary: + if _initialized and _clock != null: + _clock.unregister_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.0_weather") + _clock.unregister_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.a_upkeep") + _clock.unregister_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.operations") + _clock.unregister_tick_handler(_clock.TickPhase.APPLY_COMMANDS, &"simulation_runtime.commands") + _clock.unregister_tick_handler(_clock.TickPhase.PUBLISH_SNAPSHOT, &"simulation_runtime.snapshot") + _clock.unregister_tick_handler(_clock.TickPhase.CONSTRUCTION, &"simulation_runtime.construction") + _clock.unregister_tick_handler(_clock.TickPhase.MANA, &"simulation_runtime.mana") + _clock.unregister_tick_handler(_clock.TickPhase.LOGISTICS, &"simulation_runtime.logistics") + _clock.unregister_tick_handler(_clock.TickPhase.FACILITY_COMPLETION, &"simulation_runtime.facilities") + _clock.unregister_tick_handler(_clock.TickPhase.VITALS_AND_ENVIRONMENT, &"simulation_runtime.guest_vitals") + _clock.unregister_tick_handler(_clock.TickPhase.FACILITY_QUEUES, &"simulation_runtime.guest_queues") + _clock.unregister_tick_handler(_clock.TickPhase.INCIDENTS_AND_EVENTS, &"simulation_runtime.authority_incidents") + _clock.unregister_tick_handler(_clock.TickPhase.INCIDENTS_AND_EVENTS, &"simulation_runtime.defense") + _clock.unregister_tick_handler(_clock.TickPhase.INCIDENTS_AND_EVENTS, &"simulation_runtime.relationship_events") + _clock.unregister_tick_handler(_clock.TickPhase.AI_DECISIONS, &"simulation_runtime.staff_ai") + _clock.unregister_tick_handler(_clock.TickPhase.PUBLISH_SNAPSHOT, &"simulation_runtime.zz_save_checkpoints") + _detach_defense_service(defense_service) + _clear_mvp_content_manifest_cache() + _clock = clock + _state = state + world_seed = seed + mvp_content_catalog = MvpContentCatalog.new() + mvp_content_report = mvp_content_catalog.rebuild() + progression_service = ProgressionService.new() + var initial_progression_ok := progression_service.configure(1, { + &"asset_gold": maxi(int(_state.get_resource(&"gold")), 0), + &"faith_lifetime": maxi(int(_state.get_resource(&"faith")), 0), + }) + _hired_staff_candidate_ids.clear() + command_queue = CommandQueue.new() + id_generator = StableIdGenerator.new() + domain_events = DomainEventStream.new() + world_service = WorldService.new() + path_service = PathService.new() + path_service.set_vertical_walk_requires_connector(true) + legacy_stairs = LegacyStairService.new() + legacy_stairs.configure(path_service) + _movement_credits.clear() + _connect_path_performance_signal() + mana_network_service = ManaNetworkService.new() + _initialize_world(maxi(int(_state.world_tree_rank), 1)) + _initialize_mana_network() + _initialize_economy() + _initialize_s2_operations() + _staffing_projection_enabled = false + _initialize_s3_actors() + _initialize_s4_relationship_events() + _initialize_s5_authority() + _initialize_s5_defense() + construction_service = ConstructionService.new(world_service, construction_resource_state) + construction_service.current_minute = _clock.absolute_minute + _connect_construction_signals() + var initial_infrastructure_ok := _initialize_infrastructure_services() + _next_command_id = 1 + _last_daily_checkpoint_day = -1 + _pending_checkpoints.clear() + _next_checkpoint_request_id = 1 + _active_command_minute = -1 + operations_coordinator = null + _operations_enabled = false + _operations_tick_blocked = false + _operations_runtime_failure_latched = false + _operations_runtime_failure_report.clear() + _operations_deferred_runtime_minute = -1 + _operations_resume_publish_pending = false + _personal_action_points = 0 + _operations_test_boundary_hooks.clear() + _operations_transaction_active = false + _operations_queued_domain_events.clear() + _operations_queued_guest_spawn_notifications.clear() + _operations_flushing_guest_spawn_notifications.clear() + _operations_queued_economy_notifications.clear() + _operations_flushing_economy_notifications.clear() + _infrastructure_failure_latched = false + _infrastructure_failure_report.clear() + _construction_completion_transaction_active = false + _construction_committing_notifications = false + _construction_queued_domain_events.clear() + latest_save_operation_result.clear() + latest_restore_safety_report.clear() + _initialize_rng_streams() + supply_logistics = SupplyLogisticsBridge.new() + supply_logistics.configure(self) + cleaning_bridge.configure(self) + elevators = ElevatorService.new() + elevators.configure(path_service) + elevators.synchronize([], _clock.absolute_minute) + staff_commute = StaffCommuteService.new() + staff_commute.configure(self) + _executors.clear() + register_command_executor(&"change_resources", Callable(self, "_execute_change_resources")) + register_command_executor(&"spend_resources", Callable(self, "_execute_spend_resources")) + register_command_executor(&"repay_loan_principal", Callable(self, "_execute_repay_loan_principal")) + register_command_executor(&"build_facility", Callable(self, "_execute_build_facility")) + register_command_executor(&"cancel_construction", Callable(self, "_execute_cancel_construction")) + register_command_executor(&"demolish_facility", Callable(self, "_execute_demolish_facility")) + register_command_executor(&"set_elevator_operation", Callable(self, "_execute_set_elevator_operation")) + register_command_executor(&"start_excavation", Callable(self, "_execute_start_excavation")) + register_command_executor(&"pause_excavation", Callable(self, "_execute_pause_excavation")) + register_command_executor(&"resume_excavation", Callable(self, "_execute_resume_excavation")) + register_command_executor(&"set_world_tree_rank", Callable(self, "_execute_set_world_tree_rank")) + register_command_executor(&"update_progression_metrics", Callable(self, "_execute_update_progression_metrics")) + register_command_executor(&"complete_progression_quest", Callable(self, "_execute_complete_progression_quest")) + register_command_executor(&"acknowledge_operations_pause", Callable(self, "_execute_acknowledge_operations_pause")) + register_command_executor(&"purchase_supplies", Callable(self, "_execute_purchase_supplies")) + register_command_executor(&"set_supply_auto_purchase", Callable(self, "_execute_set_supply_auto_purchase")) + register_command_executor(&"set_kitchen_production", Callable(self, "_execute_set_kitchen_production")) + register_command_executor(&"add_inventory_stack", Callable(self, "_execute_add_inventory_stack")) + register_command_executor(&"create_logistics_request", Callable(self, "_execute_create_logistics_request")) + register_command_executor(&"dispatch_logistics", Callable(self, "_execute_dispatch_logistics")) + register_command_executor(&"advance_logistics_request", Callable(self, "_execute_advance_logistics_request")) + register_command_executor(&"register_guest_wallet", Callable(self, "_execute_register_guest_wallet")) + register_command_executor(&"create_service_request", Callable(self, "_execute_create_service_request")) + register_command_executor(&"set_facility_conditions", Callable(self, "_execute_set_facility_conditions")) + register_command_executor(&"set_facility_policy", Callable(self, "_execute_set_facility_policy")) + register_command_executor(&"leave_facility_queue", Callable(self, "_execute_leave_facility_queue")) + register_command_executor(&"spawn_guest", Callable(self, "_execute_spawn_guest")) + register_command_executor(&"transition_guest", Callable(self, "_execute_transition_guest")) + register_command_executor(&"decide_guest", Callable(self, "_execute_decide_guest")) + register_command_executor(&"register_staff", Callable(self, "_execute_register_staff")) + register_command_executor(&"hire_staff_candidate", Callable(self, "_execute_hire_staff_candidate")) + register_command_executor(&"create_staff_shift", Callable(self, "_execute_create_staff_shift")) + register_command_executor(&"set_staff_schedule_override", Callable(self, "_execute_set_staff_schedule_override")) + register_command_executor(&"set_staff_work_assignment", Callable(self, "_execute_set_staff_work_assignment")) + register_command_executor(&"create_staff_task", Callable(self, "_execute_create_staff_task")) + register_command_executor(&"begin_staff_task", Callable(self, "_execute_begin_staff_task")) + register_command_executor(&"progress_staff_task", Callable(self, "_execute_progress_staff_task")) + register_command_executor(&"create_relationship", Callable(self, "_execute_create_relationship")) + register_command_executor(&"change_relationship", Callable(self, "_execute_change_relationship")) + register_command_executor(&"attack_relationship_shield", Callable(self, "_execute_attack_relationship_shield")) + register_command_executor(&"request_route_lock", Callable(self, "_execute_request_route_lock")) + register_command_executor(&"confirm_route_lock", Callable(self, "_execute_confirm_route_lock")) + register_command_executor(&"register_event_definition", Callable(self, "_execute_register_event_definition")) + register_command_executor(&"enqueue_event", Callable(self, "_execute_enqueue_event")) + register_command_executor(&"reserve_event_choice_cost", Callable(self, "_execute_reserve_event_choice_cost")) + register_command_executor(&"submit_event_choice", Callable(self, "_execute_submit_event_choice")) + register_command_executor(&"report_authority_incident", Callable(self, "_execute_report_authority_incident")) + register_command_executor(&"register_authority_evidence", Callable(self, "_execute_register_authority_evidence")) + register_command_executor(&"discover_authority_evidence", Callable(self, "_execute_discover_authority_evidence")) + register_command_executor(&"evaluate_authority_inspection", Callable(self, "_execute_evaluate_authority_inspection")) + register_command_executor(&"schedule_authority_inspection", Callable(self, "_execute_schedule_authority_inspection")) + register_command_executor(&"start_authority_inspection", Callable(self, "_execute_start_authority_inspection")) + register_command_executor(&"arrive_authority_inspection", Callable(self, "_execute_arrive_authority_inspection")) + register_command_executor(&"plan_authority_inspection", Callable(self, "_execute_plan_authority_inspection")) + register_command_executor(&"advance_authority_inspection", Callable(self, "_execute_advance_authority_inspection")) + register_command_executor(&"inspect_authority_waypoint", Callable(self, "_execute_inspect_authority_waypoint")) + register_command_executor(&"resolve_authority_inspection", Callable(self, "_execute_resolve_authority_inspection")) + register_command_executor(&"depart_authority_inspection", Callable(self, "_execute_depart_authority_inspection")) + register_command_executor(&"create_defense_raid", Callable(self, "_execute_create_defense_raid")) + register_command_executor(&"register_defense_combatant", Callable(self, "_execute_register_defense_combatant")) + register_command_executor(&"register_defense_asset", Callable(self, "_execute_register_defense_asset")) + register_command_executor(&"start_defense_raid", Callable(self, "_execute_start_defense_raid")) + register_command_executor(&"set_defense_retreat_policy", Callable(self, "_execute_set_defense_retreat_policy")) + register_command_executor(&"queue_defense_skill", Callable(self, "_execute_queue_defense_skill")) + register_command_executor(&"resolve_defense_round", Callable(self, "_execute_resolve_defense_round")) + register_command_executor(&"begin_next_defense_wave", Callable(self, "_execute_begin_next_defense_wave")) + register_command_executor(&"retreat_defenders", Callable(self, "_execute_retreat_defenders")) + register_command_executor(&"cancel_defense_raid", Callable(self, "_execute_cancel_defense_raid")) + # Weather commits before upkeep and arrivals, including same-minute retries. + _clock.unregister_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.0_weather") + _clock.register_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.0_weather", Callable(self, "_advance_weather")) + _clock.unregister_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.a_upkeep") + _clock.register_tick_handler(_clock.TickPhase.TIME_BOUNDARIES, &"simulation_runtime.a_upkeep", Callable(self, "_advance_facility_upkeep")) + _clock.register_tick_handler( + _clock.TickPhase.APPLY_COMMANDS, + &"simulation_runtime.commands", + Callable(self, "_process_tick_commands") + ) + _clock.register_tick_handler( + _clock.TickPhase.PUBLISH_SNAPSHOT, + &"simulation_runtime.snapshot", + Callable(self, "_publish_snapshot") + ) + _clock.register_tick_handler( + _clock.TickPhase.MANA, + &"simulation_runtime.mana", + Callable(self, "_advance_mana") + ) + _clock.register_tick_handler( + _clock.TickPhase.CONSTRUCTION, + &"simulation_runtime.construction", + Callable(self, "_advance_construction") + ) + _clock.register_tick_handler( + _clock.TickPhase.LOGISTICS, + &"simulation_runtime.logistics", + Callable(self, "_advance_inventory_and_logistics") + ) + _clock.register_tick_handler( + _clock.TickPhase.FACILITY_COMPLETION, + &"simulation_runtime.facilities", + Callable(self, "_advance_facilities") + ) + _clock.register_tick_handler( + _clock.TickPhase.VITALS_AND_ENVIRONMENT, + &"simulation_runtime.guest_vitals", + Callable(self, "_advance_guest_vitals") + ) + _clock.register_tick_handler( + _clock.TickPhase.FACILITY_QUEUES, + &"simulation_runtime.guest_queues", + Callable(self, "_advance_guest_queues") + ) + _clock.register_tick_handler( + _clock.TickPhase.INCIDENTS_AND_EVENTS, + &"simulation_runtime.authority_incidents", + Callable(self, "_advance_authority_incidents") + ) + _clock.register_tick_handler( + _clock.TickPhase.INCIDENTS_AND_EVENTS, + &"simulation_runtime.defense", + Callable(self, "_advance_defense") + ) + _clock.register_tick_handler( + _clock.TickPhase.INCIDENTS_AND_EVENTS, + &"simulation_runtime.relationship_events", + Callable(self, "_advance_relationship_events") + ) + _clock.register_tick_handler( + _clock.TickPhase.AI_DECISIONS, + &"simulation_runtime.staff_ai", + Callable(self, "_advance_staff_ai") + ) + # The `zz` ID deliberately orders persistence after the published simulation + # snapshot at the final phase of a fully completed minute. + _clock.register_tick_handler( + _clock.TickPhase.PUBLISH_SNAPSHOT, + &"simulation_runtime.zz_save_checkpoints", + Callable(self, "_process_save_checkpoints") + ) + _initialized = true + var report := definition_registry.rebuild_from_paths( + FacilityCatalog.FACILITY_PATHS + FacilityCatalog.INFRASTRUCTURE_FACILITY_PATHS + FacilityCatalog.RESCUE_FACILITY_PATHS + FacilityCatalog.ORIGINAL_FACILITY_PATHS) + var catalog_registration_ok := _catalog_definitions_are_registered(guest_service) + report[&"content_catalog"] = mvp_content_report.duplicate(true) + report[&"progression_initialized"] = initial_progression_ok + report[&"catalog_guest_definitions_registered"] = catalog_registration_ok + report[&"infrastructure_initialized"] = initial_infrastructure_ok + report[&"cleaning_policy_valid"] = not cleaning_policy.create_snapshot().is_empty() + report[&"valid"] = bool(report[&"valid"]) \ + and bool(mvp_content_report.get(&"valid", false)) \ + and catalog_registration_ok \ + and initial_progression_ok \ + and initial_infrastructure_ok \ + and bool(report[&"cleaning_policy_valid"]) \ + and int(_state.world_tree_rank) == ProgressionService.MIN_RANK + if not report[&"valid"]: + _clock.set_paused(true) + definition_validation_failed.emit(report) + _publish_snapshot(_clock.absolute_minute) + return report + +func register_command_executor(command_type: StringName, executor: Callable) -> bool: + if command_type.is_empty() or not executor.is_valid() or _executors.has(command_type): + return false + _executors[command_type] = executor + return true + +func unregister_command_executor(command_type: StringName) -> void: + _executors.erase(command_type) + +func submit_command( + command_type: StringName, + payload: Dictionary = {}, + actor_id: StringName = &"player", + target_id: StringName = &"", + priority := 0, + execute_at := -1, + idempotency_key: StringName = &"" +) -> CommandResult: + if not _initialized: + return CommandResult.failed(CommandResult.Code.EXECUTOR_FAILED, 0, "Simulation runtime is not initialized.") + if _operations_enabled and operations_coordinator != null and operations_coordinator.is_terminal(): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, 0, + "ゲーム終了後は操作できません。帳簿の確認・保存・読み込みは利用できます。", + {&"reason": &"BANKRUPT"} + ) + var scheduled_tick := _clock.absolute_minute if execute_at < 0 else execute_at + var command := SimulationCommand.new( + _next_command_id, + _clock.absolute_minute, + scheduled_tick, + priority, + command_type, + actor_id, + target_id, + payload, + idempotency_key + ) + var enqueue_result := command_queue.enqueue(command) + if not enqueue_result.is_success(): + return enqueue_result + _next_command_id += 1 + if _clock.paused and scheduled_tick <= _clock.absolute_minute: + var resume_snapshot_published := _process_commands(_clock.absolute_minute) + if not resume_snapshot_published: + _publish_snapshot(_clock.absolute_minute) + var completed := command_queue.get_processed_result(command.command_id) + if completed != null: + return completed + return enqueue_result + +func get_rng_stream(stream_id: StringName) -> DeterministicRng: + return _rng_streams.get(stream_id) as DeterministicRng + +func create_snapshot() -> Dictionary: + var rng_data := {} + for stream_id: StringName in _sorted_name_keys(_rng_streams): + var stream: DeterministicRng = _rng_streams[stream_id] + rng_data[String(stream_id)] = stream.snapshot() + var owned_systems := { + &"runtime": { + &"runtime_schema_version": RUNTIME_SNAPSHOT_VERSION, + &"weather": weather.create_snapshot(), + &"world_seed": world_seed, + &"next_command_id": _next_command_id, + &"staffing_projection_enabled": _staffing_projection_enabled, + &"save_lifecycle": { + &"version": SAVE_LIFECYCLE_VERSION, + &"last_daily_checkpoint_day": _last_daily_checkpoint_day, + }, + &"command_queue": command_queue.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"domain_events": domain_events.create_snapshot(), + &"rng_streams": rng_data, + &"world": world_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"movement_credits": _serialize_movement_credits(), + &"mana": mana_network_service.create_snapshot(), + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"inventory": inventory_service.create_snapshot(), + &"kitchen_production": kitchen_production.create_snapshot(), + &"auto_purchase_plans": auto_purchase_plans.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"logistics_dispatcher": logistics_dispatcher.create_snapshot(), + &"logistics_requests": _serialize_logistics_requests(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"guests": guest_service.create_snapshot(), + &"staff": staff_service.create_snapshot(), + &"catalog_manifest": _create_mvp_content_manifest(mvp_content_catalog), + &"progression": progression_service.create_snapshot(), + &"hired_staff_candidate_ids": _serialize_hired_staff_candidate_ids(), + &"operations": _create_operations_runtime_snapshot(), + &"relationships": relationship_service.create_snapshot(), + &"event_definitions": _serialize_event_definitions(), + &"events": event_service.create_snapshot(), + &"authority": authority_service.create_snapshot(), + &"defense": defense_service.create_snapshot(), + &"construction": construction_service.create_snapshot(), + &"excavation": excavation_service.create_snapshot(), + &"spatial_subslots": spatial_subslot_service.create_snapshot(), + &"route_projection": route_subslot_path_adapter.create_snapshot(), + &"facility_infrastructure": facility_infrastructure_projector.create_snapshot(), + }, + } + if PurchaseQuoteV2.has_history(owned_systems[&"runtime"]): + owned_systems[&"runtime"][&"runtime_schema_version"] = MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION + # Every component above returns detached containers. Transfer this fresh + # tree into the envelope instead of deep-copying all component snapshots a + # second time. Keep generic capture's caller-owned-extra contract unchanged. + var snapshot := SimulationSnapshot.capture(_clock, _state) + snapshot[&"systems"] = owned_systems + return snapshot + +func restore_snapshot(snapshot: Dictionary) -> bool: + return _restore_snapshot_internal(snapshot, false) + + +func _restore_snapshot_internal(snapshot: Dictionary, recovery_mode: bool) -> bool: + var active_filter_profile := event_service.get_content_filter_profile() + var staff_repair_report := { + &"automatic_repairs_applied": false, + &"reopened_task_ids": [], + &"released_staff_ids": [], + &"release_failed_task_ids": [], + } + var event_lock_repair_report := { + &"automatic_repairs_applied": false, + &"released_actor_ids": [], + &"released_foreground_instance_id": &"", + &"reason": &"NONE", + } + var validation := SimulationSnapshot.validate(snapshot) + if not validation[&"ok"]: + return false + var systems: Variant = snapshot.get(&"systems", {}) + if not systems is Dictionary or not systems.has(&"runtime") or not systems[&"runtime"] is Dictionary: + return false + var runtime_data: Dictionary = systems[&"runtime"] + var restored_minute := int(snapshot[&"clock"].get(&"absolute_minute", -1)) + if restored_minute < 0: + return false + var runtime_schema_version_value: Variant = runtime_data.get( + &"runtime_schema_version", + runtime_data.get("runtime_schema_version", LEGACY_RUNTIME_SNAPSHOT_VERSION) + ) + if typeof(runtime_schema_version_value) != TYPE_INT: + return false + var runtime_schema_version := int(runtime_schema_version_value) + if runtime_schema_version not in [ + LEGACY_RUNTIME_SNAPSHOT_VERSION, + DEFENSE_RUNTIME_SNAPSHOT_VERSION, + PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION, + CONTENT_RUNTIME_SNAPSHOT_VERSION, + OPERATIONS_RUNTIME_SNAPSHOT_VERSION, + INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION, + SUPPLY_RUNTIME_SNAPSHOT_VERSION, + TRANSPORT_RUNTIME_SNAPSHOT_VERSION, + STAIRS_RUNTIME_SNAPSHOT_VERSION, + UPKEEP_RUNTIME_SNAPSHOT_VERSION, + WEATHER_RUNTIME_SNAPSHOT_VERSION, + CLEANING_RUNTIME_SNAPSHOT_VERSION, + EVENT_THREAT_RUNTIME_SNAPSHOT_VERSION, + RUNTIME_SNAPSHOT_VERSION, + MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION, + ]: + return false + var has_purchase_v2_history := PurchaseQuoteV2.has_history(runtime_data) + if (runtime_schema_version == MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION) != has_purchase_v2_history: + return false + if runtime_schema_version < OPERATIONS_RUNTIME_SNAPSHOT_VERSION \ + and not _legacy_operations_history_is_absent(runtime_data): + return false + if runtime_schema_version < INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION \ + and not _legacy_infrastructure_history_is_absent(runtime_data): + return false + if runtime_schema_version >= OPERATIONS_RUNTIME_SNAPSHOT_VERSION: + if not _runtime_v5_outer_snapshot_shape_is_valid(snapshot): + return false + var runtime_current_keys: Array[StringName] = [ + &"runtime_schema_version", &"world_seed", &"next_command_id", + &"staffing_projection_enabled", &"save_lifecycle", &"command_queue", + &"id_generator", &"domain_events", &"rng_streams", &"world", &"path", + &"movement_credits", &"mana", &"economy", &"inventory", + &"logistics_dispatcher", &"logistics_requests", &"facilities", &"guests", + &"staff", &"catalog_manifest", &"progression", &"hired_staff_candidate_ids", + &"operations", &"relationships", &"event_definitions", &"events", + &"authority", &"defense", &"construction", + ] + if runtime_schema_version >= INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append_array([ + &"excavation", &"spatial_subslots", &"route_projection", + &"facility_infrastructure", + ]) + if runtime_schema_version >= SUPPLY_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"kitchen_production") + if runtime_schema_version >= TRANSPORT_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"elevators") + if runtime_schema_version >= STAIRS_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"legacy_stairs") + if runtime_schema_version >= UPKEEP_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append_array([&"facility_upkeep", &"upkeep_settlement"]) + if runtime_schema_version >= WEATHER_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"weather") + if runtime_schema_version >= CLEANING_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"facility_cleanliness") + if runtime_schema_version >= AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION: + runtime_current_keys.append(&"auto_purchase_plans") + if not _dictionary_has_exact_canonical_keys(runtime_data, runtime_current_keys) \ + or typeof(runtime_data.get(&"runtime_schema_version", null)) != TYPE_INT \ + or typeof(runtime_data.get(&"world_seed", null)) != TYPE_INT \ + or typeof(runtime_data.get(&"next_command_id", null)) != TYPE_INT \ + or typeof(runtime_data.get(&"staffing_projection_enabled", null)) != TYPE_BOOL: + return false + var has_defense_snapshot := runtime_data.has(&"defense") or runtime_data.has("defense") + if runtime_schema_version >= DEFENSE_RUNTIME_SNAPSHOT_VERSION and not has_defense_snapshot: + return false + if runtime_schema_version >= PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION \ + and not runtime_data.get(&"movement_credits", null) is Array: + return false + if runtime_schema_version >= CONTENT_RUNTIME_SNAPSHOT_VERSION \ + and (not runtime_data.get(&"catalog_manifest", null) is Dictionary \ + or not runtime_data.get(&"progression", null) is Dictionary \ + or not runtime_data.get(&"hired_staff_candidate_ids", null) is Array): + return false + if runtime_schema_version >= OPERATIONS_RUNTIME_SNAPSHOT_VERSION \ + and not runtime_data.get(&"operations", null) is Dictionary: + return false + if runtime_schema_version >= INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION: + for infrastructure_key: StringName in [ + &"excavation", &"spatial_subslots", &"route_projection", + &"facility_infrastructure", + ]: + if not runtime_data.get(infrastructure_key, null) is Dictionary: + return false + if runtime_schema_version < SUPPLY_RUNTIME_SNAPSHOT_VERSION and runtime_data.has(&"kitchen_production"): + return false + if runtime_schema_version >= SUPPLY_RUNTIME_SNAPSHOT_VERSION and not runtime_data.get(&"kitchen_production", null) is Dictionary: + return false + if runtime_schema_version < TRANSPORT_RUNTIME_SNAPSHOT_VERSION and runtime_data.has(&"elevators"): + return false + if runtime_schema_version >= TRANSPORT_RUNTIME_SNAPSHOT_VERSION and not runtime_data.get(&"elevators", null) is Dictionary: + return false + if runtime_schema_version < STAIRS_RUNTIME_SNAPSHOT_VERSION and runtime_data.has(&"legacy_stairs"): + return false + if runtime_schema_version >= STAIRS_RUNTIME_SNAPSHOT_VERSION and not runtime_data.get(&"legacy_stairs", null) is Dictionary: + return false + if runtime_schema_version < AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION and runtime_data.has(&"auto_purchase_plans"): + return false + if runtime_schema_version >= AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION and not runtime_data.get(&"auto_purchase_plans", null) is Dictionary: + return false + var restored_catalog := MvpContentCatalog.new() + var restored_catalog_report := restored_catalog.rebuild() + if not bool(restored_catalog_report.get(&"valid", false)): + return false + if runtime_schema_version >= CONTENT_RUNTIME_SNAPSHOT_VERSION \ + and not _saved_content_manifest_matches(restored_catalog, runtime_data): + return false + var restored_last_daily_checkpoint_day := -1 + var save_lifecycle_value: Variant = runtime_data.get(&"save_lifecycle", {}) + if not save_lifecycle_value is Dictionary: + return false + var save_lifecycle: Dictionary = save_lifecycle_value + if not save_lifecycle.is_empty(): + if (runtime_schema_version >= OPERATIONS_RUNTIME_SNAPSHOT_VERSION \ + and (not _dictionary_has_exact_canonical_keys( + save_lifecycle, [&"version", &"last_daily_checkpoint_day"] + ) \ + or typeof(save_lifecycle.get(&"version", null)) != TYPE_INT \ + or typeof(save_lifecycle.get(&"last_daily_checkpoint_day", null)) != TYPE_INT)) \ + or int(save_lifecycle.get(&"version", -1)) != SAVE_LIFECYCLE_VERSION: + return false + restored_last_daily_checkpoint_day = int( + save_lifecycle.get(&"last_daily_checkpoint_day", -1) + ) + if restored_last_daily_checkpoint_day < -1: + return false + if not runtime_data.get(&"command_queue", null) is Dictionary \ + or not runtime_data.get(&"id_generator", null) is Dictionary \ + or not runtime_data.get(&"domain_events", null) is Dictionary \ + or not runtime_data.get(&"rng_streams", null) is Dictionary \ + or not runtime_data.get(&"world", null) is Dictionary \ + or not runtime_data.get(&"path", null) is Dictionary \ + or not runtime_data.get(&"mana", null) is Dictionary \ + or not runtime_data.get(&"economy", null) is Dictionary \ + or not runtime_data.get(&"inventory", null) is Dictionary \ + or not runtime_data.get(&"logistics_dispatcher", null) is Dictionary \ + or not runtime_data.get(&"logistics_requests", null) is Array \ + or not runtime_data.get(&"facilities", null) is Dictionary \ + or not runtime_data.get(&"guests", null) is Dictionary \ + or not runtime_data.get(&"staff", null) is Dictionary \ + or not runtime_data.get(&"relationships", null) is Dictionary \ + or not runtime_data.get(&"event_definitions", null) is Array \ + or not runtime_data.get(&"events", null) is Dictionary \ + or not runtime_data.get(&"authority", null) is Dictionary \ + or (has_defense_snapshot and not runtime_data.get(&"defense", null) is Dictionary) \ + or not runtime_data.get(&"construction", null) is Dictionary: + return false + var restored_queue := CommandQueue.new() + if not restored_queue.restore_snapshot(runtime_data[&"command_queue"]): + return false + if runtime_schema_version < AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION: + # Old saves must not reinterpret an unsupported queued action as a new + # paid feature when loading into this release. Failed historical actions + # remain ordinary recorded history; only resumable pending work is gated. + for row: Dictionary in restored_queue.create_snapshot()["pending"]: + if row["command_type"] == "set_supply_auto_purchase": + return false + var restored_id_generator := StableIdGenerator.new() + if not restored_id_generator.restore_snapshot(runtime_data[&"id_generator"]): + return false + var restored_domain_events := DomainEventStream.new() + if not restored_domain_events.restore_snapshot(runtime_data[&"domain_events"]): + return false + if runtime_schema_version >= OPERATIONS_RUNTIME_SNAPSHOT_VERSION \ + and not _runtime_command_history_crosslinks_are_valid( + runtime_data[&"command_queue"], + int(runtime_data[&"next_command_id"]), + restored_domain_events + ): + return false + var restored_world := WorldService.new() + if not restored_world.restore_snapshot(runtime_data[&"world"]): + return false + var restored_path := PathService.new() + var restored_spatial := SpatialSubslotService.new() + var restored_route_adapter := RouteSubslotPathAdapter.new() + var restored_infrastructure_projector := FacilityInfrastructureProjector.new() + if runtime_schema_version >= INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION: + # Configure against an empty Spatial source before any managed namespace is + # present. Then restore the source, rebuild the base+ROUTE topology, and + # finally restore Path traffic/actors and the two metadata owners. + if not restored_path.rebuild_graph(restored_world.get_walkable_cells()) \ + or not restored_route_adapter.configure( + restored_spatial, restored_path, restored_world.get_walkable_cells() + ) \ + or not restored_infrastructure_projector.configure( + restored_route_adapter, restored_spatial, restored_path + ) \ + or not restored_spatial.restore_snapshot(runtime_data[&"spatial_subslots"]): + return false + var prepared_projection := restored_route_adapter.synchronize_projection( + &"runtime.v6.restore.prepare", + restored_world.get_walkable_cells() + ) + if not prepared_projection.is_success() \ + or not _path_snapshot_cells_match_world( + runtime_data[&"path"], + restored_route_adapter.get_projected_walkable_cells() + ) \ + or not restored_path.restore_snapshot(runtime_data[&"path"]) \ + or not restored_route_adapter.restore_snapshot(runtime_data[&"route_projection"]) \ + or not restored_infrastructure_projector.restore_snapshot( + runtime_data[&"facility_infrastructure"] + ): + return false + else: + if runtime_schema_version >= PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION \ + and not _path_snapshot_cells_match_world( + runtime_data[&"path"], + restored_world.get_walkable_cells() + ): + return false + if not restored_path.restore_snapshot(runtime_data[&"path"]) \ + or not restored_path.rebuild_graph(restored_world.get_walkable_cells()) \ + or not restored_route_adapter.configure( + restored_spatial, restored_path, restored_world.get_walkable_cells() + ) \ + or not restored_infrastructure_projector.configure( + restored_route_adapter, restored_spatial, restored_path + ): + return false + if runtime_schema_version < STAIRS_RUNTIME_SNAPSHOT_VERSION: + var legacy_path_data: Dictionary = runtime_data[&"path"] + if legacy_path_data.has(&"vertical_walk_requires_connector") or legacy_path_data.has(&"transit_actor_ids"): + return false + var restored_legacy_stairs := LegacyStairService.new() + restored_legacy_stairs.configure(restored_path) + if runtime_schema_version >= STAIRS_RUNTIME_SNAPSHOT_VERSION: + if runtime_data[&"path"].get(&"schema_version", -1) != PathService.SNAPSHOT_VERSION \ + or not restored_path.get_vertical_walk_requires_connector() \ + or not restored_legacy_stairs.restore_snapshot(runtime_data[&"legacy_stairs"]): + return false + else: + if restored_path.get_vertical_walk_requires_connector() or not restored_legacy_stairs.migrate_existing_vertical_walks(): + return false + var restored_mana := ManaNetworkService.new() + if not restored_mana.restore_snapshot(runtime_data[&"mana"]): + return false + var restored_economy := EconomyService.new() + if not restored_economy.restore_snapshot(runtime_data[&"economy"]): + return false + if not _loan_principal_ledger_is_valid(restored_economy): + return false + if runtime_schema_version < OPERATIONS_RUNTIME_SNAPSHOT_VERSION: + if not restored_economy.has_account(WAGE_EXPENSE_ACCOUNT) \ + and not restored_economy.register_account(WAGE_EXPENSE_ACCOUNT): + return false + elif not restored_economy.has_account(WAGE_EXPENSE_ACCOUNT): + return false + var restored_upkeep := FacilityUpkeepAccrual.new() + var restored_upkeep_settlement := FacilityUpkeepSettlement.new() + if runtime_schema_version >= UPKEEP_RUNTIME_SNAPSHOT_VERSION: + if not runtime_data.get(&"facility_upkeep") is Dictionary or not runtime_data.get(&"upkeep_settlement") is Dictionary: + return false + if not restored_upkeep.restore_snapshot(runtime_data[&"facility_upkeep"]) \ + or restored_upkeep.get_current_minute() != restored_minute \ + or not restored_upkeep_settlement.restore_snapshot(runtime_data[&"upkeep_settlement"], restored_economy): + return false + if not _upkeep_accrual_crosslinks_are_valid(restored_upkeep, restored_upkeep_settlement): + return false + else: + if runtime_data.has(&"facility_upkeep") or runtime_data.has(&"upkeep_settlement") \ + or restored_economy.has_account(FacilityUpkeepSettlement.EXPENSE) \ + or restored_economy.has_account(FacilityUpkeepSettlement.PAYABLE): + return false + if not FacilityUpkeepSettlement.prepare_accounts(restored_economy) or not restored_upkeep.start_at(restored_minute)[&"ok"]: + return false + var saved_resources: Variant = snapshot[&"game_state"].get(&"resources", null) + if not saved_resources is Dictionary \ + or int(saved_resources.get(&"gold", saved_resources.get("gold", -1))) \ + != restored_economy.get_balance(PLAYER_CASH_ACCOUNT): + return false + var restored_inventory := InventoryService.new() + if not restored_inventory.restore_snapshot(runtime_data[&"inventory"]): + return false + var restored_dispatcher := LogisticsDispatcher.new() + if not restored_dispatcher.restore_snapshot(runtime_data[&"logistics_dispatcher"]): + return false + var restored_logistics: Variant = _deserialize_logistics_requests(runtime_data[&"logistics_requests"]) + if restored_logistics == null: + return false + if restored_dispatcher.restored_snapshot_version == LogisticsDispatcher.LEGACY_SNAPSHOT_VERSION: + if runtime_schema_version >= PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION \ + or not restored_dispatcher.migrate_legacy_assignment_ownership( + _derive_legacy_logistics_ownership( + restored_dispatcher, + restored_logistics, + restored_minute + ) + ): + return false + if not _validate_logistics_dispatcher_crosslinks( + restored_dispatcher, + restored_logistics, + restored_minute + ): + return false + var restored_facilities := FacilityService.new() + if not restored_facilities.restore_snapshot(runtime_data[&"facilities"]): + return false + var restored_guests := GuestService.new() + if not restored_guests.restore_snapshot(runtime_data[&"guests"]): + return false + if runtime_schema_version >= CONTENT_RUNTIME_SNAPSHOT_VERSION: + if not _saved_catalog_guest_definitions_match( + runtime_data[&"guests"], + restored_catalog + ): + return false + elif not _register_or_validate_legacy_catalog_definitions( + restored_guests, + restored_catalog + ): + return false + var restored_staff := StaffService.new() + if recovery_mode: + restored_staff.configure_callbacks( + Callable(), + func( + reservation_ids: Array[StringName], + task: StaffTask, + absolute_minute: int + ) -> Dictionary: + return _release_recovery_task_items( + restored_inventory, + reservation_ids, + task, + absolute_minute + ), + Callable() + ) + var restored_staff_ok := ( + restored_staff.restore_snapshot_with_orphan_recovery(runtime_data[&"staff"]) + if recovery_mode + else restored_staff.restore_snapshot(runtime_data[&"staff"]) + ) + if not restored_staff_ok: + return false + if recovery_mode: + staff_repair_report = restored_staff.last_recovery_repair_report.duplicate(true) + if not staff_repair_report[&"release_failed_task_ids"].is_empty(): + return false + var saved_rank_value: Variant = snapshot[&"game_state"].get(&"world_tree_rank", null) + if not saved_rank_value is int: + return false + var saved_rank := int(saved_rank_value) + var restored_progression := ProgressionService.new() + if runtime_schema_version >= CONTENT_RUNTIME_SNAPSHOT_VERSION: + if not restored_progression.restore_snapshot(runtime_data[&"progression"]): + return false + else: + # Pre-v4 saves never recorded promotion evidence. Rank 1 can be migrated + # from authoritative live facts; a later rank would require guessing which + # requirements and quests were actually satisfied, so it is rejected. + if saved_rank != ProgressionService.MIN_RANK: + return false + var legacy_guest_lifetime := restored_guests.guest_count() \ + + int((runtime_data[&"guests"] as Dictionary)[&"persistent_records"].size()) + if not restored_progression.configure(ProgressionService.MIN_RANK, { + &"active_above_ground_facilities": _count_active_facilities(restored_facilities, false), + &"active_underground_facilities": _count_active_facilities(restored_facilities, true), + &"asset_gold": restored_economy.get_balance(PLAYER_CASH_ACCOUNT), + &"faith_lifetime": maxi(int(saved_resources.get(&"faith", saved_resources.get("faith", 0))), 0), + &"guest_lifetime": legacy_guest_lifetime, + }): + return false + if saved_rank != restored_progression.current_rank \ + or not _strict_variants_equal( + restored_progression.get_rank_bounds(saved_rank), + restored_world.get_bounds() + ) \ + or not _progression_guest_lifetime_matches( + restored_progression, restored_guests + ): + return false + var restored_hired_staff_candidates: Variant + if runtime_schema_version >= CONTENT_RUNTIME_SNAPSHOT_VERSION: + restored_hired_staff_candidates = _deserialize_hired_staff_candidate_ids( + runtime_data[&"hired_staff_candidate_ids"], + restored_catalog + ) + if restored_hired_staff_candidates == null: + return false + else: + restored_hired_staff_candidates = _derive_legacy_hired_staff_candidate_ids( + restored_staff, + runtime_data[&"staff"], + restored_catalog + ) + if not _validate_catalog_staff_crosslinks( + restored_staff, + restored_hired_staff_candidates, + restored_catalog + ): + return false + var restored_operations_state := _parse_operations_runtime_snapshot( + runtime_data.get(&"operations", {}), + runtime_schema_version, + restored_minute, + restored_guests, + restored_staff, + restored_economy, + int(runtime_data.get(&"world_seed", DEFAULT_WORLD_SEED)), + snapshot[&"clock"].get(&"paused", false), + restored_upkeep_settlement + ) + if not bool(restored_operations_state.get(&"ok", false)): + return false + if bool(restored_operations_state.get(&"enabled", false)): + var restored_coordinator: OperationsCoordinator = restored_operations_state[&"coordinator"] + var expected_minimum := 0 + var expected_maximum := 0 + for period: Dictionary in restored_upkeep.get_report()[&"closed_periods"]: + if int(period[&"period_end"]) <= restored_coordinator.current_minute: + expected_minimum += 1 + if int(period[&"period_end"]) <= restored_minute: + expected_maximum += 1 + var actual_count := restored_upkeep_settlement.get_settled_period_count() + if actual_count < expected_minimum or actual_count > expected_maximum: + return false + var restored_movement_credits: Variant + if runtime_schema_version >= PATH_TRAFFIC_RUNTIME_SNAPSHOT_VERSION: + restored_movement_credits = _deserialize_movement_credits( + runtime_data[&"movement_credits"], + restored_minute + ) + if restored_movement_credits == null: + return false + else: + restored_movement_credits = _rebuild_legacy_path_actor_projection( + restored_path, + restored_guests, + restored_staff, + restored_minute + ) + if restored_movement_credits == null: + return false + if not _validate_runtime_path_crosslinks( + restored_path, + restored_guests, + restored_staff, + restored_movement_credits, + restored_minute + ): + return false + var restored_relationships := RelationshipService.new() + if not restored_relationships.restore_snapshot(runtime_data[&"relationships"]): + return false + var restored_events := EventService.new() + for raw_definition: Variant in runtime_data[&"event_definitions"]: + var definition := EventDefinition.from_variant(raw_definition) + if definition == null or not restored_events.register_definition(definition).is_success(): + return false + if not bool(restored_events.validate_definitions().get(&"ok", false)): + return false + var restored_events_ok := ( + restored_events.restore_snapshot_with_lock_recovery(runtime_data[&"events"]) + if recovery_mode + else restored_events.restore_snapshot(runtime_data[&"events"]) + ) + if not restored_events_ok: + return false + if recovery_mode: + event_lock_repair_report = restored_events.last_recovery_repair_report.duplicate(true) + var saved_filter_profile := restored_events.get_content_filter_profile() + var effective_filter_profile := _merge_content_filter_profiles( + active_filter_profile, + saved_filter_profile + ) + restored_events.configure_content_filter( + effective_filter_profile[&"filter_mode"], + effective_filter_profile[&"maximum_content_rating"], + effective_filter_profile[&"disabled_content_tags"] + ) + var restored_authority := AuthorityService.new() + if not restored_authority.restore_snapshot(runtime_data[&"authority"]): + return false + var restored_defense := DefenseService.new() + if has_defense_snapshot: + if not restored_defense.restore_snapshot(runtime_data[&"defense"]): + return false + else: + # Runtime snapshots predating the Defense aggregate migrate to an empty + # aggregate at the saved clock. No external entity or consequence is + # synthesized by this compatibility path. + if not restored_defense.advance_time(restored_minute).is_success(): + return false + var restored_staffing_projection := bool( + runtime_data.get(&"staffing_projection_enabled", false) + ) + var restored_runtime_domain_minute := restored_minute + if bool(restored_operations_state.get(&"enabled", false)): + var restored_operations_coordinator: OperationsCoordinator = ( + restored_operations_state.get(&"coordinator", null) + ) + if int(restored_operations_state.get(&"deferred_runtime_minute", -1)) \ + == restored_minute \ + or (restored_operations_coordinator != null \ + and restored_operations_coordinator.is_terminal()): + restored_runtime_domain_minute = restored_minute - 1 + if not _validate_runtime_crosslinks( + restored_facilities, + restored_guests, + restored_economy, + restored_inventory, + restored_staff, + restored_runtime_domain_minute, + restored_staffing_projection + ): + return false + if restored_authority.current_minute < restored_runtime_domain_minute \ + or restored_authority.current_minute > restored_minute \ + or restored_defense.current_minute < restored_runtime_domain_minute \ + or restored_defense.current_minute > restored_minute: + return false + if not _validate_authority_economy_crosslinks( + restored_authority, + restored_economy, + restored_authority.current_minute + ): + return false + if not _validate_defense_crosslinks( + restored_defense, + restored_staff, + restored_facilities, + restored_defense.current_minute + ): + return false + if not _validate_event_defense_crosslinks(restored_events, restored_defense): + return false + var restored_construction_resource := _create_resource_adapter( + restored_economy, + CONSTRUCTION_EXPENSE_ACCOUNT, + &"CONSTRUCTION", + &"CONSTRUCTION_REFUND", + &"construction_service" + ) + var restored_construction := ConstructionService.new(restored_world, restored_construction_resource) + if not restored_construction.restore_snapshot(runtime_data[&"construction"]): + return false + var restored_excavation := ExcavationService.new( + restored_world, restored_construction_resource + ) + if runtime_schema_version >= INFRASTRUCTURE_RUNTIME_SNAPSHOT_VERSION: + if not restored_excavation.restore_snapshot(runtime_data[&"excavation"]): + return false + else: + restored_excavation.current_minute = restored_construction.current_minute + if not _migrate_legacy_infrastructure_proxies( + restored_construction, + restored_facilities, + restored_infrastructure_projector + ) or not restored_progression.update_metrics({ + &"active_above_ground_facilities": _count_active_facilities( + restored_facilities, false + ), + &"active_underground_facilities": _count_active_facilities( + restored_facilities, true + ), + &"asset_gold": restored_economy.get_balance(PLAYER_CASH_ACCOUNT), + }) or not _validate_runtime_crosslinks( + restored_facilities, + restored_guests, + restored_economy, + restored_inventory, + restored_staff, + restored_runtime_domain_minute, + restored_staffing_projection + ): + return false + if not _validate_construction_facility_crosslinks( + restored_world, + restored_construction, + restored_facilities, + restored_infrastructure_projector + ) or not _validate_infrastructure_crosslinks( + restored_world, + restored_path, + restored_construction, + restored_construction_resource, + restored_excavation, + restored_spatial, + restored_route_adapter, + restored_infrastructure_projector + ): + return false + # Older saves used logical attendance. Migrate their staff capacity once; + # new saves must already agree with physical workplace positions. + for facility: FacilityInstance in restored_facilities.get_instances(): + var present_ids: Array[StringName] = [] + for staff_id: StringName in facility.active_staff_ids: + var worker := restored_staff.get_staff(staff_id) + if not StringName(restored_staff.get_work_assignment(staff_id).get(&"facility_id", &"")).is_empty() and not StaffCommuteService.is_at_facility(worker, facility) and not CleaningBridge.is_deployed(worker, facility, restored_staff): + if runtime_schema_version >= TRANSPORT_RUNTIME_SNAPSHOT_VERSION: + return false + if worker.role_id != &"porter" and worker.current_task_id.is_empty(): + worker.state = StaffRuntime.State.COMMUTING + else: + present_ids.append(staff_id) + if present_ids != facility.active_staff_ids: + restored_facilities.set_operational_status(facility.instance_id, + {&"active_staff_ids": present_ids}, restored_runtime_domain_minute) + var restored_elevators := ElevatorService.new() + restored_elevators.configure(restored_path) + if runtime_schema_version >= TRANSPORT_RUNTIME_SNAPSHOT_VERSION: + if not restored_elevators.restore_snapshot(runtime_data[&"elevators"]): + return false + else: + if not bool(restored_elevators.synchronize([], restored_runtime_domain_minute).get(&"ok", false)): + return false + if not _validate_elevator_crosslinks(restored_elevators, restored_path, restored_construction, + restored_guests, restored_staff, restored_runtime_domain_minute): + return false + for facility: FacilityInstance in restored_facilities.get_instances(): + for staff_id: StringName in facility.active_staff_ids: + if not restored_elevators.get_actor_trip(_staff_path_actor_id(staff_id)).is_empty() and not CleaningBridge.is_deployed(restored_staff.get_staff(staff_id), facility, restored_staff): + return false + var restored_kitchen := KitchenProductionService.new() + restored_kitchen.configure(restored_inventory, restored_facilities, definition_registry, restored_runtime_domain_minute) + if runtime_schema_version >= SUPPLY_RUNTIME_SNAPSHOT_VERSION: + if not restored_kitchen.restore_snapshot(runtime_data[&"kitchen_production"]): + return false + if restored_kitchen.current_minute != restored_runtime_domain_minute or not restored_kitchen.validate_crosslinks(): + return false + if runtime_schema_version == MIMI_PURCHASE_RUNTIME_SNAPSHOT_VERSION \ + and not PurchaseQuoteV2.valid_history(runtime_data, restored_economy): + return false + var restored_auto_purchase := AutoPurchasePlansType.new() + if runtime_schema_version >= AUTO_PURCHASE_RUNTIME_SNAPSHOT_VERSION: + if not restored_auto_purchase.restore_snapshot(runtime_data[&"auto_purchase_plans"], restored_facilities, restored_economy, restored_runtime_domain_minute): + return false + if not SupplyLogisticsBridge.validate_crosslinks(restored_logistics, restored_staff, restored_inventory, restored_facilities): + return false + var restored_weather := WeatherTimeline.new() + if runtime_schema_version >= WEATHER_RUNTIME_SNAPSHOT_VERSION: + if not runtime_data.get(&"weather") is Dictionary or not restored_weather.restore_snapshot(runtime_data[&"weather"]) or restored_weather.get_minute() != restored_minute: + return false + elif runtime_data.has(&"weather") or not restored_weather.initialize(&"clear", restored_minute): + return false + var restored_cleanliness := FacilityCleanliness.new() + if runtime_schema_version >= CLEANING_RUNTIME_SNAPSHOT_VERSION: + if not runtime_data.get(&"facility_cleanliness") is Dictionary or not restored_cleanliness.restore_snapshot(runtime_data[&"facility_cleanliness"]): + return false + else: + if runtime_data.has(&"facility_cleanliness"): + return false + var policy_values := cleaning_policy.create_snapshot() + for facility: FacilityInstance in restored_facilities.get_instances(): + if not restored_cleanliness.register_facility(facility.instance_id, policy_values["initial_cleanliness"], policy_values["maximum_cleanliness"]): + return false + if not _validate_cleanliness_crosslinks(restored_cleanliness, restored_facilities, restored_staff, restored_path): + return false + var restored_world_seed := int(runtime_data.get(&"world_seed", DEFAULT_WORLD_SEED)) + var restored_streams := {} + var saved_streams: Dictionary = runtime_data[&"rng_streams"] + for stream_key: Variant in saved_streams: + if not saved_streams[stream_key] is Dictionary: + return false + var normalized_stream_id := StringName(stream_key) + if normalized_stream_id.is_empty() or restored_streams.has(normalized_stream_id): + return false + var stream := DeterministicRng.from_root_seed(0, normalized_stream_id) as DeterministicRng + if stream == null or not stream.restore(saved_streams[stream_key]) \ + or stream.get_stream_id() != normalized_stream_id \ + or stream.get_root_seed() != restored_world_seed: + return false + restored_streams[normalized_stream_id] = stream + if not restored_streams.has(&"defense"): + if has_defense_snapshot: + return false + restored_streams[&"defense"] = DeterministicRng.from_root_seed(restored_world_seed, &"defense") + if runtime_schema_version >= DEFENSE_RUNTIME_SNAPSHOT_VERSION: + for required_stream_id: StringName in RNG_STREAM_IDS: + if not restored_streams.has(required_stream_id): + return false + var restored_next_id := int(runtime_data.get(&"next_command_id", 0)) + if restored_next_id <= 0: + return false + if not SimulationSnapshot.restore(snapshot, _clock, _state): + return false + world_seed = restored_world_seed + _next_command_id = restored_next_id + _staffing_projection_enabled = restored_staffing_projection + command_queue = restored_queue + id_generator = restored_id_generator + domain_events = restored_domain_events + _rng_streams = restored_streams + world_service = restored_world + path_service = restored_path + _movement_credits = (restored_movement_credits as Dictionary).duplicate(true) + _connect_path_performance_signal() + mana_network_service = restored_mana + weather = restored_weather + facility_cleanliness = restored_cleanliness + facility_upkeep = restored_upkeep + upkeep_settlement = restored_upkeep_settlement + economy_service = restored_economy + inventory_service = restored_inventory + kitchen_production = restored_kitchen + auto_purchase_plans = restored_auto_purchase + logistics_dispatcher = restored_dispatcher + logistics_requests = restored_logistics + facility_service = restored_facilities + guest_service = restored_guests + staff_service = restored_staff + elevators = restored_elevators + legacy_stairs = restored_legacy_stairs + staff_commute.configure(self) + supply_logistics.configure(self) + cleaning_bridge.configure(self) + mvp_content_catalog = restored_catalog + _clear_mvp_content_manifest_cache() + mvp_content_report = restored_catalog_report.duplicate(true) + progression_service = restored_progression + _hired_staff_candidate_ids = (restored_hired_staff_candidates as Dictionary).duplicate(true) + operations_coordinator = restored_operations_state.get(&"coordinator", null) + _operations_enabled = bool(restored_operations_state[&"enabled"]) + _personal_action_points = int(restored_operations_state[&"personal_action_points"]) + _operations_runtime_failure_latched = bool(restored_operations_state[&"runtime_failure_latched"]) + _operations_runtime_failure_report = ( + restored_operations_state[&"runtime_failure_report"] as Dictionary + ).duplicate(true) + _operations_tick_blocked = _operations_should_block_tick() + _operations_deferred_runtime_minute = int( + restored_operations_state[&"deferred_runtime_minute"] + ) + _operations_resume_publish_pending = false + _operations_test_boundary_hooks.clear() + _operations_transaction_active = false + _operations_queued_domain_events.clear() + _operations_queued_guest_spawn_notifications.clear() + _operations_flushing_guest_spawn_notifications.clear() + _operations_queued_economy_notifications.clear() + _operations_flushing_economy_notifications.clear() + relationship_service = restored_relationships + event_service = restored_events + authority_service = restored_authority + _detach_defense_service(defense_service) + defense_service = restored_defense + _reset_defense_round_attempts() + construction_resource_state = restored_construction_resource + operating_resource_state = _create_resource_adapter( + economy_service, + OPERATING_EXPENSE_ACCOUNT, + &"OPERATING_EXPENSE", + &"OPERATING_REFUND", + &"simulation_runtime" + ) + construction_service = restored_construction + excavation_service = restored_excavation + spatial_subslot_service = restored_spatial + route_subslot_path_adapter = restored_route_adapter + facility_infrastructure_projector = restored_infrastructure_projector + _infrastructure_failure_latched = false + _infrastructure_failure_report.clear() + _construction_completion_transaction_active = false + _construction_committing_notifications = false + _construction_queued_domain_events.clear() + _last_daily_checkpoint_day = restored_last_daily_checkpoint_day + _pending_checkpoints.clear() + _next_checkpoint_request_id = 1 + _connect_economy_signals() + _configure_facility_boundaries() + _connect_facility_signals() + _configure_staff_boundaries() + _connect_guest_signals() + _connect_staff_signals() + _configure_relationship_event_boundaries() + _connect_relationship_signals() + _connect_event_signals() + _configure_authority_boundaries() + _connect_authority_signals() + _configure_defense_boundaries() + _connect_defense_signals() + _connect_construction_signals() + var excavation_callback := Callable(self, "_on_excavation_completed") + if not excavation_service.excavation_completed.is_connected(excavation_callback): + excavation_service.excavation_completed.connect(excavation_callback) + if _operations_enabled: + _configure_operations_callbacks() + _register_operations_tick_handler() + else: + _clock.unregister_tick_handler( + _clock.TickPhase.TIME_BOUNDARIES, + &"simulation_runtime.operations" + ) + latest_restore_safety_report = { + &"report_version": 1, + &"recovery_mode": bool(recovery_mode), + &"repair_policy": &"WHITELISTED_AUTHORITATIVE_ONLY", + &"automatic_repairs_applied": ( + bool(staff_repair_report[&"automatic_repairs_applied"]) + or bool(event_lock_repair_report[&"automatic_repairs_applied"]) + ), + &"repairs": { + &"orphan_tasks": staff_repair_report, + &"orphan_event_locks": event_lock_repair_report, + }, + &"content_filter": _content_filter_restore_report( + active_filter_profile, + saved_filter_profile, + effective_filter_profile + ), + &"forbidden_repairs_applied": false, + &"forbidden_repair_categories": [ + &"synthesize_gold", + &"delete_facilities", + &"rewrite_ledger", + &"guess_route_locks", + ], + } + _publish_snapshot(_clock.absolute_minute) + return true + +func configure_save_policy(overrides: Dictionary) -> Dictionary: + var configured := _save_policy.duplicate(true) + if overrides.has(&"enabled"): + configured[&"enabled"] = bool(overrides[&"enabled"]) + if overrides.has(&"daily_checkpoint_enabled"): + configured[&"daily_checkpoint_enabled"] = bool(overrides[&"daily_checkpoint_enabled"]) + if overrides.has(&"auto_migrate"): + configured[&"auto_migrate"] = bool(overrides[&"auto_migrate"]) + if overrides.has(&"autosave_path"): + var autosave_path := str(overrides[&"autosave_path"]) + if not _save_policy_path_is_safe(autosave_path): + return { + &"ok": false, + &"code": &"INVALID_AUTOSAVE_PATH", + &"message": autosave_path, + } + configured[&"autosave_path"] = autosave_path + if overrides.has(&"autosave_generations"): + var generations := int(overrides[&"autosave_generations"]) + if generations < 1 or generations > SaveService.MAX_AUTOSAVE_GENERATIONS: + return { + &"ok": false, + &"code": &"INVALID_AUTOSAVE_GENERATIONS", + &"message": str(generations), + } + configured[&"autosave_generations"] = generations + _save_policy = configured + return { + &"ok": true, + &"code": &"OK", + &"policy": get_save_policy(), + } + + +func enable_production_save_policy() -> Dictionary: + return configure_save_policy({ + &"enabled": true, + &"daily_checkpoint_enabled": true, + &"autosave_path": DEFAULT_AUTOSAVE_PATH, + }) + + +func get_save_policy() -> Dictionary: + return _save_policy.duplicate(true) + + +func get_last_daily_checkpoint_day() -> int: + return _last_daily_checkpoint_day + + +func get_pending_checkpoint_count() -> int: + return _pending_checkpoints.size() + + +func get_latest_restore_safety_report() -> Dictionary: + return latest_restore_safety_report.duplicate(true) + + +func enable_production_operations() -> Dictionary: + if not _initialized or _clock == null or _state == null: + return _operations_api_failure(&"RUNTIME_NOT_INITIALIZED", "Runtime is not initialized.") + if _operations_enabled: + return _operations_api_failure(&"ALREADY_ENABLED", "Production operations are already enabled.") + if _clock.absolute_minute != OPERATIONS_START_MINUTE \ + or _clock.day != 1 or _clock.minute_of_day != OPERATIONS_START_MINUTE: + return _operations_api_failure( + &"INVALID_START_TIME", + "Production operations must start at Day 1 06:00." + ) + if not bool(mvp_content_report.get(&"valid", false)): + return _operations_api_failure(&"CONTENT_INVALID", "MVP content is unavailable.") + if _staff_payroll_arrears_total(staff_service) != 0: + return _operations_api_failure( + &"INITIAL_ARREARS_UNSUPPORTED", + "Production operations cannot infer pre-existing payroll arrears." + ) + if not (staff_service.create_snapshot().get(&"payroll_settlements", []) as Array).is_empty(): + return _operations_api_failure( + &"INITIAL_PAYROLL_HISTORY_UNSUPPORTED", + "Production operations require a fresh Day 1 payroll history." + ) + if _guest_aggregate_has_reserved_operations_id(guest_service): + return _operations_api_failure( + &"RESERVED_GUEST_ID_PRESENT", + "Production operations require the guest-auto namespace to be unused." + ) + var coordinator := OperationsCoordinator.new({ + &"start_minute": OPERATIONS_COORDINATOR_ORIGIN_MINUTE, + &"world_seed": world_seed, + }) + coordinator.configure_callbacks( + Callable(self, "_operations_daily_boundary"), + Callable(self, "_operations_arrival_boundary"), + Callable(self, "_operations_morning_boundary"), + Callable(self, "_operations_midnight_upkeep_boundary") + ) + var demand_configuration := _configure_default_operations_demand(coordinator) + if not demand_configuration.is_success(): + return _operations_api_failure( + &"DEMAND_CONFIGURATION_FAILED", + demand_configuration.message, + demand_configuration.details + ) + var population := coordinator.set_population_count(guest_service.guest_count()) + if not population.is_success(): + return _operations_api_failure( + &"INITIAL_POPULATION_INVALID", + population.message, + population.details + ) + var previous_coordinator := operations_coordinator + var previous_ap := _personal_action_points + var enable_external_before := _capture_operations_external_state() + if enable_external_before.is_empty(): + return _operations_api_failure( + &"INITIAL_CAPTURE_FAILED", + "Production Operations could not capture the initial Runtime state." + ) + operations_coordinator = coordinator + _personal_action_points = 0 + var advanced := coordinator.advance_to(OPERATIONS_START_MINUTE, true) + if not advanced.is_success() \ + or coordinator.current_minute != _clock.absolute_minute \ + or coordinator.get_population_count() != guest_service.guest_count() \ + or coordinator.get_arrears_total() != _operations_closed_arrears_total() \ + or not _operations_notifications_are_committable() \ + or not _commit_operations_domain_events() \ + or not _commit_operations_notifications(): + coordinator.discard_deferred_notifications() + _restore_operations_external_state(enable_external_before) + _discard_operations_domain_events() + operations_coordinator = previous_coordinator + _personal_action_points = previous_ap + return _operations_api_failure( + &"INITIAL_BOUNDARY_FAILED", + advanced.message if not advanced.is_success() else "Initial Operations cross-links failed.", + advanced.details + ) + _operations_enabled = true + _operations_tick_blocked = false + _operations_runtime_failure_latched = false + _operations_runtime_failure_report.clear() + _register_operations_tick_handler() + _pause_for_waiting_foreground_event() + _publish_snapshot(_clock.absolute_minute) + return { + &"ok": true, + &"code": &"OK", + &"enabled": true, + &"current_minute": coordinator.current_minute, + &"personal_action_points": _personal_action_points, + } + + +func acknowledge_operations_pause() -> Dictionary: + if not _operations_enabled or operations_coordinator == null: + return _operations_api_failure(&"OPERATIONS_DISABLED", "Production operations are disabled.") + if operations_coordinator.is_terminal(): + return _operations_api_failure(&"TERMINAL_STATE", "Bankruptcy cannot be acknowledged away.") + if operations_coordinator.is_external_quarantined(): + return _operations_api_failure( + &"EXTERNAL_ROLLBACK_FAILED", + "A verified snapshot restore is required." + ) + if _operations_deferred_runtime_minute < 0: + return _operations_api_failure( + &"NO_DEFERRED_RUNTIME_MINUTE", + "Operations have no deferred Runtime phase suffix." + ) + if _operations_deferred_runtime_minute != _clock.absolute_minute: + return _operations_api_failure( + &"DEFERRED_MINUTE_MISMATCH", + "The deferred Operations minute no longer matches GameClock." + ) + var had_runtime_failure := _operations_runtime_failure_latched + var acknowledged := operations_coordinator.acknowledge_pause() + if not acknowledged.is_success(): + return _operations_api_failure(&"ACKNOWLEDGE_FAILED", acknowledged.message, acknowledged.details) + var deferred_minute := _operations_deferred_runtime_minute + var deferred := operations_coordinator.advance_to(deferred_minute, true) + if not deferred.is_success(): + var partial_commit_ok := _commit_operations_domain_events() \ + and _commit_operations_notifications() + if not partial_commit_ok: + operations_coordinator.discard_deferred_notifications() + _discard_operations_domain_events() + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = deferred.to_dictionary() + _operations_tick_blocked = true + _clock.set_paused(true) + return _operations_api_failure(&"RETRY_FAILED", deferred.message, deferred.details) + if operations_coordinator.current_minute != deferred_minute \ + or operations_coordinator.get_population_count() != guest_service.guest_count() \ + or operations_coordinator.get_arrears_total() != _operations_closed_arrears_total() \ + or not _operations_notifications_are_committable() \ + or not _commit_operations_domain_events() \ + or not _commit_operations_notifications(): + operations_coordinator.discard_deferred_notifications() + _discard_operations_domain_events() + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = { + &"code": &"OPERATIONS_CROSSLINK_MISMATCH", + &"minute": deferred_minute, + } + _operations_tick_blocked = true + _clock.set_paused(true) + return _operations_api_failure( + &"RETRY_CROSSLINK_FAILED", + "Operations retry did not restore Runtime cross-links." + ) + _operations_runtime_failure_latched = false + _operations_runtime_failure_report.clear() + if operations_coordinator.is_terminal(): + _operations_deferred_runtime_minute = -1 + _operations_tick_blocked = true + _clock.set_paused(true) + _publish_snapshot(deferred_minute) + return { + &"ok": true, + &"code": &"TERMINAL_STATE", + &"had_runtime_failure": had_runtime_failure, + &"suffix_replayed": false, + } + if operations_coordinator.pause_requested: + _operations_tick_blocked = true + _clock.set_paused(true) + return _operations_api_failure( + &"PAUSE_REMAINS", + "Operations still require acknowledgement before Runtime phases can resume." + ) + _operations_deferred_runtime_minute = -1 + _operations_tick_blocked = false + _clock.set_paused(false) + _run_operations_deferred_suffix(deferred_minute) + _pause_for_waiting_foreground_event() + if operations_coordinator.get_population_count() != guest_service.guest_count() \ + or operations_coordinator.get_arrears_total() != _operations_closed_arrears_total(): + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = { + &"code": &"DEFERRED_SUFFIX_CROSSLINK_MISMATCH", + &"minute": deferred_minute, + } + _operations_tick_blocked = true + _clock.set_paused(true) + return _operations_api_failure( + &"SUFFIX_CROSSLINK_FAILED", + "Deferred Runtime phases ended with invalid Operations cross-links." + ) + return { + &"ok": true, + &"code": &"OK", + &"had_runtime_failure": had_runtime_failure, + &"coordinator": acknowledged.to_dictionary(), + &"suffix_replayed": true, + &"deferred_runtime_minute": deferred_minute, + } + + +func _run_operations_deferred_suffix(absolute_minute: int) -> void: + _advance_mana(absolute_minute) + _advance_construction(absolute_minute) + _advance_inventory_and_logistics(absolute_minute) + _advance_facilities(absolute_minute) + _advance_guest_vitals(absolute_minute) + _advance_authority_incidents(absolute_minute) + _advance_defense(absolute_minute) + _advance_relationship_events(absolute_minute) + _advance_guest_queues(absolute_minute) + _advance_staff_ai(absolute_minute) + if _active_command_minute >= 0: + _operations_resume_publish_pending = true + else: + _publish_snapshot(absolute_minute) + _process_save_checkpoints(absolute_minute) + + +func get_operations_dashboard_report() -> Dictionary: + return {&"enabled":_operations_enabled, &"arrears_total":_operations_total_arrears(), + &"tick_blocked":_operations_tick_blocked, &"runtime_failure_latched":_operations_runtime_failure_latched, + &"personal_action_points":_personal_action_points, + &"deferred_runtime_minute":_operations_deferred_runtime_minute, + &"coordinator":operations_coordinator.get_dashboard_summary() if operations_coordinator != null else {}} + + +func get_operations_report() -> Dictionary: + return { + &"enabled": _operations_enabled, + &"arrears_total": _operations_total_arrears(), + &"tick_blocked": _operations_tick_blocked, + &"runtime_failure_latched": _operations_runtime_failure_latched, + &"runtime_failure_report": _operations_runtime_failure_report.duplicate(true), + &"deferred_runtime_minute": _operations_deferred_runtime_minute, + &"personal_action_points": _personal_action_points, + &"coordinator": ( + operations_coordinator.create_snapshot() + if operations_coordinator != null else {} + ), + } + + +func set_operations_test_boundary_hook(operation: StringName, callback: Callable) -> bool: + # Test-only fault injection is invoked at PREPARE and, for arrivals, once at + # AFTER_FIRST_MUTATION. The latter proves staged service notifications are + # discarded when a real partial apply is rolled back. + if operation not in [&"DAILY_CLOSE", &"ARRIVAL_PLAN", &"MORNING_BOUNDARY", &"MIDNIGHT_UPKEEP"]: + return false + if callback.is_valid(): + _operations_test_boundary_hooks[operation] = callback + else: + _operations_test_boundary_hooks.erase(operation) + return true + + +func _run_operations_test_boundary_hook( + operation: StringName, + payload: Dictionary, + phase: StringName, + token: Variant +) -> Dictionary: + var callback: Callable = _operations_test_boundary_hooks.get(operation, Callable()) + if not callback.is_valid(): + return {&"ok": true} + var returned: Variant = callback.call(payload.duplicate(true), phase, token) + if returned is bool: + return {&"ok": bool(returned), &"reason": &"TEST_HOOK_REJECTED"} + if returned is Dictionary: + var result: Dictionary = returned + if typeof(result.get(&"ok", null)) == TYPE_BOOL: + return result.duplicate(true) + return {&"ok": false, &"reason": &"TEST_HOOK_INVALID_RESULT"} + + +func _register_operations_tick_handler() -> void: + _clock.unregister_tick_handler( + _clock.TickPhase.TIME_BOUNDARIES, + &"simulation_runtime.operations" + ) + _clock.register_tick_handler( + _clock.TickPhase.TIME_BOUNDARIES, + &"simulation_runtime.operations", + Callable(self, "_advance_operations_time") + ) + + +func _configure_operations_callbacks() -> void: + if operations_coordinator == null: + return + operations_coordinator.configure_callbacks( + Callable(self, "_operations_daily_boundary"), + Callable(self, "_operations_arrival_boundary"), + Callable(self, "_operations_morning_boundary"), + Callable(self, "_operations_midnight_upkeep_boundary") + ) + + +func _configure_default_operations_demand(coordinator: OperationsCoordinator) -> CommandResult: + if coordinator == null or DEFAULT_OPERATIONS_DEMAND_PROFILES.size() != 8: + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + 0, + "The canonical Operations demand profile set is unavailable." + ) + var allowed_classes: Dictionary = {} + for class_id: StringName in mvp_content_catalog.get_guest_class_ids(): + allowed_classes[class_id] = true + var seen_classes: Dictionary = {} + for raw_profile: Variant in DEFAULT_OPERATIONS_DEMAND_PROFILES: + if not raw_profile is Dictionary: + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, 0, + "A canonical Operations demand profile is malformed." + ) + var profile: Dictionary = raw_profile + var guest_class := StringName(profile[&"guest_class"]) + if not allowed_classes.has(guest_class) or seen_classes.has(guest_class): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, 0, + "The canonical Operations demand classes are invalid." + ) + seen_classes[guest_class] = true + var configured := coordinator.set_demand_input( + StringName(profile[&"facility_tag"]), + guest_class, + StringName(profile[&"time_band"]), + { + &"base": 100, + &"reputation": 0, + &"unmet_need": 0, + &"event": 0, + &"recent_price_penalty": 0, + &"wait_penalty": 0, + } + ) + if not configured.is_success(): + return configured + if seen_classes.size() != allowed_classes.size(): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, 0, + "Every MVP Guest class must have exactly one demand profile." + ) + return CommandResult.succeeded(0, {&"profile_count": seen_classes.size()}) + + +func get_facility_upkeep_report(facility_id: StringName) -> Dictionary: + var definition_id: StringName = &"" + var facility := facility_service.get_instance(facility_id) + if facility != null: + definition_id = facility.definition_id + elif construction_service != null: + for built: Dictionary in construction_service.get_facilities(): + if StringName(built[&"instance_id"]) == facility_id: + definition_id = StringName(built[&"definition_id"]) + break + var definition := definition_registry.get_facility(definition_id) + var balance := upkeep_settlement.get_facility_balance(facility_id) + var units := facility_upkeep.get_unsettled_units(facility_id, upkeep_settlement.get_settled_period_count()) + return { + &"facility_id": facility_id, + &"owned": definition != null, + &"daily_rate": definition.maintenance_gold if definition != null else 0, + &"unsettled_units": units + int(balance[&"fraction_units"]), + &"gold_denominator": FacilityUpkeepAccrual.MINUTES_PER_DAY, + &"arrears": balance[&"arrears"], + } + + +func _advance_facility_upkeep(minute: int) -> void: + if _operations_deferred_runtime_minute >= 0: + return + var rates: Dictionary = {} + for facility: FacilityInstance in facility_service.get_instances(): + var definition := definition_registry.get_facility(facility.definition_id) + if definition != null: + rates[String(facility.instance_id)] = definition.maintenance_gold + # Infrastructure modules are completed assets even when they have no service instance. + for facility: Dictionary in construction_service.get_facilities(): + var definition := definition_registry.get_facility(StringName(facility[&"definition_id"])) + if definition != null: + rates[String(facility[&"instance_id"])] = definition.maintenance_gold + var advanced := facility_upkeep.advance_to(minute, rates) + if not advanced[&"ok"]: + _clock.set_paused(true) + push_error("Facility upkeep accrual failed: %s" % advanced) + + +func _upkeep_accrual_crosslinks_are_valid(accrual: FacilityUpkeepAccrual, settlement: FacilityUpkeepSettlement) -> bool: + var periods: Array = accrual.get_report()[&"closed_periods"] + var receipts: Array = settlement.get_report()[&"receipts"] + if receipts.size() > periods.size(): + return false + for index in receipts.size(): + if receipts[index][&"period"] != periods[index]: + return false + return true + + +func _operations_closed_arrears_total() -> int: + # Coordinator arrears describe its last financial close. Interim calendar + # payments during a legacy 06:00 period must not rewrite that closed record. + var last_close := 0 + if operations_coordinator != null and operations_coordinator.get_open_financial_day() > 1: + last_close = operations_coordinator.get_daily_close_minute(operations_coordinator.get_open_financial_day() - 1) + return _staff_payroll_arrears_total(staff_service) + upkeep_settlement.get_arrears_through(last_close) + + +func _operations_total_arrears() -> int: + return _staff_payroll_arrears_total(staff_service) + upkeep_settlement.get_arrears_total() + + +func _advance_operations_time(absolute_minute: int) -> void: + if not _operations_enabled or operations_coordinator == null: + return + if _operations_deferred_runtime_minute >= 0: + _operations_tick_blocked = true + _clock.set_paused(true) + return + _operations_tick_blocked = false + var advanced := operations_coordinator.advance_to(absolute_minute, true) + if not advanced.is_success(): + # Earlier boundaries in the same minute can already be validly committed + # (for example demand before a failed arrival). Publish only those staged + # effects and notifications; the failing callback rolled itself back. + if not _commit_operations_domain_events() \ + or not _commit_operations_notifications(): + operations_coordinator.discard_deferred_notifications() + _discard_operations_domain_events() + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = advanced.to_dictionary() + _operations_deferred_runtime_minute = absolute_minute + _operations_tick_blocked = true + _clock.set_paused(true) + return + if operations_coordinator.current_minute != absolute_minute \ + or operations_coordinator.get_population_count() != guest_service.guest_count() \ + or operations_coordinator.get_arrears_total() != _operations_closed_arrears_total() \ + or not _operations_notifications_are_committable() \ + or not _commit_operations_domain_events() \ + or not _commit_operations_notifications(): + operations_coordinator.discard_deferred_notifications() + _discard_operations_domain_events() + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = { + &"code": &"OPERATIONS_CROSSLINK_MISMATCH", + &"minute": absolute_minute, + } + _operations_deferred_runtime_minute = absolute_minute + _operations_tick_blocked = true + _clock.set_paused(true) + return + _operations_runtime_failure_latched = false + _operations_runtime_failure_report.clear() + if operations_coordinator.is_terminal(): + _operations_deferred_runtime_minute = -1 + _operations_tick_blocked = true + _clock.set_paused(true) + return + if operations_coordinator.pause_requested: + _operations_deferred_runtime_minute = absolute_minute + _operations_tick_blocked = true + _clock.set_paused(true) + return + _operations_deferred_runtime_minute = -1 + _pause_for_waiting_foreground_event() + + +func _operations_should_block_tick() -> bool: + if not _operations_enabled or operations_coordinator == null: + return false + return _operations_deferred_runtime_minute >= 0 \ + or _operations_runtime_failure_latched \ + or operations_coordinator.pause_requested \ + or operations_coordinator.is_terminal() \ + or operations_coordinator.is_external_quarantined() + + +func _pause_for_waiting_foreground_event() -> void: + if event_service == null or _clock == null: + return + var foreground := event_service.get_foreground_instance() + if foreground != null and foreground.state == EventInstance.State.WAITING_CHOICE: + _clock.set_paused(true) + + +func _capture_operations_external_state() -> Dictionary: + # This is deliberately a composed transaction token, not a Runtime snapshot. + # It contains every aggregate that an Operations callback can reach, while + # excluding clock/coordinator state owned by the caller of the callback. + if not _begin_operations_external_transaction(): + return {} + return _build_operations_external_state() + + +func _build_operations_external_state() -> Dictionary: + var committed_minute := _runtime_aggregate_committed_minute() + if committed_minute < 0: + _discard_operations_domain_events() + return {} + var rng_snapshots: Dictionary = {} + for stream_id: StringName in _sorted_name_keys(_rng_streams): + var stream := _rng_streams.get(stream_id) as DeterministicRng + if stream == null: + _discard_operations_domain_events() + return {} + rng_snapshots[stream_id] = stream.snapshot() + return { + # TIME_BOUNDARIES runs before the Runtime suffix. During a normal + # Operations callback the Clock is already at X while minute-driven + # aggregates are still committed through X - 1. Capture that committed + # participant minute so rollback validates the state it actually saved. + &"captured_minute": committed_minute, + &"captured_clock_minute": _clock.absolute_minute, + &"captured_authority_minute": authority_service.current_minute, + &"captured_defense_minute": defense_service.current_minute, + &"game_state": _state.create_snapshot(), + &"command_queue": command_queue.create_snapshot(), + &"next_command_id": _next_command_id, + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"inventory": inventory_service.create_snapshot(), + &"kitchen_production": kitchen_production.create_snapshot(), + &"auto_purchase_plans": auto_purchase_plans.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"guests": guest_service.create_snapshot(), + &"staff": staff_service.create_snapshot(), + &"relationships": relationship_service.create_snapshot(), + &"events": event_service.create_snapshot(), + &"authority": authority_service.create_snapshot(), + &"world": world_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"excavation": excavation_service.create_snapshot(), + &"spatial_subslots": spatial_subslot_service.create_snapshot(), + &"route_projection": route_subslot_path_adapter.create_snapshot(), + &"facility_infrastructure": facility_infrastructure_projector.create_snapshot(), + &"movement_credits": _movement_credits.duplicate(true), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"rng_streams": rng_snapshots, + &"staffing_projection_enabled": _staffing_projection_enabled, + &"progression": progression_service.create_snapshot(), + &"hired_staff_candidate_ids": _hired_staff_candidate_ids.duplicate(true), + &"personal_action_points": _personal_action_points, + # The remaining aggregates are reachable through Event actions or signals. + &"mana": mana_network_service.create_snapshot(), + &"logistics_dispatcher": logistics_dispatcher.create_snapshot(), + &"logistics_requests": _serialize_logistics_requests(), + &"defense": defense_service.create_snapshot(), + &"construction": construction_service.create_snapshot(), + } + + +func _operations_external_committed_minute() -> int: + return _runtime_aggregate_committed_minute() + + +func _runtime_aggregate_committed_minute() -> int: + if facility_service == null or guest_service == null or inventory_service == null \ + or staff_service == null or kitchen_production == null: + return -1 + var minute := facility_service.current_minute + if minute < 0 or guest_service.current_minute != minute \ + or inventory_service.current_minute != minute \ + or staff_service.current_minute != minute \ + or kitchen_production.current_minute != minute \ + or elevators.current_minute != minute: + return -1 + return minute + + +func _restore_operations_external_state(token: Variant) -> bool: + if not token is Dictionary: + _discard_operations_domain_events() + return false + var saved: Dictionary = token + var required_dictionary_keys: Array[StringName] = [ + &"facility_upkeep", &"upkeep_settlement", &"facility_cleanliness", + &"game_state", &"command_queue", &"economy", &"inventory", &"kitchen_production", &"auto_purchase_plans", &"facilities", &"guests", + &"staff", &"relationships", &"events", &"authority", &"world", &"path", &"elevators", &"legacy_stairs", + &"excavation", &"spatial_subslots", &"route_projection", + &"facility_infrastructure", + &"movement_credits", &"domain_events", &"id_generator", &"rng_streams", + &"progression", &"hired_staff_candidate_ids", &"mana", + &"logistics_dispatcher", &"defense", &"construction", + ] + for key: StringName in required_dictionary_keys: + if not saved.get(key, null) is Dictionary: + _discard_operations_domain_events() + return false + if not saved.get(&"logistics_requests", null) is Array \ + or typeof(saved.get(&"staffing_projection_enabled", null)) != TYPE_BOOL \ + or typeof(saved.get(&"personal_action_points", null)) != TYPE_INT \ + or typeof(saved.get(&"captured_minute", null)) != TYPE_INT \ + or int(saved[&"captured_minute"]) < 0 \ + or typeof(saved.get(&"captured_clock_minute", null)) != TYPE_INT \ + or int(saved[&"captured_clock_minute"]) < int(saved[&"captured_minute"]) \ + or typeof(saved.get(&"captured_authority_minute", null)) != TYPE_INT \ + or int(saved[&"captured_authority_minute"]) < 0 \ + or typeof(saved.get(&"captured_defense_minute", null)) != TYPE_INT \ + or int(saved[&"captured_defense_minute"]) < 0 \ + or typeof(saved.get(&"next_command_id", null)) != TYPE_INT \ + or int(saved[&"next_command_id"]) <= 0: + _discard_operations_domain_events() + return false + # Validation/PREPARE failure did not mutate a participant. Avoid restore APIs + # here because GameState.restore_snapshot intentionally emits reset signals. + if _operations_external_state_matches(saved): + _discard_operations_domain_events() + return true + + # Ask every participant to restore even when an earlier participant rejects + # its snapshot. This avoids knowingly leaving a half-restored external world. + var state_ok: bool = _state.restore_snapshot(saved[&"game_state"]) + var command_queue_ok := command_queue.restore_snapshot(saved[&"command_queue"]) + var economy_ok := economy_service.restore_snapshot(saved[&"economy"]) + var upkeep_ok := facility_upkeep.restore_snapshot(saved[&"facility_upkeep"]) and upkeep_settlement.restore_snapshot(saved[&"upkeep_settlement"], economy_service) + var inventory_ok := inventory_service.restore_snapshot(saved[&"inventory"]) + var facilities_ok := facility_service.restore_snapshot(saved[&"facilities"]) + facilities_ok = facility_cleanliness.restore_snapshot(saved.get(&"facility_cleanliness", {})) and facilities_ok + var kitchen_ok := kitchen_production.restore_snapshot(saved[&"kitchen_production"]) + var auto_purchase_ok := auto_purchase_plans.restore_snapshot(saved[&"auto_purchase_plans"], facility_service, economy_service, int(saved[&"captured_minute"])) + var guests_ok := guest_service.restore_snapshot(saved[&"guests"]) + var staff_ok := staff_service.restore_snapshot(saved[&"staff"]) + var relationships_ok := relationship_service.restore_snapshot(saved[&"relationships"]) + var events_ok := event_service.restore_snapshot(saved[&"events"]) + var authority_ok := authority_service.restore_snapshot(saved[&"authority"]) + var world_ok := world_service.restore_snapshot(saved[&"world"]) + var spatial_ok := spatial_subslot_service.restore_snapshot(saved[&"spatial_subslots"]) + var route_snapshot: Dictionary = saved[&"route_projection"] + var projected_walkable: Variant = route_snapshot.get(&"projected_walkable_cells", null) + var topology_ok := projected_walkable is Array \ + and path_service.rebuild_graph(projected_walkable) + var path_ok := topology_ok and path_service.restore_snapshot(saved[&"path"]) + path_ok = elevators.restore_snapshot(saved[&"elevators"]) and path_ok + path_ok = legacy_stairs.restore_snapshot(saved[&"legacy_stairs"]) and path_ok + var route_ok := path_ok and route_subslot_path_adapter.restore_snapshot(route_snapshot) + var infrastructure_ok := route_ok and facility_infrastructure_projector.restore_snapshot( + saved[&"facility_infrastructure"] + ) + var domain_events_ok := domain_events.restore_snapshot(saved[&"domain_events"]) + var ids_ok := id_generator.restore_snapshot(saved[&"id_generator"]) + var progression_ok := progression_service.restore_snapshot(saved[&"progression"]) + var mana_ok := mana_network_service.restore_snapshot(saved[&"mana"]) + var dispatcher_ok := logistics_dispatcher.restore_snapshot(saved[&"logistics_dispatcher"]) + var defense_ok := defense_service.restore_snapshot(saved[&"defense"]) + var construction_ok := construction_service.restore_snapshot(saved[&"construction"]) + var excavation_ok := excavation_service.restore_snapshot(saved[&"excavation"]) + var restored_requests: Variant = _deserialize_logistics_requests(saved[&"logistics_requests"]) + var requests_ok := restored_requests is Dictionary + if requests_ok: + logistics_requests = restored_requests + _movement_credits = (saved[&"movement_credits"] as Dictionary).duplicate(true) + _staffing_projection_enabled = bool(saved[&"staffing_projection_enabled"]) + _hired_staff_candidate_ids = ( + saved[&"hired_staff_candidate_ids"] as Dictionary + ).duplicate(true) + _personal_action_points = int(saved[&"personal_action_points"]) + _next_command_id = int(saved[&"next_command_id"]) + + var rng_ok := true + var saved_rngs: Dictionary = saved[&"rng_streams"] + if saved_rngs.size() != _rng_streams.size(): + rng_ok = false + for raw_stream_id: Variant in saved_rngs: + var stream_id := StringName(raw_stream_id) + var stream := _rng_streams.get(stream_id) as DeterministicRng + if stream == null or not saved_rngs[raw_stream_id] is Dictionary \ + or not stream.restore(saved_rngs[raw_stream_id]): + rng_ok = false + + _discard_operations_domain_events() + var participants_ok := upkeep_ok and state_ok and command_queue_ok and economy_ok and inventory_ok and kitchen_ok and auto_purchase_ok \ + and facilities_ok and guests_ok and staff_ok and relationships_ok \ + and events_ok and authority_ok and world_ok and spatial_ok and path_ok \ + and route_ok and infrastructure_ok and excavation_ok \ + and domain_events_ok and ids_ok \ + and progression_ok and mana_ok and dispatcher_ok and defense_ok \ + and construction_ok and requests_ok and rng_ok + if not participants_ok: + return false + var validation_minute := int(saved[&"captured_minute"]) + var clock_validation_minute := int(saved[&"captured_clock_minute"]) + return _operations_external_state_matches(saved) \ + and bool(economy_service.validate_ledger().get(&"ok", false)) \ + and _validate_logistics_dispatcher_crosslinks( + logistics_dispatcher, logistics_requests, clock_validation_minute + ) \ + and _validate_runtime_crosslinks( + facility_service, guest_service, economy_service, inventory_service, + staff_service, validation_minute, _staffing_projection_enabled + ) \ + and _validate_runtime_path_crosslinks( + path_service, guest_service, staff_service, _movement_credits, + clock_validation_minute + ) \ + and _validate_authority_economy_crosslinks( + authority_service, economy_service, + int(saved[&"captured_authority_minute"]) + ) \ + and _validate_defense_crosslinks( + defense_service, staff_service, facility_service, + int(saved[&"captured_defense_minute"]) + ) \ + and _validate_construction_facility_crosslinks( + world_service, construction_service, facility_service, + facility_infrastructure_projector + ) \ + and _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ) + + +func _operations_external_state_matches(saved: Dictionary) -> bool: + if not _strict_variants_equal(_state.create_snapshot(), saved[&"game_state"]) \ + or not _strict_variants_equal(command_queue.create_snapshot(), saved[&"command_queue"]) \ + or _next_command_id != int(saved[&"next_command_id"]) \ + or not _strict_variants_equal(facility_upkeep.create_snapshot(), saved[&"facility_upkeep"]) \ + or not _strict_variants_equal(upkeep_settlement.create_snapshot(), saved[&"upkeep_settlement"]) \ + or not _strict_variants_equal(economy_service.create_snapshot(), saved[&"economy"]) \ + or not _strict_variants_equal(inventory_service.create_snapshot(), saved[&"inventory"]) \ + or not _strict_variants_equal(kitchen_production.create_snapshot(), saved[&"kitchen_production"]) \ + or not _strict_variants_equal(auto_purchase_plans.create_snapshot(), saved[&"auto_purchase_plans"]) \ + or not _strict_variants_equal(facility_service.create_snapshot(), saved[&"facilities"]) \ + or not _strict_variants_equal(facility_cleanliness.create_snapshot(), saved.get(&"facility_cleanliness", {})) \ + or not _strict_variants_equal(guest_service.create_snapshot(), saved[&"guests"]) \ + or not _strict_variants_equal(staff_service.create_snapshot(), saved[&"staff"]) \ + or not _strict_variants_equal(relationship_service.create_snapshot(), saved[&"relationships"]) \ + or not _strict_variants_equal(event_service.create_snapshot(), saved[&"events"]) \ + or not _strict_variants_equal(authority_service.create_snapshot(), saved[&"authority"]) \ + or not _strict_variants_equal(world_service.create_snapshot(), saved[&"world"]) \ + or not _strict_variants_equal(path_service.create_snapshot(), saved[&"path"]) \ + or not _strict_variants_equal(elevators.create_snapshot(), saved[&"elevators"]) \ + or not _strict_variants_equal(legacy_stairs.create_snapshot(), saved[&"legacy_stairs"]) \ + or not _strict_variants_equal(excavation_service.create_snapshot(), saved[&"excavation"]) \ + or not _strict_variants_equal(spatial_subslot_service.create_snapshot(), saved[&"spatial_subslots"]) \ + or not _strict_variants_equal(route_subslot_path_adapter.create_snapshot(), saved[&"route_projection"]) \ + or not _strict_variants_equal(facility_infrastructure_projector.create_snapshot(), saved[&"facility_infrastructure"]) \ + or not _strict_variants_equal(_movement_credits, saved[&"movement_credits"]) \ + or not _strict_variants_equal(domain_events.create_snapshot(), saved[&"domain_events"]) \ + or not _strict_variants_equal(id_generator.create_snapshot(), saved[&"id_generator"]) \ + or not _strict_variants_equal(progression_service.create_snapshot(), saved[&"progression"]) \ + or not _strict_variants_equal(mana_network_service.create_snapshot(), saved[&"mana"]) \ + or not _strict_variants_equal(logistics_dispatcher.create_snapshot(), saved[&"logistics_dispatcher"]) \ + or not _strict_variants_equal(_serialize_logistics_requests(), saved[&"logistics_requests"]) \ + or not _strict_variants_equal(defense_service.create_snapshot(), saved[&"defense"]) \ + or not _strict_variants_equal(construction_service.create_snapshot(), saved[&"construction"]) \ + or _staffing_projection_enabled != bool(saved[&"staffing_projection_enabled"]) \ + or not _strict_variants_equal(_hired_staff_candidate_ids, saved[&"hired_staff_candidate_ids"]) \ + or _personal_action_points != int(saved[&"personal_action_points"]): + return false + var saved_rngs: Dictionary = saved[&"rng_streams"] + if saved_rngs.size() != _rng_streams.size(): + return false + for raw_stream_id: Variant in saved_rngs: + var stream := _rng_streams.get(StringName(raw_stream_id)) as DeterministicRng + if stream == null or not _strict_variants_equal( + stream.snapshot(), saved_rngs[raw_stream_id] + ): + return false + return true + + +func _begin_operations_external_transaction() -> bool: + if _operations_transaction_active: + # One Coordinator minute can contain daily, demand and arrival boundaries. + # Keep their Runtime side effects in one notification/event transaction + # until the Coordinator has committed the complete minute. + return true + _operations_transaction_active = true + _operations_queued_domain_events.clear() + _operations_queued_guest_spawn_notifications.clear() + _operations_queued_economy_notifications.clear() + return true + + +func _commit_operations_domain_events() -> bool: + if not _operations_transaction_active: + return true + var seen: Dictionary = {} + for event: SimulationDomainEvent in _operations_queued_domain_events: + if event == null or not event.is_valid() or seen.has(event.event_id) \ + or domain_events.has_published(event.event_id): + return false + seen[event.event_id] = true + var committed := domain_events.publish_batch(_operations_queued_domain_events) + if not committed: + return false + _operations_queued_domain_events.clear() + _operations_transaction_active = false + return true + + +func _operations_notifications_are_committable() -> bool: + if operations_coordinator == null or guest_service == null: + return false + var seen_guest_ids: Dictionary = {} + for guest_id: StringName in _operations_queued_guest_spawn_notifications: + if guest_id.is_empty() or seen_guest_ids.has(guest_id) \ + or not guest_service.has_guest(guest_id) \ + or not guest_service.has_pending_guest_spawned_notification(guest_id): + return false + seen_guest_ids[guest_id] = true + var seen_transaction_ids: Dictionary = {} + for transaction_id: StringName in _operations_queued_economy_notifications: + if transaction_id.is_empty() or seen_transaction_ids.has(transaction_id) \ + or not economy_service.has_pending_transaction_notification(transaction_id): + return false + seen_transaction_ids[transaction_id] = true + return true + + +func _stage_operations_economy_notification(result: CommandResult) -> bool: + if result == null or not result.is_success(): + return false + var transaction_id := StringName(result.details.get(&"transaction_id", &"")) + if transaction_id.is_empty() \ + or not economy_service.has_pending_transaction_notification(transaction_id) \ + or _operations_queued_economy_notifications.has(transaction_id): + return false + _operations_queued_economy_notifications.append(transaction_id) + # Preserve Runtime's authoritative GameState projection now; the matching raw + # Economy signal is delivered to external observers only after commit. + _on_ledger_transaction_posted( + transaction_id, economy_service.get_transaction_entries(transaction_id) + ) + return true + + +func _discard_operations_domain_events() -> void: + for guest_id: StringName in _operations_queued_guest_spawn_notifications: + guest_service.discard_guest_spawned_notification(guest_id) + for transaction_id: StringName in _operations_queued_economy_notifications: + economy_service.discard_transaction_notification(transaction_id) + _operations_queued_guest_spawn_notifications.clear() + _operations_flushing_guest_spawn_notifications.clear() + _operations_queued_economy_notifications.clear() + _operations_flushing_economy_notifications.clear() + _operations_queued_domain_events.clear() + _operations_transaction_active = false + + +func _commit_operations_notifications() -> bool: + if operations_coordinator == null: + return false + guest_service.set_external_mutation_blocked(true) + var coordinator_notifications_ok := operations_coordinator.commit_deferred_notifications() + var guest_notifications_ok := true + if coordinator_notifications_ok: + for guest_id: StringName in _operations_queued_guest_spawn_notifications: + _operations_flushing_guest_spawn_notifications[guest_id] = true + if not guest_service.commit_guest_spawned_notification(guest_id): + guest_notifications_ok = false + _operations_flushing_guest_spawn_notifications.erase(guest_id) + else: + guest_notifications_ok = false + var economy_notifications_ok := coordinator_notifications_ok and guest_notifications_ok + if economy_notifications_ok: + for transaction_id: StringName in _operations_queued_economy_notifications: + _operations_flushing_economy_notifications[transaction_id] = true + if not economy_service.commit_transaction_notification(transaction_id): + economy_notifications_ok = false + _operations_flushing_economy_notifications.erase(transaction_id) + guest_service.set_external_mutation_blocked(false) + _operations_queued_guest_spawn_notifications.clear() + _operations_flushing_guest_spawn_notifications.clear() + _operations_queued_economy_notifications.clear() + _operations_flushing_economy_notifications.clear() + return coordinator_notifications_ok and guest_notifications_ok and economy_notifications_ok + + +func _publish_domain_event(event: SimulationDomainEvent) -> bool: + if _construction_completion_transaction_active: + if event == null or not event.is_valid() or domain_events.has_published(event.event_id): + return false + for queued: SimulationDomainEvent in _construction_queued_domain_events: + if queued.event_id == event.event_id: + return false + _construction_queued_domain_events.append(event.copy()) + return true + if not _operations_transaction_active: + return domain_events.publish(event) + if event == null or not event.is_valid() or domain_events.has_published(event.event_id): + return false + for queued: SimulationDomainEvent in _operations_queued_domain_events: + if queued.event_id == event.event_id: + return false + _operations_queued_domain_events.append(event.copy()) + return true + + +func _operations_daily_boundary( + payload: Dictionary, + phase: StringName, + token: Variant +) -> Dictionary: + if phase == OperationsCoordinator.PHASE_CAPTURE: + var captured := _capture_operations_external_state() + return {&"ok": not captured.is_empty(), &"token": captured} + if phase == OperationsCoordinator.PHASE_VALIDATE: + return { + &"ok": token is Dictionary and not token.is_empty() \ + and _operations_daily_payload_is_valid(payload), + &"token": token, + } + if phase == OperationsCoordinator.PHASE_APPLY: + return _apply_operations_daily_close(payload, token) + if phase == OperationsCoordinator.PHASE_ROLLBACK: + return {&"ok": _restore_operations_external_state(token)} + return {&"ok": false} + + +func _operations_daily_payload_is_valid(payload: Dictionary) -> bool: + for key: StringName in [ + &"day", &"boundary_minute", &"period_start_minute", + &"period_end_minute_exclusive", + ]: + if typeof(payload.get(key, null)) != TYPE_INT: + return false + var day := int(payload[&"day"]) + var boundary_minute := int(payload[&"boundary_minute"]) + return day > 0 \ + and boundary_minute == _clock.absolute_minute \ + and boundary_minute == operations_coordinator.get_daily_close_minute(day) \ + and int(payload[&"period_start_minute"]) == operations_coordinator.get_financial_period_start(day) \ + and int(payload[&"period_end_minute_exclusive"]) == boundary_minute + + +func _settle_upkeep_through(boundary_minute: int) -> Dictionary: + var upkeep_paid := 0 + for period: Dictionary in facility_upkeep.get_closed_periods_from(upkeep_settlement.get_settled_period_count()): + if int(period[&"period_end"]) > boundary_minute: + continue + var upkeep_result := upkeep_settlement.settle(period, economy_service) + if not upkeep_result[&"ok"]: + return {&"ok": false, &"reason": &"UPKEEP_SETTLEMENT_FAILED"} + if not upkeep_result[&"replayed"]: + for row: Dictionary in upkeep_result[&"receipt"][&"rows"]: + upkeep_paid += int(row[&"paid"]) + if not String(upkeep_result[&"transaction_id"]).is_empty() and not _stage_operations_economy_notification(CommandResult.succeeded(0, {&"transaction_id": upkeep_result[&"transaction_id"]})): + return {&"ok": false, &"reason": &"UPKEEP_NOTIFICATION_STAGE_FAILED"} + return {&"ok": true, &"paid_total": upkeep_paid} + + +func _operations_midnight_upkeep_boundary(payload: Dictionary, phase: StringName, token: Variant) -> Dictionary: + if phase == OperationsCoordinator.PHASE_CAPTURE: + var captured := _capture_operations_external_state() + return {&"ok": not captured.is_empty(), &"token": captured} + if phase == OperationsCoordinator.PHASE_ROLLBACK: + return {&"ok": _restore_operations_external_state(token)} + var minute: Variant = payload.get(&"boundary_minute") + var valid: bool = token is Dictionary and not token.is_empty() and typeof(minute) == TYPE_INT \ + and int(minute) == _clock.absolute_minute and int(minute) % 1440 == 0 + if phase == OperationsCoordinator.PHASE_VALIDATE: + return {&"ok": valid, &"token": token} + if phase != OperationsCoordinator.PHASE_APPLY or not valid: + return {&"ok": false} + var prepared := _run_operations_test_boundary_hook(&"MIDNIGHT_UPKEEP", payload, OPERATIONS_TEST_PREPARE_PHASE, token) + if not bool(prepared.get(&"ok", false)): + return prepared + var result := _settle_upkeep_through(int(minute)) + if not bool(result[&"ok"]): + return result + var after := _run_operations_test_boundary_hook(&"MIDNIGHT_UPKEEP", payload, OPERATIONS_TEST_AFTER_FIRST_MUTATION_PHASE, token) + if not bool(after.get(&"ok", false)): + return after + return {&"ok": upkeep_settlement.validate_ledger(economy_service) \ + and int(_state.get_resource(&"gold")) == economy_service.get_balance(PLAYER_CASH_ACCOUNT)} + + +func _apply_operations_daily_close(payload: Dictionary, token: Variant) -> Dictionary: + if not token is Dictionary or token.is_empty() \ + or not _operations_daily_payload_is_valid(payload): + return {&"ok": false, &"reason": &"DAILY_CLOSE_PRECONDITION_FAILED"} + var prepare_hook := _run_operations_test_boundary_hook( + &"DAILY_CLOSE", payload, OPERATIONS_TEST_PREPARE_PHASE, token + ) + if not bool(prepare_hook.get(&"ok", false)): + return prepare_hook + var day := int(payload[&"day"]) + var preview := staff_service.preview_daily_payroll(day) + if not bool(preview.get(&"ok", false)) \ + or not preview.get(&"rows", null) is Array: + return {&"ok": false, &"reason": &"PAYROLL_PREVIEW_FAILED"} + var available_gold := economy_service.get_balance(PLAYER_CASH_ACCOUNT) + var remaining_gold := available_gold + var payments: Dictionary = {} + var expected_paid_total := 0 + var previous_staff_id := "" + for raw_row: Variant in preview[&"rows"]: + if not raw_row is Dictionary: + return {&"ok": false, &"reason": &"PAYROLL_PREVIEW_INVALID"} + var row: Dictionary = raw_row + var staff_id_value: Variant = row.get(&"staff_id", null) + var total_due_value: Variant = row.get(&"total_due", null) + if typeof(staff_id_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(staff_id_value).is_empty() \ + or typeof(total_due_value) != TYPE_INT or int(total_due_value) < 0: + return {&"ok": false, &"reason": &"PAYROLL_PREVIEW_INVALID"} + var staff_text := String(staff_id_value) + if not previous_staff_id.is_empty() and staff_text <= previous_staff_id: + return {&"ok": false, &"reason": &"PAYROLL_ORDER_INVALID"} + previous_staff_id = staff_text + var payment := mini(int(total_due_value), remaining_gold) + payments[StringName(staff_id_value)] = payment + remaining_gold -= payment + expected_paid_total += payment + + var settlement_id := StringName("payroll-day-%08d" % day) + var settlement := staff_service.apply_daily_payroll_settlement( + settlement_id, day, payments + ) + if not settlement.is_success() \ + or int(settlement.details.get(&"paid_total", -1)) != expected_paid_total: + return { + &"ok": false, + &"reason": &"PAYROLL_SETTLEMENT_FAILED", + &"result": settlement.to_dictionary(), + } + if expected_paid_total > 0: + var wage_payment := economy_service.transfer( + PLAYER_CASH_ACCOUNT, + WAGE_EXPENSE_ACCOUNT, + expected_paid_total, + int(payload[&"boundary_minute"]), + &"WAGE", + settlement_id, + StringName("operations.wage.day.%08d" % day), + &"operations.payroll.settlement", + &"", + false + ) + if not wage_payment.is_success(): + return { + &"ok": false, + &"reason": &"WAGE_LEDGER_POST_FAILED", + &"result": wage_payment.to_dictionary(), + } + if not _stage_operations_economy_notification(wage_payment): + return { + &"ok": false, + &"reason": &"WAGE_NOTIFICATION_STAGE_FAILED", + &"result": wage_payment.to_dictionary(), + } + var upkeep_result := _settle_upkeep_through(int(payload[&"boundary_minute"])) + if not bool(upkeep_result[&"ok"]): + return upkeep_result + var upkeep_paid := int(upkeep_result[&"paid_total"]) + var financials := _build_operations_daily_financials( + int(payload[&"period_start_minute"]), + int(payload[&"period_end_minute_exclusive"]), + int(preview.get(&"new_wages_total", -1)), + preview[&"rows"] + ) + if not bool(financials.get(&"ok", false)): + return financials + var arrears_total := int(settlement.details.get(&"unpaid_after_total", -1)) + if arrears_total < 0 \ + or arrears_total != _staff_payroll_arrears_total(staff_service) \ + or economy_service.get_balance(PLAYER_CASH_ACCOUNT) != available_gold - expected_paid_total - upkeep_paid \ + or int(_state.get_resource(&"gold")) != economy_service.get_balance(PLAYER_CASH_ACCOUNT) \ + or not bool(economy_service.validate_ledger().get(&"ok", false)) \ + or not bool(staff_service.validate_invariants().get(&"ok", false)): + return {&"ok": false, &"reason": &"DAILY_CLOSE_POSTCONDITION_FAILED"} + var settlement_report := settlement.details.duplicate(true) + settlement_report[&"upkeep_arrears_total"] = upkeep_settlement.get_arrears_total() + settlement_report[&"arrears_total"] = arrears_total + int(settlement_report[&"upkeep_arrears_total"]) + return { + &"ok": true, + &"category_totals": financials[&"category_totals"], + &"reconciliation_difference": financials[&"reconciliation_difference"], + &"facility_profit_loss": financials[&"facility_profit_loss"], + &"anomalies": financials[&"anomalies"], + &"settlement": settlement_report, + } + + +func _build_operations_daily_financials( + period_start: int, + period_end_exclusive: int, + new_wages_total: int, + payroll_rows: Array +) -> Dictionary: + if period_start < 0 or period_end_exclusive <= period_start or new_wages_total < 0: + return {&"ok": false, &"reason": &"DAILY_FINANCIAL_PERIOD_INVALID"} + if not _loan_principal_ledger_is_valid(economy_service): + return {&"ok": false, &"reason": &"INVALID_LOAN_PRINCIPAL_LEDGER"} + var category_totals := { + &"revenue": 0, + &"refunds": 0, + &"cost_of_goods": 0, + &"wages": new_wages_total, + &"maintenance": 0, + &"utilities": 0, + &"taxes_and_interest": 0, + &"fines": 0, + &"construction_cash_flow": 0, + } + var facility_rows: Dictionary = {} + var excluded_categories: Array[StringName] = [ + &"EVENT_COST_RESERVED", &"EVENT_COST_RELEASED", &"INITIALIZATION", + &"TRANSFER", &"GENERATION", &"DESTRUCTION", &"MIGRATION", + &"SERVICE_CASH_SWEEP", &"WAGE", &"MAINTENANCE_PAYMENT", + ] + var category_mapping := { + &"SERVICE_SALE": &"revenue", + &"REFUND": &"refunds", + &"CONSTRUCTION": &"construction_cash_flow", + &"CONSTRUCTION_REFUND": &"construction_cash_flow", + &"AUTHORITY_FINE": &"fines", + &"OPERATING_EXPENSE": &"cost_of_goods", + &"STAFF_SIGNING_COST": &"cost_of_goods", + &"EVENT_ACTION": &"cost_of_goods", + &"EVENT_COST_COMMITTED": &"cost_of_goods", + &"DEFENSE_SKILL_COST": &"cost_of_goods", + &"MAINTENANCE_ACCRUAL": &"maintenance", + &"LOAN_PRINCIPAL_BORROWED": &"financing_principal_inflows", + &"LOAN_PRINCIPAL_REPAID": &"financing_principal_outflows", + } + var operating_refund_total := 0 + for entry: LedgerEntry in economy_service.get_entries(): + if entry.absolute_minute < period_start \ + or entry.absolute_minute >= period_end_exclusive: + continue + if entry.category in excluded_categories: + continue + if entry.category == &"OPERATING_REFUND": + operating_refund_total += entry.amount + continue + if not category_mapping.has(entry.category): + return { + &"ok": false, + &"reason": &"UNKNOWN_LEDGER_CATEGORY", + &"category": entry.category, + &"transaction_id": entry.transaction_id, + } + var category: StringName = category_mapping[entry.category] + category_totals[category] = int(category_totals.get(category, 0)) + entry.amount + if not entry.source_entity_id.is_empty() \ + and (facility_service.has_instance(entry.source_entity_id) or entry.category == &"MAINTENANCE_ACCRUAL") \ + and category not in [&"construction_cash_flow", &"financing_principal_inflows", &"financing_principal_outflows"]: + if not facility_rows.has(entry.source_entity_id): + facility_rows[entry.source_entity_id] = { + &"revenue": 0, &"expenses": 0, &"net_profit": 0, + } + var facility_row: Dictionary = facility_rows[entry.source_entity_id] + if category == &"revenue": + facility_row[&"revenue"] = int(facility_row[&"revenue"]) + entry.amount + else: + facility_row[&"expenses"] = int(facility_row[&"expenses"]) + entry.amount + var anomalies: Array[Dictionary] = [] + var wage_allocation := _allocate_operations_wages_to_facilities( + period_start, + period_end_exclusive, + new_wages_total, + payroll_rows, + facility_rows + ) + if not bool(wage_allocation.get(&"ok", false)): + return wage_allocation + anomalies.append_array(wage_allocation[&"anomalies"]) + var operating_refund_offset := mini( + operating_refund_total, + int(category_totals[&"cost_of_goods"]) + ) + category_totals[&"cost_of_goods"] = int(category_totals[&"cost_of_goods"]) \ + - operating_refund_offset + var excess_operating_refund := operating_refund_total - operating_refund_offset + if excess_operating_refund > 0: + category_totals[&"revenue"] = int(category_totals[&"revenue"]) \ + + excess_operating_refund + anomalies.append({ + &"code": &"OPERATING_REFUND_EXCEEDS_PERIOD_COST", + &"refund_total": operating_refund_total, + &"cost_offset": operating_refund_offset, + &"excess_revenue": excess_operating_refund, + }) + for facility_id: StringName in _sorted_name_keys(facility_rows): + var row: Dictionary = facility_rows[facility_id] + row[&"net_profit"] = int(row[&"revenue"]) - int(row[&"expenses"]) + var allocation_rows: Array[Dictionary] = [] + for facility_id: StringName in _sorted_name_keys( + wage_allocation[&"allocated_by_facility"] + ): + allocation_rows.append({ + &"facility_id": String(facility_id), + &"amount": int(wage_allocation[&"allocated_by_facility"][facility_id]), + }) + var unallocated_rows: Array[Dictionary] = [] + for staff_id: StringName in _sorted_name_keys( + wage_allocation[&"unallocated_by_staff"] + ): + unallocated_rows.append({ + &"staff_id": String(staff_id), + &"amount": int(wage_allocation[&"unallocated_by_staff"][staff_id]), + }) + var profit_loss_facility_ids: Array[String] = [] + for facility_id: StringName in _sorted_name_keys(facility_rows): + profit_loss_facility_ids.append(String(facility_id)) + anomalies.append({ + &"code": &"WAGE_ALLOCATION_EVIDENCE", + &"version": 1, + &"new_wages_total": new_wages_total, + &"allocated_total": int(wage_allocation[&"allocated_total"]), + &"unallocated_total": int(wage_allocation[&"unallocated_total"]), + &"allocations": allocation_rows, + &"unallocated_by_staff": unallocated_rows, + &"facility_ids": profit_loss_facility_ids, + }) + var daily_summary := economy_service.get_daily_summary(period_start / 1_440 + 1) + if daily_summary.is_empty(): + return {&"ok": false, &"reason": &"LEDGER_PERIOD_SUMMARY_MISSING"} + var difference := int(daily_summary.get(&"total_debit", 0)) \ + - int(daily_summary.get(&"total_credit", 0)) + return { + &"ok": true, + &"category_totals": category_totals, + &"reconciliation_difference": difference, + &"facility_profit_loss": facility_rows, + &"anomalies": anomalies, + } + + +func _allocate_operations_wages_to_facilities( + period_start: int, + period_end_exclusive: int, + new_wages_total: int, + payroll_rows: Array, + facility_rows: Dictionary +) -> Dictionary: + var new_wages_by_staff: Dictionary = {} + var observed_new_wages := 0 + var previous_staff_text := "" + for raw_row: Variant in payroll_rows: + if not raw_row is Dictionary: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_INPUT_INVALID"} + var row: Dictionary = raw_row + var staff_id_value: Variant = row.get(&"staff_id", null) + var new_wages_value: Variant = row.get(&"new_wages", null) + if typeof(staff_id_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(staff_id_value).is_empty() \ + or typeof(new_wages_value) != TYPE_INT or int(new_wages_value) < 0: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_INPUT_INVALID"} + var staff_text := String(staff_id_value) + if not previous_staff_text.is_empty() and staff_text <= previous_staff_text: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_ORDER_INVALID"} + previous_staff_text = staff_text + new_wages_by_staff[StringName(staff_id_value)] = int(new_wages_value) + observed_new_wages += int(new_wages_value) + if observed_new_wages != new_wages_total: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_TOTAL_MISMATCH"} + + var weights_by_staff: Dictionary = {} + for shift: ShiftInstance in staff_service.get_shifts(): + if shift == null or shift.cancelled or shift.assigned_facility_id.is_empty() \ + or not new_wages_by_staff.has(shift.staff_id) \ + or int(new_wages_by_staff[shift.staff_id]) <= 0 \ + or not facility_service.has_instance(shift.assigned_facility_id): + continue + var overlap := maxi( + mini(shift.end_at, period_end_exclusive) - maxi(shift.start_at, period_start), + 0 + ) + if overlap <= 0: + continue + # Recorded duty is the strongest attribution fact. A future/unadvanced Shift + # still uses its scheduled overlap so daily wages never disappear merely + # because the Runtime was restored immediately before the close. + var recorded_minutes := shift.worked_minutes + shift.overtime_minutes + var weight := mini(recorded_minutes, overlap) if recorded_minutes > 0 else overlap + if weight <= 0: + continue + if not weights_by_staff.has(shift.staff_id): + weights_by_staff[shift.staff_id] = {} + var facility_weights: Dictionary = weights_by_staff[shift.staff_id] + facility_weights[shift.assigned_facility_id] = int( + facility_weights.get(shift.assigned_facility_id, 0) + ) + weight + + var anomalies: Array[Dictionary] = [] + var allocated_total := 0 + var allocated_by_facility: Dictionary = {} + var unallocated_by_staff: Dictionary = {} + for staff_id: StringName in _sorted_name_keys(new_wages_by_staff): + var wage := int(new_wages_by_staff[staff_id]) + if wage <= 0: + continue + var weights: Dictionary = weights_by_staff.get(staff_id, {}) + if weights.is_empty(): + unallocated_by_staff[staff_id] = wage + anomalies.append({ + &"code": &"UNALLOCATED_WAGES", + &"staff_id": staff_id, + &"amount": wage, + }) + continue + var total_weight := 0 + for facility_id: StringName in _sorted_name_keys(weights): + total_weight += int(weights[facility_id]) + if total_weight <= 0: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_WEIGHT_INVALID"} + var allocations: Dictionary = {} + var floor_total := 0 + var facility_ids := _sorted_name_keys(weights) + for facility_id: StringName in facility_ids: + var amount := wage * int(weights[facility_id]) / total_weight + allocations[facility_id] = amount + floor_total += amount + var remainder := wage - floor_total + for index in range(remainder): + var facility_id: StringName = facility_ids[index] + allocations[facility_id] = int(allocations[facility_id]) + 1 + for facility_id: StringName in facility_ids: + var amount := int(allocations[facility_id]) + if amount <= 0: + continue + if not facility_rows.has(facility_id): + facility_rows[facility_id] = { + &"revenue": 0, &"expenses": 0, &"net_profit": 0, + } + var facility_row: Dictionary = facility_rows[facility_id] + facility_row[&"expenses"] = int(facility_row[&"expenses"]) + amount + allocated_by_facility[facility_id] = int( + allocated_by_facility.get(facility_id, 0) + ) + amount + allocated_total += amount + if allocated_total > new_wages_total: + return {&"ok": false, &"reason": &"PAYROLL_ALLOCATION_EXCEEDS_TOTAL"} + return { + &"ok": true, + &"allocated_total": allocated_total, + &"unallocated_total": new_wages_total - allocated_total, + &"allocated_by_facility": allocated_by_facility, + &"unallocated_by_staff": unallocated_by_staff, + &"anomalies": anomalies, + } + + +func _operations_arrival_boundary( + payload: Dictionary, + phase: StringName, + token: Variant +) -> Dictionary: + if phase == OperationsCoordinator.PHASE_CAPTURE: + var captured := _capture_operations_external_state() + var population_cap := ( + int(operations_coordinator.get_config().get(&"population_cap", 0)) + if operations_coordinator != null else 0 + ) + return { + &"ok": not captured.is_empty(), + &"token": captured, + &"capacity_remaining": maxi(population_cap - guest_service.guest_count(), 0) if int(_state.get_resource(&"mana")) > 0 and weather.permits_new_arrivals() else 0, + } + if phase == OperationsCoordinator.PHASE_VALIDATE: + return { + &"ok": token is Dictionary and not token.is_empty() \ + and _operations_arrival_payload_is_valid(payload), + &"token": token, + } + if phase == OperationsCoordinator.PHASE_APPLY: + return _apply_operations_arrivals(payload, token) + if phase == OperationsCoordinator.PHASE_ROLLBACK: + return {&"ok": _restore_operations_external_state(token)} + return {&"ok": false} + + +func _operations_arrival_payload_is_valid(payload: Dictionary) -> bool: + var plans_value: Variant = payload.get(&"plans", null) + var total_value: Variant = payload.get(&"total_count", null) + var minute_value: Variant = payload.get(&"minute", null) + if not plans_value is Array or typeof(total_value) != TYPE_INT \ + or int(total_value) < 0 or typeof(minute_value) != TYPE_INT \ + or int(minute_value) != _clock.absolute_minute: + return false + var allowed_classes: Dictionary = {} + for class_id: StringName in mvp_content_catalog.get_guest_class_ids(): + allowed_classes[class_id] = true + var species_ids := mvp_content_catalog.get_species_ids() + if allowed_classes.size() != 8 or species_ids.size() != 4: + return false + var seen_guest_ids: Dictionary = {} + var seen_plan_ids: Dictionary = {} + var counted := 0 + for raw_plan: Variant in plans_value: + if not raw_plan is Dictionary: + return false + var plan: Dictionary = raw_plan + var plan_id_value: Variant = plan.get(&"plan_id", null) + var guest_class_value: Variant = plan.get(&"guest_class", null) + var facility_tag_value: Variant = plan.get(&"facility_tag", null) + var time_band_value: Variant = plan.get(&"time_band", null) + var plan_minute_value: Variant = plan.get(&"minute", null) + var count_value: Variant = plan.get(&"count", null) + var guest_ids_value: Variant = plan.get(&"guest_ids", null) + if typeof(plan_id_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or not _operations_sequence_id_is_valid(String(plan_id_value), "arrival-plan-") \ + or seen_plan_ids.has(StringName(plan_id_value)) \ + or typeof(guest_class_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or not allowed_classes.has(StringName(guest_class_value)) \ + or typeof(facility_tag_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(facility_tag_value).is_empty() \ + or typeof(time_band_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(time_band_value) not in OperationsCoordinator.TIME_BANDS \ + or typeof(plan_minute_value) != TYPE_INT \ + or int(plan_minute_value) != int(minute_value) \ + or typeof(count_value) != TYPE_INT or int(count_value) <= 0 \ + or not guest_ids_value is Array \ + or guest_ids_value.size() != int(count_value): + return false + seen_plan_ids[StringName(plan_id_value)] = true + for raw_guest_id: Variant in guest_ids_value: + if typeof(raw_guest_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var guest_id := StringName(raw_guest_id) + var actor_id := _guest_path_actor_id(guest_id) + if not _operations_sequence_id_is_valid(String(guest_id), "guest-auto-") \ + or seen_guest_ids.has(guest_id) or guest_service.has_guest(guest_id) \ + or not guest_service.get_persistent_record(guest_id).is_empty() \ + or economy_service.has_account(_guest_wallet_account(guest_id)) \ + or path_service.has_actor_projection(actor_id) \ + or _movement_credits.has(actor_id): + return false + seen_guest_ids[guest_id] = true + counted += 1 + if counted != int(total_value): + return false + var population_cap := int(operations_coordinator.get_config().get(&"population_cap", 0)) + return guest_service.guest_count() + counted <= population_cap \ + and _operations_entrance_cell() != null + + +func _operations_sequence_id_is_valid(value: String, prefix: String) -> bool: + if not value.begins_with(prefix) or value.length() != prefix.length() + 8: + return false + var suffix := value.substr(prefix.length(), 8) + if not suffix.is_valid_int(): + return false + var sequence := int(suffix) + return sequence > 0 and value == "%s%08d" % [prefix, sequence] + + +func _operations_entrance_cell() -> Variant: + var bounds := world_service.get_bounds() + for x in range(int(bounds.get(&"min_x", 0)), int(bounds.get(&"max_x", -1)) + 1): + var cell := Vector3i(x, 0, WorldService.LAYER_FRONT) + if not world_service.is_in_bounds(cell) \ + or world_service.get_zone(cell) != WorldService.ZONE_BOUNDARY: + continue + var traffic := path_service.get_cell_traffic(cell) + if traffic.is_empty() or bool(traffic.get(&"temporary_block", false)): + continue + return cell + return null + + +func _apply_operations_arrivals(payload: Dictionary, token: Variant) -> Dictionary: + if not token is Dictionary or token.is_empty() \ + or not _operations_arrival_payload_is_valid(payload): + return {&"ok": false, &"reason": &"ARRIVAL_PRECONDITION_FAILED"} + var prepare_hook := _run_operations_test_boundary_hook( + &"ARRIVAL_PLAN", payload, OPERATIONS_TEST_PREPARE_PHASE, token + ) + if not bool(prepare_hook.get(&"ok", false)): + return prepare_hook + if int(progression_service.metrics.get(&"guest_lifetime", 0)) \ + > ProgressionService.MAX_SAFE_INTEGER - int(payload[&"total_count"]): + return {&"ok": false, &"reason": &"ARRIVAL_LIFETIME_LIMIT"} + var entrance_value: Variant = _operations_entrance_cell() + var spawn_rng := get_rng_stream(&"guest_spawn") + var species_ids := mvp_content_catalog.get_species_ids() + if entrance_value == null or spawn_rng == null or species_ids.size() != 4: + return {&"ok": false, &"reason": &"ARRIVAL_CONTENT_UNAVAILABLE"} + var entrance: Vector3i = entrance_value + var accepted_count := 0 + var arrivals: Array[Dictionary] = [] + for raw_plan: Variant in payload[&"plans"]: + var plan: Dictionary = raw_plan + var guest_class := StringName(plan[&"guest_class"]) + for raw_guest_id: Variant in plan[&"guest_ids"]: + var guest_id := StringName(raw_guest_id) + var species := species_ids[spawn_rng.randi_range(0, species_ids.size() - 1)] + var definition_id := StringName("%s_%s" % [guest_class, species]) + var definition := guest_service.get_definition(definition_id) + if definition == null or not definition.adult_verified \ + or definition.wealth_min < 0 or definition.wealth_max < definition.wealth_min: + return {&"ok": false, &"reason": &"ARRIVAL_DEFINITION_INVALID"} + var wallet_gold := spawn_rng.randi_range( + definition.wealth_min, definition.wealth_max + ) + var command := SimulationCommand.new( + 1, + _clock.absolute_minute, + _clock.absolute_minute, + 0, + &"spawn_guest", + &"operations_coordinator", + guest_id, + { + &"guest_id": guest_id, + &"guest_type_id": definition_id, + &"gold": wallet_gold, + &"options": { + &"current_cell": entrance, + &"needs": { + &"hunger": 0, &"sleep": 0, &"hygiene": 0, + &"medical": 0, &"leisure": 0, &"intimacy": 0, + }, + &"planned_exit_at": _clock.absolute_minute + 720, + }, + }, + StringName("operations.arrival.%s" % guest_id) + ) + var spawned := _execute_spawn_guest(command) + var guest := guest_service.get_guest(guest_id) + if not spawned.is_success() or guest == null \ + or guest.guest_type_id != definition_id \ + or guest.current_cell != entrance \ + or guest.wallet_gold != wallet_gold \ + or economy_service.get_balance(_guest_wallet_account(guest_id)) != wallet_gold: + return { + &"ok": false, + &"reason": &"ARRIVAL_SPAWN_FAILED", + &"guest_id": guest_id, + &"result": spawned.to_dictionary(), + } + var arrival_row := { + &"guest_id": guest_id, + &"plan_id": StringName(plan[&"plan_id"]), + &"guest_class": guest_class, + &"species": species, + &"definition_id": definition_id, + &"adult_verified": true, + &"wallet_gold": wallet_gold, + &"entrance_cell": entrance, + } + if not _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"GUEST_AUTO_ARRIVED", + _clock.absolute_minute, + &"operations_coordinator", + [guest_id, definition_id], + arrival_row, + 0 + )): + return {&"ok": false, &"reason": &"ARRIVAL_EVENT_FAILED"} + arrivals.append(arrival_row) + accepted_count += 1 + if accepted_count == 1: + var after_mutation_hook := _run_operations_test_boundary_hook( + &"ARRIVAL_PLAN", + payload, + OPERATIONS_TEST_AFTER_FIRST_MUTATION_PHASE, + token + ) + if not bool(after_mutation_hook.get(&"ok", false)): + return after_mutation_hook + var runtime_crosslinks_ok := _validate_runtime_crosslinks( + facility_service, guest_service, economy_service, inventory_service, + staff_service, _operations_external_committed_minute(), + _staffing_projection_enabled + ) + var path_crosslinks_ok := _validate_runtime_path_crosslinks( + path_service, guest_service, staff_service, _movement_credits, + _clock.absolute_minute + ) + if accepted_count != int(payload[&"total_count"]) \ + or not runtime_crosslinks_ok or not path_crosslinks_ok: + return { + &"ok": false, + &"reason": &"ARRIVAL_POSTCONDITION_FAILED", + &"accepted_count": accepted_count, + &"expected_count": int(payload[&"total_count"]), + &"runtime_crosslinks_ok": runtime_crosslinks_ok, + &"path_crosslinks_ok": path_crosslinks_ok, + } + return { + &"ok": true, + &"accepted_count": accepted_count, + } + + +func _operations_morning_boundary( + payload: Dictionary, + phase: StringName, + token: Variant +) -> Dictionary: + if phase == OperationsCoordinator.PHASE_CAPTURE: + var captured := _capture_operations_external_state() + return {&"ok": not captured.is_empty(), &"token": captured} + if phase == OperationsCoordinator.PHASE_VALIDATE: + return { + &"ok": token is Dictionary and not token.is_empty() \ + and _operations_morning_payload_is_valid(payload), + &"token": token, + } + if phase == OperationsCoordinator.PHASE_APPLY: + return _apply_operations_morning(payload, token) + if phase == OperationsCoordinator.PHASE_ROLLBACK: + return {&"ok": _restore_operations_external_state(token)} + return {&"ok": false} + + +func _operations_morning_payload_is_valid(payload: Dictionary) -> bool: + var day_value: Variant = payload.get(&"day", null) + var minute_value: Variant = payload.get(&"boundary_minute", null) + if typeof(day_value) != TYPE_INT or int(day_value) <= 0 \ + or typeof(minute_value) != TYPE_INT: + return false + var minute := int(minute_value) + return minute == _clock.absolute_minute \ + and posmod(minute, SimulationKernel.MINUTES_PER_DAY) == OPERATIONS_START_MINUTE \ + and int(day_value) == minute / SimulationKernel.MINUTES_PER_DAY + 1 + + +func _apply_operations_morning(payload: Dictionary, token: Variant) -> Dictionary: + if not token is Dictionary or token.is_empty() \ + or not _operations_morning_payload_is_valid(payload): + return {&"ok": false, &"reason": &"MORNING_PRECONDITION_FAILED"} + var prepare_hook := _run_operations_test_boundary_hook( + &"MORNING_BOUNDARY", payload, OPERATIONS_TEST_PREPARE_PHASE, token + ) + if not bool(prepare_hook.get(&"ok", false)): + return prepare_hook + var minute := int(payload[&"boundary_minute"]) + var before_ap := _personal_action_points + _personal_action_points = mini( + _personal_action_points + 2, + MAX_PERSONAL_ACTION_POINTS + ) + var authority_advance := authority_service.advance_time(minute) + if not authority_advance.is_success(): + return { + &"ok": false, + &"reason": &"MORNING_AUTHORITY_ADVANCE_FAILED", + &"result": authority_advance.to_dictionary(), + } + var authority_evaluation := authority_service.evaluate_inspection(minute) + if not authority_evaluation.is_success(): + return { + &"ok": false, + &"reason": &"MORNING_AUTHORITY_EVALUATION_FAILED", + &"result": authority_evaluation.to_dictionary(), + } + if not authority_evaluation.is_replay: + _publish_authority_evaluation(authority_evaluation.details) + _enqueue_pending_relationship_candidates() + # start_next_event owns exactly one expiry pass and one actor audit pass. + # Calling those helpers separately here would double-apply morning effects. + var event_start := event_service.start_next_event( + minute, + _build_event_context(minute) + ) + var no_event_ready := ( + not event_start.is_success() + and event_start.message == "No eligible Event candidate is ready." + ) + var foreground_already_active := ( + not event_start.is_success() + and event_start.message == "A foreground Event is already active." + ) + if not event_start.is_success() and not no_event_ready and not foreground_already_active: + return { + &"ok": false, + &"reason": &"MORNING_EVENT_START_FAILED", + &"result": event_start.to_dictionary(), + } + if _personal_action_points < 0 \ + or _personal_action_points > MAX_PERSONAL_ACTION_POINTS \ + or authority_service.current_minute != minute \ + or not bool(authority_service.validate_invariants().get(&"ok", false)) \ + or not bool(event_service.validate_invariants().get(&"ok", false)) \ + or not bool(relationship_service.validate_invariants().get(&"ok", false)): + return {&"ok": false, &"reason": &"MORNING_POSTCONDITION_FAILED"} + return { + &"ok": true, + &"event_payload": { + &"personal_action_points_before": before_ap, + &"personal_action_points_after": _personal_action_points, + &"authority_advance": authority_advance.to_dictionary(), + &"authority_evaluation": authority_evaluation.to_dictionary(), + &"event_start": event_start.to_dictionary(), + &"no_event_ready": no_event_ready, + &"foreground_already_active": foreground_already_active, + }, + } + + +func _create_operations_runtime_snapshot() -> Dictionary: + return { + &"wrapper_version": OPERATIONS_RUNTIME_WRAPPER_VERSION, + &"enabled": _operations_enabled, + &"personal_action_points": _personal_action_points, + &"runtime_failure_latched": _operations_runtime_failure_latched, + &"runtime_failure_report": _operations_runtime_failure_report.duplicate(true), + &"deferred_runtime_minute": _operations_deferred_runtime_minute, + &"coordinator": ( + operations_coordinator.create_snapshot() + if _operations_enabled and operations_coordinator != null else {} + ), + } + + +func _parse_operations_runtime_snapshot( + raw_wrapper: Variant, + runtime_schema_version: int, + restored_minute: int, + restored_guests: GuestService, + restored_staff: StaffService, + restored_economy: EconomyService, + restored_world_seed: int, + restored_clock_paused: Variant, + restored_upkeep_settlement: FacilityUpkeepSettlement +) -> Dictionary: + var disabled := { + &"ok": true, + &"enabled": false, + &"personal_action_points": 0, + &"runtime_failure_latched": false, + &"runtime_failure_report": {}, + &"deferred_runtime_minute": -1, + &"coordinator": null, + } + if runtime_schema_version < OPERATIONS_RUNTIME_SNAPSHOT_VERSION: + return disabled + if typeof(restored_clock_paused) != TYPE_BOOL \ + or not restored_economy.has_account(WAGE_EXPENSE_ACCOUNT): + return {&"ok": false} + if not raw_wrapper is Dictionary: + return {&"ok": false} + var wrapper: Dictionary = raw_wrapper + var expected_keys: Array[StringName] = [ + &"wrapper_version", &"enabled", &"personal_action_points", + &"runtime_failure_latched", &"runtime_failure_report", + &"deferred_runtime_minute", &"coordinator", + ] + if not _dictionary_has_exact_canonical_keys(wrapper, expected_keys): + return {&"ok": false} + if typeof(wrapper[&"wrapper_version"]) != TYPE_INT \ + or int(wrapper[&"wrapper_version"]) != OPERATIONS_RUNTIME_WRAPPER_VERSION \ + or typeof(wrapper[&"enabled"]) != TYPE_BOOL \ + or typeof(wrapper[&"personal_action_points"]) != TYPE_INT \ + or typeof(wrapper[&"runtime_failure_latched"]) != TYPE_BOOL \ + or not wrapper[&"runtime_failure_report"] is Dictionary \ + or typeof(wrapper[&"deferred_runtime_minute"]) != TYPE_INT \ + or not wrapper[&"coordinator"] is Dictionary: + return {&"ok": false} + var enabled := bool(wrapper[&"enabled"]) + var action_points := int(wrapper[&"personal_action_points"]) + var failure_latched := bool(wrapper[&"runtime_failure_latched"]) + var failure_report: Dictionary = wrapper[&"runtime_failure_report"] + var deferred_runtime_minute := int(wrapper[&"deferred_runtime_minute"]) + var coordinator_snapshot: Dictionary = wrapper[&"coordinator"] + if action_points < 0 or action_points > MAX_PERSONAL_ACTION_POINTS \ + or failure_latched != not failure_report.is_empty() \ + or (failure_latched \ + and not _operations_failure_report_is_valid(failure_report, restored_minute)): + return {&"ok": false} + if not enabled: + if action_points != 0 or failure_latched or deferred_runtime_minute != -1 \ + or not coordinator_snapshot.is_empty(): + return {&"ok": false} + return disabled + var restored_coordinator := OperationsCoordinator.new() + if not restored_coordinator.restore_snapshot(coordinator_snapshot): + return {&"ok": false} + var coordinator_current_matches := restored_coordinator.current_minute == restored_minute + var pending_boundary_minute := int( + coordinator_snapshot.get(&"pending_boundary_minute", -1) + ) + var deferred_boundary_minute := int( + coordinator_snapshot.get(&"deferred_boundary_minute", -1) + ) + var normal_shape := deferred_runtime_minute == -1 \ + and not failure_latched and not restored_coordinator.pause_requested \ + and not restored_coordinator.is_terminal() \ + and coordinator_current_matches + var failure_shape := deferred_runtime_minute == restored_minute \ + and failure_latched and bool(restored_clock_paused) \ + and restored_coordinator.current_minute == restored_minute - 1 \ + and pending_boundary_minute == restored_minute + var pause_shape := deferred_runtime_minute == restored_minute \ + and not failure_latched and bool(restored_clock_paused) \ + and restored_coordinator.pause_requested and coordinator_current_matches \ + and deferred_boundary_minute == restored_minute + var terminal_shape := deferred_runtime_minute == -1 \ + and not failure_latched and restored_coordinator.is_terminal() \ + and coordinator_current_matches and bool(restored_clock_paused) + if not bool(restored_coordinator.validate_invariants().get(&"ok", false)) \ + or restored_coordinator.get_origin_minute() != OPERATIONS_COORDINATOR_ORIGIN_MINUTE \ + or not (normal_shape or failure_shape or pause_shape or terminal_shape) \ + or restored_coordinator.get_population_count() != restored_guests.guest_count() \ + or restored_coordinator.get_arrears_total() != (_staff_payroll_arrears_total(restored_staff) + restored_upkeep_settlement.get_arrears_through(restored_coordinator.get_daily_close_minute(restored_coordinator.get_open_financial_day() - 1))) \ + or not _operations_payroll_crosslinks_are_valid( + restored_coordinator, restored_staff, restored_economy, restored_upkeep_settlement + ) \ + or not _operations_coordinator_configuration_is_canonical( + restored_coordinator, restored_world_seed + ) \ + or not _operations_arrival_guest_crosslinks_are_valid( + restored_coordinator, restored_guests + ) \ + or (restored_coordinator.is_external_quarantined() \ + and not (failure_shape or pause_shape)): + return {&"ok": false} + return { + &"ok": true, + &"enabled": true, + &"personal_action_points": action_points, + &"runtime_failure_latched": failure_latched, + &"runtime_failure_report": failure_report.duplicate(true), + &"deferred_runtime_minute": deferred_runtime_minute, + &"coordinator": restored_coordinator, + } + + +func _progression_guest_lifetime_matches( + progression: ProgressionService, + guests: GuestService +) -> bool: + if progression == null or guests == null: + return false + var guest_snapshot := guests.create_snapshot() + var persistent_value: Variant = guest_snapshot.get(&"persistent_records", null) + var metrics_value: Variant = progression.create_snapshot().get(&"metrics", null) + if not persistent_value is Array or not metrics_value is Dictionary: + return false + var lifetime_value: Variant = (metrics_value as Dictionary).get(&"guest_lifetime", null) + return typeof(lifetime_value) == TYPE_INT \ + and int(lifetime_value) == guests.guest_count() + persistent_value.size() + + +func _operations_arrival_guest_crosslinks_are_valid( + coordinator: OperationsCoordinator, + guests: GuestService +) -> bool: + if coordinator == null or guests == null: + return false + var definitions_by_guest: Dictionary = {} + for guest: GuestRuntime in guests.get_guests(): + definitions_by_guest[guest.guest_id] = guest.guest_type_id + var guest_snapshot := guests.create_snapshot() + var persistent_value: Variant = guest_snapshot.get(&"persistent_records", null) + if not persistent_value is Array: + return false + for raw_record: Variant in persistent_value: + if not raw_record is Dictionary: + return false + var guest_id := StringName((raw_record as Dictionary).get(&"guest_id", &"")) + var definition_id := StringName( + (raw_record as Dictionary).get(&"guest_type_id", &"") + ) + if guest_id.is_empty() or definition_id.is_empty() \ + or definitions_by_guest.has(guest_id): + return false + definitions_by_guest[guest_id] = definition_id + var history_ids: Dictionary = {} + var expected_sequence := 1 + for report: Dictionary in coordinator.get_arrival_reports(): + var plans_value: Variant = report.get(&"plans", null) + if not plans_value is Array: + return false + for raw_plan: Variant in plans_value: + if not raw_plan is Dictionary: + return false + var plan: Dictionary = raw_plan + var guest_class := StringName(plan.get(&"guest_class", &"")) + var ids_value: Variant = plan.get(&"guest_ids", null) + if guest_class.is_empty() or not ids_value is Array: + return false + for raw_guest_id: Variant in ids_value: + if typeof(raw_guest_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var guest_id := StringName(raw_guest_id) + if guest_id != StringName("guest-auto-%08d" % expected_sequence) \ + or history_ids.has(guest_id) \ + or not definitions_by_guest.has(guest_id): + return false + var definition_id := String(definitions_by_guest[guest_id]) + if not definition_id.begins_with("%s_" % String(guest_class)): + return false + history_ids[guest_id] = true + expected_sequence += 1 + for raw_guest_id: Variant in definitions_by_guest: + var guest_id := StringName(raw_guest_id) + if String(guest_id).begins_with("guest-auto-") \ + and not history_ids.has(guest_id): + return false + return true + + +func _guest_aggregate_has_reserved_operations_id(guests: GuestService) -> bool: + if guests == null: + return true + for guest: GuestRuntime in guests.get_guests(): + if String(guest.guest_id).begins_with("guest-auto-"): + return true + var records: Variant = guests.create_snapshot().get(&"persistent_records", null) + if not records is Array: + return true + for raw_record: Variant in records: + if not raw_record is Dictionary \ + or String((raw_record as Dictionary).get(&"guest_id", "")).begins_with( + "guest-auto-" + ): + return true + return false + + +func _operations_payroll_crosslinks_are_valid( + coordinator: OperationsCoordinator, + staff: StaffService, + economy: EconomyService, + upkeep: FacilityUpkeepSettlement +) -> bool: + if coordinator == null or staff == null or economy == null: + return false + var staff_snapshot := staff.create_snapshot() + var settlement_values: Variant = staff_snapshot.get(&"payroll_settlements", null) + if not settlement_values is Array: + return false + var summaries := coordinator.get_day_summaries() + if summaries.size() != settlement_values.size(): + return false + var expected_wage_transactions: Dictionary = {} + var settlements_by_day: Dictionary = {} + for raw_settlement: Variant in settlement_values: + if not raw_settlement is Dictionary: + return false + var serialized: Dictionary = raw_settlement + var day_value: Variant = serialized.get(&"day", null) + var settlement_id_value: Variant = serialized.get(&"settlement_id", null) + if typeof(day_value) != TYPE_INT \ + or typeof(settlement_id_value) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var day := int(day_value) + var settlement_id := StringName(settlement_id_value) + if day <= 0 or settlement_id != StringName("payroll-day-%08d" % day) \ + or settlements_by_day.has(day): + return false + var staff_record := staff.get_payroll_settlement(settlement_id) + if staff_record.is_empty(): + return false + settlements_by_day[day] = staff_record + var paid_total := int(staff_record.get(&"paid_total", -1)) + if paid_total < 0: + return false + var idempotency_key := StringName("operations.wage.day.%08d" % day) + var transaction_id := economy.get_transaction_id_for_idempotency_key(idempotency_key) + if paid_total == 0: + if not transaction_id.is_empty(): + return false + continue + if transaction_id.is_empty() or expected_wage_transactions.has(transaction_id): + return false + var entries := economy.get_transaction_entries(transaction_id) + if entries.size() != 1: + return false + var entry: LedgerEntry = entries[0] + if entry.absolute_minute != coordinator.get_daily_close_minute(day) \ + or entry.debit_account != WAGE_EXPENSE_ACCOUNT \ + or entry.credit_account != PLAYER_CASH_ACCOUNT \ + or entry.amount != paid_total or entry.category != &"WAGE" \ + or entry.source_entity_id != settlement_id \ + or entry.memo_key != &"operations.payroll.settlement" \ + or not entry.related_transaction_id.is_empty(): + return false + expected_wage_transactions[transaction_id] = true + + for summary: Dictionary in summaries: + var day := int(summary.get(&"day", -1)) + if not settlements_by_day.has(day): + return false + var summary_settlement_value: Variant = summary.get(&"settlement", null) + if not summary_settlement_value is Dictionary: + return false + var summary_settlement: Dictionary = summary_settlement_value.duplicate(true) + var staff_record: Dictionary = settlements_by_day[day] + var expected_categories: Variant = _operations_expected_category_totals( + economy, + coordinator.get_financial_period_start(day), + coordinator.get_daily_close_minute(day), + int(staff_record.get(&"new_wages_total", -1)) + ) + if expected_categories == null \ + or not _strict_variants_equal( + _operations_snapshot_comparison_value( + summary.get(&"category_totals", {}) + ), + _operations_snapshot_comparison_value(expected_categories) + ) \ + or not _operations_facility_wage_summary_is_valid( + summary, staff_record, staff, economy + ): + return false + var upkeep_debt := 0 + for receipt: Dictionary in upkeep.get_report()[&"receipts"]: + if int(receipt[&"period"][&"period_end"]) <= coordinator.get_daily_close_minute(day): + upkeep_debt = 0 + for row: Dictionary in receipt[&"rows"]: + upkeep_debt += int(row[&"arrears"]) + if summary_settlement.has(&"upkeep_arrears_total"): + if typeof(summary_settlement[&"upkeep_arrears_total"]) != TYPE_INT or int(summary_settlement[&"upkeep_arrears_total"]) != upkeep_debt: + return false + summary_settlement.erase(&"upkeep_arrears_total") + elif upkeep_debt != 0: + return false + if int(summary_settlement.get(&"arrears_total", -1)) \ + != int(staff_record.get(&"unpaid_after_total", -2)) + upkeep_debt \ + or summary_settlement.get(&"replayed", null) != false: + return false + summary_settlement.erase(&"arrears_total") + summary_settlement.erase(&"replayed") + # OperationsCoordinator persists history in a transport-safe form, so + # StringName identifiers become String values after a round-trip. Compare + # the redundant Staff/Coordinator evidence in that same canonical form; + # numeric and structural types remain strict. + if not _strict_variants_equal( + _operations_snapshot_comparison_value(summary_settlement), + _operations_snapshot_comparison_value(staff_record) + ): + return false + + for entry: LedgerEntry in economy.get_entries(): + if entry.category == &"WAGE" \ + and not expected_wage_transactions.has(entry.transaction_id): + return false + return true + + +## Existing liabilities only. This projection does not issue financing or infer terms. +func get_loan_principal_report() -> Dictionary: + if not _initialized or economy_service == null or _state == null: + return {&"available": false, &"loans": []} + var cash := economy_service.get_balance(PLAYER_CASH_ACCOUNT) + var pending: Dictionary = {} + for command: SimulationCommand in command_queue.get_pending_commands(): + if command.command_type != &"repay_loan_principal": + continue + var id: Variant = command.payload.get(&"loan_id", null) + if typeof(id) not in [TYPE_STRING, TYPE_STRING_NAME]: + continue + var key := StringName(id) + if not pending.has(key): pending[key] = [] + pending[key].append(command.command_id) + var loans: Array[Dictionary] = [] + for account: Dictionary in economy_service.get_accounts(): + var id := String(account[&"account_id"]) + if not id.begins_with("LOAN_LIABILITY:"): + continue + var loan := StringName(id.trim_prefix("LOAN_LIABILITY:")) + loans.append({&"loan_id": loan, &"outstanding_principal": -economy_service.get_balance(StringName(id)), &"pending_command_ids": (pending.get(loan, []) as Array).duplicate()}) + loans.sort_custom(func(left: Dictionary, right: Dictionary) -> bool: return String(left[&"loan_id"]) < String(right[&"loan_id"])) + var valid: bool = _state.get_resource(&"gold") == cash and (loans.is_empty() or _loan_principal_ledger_is_valid(economy_service)) + var ended: bool = _operations_enabled and operations_coordinator != null and operations_coordinator.is_terminal() + return {&"available": true, &"ledger_valid": valid, &"terminal": ended, &"cash": cash, &"next_command_id": _next_command_id, &"loans": loans} + + +## Atomic principal payment against an already attested loan liability. +## Loan issuance, rates, due dates and bank eligibility belong to the bank +## producer; this API does not create or approve any financing contract. +func repay_loan_principal( + loan_id: StringName, + amount: Variant, + idempotency_key: StringName +) -> CommandResult: + if not _initialized or economy_service == null or _state == null: + return CommandResult.failed(CommandResult.Code.EXECUTOR_FAILED, 0, "Simulation runtime is not initialized.") + if _operations_enabled and operations_coordinator != null and operations_coordinator.is_terminal(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, 0, "Repayment is unavailable after the game ends.") + if loan_id.is_empty() or idempotency_key.is_empty() or typeof(amount) != TYPE_INT \ + or amount <= 0 or amount > OperationsCoordinator.MAX_FINANCIAL_AMOUNT: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, 0, "A loan id, positive integer principal and idempotency key are required.") + if not economy_service.get_transaction_id_for_idempotency_key(idempotency_key).is_empty(): + return CommandResult.failed(CommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY, 0, "The principal payment key has already been posted.") + if not _loan_principal_ledger_is_valid(economy_service): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, 0, "The principal ledger is inconsistent.") + var liability := StringName("LOAN_LIABILITY:" + String(loan_id)) + if not economy_service.has_account(liability): + return CommandResult.failed(CommandResult.Code.NOT_FOUND, 0, "The loan liability does not exist.") + var remaining := -economy_service.get_balance(liability) + var cash := economy_service.get_balance(PLAYER_CASH_ACCOUNT) + if amount > remaining or amount > cash or _state.get_resource(&"gold") != cash: + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, 0, "Principal payment exceeds the outstanding principal or available Gold, or its mirror is inconsistent.") + # The single balanced posting is atomic. Defer receipts until the Gold + # mirror is synchronized, also respecting any enclosing effect scope. + economy_service.begin_notification_scope() + var result := economy_service.transfer( + PLAYER_CASH_ACCOUNT, liability, amount, _runtime_event_minute(), + &"LOAN_PRINCIPAL_REPAID", loan_id, idempotency_key + ) + if result.is_success(): + _state.set_resource(&"gold", economy_service.get_balance(PLAYER_CASH_ACCOUNT)) + result.details[&"loan_id"] = loan_id + result.details[&"paid_principal"] = amount + result.details[&"outstanding_principal"] = remaining - amount + economy_service.end_notification_scope() + return result + + +func _loan_principal_ledger_is_valid(economy: EconomyService) -> bool: + if economy == null: + return false + var outstanding: Dictionary = {} + for entry: LedgerEntry in economy.get_entries(): + if entry.category not in [&"LOAN_PRINCIPAL_BORROWED", &"LOAN_PRINCIPAL_REPAID"]: + continue + if entry.source_entity_id.is_empty(): + return false + var liability := StringName("LOAN_LIABILITY:" + String(entry.source_entity_id)) + if not economy.has_account(liability) or not economy.account_allows_negative(liability): + return false + var remaining := int(outstanding.get(liability, 0)) + if entry.category == &"LOAN_PRINCIPAL_BORROWED": + if entry.debit_account != PLAYER_CASH_ACCOUNT or entry.credit_account != liability \ + or entry.amount > OperationsCoordinator.MAX_FINANCIAL_AMOUNT - remaining: + return false + remaining += entry.amount + else: + if entry.debit_account != liability or entry.credit_account != PLAYER_CASH_ACCOUNT \ + or entry.amount > remaining: + return false + remaining -= entry.amount + outstanding[liability] = remaining + for account: Dictionary in economy.get_accounts(): + var id: StringName = account[&"account_id"] + if String(id).begins_with("LOAN_LIABILITY:"): + if not economy.account_allows_negative(id) or economy.get_balance(id) != -int(outstanding.get(id, 0)): + return false + return true + + +func _operations_expected_category_totals( + economy: EconomyService, + period_start: int, + period_end_exclusive: int, + new_wages_total: int +) -> Variant: + if economy == null or period_start < 0 or period_end_exclusive <= period_start \ + or new_wages_total < 0: + return null + if not _loan_principal_ledger_is_valid(economy): + return null + var totals := { + &"revenue": 0, &"refunds": 0, &"cost_of_goods": 0, + &"wages": new_wages_total, &"maintenance": 0, &"utilities": 0, + &"taxes_and_interest": 0, &"fines": 0, + &"construction_cash_flow": 0, + } + var excluded: Array[StringName] = [ + &"EVENT_COST_RESERVED", &"EVENT_COST_RELEASED", &"INITIALIZATION", + &"TRANSFER", &"GENERATION", &"DESTRUCTION", &"MIGRATION", + &"SERVICE_CASH_SWEEP", &"WAGE", &"MAINTENANCE_PAYMENT", + ] + var mapping := { + &"SERVICE_SALE": &"revenue", &"REFUND": &"refunds", + &"CONSTRUCTION": &"construction_cash_flow", + &"CONSTRUCTION_REFUND": &"construction_cash_flow", + &"AUTHORITY_FINE": &"fines", &"OPERATING_EXPENSE": &"cost_of_goods", + &"STAFF_SIGNING_COST": &"cost_of_goods", &"EVENT_ACTION": &"cost_of_goods", + &"EVENT_COST_COMMITTED": &"cost_of_goods", + &"DEFENSE_SKILL_COST": &"cost_of_goods", + &"MAINTENANCE_ACCRUAL": &"maintenance", + &"LOAN_PRINCIPAL_BORROWED": &"financing_principal_inflows", + &"LOAN_PRINCIPAL_REPAID": &"financing_principal_outflows", + } + var operating_refunds := 0 + for entry: LedgerEntry in economy.get_entries(): + if entry.absolute_minute < period_start \ + or entry.absolute_minute >= period_end_exclusive: + continue + if entry.category in excluded: + continue + if entry.category == &"OPERATING_REFUND": + operating_refunds += entry.amount + continue + if not mapping.has(entry.category): + return null + var category: StringName = mapping[entry.category] + totals[category] = int(totals.get(category, 0)) + entry.amount + var offset := mini(operating_refunds, int(totals[&"cost_of_goods"])) + totals[&"cost_of_goods"] = int(totals[&"cost_of_goods"]) - offset + totals[&"revenue"] = int(totals[&"revenue"]) + operating_refunds - offset + return totals + + +func _operations_facility_wage_summary_is_valid( + summary: Dictionary, + staff_record: Dictionary, + _staff: StaffService, + economy: EconomyService +) -> bool: + var facilities_value: Variant = summary.get(&"facility_profit_loss", null) + var anomalies_value: Variant = summary.get(&"anomalies", null) + if not facilities_value is Dictionary or not anomalies_value is Array: + return false + var evidence: Dictionary = {} + var observed_unallocated: Dictionary = {} + for raw_anomaly: Variant in anomalies_value: + if not raw_anomaly is Dictionary: + return false + var anomaly: Dictionary = raw_anomaly + match StringName(anomaly.get(&"code", &"")): + &"WAGE_ALLOCATION_EVIDENCE": + if not evidence.is_empty() or not _dictionary_has_exact_canonical_keys( + anomaly, + [&"code", &"version", &"new_wages_total", &"allocated_total", + &"unallocated_total", &"allocations", &"unallocated_by_staff", + &"facility_ids"] + ): + return false + evidence = anomaly + &"UNALLOCATED_WAGES": + if not _dictionary_has_exact_canonical_keys( + anomaly, [&"code", &"staff_id", &"amount"] + ): + return false + var staff_id := StringName(anomaly.get(&"staff_id", &"")) + var amount_value: Variant = anomaly.get(&"amount", null) + if staff_id.is_empty() or typeof(amount_value) != TYPE_INT \ + or int(amount_value) <= 0 or observed_unallocated.has(staff_id): + return false + observed_unallocated[staff_id] = int(amount_value) + &"OPERATING_REFUND_EXCEEDS_PERIOD_COST": + if not _dictionary_has_exact_canonical_keys( + anomaly, [&"code", &"refund_total", &"cost_offset", &"excess_revenue"] + ): + return false + _: + return false + if evidence.is_empty() or int(evidence.get(&"version", -1)) != 1 \ + or typeof(evidence.get(&"new_wages_total", null)) != TYPE_INT \ + or int(evidence[&"new_wages_total"]) \ + != int(staff_record.get(&"new_wages_total", -1)) \ + or typeof(evidence.get(&"allocated_total", null)) != TYPE_INT \ + or typeof(evidence.get(&"unallocated_total", null)) != TYPE_INT \ + or not evidence.get(&"allocations", null) is Array \ + or not evidence.get(&"unallocated_by_staff", null) is Array \ + or not evidence.get(&"facility_ids", null) is Array: + return false + var allocations: Dictionary = {} + var previous_facility := "" + var allocated_total := 0 + for raw_row: Variant in evidence[&"allocations"]: + if not raw_row is Dictionary or not _dictionary_has_exact_canonical_keys( + raw_row, [&"facility_id", &"amount"] + ): + return false + var facility_id := StringName((raw_row as Dictionary).get(&"facility_id", &"")) + var amount_value: Variant = (raw_row as Dictionary).get(&"amount", null) + if facility_id.is_empty() or typeof(amount_value) != TYPE_INT \ + or int(amount_value) <= 0 or allocations.has(facility_id) \ + or (not previous_facility.is_empty() \ + and String(facility_id) <= previous_facility): + return false + allocations[facility_id] = int(amount_value) + allocated_total += int(amount_value) + previous_facility = String(facility_id) + var unallocated: Dictionary = {} + var previous_staff := "" + var unallocated_total := 0 + for raw_row: Variant in evidence[&"unallocated_by_staff"]: + if not raw_row is Dictionary or not _dictionary_has_exact_canonical_keys( + raw_row, [&"staff_id", &"amount"] + ): + return false + var staff_id := StringName((raw_row as Dictionary).get(&"staff_id", &"")) + var amount_value: Variant = (raw_row as Dictionary).get(&"amount", null) + if staff_id.is_empty() or typeof(amount_value) != TYPE_INT \ + or int(amount_value) <= 0 or unallocated.has(staff_id) \ + or (not previous_staff.is_empty() and String(staff_id) <= previous_staff): + return false + unallocated[staff_id] = int(amount_value) + unallocated_total += int(amount_value) + previous_staff = String(staff_id) + var expected_facility_ids: Dictionary = {} + var previous_id := "" + for raw_id: Variant in evidence[&"facility_ids"]: + if typeof(raw_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var facility_id := StringName(raw_id) + if facility_id.is_empty() or expected_facility_ids.has(facility_id) \ + or (not previous_id.is_empty() and String(facility_id) <= previous_id): + return false + expected_facility_ids[facility_id] = true + previous_id = String(facility_id) + var new_wages_total := int(evidence[&"new_wages_total"]) + if allocated_total != int(evidence[&"allocated_total"]) \ + or unallocated_total != int(evidence[&"unallocated_total"]) \ + or allocated_total + unallocated_total != new_wages_total \ + or not _strict_variants_equal(observed_unallocated, unallocated): + return false + for facility_id: StringName in allocations: + if not expected_facility_ids.has(facility_id): + return false + var facility_rows: Dictionary = facilities_value + if facility_rows.size() != expected_facility_ids.size(): + return false + for raw_id: Variant in facility_rows: + if not expected_facility_ids.has(StringName(raw_id)): + return false + var period_start := int(summary.get(&"period_start_minute", -1)) + var period_end := int(summary.get(&"period_end_minute_exclusive", -1)) + if period_start < 0 or period_end <= period_start: + return false + var base_rows: Dictionary = {} + for facility_id: StringName in expected_facility_ids: + base_rows[facility_id] = {&"revenue": 0, &"expenses": 0} + var excluded: Array[StringName] = [ + &"EVENT_COST_RESERVED", &"EVENT_COST_RELEASED", &"INITIALIZATION", + &"TRANSFER", &"GENERATION", &"DESTRUCTION", &"MIGRATION", + &"SERVICE_CASH_SWEEP", &"WAGE", &"MAINTENANCE_PAYMENT", &"OPERATING_REFUND", + ] + var mapping := { + &"SERVICE_SALE": &"revenue", &"REFUND": &"expenses", + &"AUTHORITY_FINE": &"expenses", &"OPERATING_EXPENSE": &"expenses", + &"STAFF_SIGNING_COST": &"expenses", &"EVENT_ACTION": &"expenses", + &"EVENT_COST_COMMITTED": &"expenses", &"DEFENSE_SKILL_COST": &"expenses", + &"MAINTENANCE_ACCRUAL": &"expenses", + } + for entry: LedgerEntry in economy.get_entries(): + if entry.absolute_minute < period_start or entry.absolute_minute >= period_end \ + or entry.category in excluded \ + or entry.category in [&"CONSTRUCTION", &"CONSTRUCTION_REFUND"] \ + or not expected_facility_ids.has(entry.source_entity_id): + continue + if not mapping.has(entry.category): + return false + var base: Dictionary = base_rows[entry.source_entity_id] + var key: StringName = mapping[entry.category] + base[key] = int(base[key]) + entry.amount + for facility_id: StringName in expected_facility_ids: + var row_value: Variant = facility_rows.get(facility_id, null) + if not row_value is Dictionary: + return false + var row: Dictionary = row_value + var base: Dictionary = base_rows[facility_id] + var expected_revenue := int(base[&"revenue"]) + var expected_expenses := int(base[&"expenses"]) \ + + int(allocations.get(facility_id, 0)) + if int(row.get(&"revenue", -1)) != expected_revenue \ + or int(row.get(&"expenses", -1)) != expected_expenses \ + or int(row.get(&"net_profit", 0)) != expected_revenue - expected_expenses: + return false + return true + + +func _operations_facility_wage_summary_from_live_shifts_is_valid( + summary: Dictionary, + staff_record: Dictionary, + staff: StaffService, + economy: EconomyService +) -> bool: + var facilities_value: Variant = summary.get(&"facility_profit_loss", null) + var rows_value: Variant = staff_record.get(&"rows", null) + var anomalies_value: Variant = summary.get(&"anomalies", null) + if not facilities_value is Dictionary or not rows_value is Array \ + or not anomalies_value is Array: + return false + var facility_rows: Dictionary = facilities_value + var period_start := int(summary.get(&"period_start_minute", -1)) + var period_end := int(summary.get(&"period_end_minute_exclusive", -1)) + if period_start < 0 or period_end <= period_start: + return false + var wages_by_staff: Dictionary = {} + for raw_row: Variant in rows_value: + if not raw_row is Dictionary: + return false + var row: Dictionary = raw_row + var staff_id := StringName(row.get(&"staff_id", &"")) + var wage_value: Variant = row.get(&"new_wages", null) + if staff_id.is_empty() or typeof(wage_value) != TYPE_INT \ + or int(wage_value) < 0 or wages_by_staff.has(staff_id): + return false + wages_by_staff[staff_id] = int(wage_value) + var weights_by_staff: Dictionary = {} + for shift: ShiftInstance in staff.get_shifts(): + if shift == null or shift.cancelled or shift.assigned_facility_id.is_empty() \ + or not wages_by_staff.has(shift.staff_id) \ + or int(wages_by_staff[shift.staff_id]) <= 0: + continue + var overlap := maxi( + mini(shift.end_at, period_end) - maxi(shift.start_at, period_start), 0 + ) + if overlap <= 0: + continue + var recorded := shift.worked_minutes + shift.overtime_minutes + var weight := mini(recorded, overlap) if recorded > 0 else overlap + if weight <= 0: + continue + if not weights_by_staff.has(shift.staff_id): + weights_by_staff[shift.staff_id] = {} + var weights: Dictionary = weights_by_staff[shift.staff_id] + weights[shift.assigned_facility_id] = int( + weights.get(shift.assigned_facility_id, 0) + ) + weight + var expected_allocations: Dictionary = {} + var expected_unallocated: Dictionary = {} + for staff_id: StringName in _sorted_name_keys(wages_by_staff): + var wage := int(wages_by_staff[staff_id]) + if wage <= 0: + continue + var weights: Dictionary = weights_by_staff.get(staff_id, {}) + if weights.is_empty(): + expected_unallocated[staff_id] = wage + continue + var facility_ids := _sorted_name_keys(weights) + var total_weight := 0 + for facility_id: StringName in facility_ids: + total_weight += int(weights[facility_id]) + if total_weight <= 0: + return false + var allocated := 0 + for facility_id: StringName in facility_ids: + var amount := wage * int(weights[facility_id]) / total_weight + expected_allocations[facility_id] = int( + expected_allocations.get(facility_id, 0) + ) + amount + allocated += amount + var remainder := wage - allocated + for index in range(remainder): + var facility_id: StringName = facility_ids[index] + expected_allocations[facility_id] = int(expected_allocations[facility_id]) + 1 + + var base_rows: Dictionary = {} + var excluded: Array[StringName] = [ + &"EVENT_COST_RESERVED", &"EVENT_COST_RELEASED", &"INITIALIZATION", + &"TRANSFER", &"GENERATION", &"DESTRUCTION", &"MIGRATION", + &"SERVICE_CASH_SWEEP", &"WAGE", &"MAINTENANCE_PAYMENT", &"OPERATING_REFUND", + ] + var mapping := { + &"SERVICE_SALE": &"revenue", &"REFUND": &"expense", + &"AUTHORITY_FINE": &"expense", &"OPERATING_EXPENSE": &"expense", + &"STAFF_SIGNING_COST": &"expense", &"EVENT_ACTION": &"expense", + &"EVENT_COST_COMMITTED": &"expense", &"DEFENSE_SKILL_COST": &"expense", + } + for entry: LedgerEntry in economy.get_entries(): + if entry.absolute_minute < period_start or entry.absolute_minute >= period_end \ + or entry.category in excluded \ + or entry.category in [&"CONSTRUCTION", &"CONSTRUCTION_REFUND"] \ + or entry.source_entity_id.is_empty() \ + or not facility_rows.has(entry.source_entity_id): + continue + if not mapping.has(entry.category): + return false + if not base_rows.has(entry.source_entity_id): + base_rows[entry.source_entity_id] = {&"revenue": 0, &"expenses": 0} + var base: Dictionary = base_rows[entry.source_entity_id] + var key: StringName = mapping[entry.category] + if key == &"revenue": + base[&"revenue"] = int(base[&"revenue"]) + entry.amount + else: + base[&"expenses"] = int(base[&"expenses"]) + entry.amount + for raw_facility_id: Variant in facility_rows: + var facility_id := StringName(raw_facility_id) + var row_value: Variant = facility_rows[raw_facility_id] + if facility_id.is_empty() or not row_value is Dictionary: + return false + var row: Dictionary = row_value + var base: Dictionary = base_rows.get( + facility_id, {&"revenue": 0, &"expenses": 0} + ) + if int(row.get(&"revenue", -1)) != int(base[&"revenue"]) \ + or int(row.get(&"expenses", -1)) \ + != int(base[&"expenses"]) + int(expected_allocations.get(facility_id, 0)): + return false + for facility_id: StringName in expected_allocations: + if not facility_rows.has(facility_id): + return false + var observed_unallocated: Dictionary = {} + for raw_anomaly: Variant in anomalies_value: + if not raw_anomaly is Dictionary: + return false + var anomaly: Dictionary = raw_anomaly + if StringName(anomaly.get(&"code", &"")) != &"UNALLOCATED_WAGES": + continue + var staff_id := StringName(anomaly.get(&"staff_id", &"")) + var amount_value: Variant = anomaly.get(&"amount", null) + if staff_id.is_empty() or typeof(amount_value) != TYPE_INT \ + or int(amount_value) <= 0 or observed_unallocated.has(staff_id): + return false + observed_unallocated[staff_id] = int(amount_value) + return _strict_variants_equal(observed_unallocated, expected_unallocated) + + +func _operations_coordinator_configuration_is_canonical( + coordinator: OperationsCoordinator, + expected_world_seed: int +) -> bool: + if coordinator == null: + return false + var expected := OperationsCoordinator.new({ + &"start_minute": OPERATIONS_COORDINATOR_ORIGIN_MINUTE, + &"world_seed": expected_world_seed, + }) + if not _strict_variants_equal(coordinator.get_config(), expected.get_config()): + return false + var profiles := coordinator.get_demand_profiles() + if profiles.size() != DEFAULT_OPERATIONS_DEMAND_PROFILES.size(): + return false + var expected_identities: Dictionary = {} + for raw_profile: Variant in DEFAULT_OPERATIONS_DEMAND_PROFILES: + var profile: Dictionary = raw_profile + var key := "%s|%s|%s" % [ + profile[&"facility_tag"], profile[&"guest_class"], profile[&"time_band"], + ] + expected_identities[key] = true + var seen: Dictionary = {} + var expected_components := { + &"base": 100, &"reputation": 0, &"unmet_need": 0, + &"event": 0, &"recent_price_penalty": 0, &"wait_penalty": 0, + } + for profile: Dictionary in profiles: + var key := "%s|%s|%s" % [ + profile.get(&"facility_tag", &""), + profile.get(&"guest_class", &""), + profile.get(&"time_band", &""), + ] + if not expected_identities.has(key) or seen.has(key) \ + or not _strict_variants_equal( + profile.get(&"components", {}), expected_components + ): + return false + seen[key] = true + return seen.size() == expected_identities.size() + + +func _staff_payroll_arrears_total(service: StaffService) -> int: + var total := 0 + for row: Dictionary in service.get_payroll_obligations(): + var unpaid: Variant = row.get(&"unpaid_wages", null) + if typeof(unpaid) != TYPE_INT or int(unpaid) < 0: + return -1 + total += int(unpaid) + return total + + +func _operations_failure_report_is_valid(report: Dictionary, minute: int) -> bool: + if report.size() == 2 \ + and _dictionary_has_exact_canonical_keys(report, [&"code", &"minute"]): + var simple_code: Variant = report.get(&"code", null) + var simple_minute: Variant = report.get(&"minute", null) + return typeof(simple_code) in [TYPE_STRING, TYPE_STRING_NAME] \ + and not String(simple_code).is_empty() \ + and typeof(simple_minute) == TYPE_INT and int(simple_minute) == minute + var result_keys: Array[StringName] = [ + &"code", &"command_id", &"target_id", &"message", + &"resolution_hints", &"details", &"is_replay", + ] + if not _dictionary_has_exact_canonical_keys(report, result_keys): + return false + var code_value: Variant = report.get(&"code", null) + var command_id_value: Variant = report.get(&"command_id", null) + var target_value: Variant = report.get(&"target_id", null) + var message_value: Variant = report.get(&"message", null) + var hints_value: Variant = report.get(&"resolution_hints", null) + var details_value: Variant = report.get(&"details", null) + if typeof(code_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or String(code_value).is_empty() or String(code_value) == "OK" \ + or typeof(command_id_value) != TYPE_INT or int(command_id_value) < 0 \ + or typeof(target_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or typeof(message_value) != TYPE_STRING \ + or not hints_value is Array or hints_value.size() > 32 \ + or not details_value is Dictionary \ + or typeof(report.get(&"is_replay", null)) != TYPE_BOOL: + return false + for raw_hint: Variant in hints_value: + if typeof(raw_hint) != TYPE_STRING or String(raw_hint).length() > 4_096: + return false + return JSON.stringify(details_value).length() <= 262_144 + + +func _dictionary_has_exact_canonical_keys( + source: Dictionary, + expected_keys: Array[StringName] +) -> bool: + if source.size() != expected_keys.size(): + return false + var seen: Dictionary = {} + for raw_key: Variant in source: + if typeof(raw_key) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var key := StringName(raw_key) + if not expected_keys.has(key) or seen.has(key): + return false + seen[key] = true + return seen.size() == expected_keys.size() + + +func _operations_api_failure( + code: StringName, + message: String, + details: Dictionary = {} +) -> Dictionary: + return { + &"ok": false, + &"code": code, + &"message": message, + &"details": details.duplicate(true), + } + + +func register_save_migration_step( + from_version: int, + migration_id: StringName, + migrator: Callable +) -> Dictionary: + return save_migration_registry.register_step(from_version, migration_id, migrator) + + +func queue_checkpoint( + save_path := "", + metadata := {}, + use_autosave := false, + reason: StringName = &"manual" +) -> Dictionary: + if not _initialized: + return { + &"ok": false, + &"code": &"RUNTIME_NOT_INITIALIZED", + &"message": "Simulation runtime is not initialized.", + } + var resolved_path := str(save_path) + if resolved_path.is_empty(): + resolved_path = str(_save_policy[&"autosave_path"]) + var request_id := _next_checkpoint_request_id + _next_checkpoint_request_id += 1 + _pending_checkpoints.append({ + &"request_id": request_id, + &"save_path": resolved_path, + &"metadata": metadata.duplicate(true) if metadata is Dictionary else {}, + &"use_autosave": bool(use_autosave), + &"reason": reason if not reason.is_empty() else &"manual", + }) + return { + &"ok": true, + &"code": &"CHECKPOINT_QUEUED", + &"request_id": request_id, + &"save_path": resolved_path, + &"queued_for_tick_boundary": true, + &"queued_at_absolute_minute": _clock.absolute_minute, + } + + +func queue_manual_checkpoint(save_path: String, metadata := {}) -> Dictionary: + return queue_checkpoint(save_path, metadata, false, &"manual") + + +func save_to_path(save_path: String, metadata := {}) -> Dictionary: + return _perform_checkpoint_save(save_path, metadata, false, &"manual", 0) + + +func inspect_recovery_candidates( + save_path := "", + generation_count := -1 +) -> Dictionary: + var resolved_path := str(save_path) + if resolved_path.is_empty(): + resolved_path = str(_save_policy[&"autosave_path"]) + var resolved_generations := generation_count + if resolved_generations < 0: + resolved_generations = int(_save_policy[&"autosave_generations"]) + var started_at_us := Time.get_ticks_usec() + var result := SaveService.inspect_recovery_candidates( + resolved_path, + resolved_generations + ) + var runtime_duration_us := maxi(int(Time.get_ticks_usec() - started_at_us), 0) + _record_runtime_performance(&"load", runtime_duration_us) + return _with_operation_context(result, { + &"operation": &"inspect_recovery", + &"save_path": resolved_path, + &"runtime_duration_us": runtime_duration_us, + }) + + +func load_from_path(save_path: String) -> Dictionary: + var started_at_us := Time.get_ticks_usec() + var previous_paused := _clock.paused + _clock.set_paused(true) + var result := SaveService.load_snapshot(save_path) + if not result[&"ok"] and result[&"code"] == &"UNSUPPORTED_FORMAT" \ + and bool(_save_policy.get(&"auto_migrate", true)): + var migration := SaveService.migrate_save( + save_path, + save_migration_registry, + SaveService.FORMAT_VERSION + ) + _record_runtime_performance(&"save", int(migration.get(&"duration_us", 0))) + if migration[&"ok"]: + result = SaveService.load_snapshot(save_path) + else: + result = _with_operation_context(migration, { + &"operation": &"load", + &"migration_attempted": true, + }) + return _finish_load_operation( + result, + save_path, + previous_paused, + started_at_us, + &"load", + &"SAVE_LOADED", + &"SAVE_LOAD_FAILED" + ) + + +func load_with_recovery( + save_path := "", + generation_count := -1 +) -> Dictionary: + var resolved_path := str(save_path) + if resolved_path.is_empty(): + resolved_path = str(_save_policy[&"autosave_path"]) + var resolved_generations := generation_count + if resolved_generations < 0: + resolved_generations = int(_save_policy[&"autosave_generations"]) + var started_at_us := Time.get_ticks_usec() + var previous_paused := _clock.paused + # Recovery is a two-stage decision. SaveService establishes package, + # checksum, format, and generic snapshot validity; Runtime then tries every + # package-loadable candidate in the same stable order against authoritative + # domain and cross-link rules. Failed domain attempts never reach the commit + # boundary in _restore_snapshot_internal. + var live_snapshot_before := create_snapshot() + _clock.set_paused(true) + var package_inventory := SaveService.inspect_recovery_candidates( + resolved_path, + resolved_generations + ) + var result := _attempt_domain_valid_recovery( + resolved_path, + package_inventory + ) + return _finish_recovery_operation( + result, + resolved_path, + previous_paused, + started_at_us, + live_snapshot_before + ) + + +func _attempt_domain_valid_recovery( + save_path: String, + package_inventory: Dictionary +) -> Dictionary: + var package_report := package_inventory.duplicate(true) + # The selected package snapshot is an implementation detail of the package + # inspection pass. Every actual attempt is loaded again through the explicit, + # read-only candidate API so the final selection cannot accidentally reuse a + # different candidate's payload. + package_report.erase(&"snapshot") + var package_recovery_report: Dictionary = {} + var package_recovery_value: Variant = package_inventory.get(&"recovery_report", {}) + if package_recovery_value is Dictionary: + package_recovery_report = package_recovery_value.duplicate(true) + var raw_candidates_value: Variant = package_inventory.get(&"candidates", []) + var candidates: Array[Dictionary] = [] + if raw_candidates_value is Array: + for raw_candidate: Variant in raw_candidates_value: + if not raw_candidate is Dictionary: + continue + var candidate: Dictionary = raw_candidate.duplicate(true) + var package_loadable := bool(candidate.get(&"valid", false)) + candidate[&"package_loadable"] = package_loadable + candidate[&"package_status"] = &"VALID" if package_loadable else &"REJECTED" + candidate[&"package_rejected"] = not package_loadable + candidate[&"package_rejection_code"] = ( + &"" if package_loadable else StringName(candidate.get(&"code", &"PACKAGE_REJECTED")) + ) + candidate[&"domain_status"] = &"NOT_ATTEMPTED" + candidate[&"domain_attempted"] = false + candidate[&"domain_valid"] = false + candidate[&"domain_rejected"] = false + candidate[&"domain_rejection_code"] = &"" + candidate[&"failed_attempt_live_state_preserved"] = true + candidate[&"selected"] = false + candidates.append(candidate) + + if not bool(package_inventory.get(&"ok", false)) \ + and not _has_package_loadable_recovery_candidate(candidates): + return _recovery_failure_result( + StringName(package_inventory.get(&"code", &"NO_VALID_RECOVERY_CANDIDATE")), + str(package_inventory.get(&"message", save_path)), + candidates, + package_report, + package_recovery_report, + &"NO_PACKAGE_VALID_RECOVERY_CANDIDATE" + ) + + for candidate_index in range(candidates.size()): + var candidate: Dictionary = candidates[candidate_index] + if not bool(candidate[&"package_loadable"]): + continue + var candidate_id := StringName(candidate.get(&"id", &"")) + var generation := int(candidate.get(&"generation", -1)) + var loaded := SaveService.load_recovery_candidate( + save_path, + candidate_id, + generation + ) + if not bool(loaded.get(&"ok", false)): + # A candidate may disappear or become corrupt between inventory and + # its explicit load. Treat that race as a package rejection and keep + # walking the already-established priority order. + candidate[&"package_status"] = &"REJECTED" + candidate[&"package_rejected"] = true + candidate[&"package_load_succeeded"] = false + candidate[&"package_rejection_code"] = StringName( + loaded.get(&"code", &"PACKAGE_LOAD_FAILED") + ) + candidate[&"package_rejection_message"] = str(loaded.get(&"message", "")) + candidates[candidate_index] = candidate + continue + + candidate[&"package_load_succeeded"] = true + candidate[&"domain_attempted"] = true + var package_attempt_report: Dictionary = {} + var loaded_report_value: Variant = loaded.get(&"recovery_report", {}) + if loaded_report_value is Dictionary: + package_attempt_report = loaded_report_value.duplicate(true) + var attempt_live_guard := create_snapshot() + var attempt_pause_guard := _clock.paused + if not _restore_snapshot_internal(loaded[&"snapshot"], true): + candidate[&"domain_status"] = &"REJECTED" + candidate[&"domain_rejected"] = true + candidate[&"domain_rejection_code"] = &"DOMAIN_OR_CROSSLINK_VALIDATION_FAILED" + candidate[&"failed_attempt_live_state_preserved"] = ( + create_snapshot() == attempt_live_guard + and _clock.paused == attempt_pause_guard + ) + candidates[candidate_index] = candidate + continue + + candidate[&"domain_status"] = &"VALID" + candidate[&"domain_valid"] = true + candidate[&"selected"] = true + candidates[candidate_index] = candidate + var result := loaded.duplicate(true) + result[&"ok"] = true + result[&"code"] = &"OK" + result[&"selection_rule"] = package_inventory.get( + &"selection_rule", + &"FORMAL_BACKUP_MIGRATION_AUTOSAVE_NEWEST_FIRST" + ) + result[&"selected"] = candidate.duplicate(true) + result[&"candidates"] = candidates.duplicate(true) + result[&"candidate_attempts"] = candidates.duplicate(true) + result[&"package_candidate_report"] = package_report + result[&"package_recovery_report"] = package_attempt_report + result[&"restore_safety_report"] = latest_restore_safety_report.duplicate(true) + result[&"recovery_report"] = latest_restore_safety_report.duplicate(true) + result[&"recovery_report"][&"restore_committed"] = true + result[&"recovery_report"][&"selected_candidate_id"] = candidate_id + result[&"recovery_report"][&"package_rejections"] = _recovery_package_rejections(candidates) + result[&"recovery_report"][&"domain_rejections"] = _recovery_domain_rejections(candidates) + return result + + return _recovery_failure_result( + &"RESTORE_FAILED", + save_path, + candidates, + package_report, + package_recovery_report, + &"NO_DOMAIN_VALID_RECOVERY_CANDIDATE" + ) + + +func _finish_recovery_operation( + loaded_result: Dictionary, + save_path: String, + previous_paused: bool, + started_at_us: int, + live_snapshot_before: Dictionary +) -> Dictionary: + var result := loaded_result.duplicate(true) + if not bool(result.get(&"ok", false)): + _clock.set_paused(previous_paused) + var runtime_duration_us := maxi(int(Time.get_ticks_usec() - started_at_us), 0) + _record_runtime_performance(&"load", runtime_duration_us) + var live_state_preserved := true + if not bool(result.get(&"ok", false)): + live_state_preserved = create_snapshot() == live_snapshot_before + result = _with_operation_context(result, { + &"operation": &"recovery", + &"save_path": save_path, + &"runtime_duration_us": runtime_duration_us, + &"loaded_clock_paused": _clock.paused if result.get(&"ok", false) else previous_paused, + &"preload_pause_restored": true if result.get(&"ok", false) else _clock.paused == previous_paused, + &"live_state_preserved": live_state_preserved, + }) + if bool(result.get(&"ok", false)): + _complete_save_operation(result, &"SAVE_RECOVERY_LOADED") + else: + # A failed recovery is an observational operation. Publishing a persisted + # DomainEvent here would itself violate the promised all-live-state atomicity. + latest_save_operation_result = _save_event_payload(result) + save_operation_completed.emit(result.duplicate(true)) + return result + + +func _has_package_loadable_recovery_candidate(candidates: Array[Dictionary]) -> bool: + for candidate: Dictionary in candidates: + if bool(candidate.get(&"package_loadable", false)): + return true + return false + + +func _recovery_package_rejections(candidates: Array[Dictionary]) -> Array[Dictionary]: + var rejected: Array[Dictionary] = [] + for candidate: Dictionary in candidates: + if not bool(candidate.get(&"package_rejected", false)): + continue + rejected.append({ + &"id": StringName(candidate.get(&"id", &"")), + &"code": StringName(candidate.get(&"package_rejection_code", &"PACKAGE_REJECTED")), + }) + return rejected + + +func _recovery_domain_rejections(candidates: Array[Dictionary]) -> Array[Dictionary]: + var rejected: Array[Dictionary] = [] + for candidate: Dictionary in candidates: + if not bool(candidate.get(&"domain_rejected", false)): + continue + rejected.append({ + &"id": StringName(candidate.get(&"id", &"")), + &"code": StringName(candidate.get( + &"domain_rejection_code", + &"DOMAIN_OR_CROSSLINK_VALIDATION_FAILED" + )), + }) + return rejected + + +func _recovery_failure_result( + code: StringName, + message: String, + candidates: Array[Dictionary], + package_report: Dictionary, + package_recovery_report: Dictionary, + rejection_reason: StringName +) -> Dictionary: + var restore_safety_report := { + &"report_version": 2, + &"recovery_mode": true, + &"repair_policy": &"WHITELISTED_AUTHORITATIVE_ONLY", + &"automatic_repairs_applied": false, + &"restore_committed": false, + &"rejection_reason": rejection_reason, + &"package_rejections": _recovery_package_rejections(candidates), + &"domain_rejections": _recovery_domain_rejections(candidates), + &"forbidden_repairs_applied": false, + } + return { + &"ok": false, + &"code": code, + &"message": message, + &"selection_rule": package_report.get( + &"selection_rule", + &"FORMAL_BACKUP_MIGRATION_AUTOSAVE_NEWEST_FIRST" + ), + &"selected": {}, + &"candidates": candidates.duplicate(true), + &"candidate_attempts": candidates.duplicate(true), + &"package_candidate_report": package_report.duplicate(true), + &"package_recovery_report": package_recovery_report.duplicate(true), + &"restore_safety_report": restore_safety_report.duplicate(true), + &"recovery_report": restore_safety_report, + } + + +func load_recovery_candidate( + save_path: String, + candidate_id: StringName, + generation := -1 +) -> Dictionary: + var started_at_us := Time.get_ticks_usec() + var previous_paused := _clock.paused + _clock.set_paused(true) + var result := SaveService.load_recovery_candidate(save_path, candidate_id, generation) + return _finish_load_operation( + result, + save_path, + previous_paused, + started_at_us, + &"recovery_candidate", + &"SAVE_RECOVERY_CANDIDATE_LOADED", + &"SAVE_RECOVERY_FAILED" + ) + + +func migrate_save_path( + save_path: String, + target_version := SaveService.FORMAT_VERSION +) -> Dictionary: + var started_at_us := Time.get_ticks_usec() + var previous_paused := _clock.paused + _clock.set_paused(true) + var result := SaveService.migrate_save(save_path, save_migration_registry, target_version) + _clock.set_paused(previous_paused) + var runtime_duration_us := maxi(int(Time.get_ticks_usec() - started_at_us), 0) + _record_runtime_performance(&"save", runtime_duration_us) + result = _with_operation_context(result, { + &"operation": &"migration", + &"save_path": save_path, + &"runtime_duration_us": runtime_duration_us, + &"clock_pause_restored": _clock.paused == previous_paused, + }) + _complete_save_operation( + result, + &"SAVE_MIGRATION_SUCCEEDED" if result[&"ok"] else &"SAVE_MIGRATION_FAILED" + ) + return result + + +func _process_save_checkpoints(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + if bool(_save_policy.get(&"enabled", false)) \ + and bool(_save_policy.get(&"daily_checkpoint_enabled", true)) \ + and posmod(absolute_minute, SimulationKernel.MINUTES_PER_DAY) == SimulationKernel.START_ABSOLUTE_MINUTE: + var checkpoint_day := absolute_minute / SimulationKernel.MINUTES_PER_DAY + 1 + if checkpoint_day != _last_daily_checkpoint_day: + var previous_checkpoint_day := _last_daily_checkpoint_day + _last_daily_checkpoint_day = checkpoint_day + var daily_result := _perform_checkpoint_save( + str(_save_policy[&"autosave_path"]), + { + &"display_name": "Daily Autosave", + &"checkpoint_day": checkpoint_day, + &"checkpoint_absolute_minute": absolute_minute, + }, + true, + &"daily_0600", + 0 + ) + if not daily_result[&"ok"]: + _last_daily_checkpoint_day = previous_checkpoint_day + + if _pending_checkpoints.is_empty(): + return + var requests := _pending_checkpoints.duplicate(true) + _pending_checkpoints.clear() + for request_value: Variant in requests: + if not request_value is Dictionary: + continue + var request: Dictionary = request_value + _perform_checkpoint_save( + str(request[&"save_path"]), + request[&"metadata"], + bool(request[&"use_autosave"]), + StringName(request[&"reason"]), + int(request[&"request_id"]) + ) + + +func _perform_checkpoint_save( + save_path: String, + metadata: Variant, + use_autosave: bool, + reason: StringName, + request_id: int +) -> Dictionary: + if not _initialized or _clock == null: + return { + &"ok": false, + &"code": &"RUNTIME_NOT_INITIALIZED", + &"message": "Simulation runtime is not initialized.", + } + var started_at_us := Time.get_ticks_usec() + # A rejected Path projection is not a complete Runtime save. Refuse before + # pausing or touching formal/tmp/backup files, and keep the refusal observable + # without publishing a persisted event into the live snapshot. + if path_service.create_snapshot().is_empty(): + var refused: Dictionary = { + &"ok": false, &"code": &"INVALID_SNAPSHOT", + &"message": "Incomplete Path snapshot; original save preserved.", + &"operation": &"autosave" if use_autosave else &"save", + &"save_path": save_path, &"reason": reason, &"request_id": request_id, + &"checkpoint_absolute_minute": _clock.absolute_minute, + &"runtime_duration_us": maxi(int(Time.get_ticks_usec() - started_at_us), 0), + &"clock_pause_restored": true, &"formal_save_preserved": true, + &"live_state_preserved": true, + } + latest_save_operation_result = _save_event_payload(refused) + save_operation_completed.emit(refused.duplicate(true)) + return refused + var previous_paused := _clock.paused + _clock.set_paused(true) + var snapshot := create_snapshot() + # Persistence pauses I/O, not game semantics. The package must retain the + # state that should resume after load rather than the temporary I/O pause. + snapshot[&"clock"][&"paused"] = previous_paused + var effective_metadata: Dictionary = metadata.duplicate(true) if metadata is Dictionary else {} + var presentation: Dictionary = {} + checkpoint_presentation_requested.emit(presentation) + if not effective_metadata.has(&"interface_selection") and presentation.get(&"interface_selection") is Dictionary: + effective_metadata[&"interface_selection"] = presentation[&"interface_selection"].duplicate(true) + effective_metadata[&"checkpoint_reason"] = reason + var result := ( + SaveService.save_autosave( + save_path, + snapshot, + effective_metadata, + int(_save_policy[&"autosave_generations"]) + ) + if use_autosave + else SaveService.save_snapshot(save_path, snapshot, effective_metadata) + ) + _clock.set_paused(previous_paused) + var runtime_duration_us := maxi(int(Time.get_ticks_usec() - started_at_us), 0) + _record_runtime_performance(&"save", runtime_duration_us) + result = _with_operation_context(result, { + &"operation": &"autosave" if use_autosave else &"save", + &"save_path": save_path, + &"reason": reason, + &"request_id": request_id, + &"checkpoint_absolute_minute": int(snapshot[&"clock"][&"absolute_minute"]), + &"runtime_duration_us": runtime_duration_us, + &"clock_pause_restored": _clock.paused == previous_paused, + }) + var event_type := ( + &"AUTOSAVE_CHECKPOINT_SUCCEEDED" + if use_autosave and result[&"ok"] + else &"AUTOSAVE_CHECKPOINT_FAILED" + if use_autosave + else &"SAVE_CHECKPOINT_SUCCEEDED" + if result[&"ok"] + else &"SAVE_CHECKPOINT_FAILED" + ) + _complete_save_operation(result, event_type) + return result + + +func _finish_load_operation( + loaded_result: Dictionary, + save_path: String, + previous_paused: bool, + started_at_us: int, + operation: StringName, + success_event_type: StringName, + failure_event_type: StringName +) -> Dictionary: + var result := loaded_result.duplicate(true) + var recovery_mode := operation in [&"recovery", &"recovery_candidate"] + var package_recovery_report: Variant = result.get(&"recovery_report", null) + if result[&"ok"] and not _restore_snapshot_internal(result[&"snapshot"], recovery_mode): + result[&"ok"] = false + result[&"source_code"] = result.get(&"code", &"OK") + result[&"code"] = &"RESTORE_FAILED" + result[&"message"] = save_path + result[&"recovery_report"] = { + &"report_version": 1, + &"recovery_mode": recovery_mode, + &"repair_policy": &"WHITELISTED_AUTHORITATIVE_ONLY", + &"automatic_repairs_applied": false, + &"restore_committed": false, + &"rejection_reason": &"DOMAIN_OR_CROSSLINK_VALIDATION_FAILED", + &"forbidden_repairs_applied": false, + } + elif result[&"ok"]: + result[&"restore_safety_report"] = latest_restore_safety_report.duplicate(true) + if recovery_mode: + result[&"recovery_report"] = latest_restore_safety_report.duplicate(true) + result[&"recovery_report"][&"restore_committed"] = true + if package_recovery_report is Dictionary: + result[&"package_recovery_report"] = package_recovery_report.duplicate(true) + if not result[&"ok"]: + _clock.set_paused(previous_paused) + var runtime_duration_us := maxi(int(Time.get_ticks_usec() - started_at_us), 0) + _record_runtime_performance(&"load", runtime_duration_us) + result = _with_operation_context(result, { + &"operation": operation, + &"save_path": save_path, + &"runtime_duration_us": runtime_duration_us, + &"loaded_clock_paused": _clock.paused if result[&"ok"] else previous_paused, + &"preload_pause_restored": true if result[&"ok"] else _clock.paused == previous_paused, + }) + _complete_save_operation( + result, + success_event_type if result[&"ok"] else failure_event_type + ) + return result + + +func _complete_save_operation(result: Dictionary, event_type: StringName) -> void: + latest_save_operation_result = _save_event_payload(result) + _publish_actor_event( + event_type, + &"save_service", + [], + latest_save_operation_result + ) + save_operation_completed.emit(result.duplicate(true)) + + +func _save_event_payload(result: Dictionary) -> Dictionary: + var payload := { + &"ok": bool(result.get(&"ok", false)), + &"code": StringName(result.get(&"code", &"UNKNOWN")), + &"message": str(result.get(&"message", "")), + &"operation": StringName(result.get(&"operation", &"unknown")), + &"save_path": str(result.get(&"save_path", result.get(&"path", ""))), + &"reason": StringName(result.get(&"reason", &"")), + &"request_id": int(result.get(&"request_id", 0)), + &"checkpoint_absolute_minute": int(result.get(&"checkpoint_absolute_minute", _clock.absolute_minute)), + &"duration_us": int(result.get(&"duration_us", 0)), + &"runtime_duration_us": int(result.get(&"runtime_duration_us", 0)), + } + var selected_value: Variant = result.get(&"selected", null) + if selected_value is Dictionary: + payload[&"selected_candidate_id"] = StringName(selected_value.get(&"id", &"")) + payload[&"selected_candidate_kind"] = StringName(selected_value.get(&"kind", &"")) + payload[&"selected_generation"] = int(selected_value.get(&"generation", -1)) + var manifest_value: Variant = result.get(&"manifest", null) + if manifest_value is Dictionary: + payload[&"save_id"] = str(manifest_value.get("save_id", "")) + payload[&"saved_absolute_minute"] = int(manifest_value.get("absolute_minute", -1)) + return payload + + +func _with_operation_context(result: Dictionary, context: Dictionary) -> Dictionary: + var enriched := result.duplicate(true) + for key: Variant in context: + enriched[key] = context[key] + return enriched + + +func _record_runtime_performance(metric_id: StringName, duration_us: int) -> void: + if _clock != null and _clock.performance_budget != null: + _clock.performance_budget.record_sample(metric_id, maxi(duration_us, 0)) + + +func _release_recovery_task_items( + inventory: InventoryService, + reservation_ids: Array[StringName], + task: StaffTask, + absolute_minute: int +) -> Dictionary: + var before := inventory.create_snapshot() + for reservation_id: StringName in reservation_ids: + var result := inventory.release_reservation( + reservation_id, + StringName("recovery.staff.task.release.%s.%s" % [task.task_id, reservation_id]), + absolute_minute + ) + if not bool(result.get(&"ok", false)): + inventory.restore_snapshot(before) + return result + return {&"ok": true} + + +func _merge_content_filter_profiles(current: Dictionary, saved: Dictionary) -> Dictionary: + var disabled_by_name: Dictionary = {} + for raw_tag: Variant in current.get(&"disabled_content_tags", []): + var tag := StringName(raw_tag) + if not tag.is_empty(): + disabled_by_name[tag] = true + for raw_tag: Variant in saved.get(&"disabled_content_tags", []): + var tag := StringName(raw_tag) + if not tag.is_empty(): + disabled_by_name[tag] = true + var disabled_tags: Array[StringName] = [] + for raw_tag: Variant in disabled_by_name: + disabled_tags.append(StringName(raw_tag)) + disabled_tags.sort_custom( + func(left: StringName, right: StringName) -> bool: + return String(left) < String(right) + ) + return { + &"filter_mode": maxi( + int(current.get(&"filter_mode", EventDefinition.FilterBehavior.NONE)), + int(saved.get(&"filter_mode", EventDefinition.FilterBehavior.NONE)) + ) as EventDefinition.FilterBehavior, + &"maximum_content_rating": mini( + int(current.get(&"maximum_content_rating", EventDefinition.ContentRating.GENERAL)), + int(saved.get(&"maximum_content_rating", EventDefinition.ContentRating.GENERAL)) + ) as EventDefinition.ContentRating, + &"disabled_content_tags": disabled_tags, + } + + +func _content_filter_restore_report( + current: Dictionary, + saved: Dictionary, + effective: Dictionary +) -> Dictionary: + var current_tags: Array = current.get(&"disabled_content_tags", []) + var saved_tags: Array = saved.get(&"disabled_content_tags", []) + var saved_was_weaker := ( + int(saved.get(&"filter_mode", 0)) < int(current.get(&"filter_mode", 0)) + or int(saved.get(&"maximum_content_rating", 0)) > int(current.get(&"maximum_content_rating", 0)) + ) + for raw_tag: Variant in current_tags: + if not saved_tags.has(StringName(raw_tag)) and not saved_tags.has(String(raw_tag)): + saved_was_weaker = true + break + return { + &"saved_profile_was_weaker": saved_was_weaker, + &"strict_profile_preserved": true, + &"current_before_load": _content_filter_profile_payload(current), + &"saved_profile": _content_filter_profile_payload(saved), + &"effective_profile": _content_filter_profile_payload(effective), + } + + +func _content_filter_profile_payload(profile: Dictionary) -> Dictionary: + var mode := clampi( + int(profile.get(&"filter_mode", EventDefinition.FilterBehavior.NONE)), + EventDefinition.FilterBehavior.NONE, + EventDefinition.FilterBehavior.DISABLE + ) + var rating := clampi( + int(profile.get(&"maximum_content_rating", EventDefinition.ContentRating.GENERAL)), + EventDefinition.ContentRating.GENERAL, + EventDefinition.ContentRating.RESTRICTED + ) + var tags: Array[String] = [] + for raw_tag: Variant in profile.get(&"disabled_content_tags", []): + tags.append(String(raw_tag)) + tags.sort() + return { + &"filter_mode": EventDefinition.FilterBehavior.keys()[mode], + &"maximum_content_rating": EventDefinition.ContentRating.keys()[rating], + &"disabled_content_tags": tags, + } + + +func _save_policy_path_is_safe(save_path: String) -> bool: + if not save_path.begins_with("user://") or save_path == "user://": + return false + var relative := save_path.trim_prefix("user://").replace("\\", "/") + if relative.is_empty() or relative.is_absolute_path(): + return false + for segment: String in relative.split("/", false): + if segment.is_empty() or segment == "." or segment == "..": + return false + return true + + +func _runtime_command_history_crosslinks_are_valid( + queue_snapshot: Dictionary, + next_command_id: int, + events: DomainEventStream +) -> bool: + if next_command_id <= 0 or events == null \ + or typeof(queue_snapshot.get("version", null)) != TYPE_INT \ + or int(queue_snapshot["version"]) != CommandQueue.SNAPSHOT_VERSION \ + or not queue_snapshot.get("accepted", null) is Array: + return false + var seen_ids: Dictionary = {} + var processed_by_id: Dictionary = {} + var command_idempotency: Dictionary = {} + for collection_key: String in ["pending", "in_flight", "processed"]: + var rows_value: Variant = queue_snapshot.get(collection_key, null) + if not rows_value is Array: + return false + if collection_key == "in_flight" and not rows_value.is_empty(): + # Runtime commands are synchronously completed in APPLY_COMMANDS and + # have no resumable in-flight execution path. + return false + for row_value: Variant in rows_value: + if not row_value is Dictionary: + return false + var row: Dictionary = row_value + var command_id_value: Variant = row.get("command_id", null) + if typeof(command_id_value) != TYPE_INT or int(command_id_value) <= 0 \ + or seen_ids.has(int(command_id_value)): + return false + var command_id := int(command_id_value) + seen_ids[command_id] = true + if collection_key == "processed": + processed_by_id[command_id] = row + else: + var raw_key: Variant = row.get("idempotency_key", "") + if typeof(raw_key) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var key := StringName(raw_key) + if not key.is_empty(): + command_idempotency[command_id] = key + if seen_ids.size() != next_command_id - 1: + return false + for command_id in range(1, next_command_id): + if not seen_ids.has(command_id): + return false + var accepted_by_id: Dictionary = {} + var previous_accepted_id := 0 + for raw_metadata: Variant in queue_snapshot["accepted"]: + if not raw_metadata is Dictionary: + return false + var metadata: Dictionary = raw_metadata + var command_id_value: Variant = metadata.get("command_id", null) + var key_value: Variant = metadata.get("idempotency_key", null) + if metadata.size() != 2 or typeof(command_id_value) != TYPE_INT \ + or int(command_id_value) <= previous_accepted_id \ + or typeof(key_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or not seen_ids.has(int(command_id_value)): + return false + var command_id := int(command_id_value) + if command_idempotency.has(command_id) \ + and StringName(command_idempotency[command_id]) != StringName(key_value): + return false + accepted_by_id[command_id] = StringName(key_value) + command_idempotency[command_id] = StringName(key_value) + previous_accepted_id = command_id + if accepted_by_id.size() != seen_ids.size(): + return false + var idempotency_value: Variant = queue_snapshot.get("idempotency", null) + if not idempotency_value is Dictionary: + return false + var mapped_ids: Dictionary = {} + for raw_key: Variant in idempotency_value: + if typeof(raw_key) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(raw_key).is_empty() \ + or typeof(idempotency_value[raw_key]) != TYPE_INT: + return false + var command_id := int(idempotency_value[raw_key]) + if not seen_ids.has(command_id) or mapped_ids.has(command_id): + return false + mapped_ids[command_id] = StringName(raw_key) + for command_id: int in command_idempotency: + var accepted_key := StringName(command_idempotency[command_id]) + if accepted_key.is_empty(): + if mapped_ids.has(command_id): + return false + elif mapped_ids.get(command_id, &"") != accepted_key: + return false + + var completion_by_id: Dictionary = {} + for event: SimulationDomainEvent in events.recent_events(): + if event.event_type not in [&"COMMAND_COMPLETED", &"COMMAND_FAILED"]: + continue + var command_id := event.causation_command_id + if command_id <= 0 or not processed_by_id.has(command_id) \ + or completion_by_id.has(command_id) \ + or event.source_service != &"simulation_runtime" \ + or not _strict_variants_equal(event.payload, processed_by_id[command_id]): + return false + var result_code := String((processed_by_id[command_id] as Dictionary).get("code", "")) + if (result_code == "OK") != (event.event_type == &"COMMAND_COMPLETED"): + return false + completion_by_id[command_id] = true + # Completion events share a bounded stream with all other DomainEvents. Any + # retained completion must match exactly; absence alone is not corruption + # because unrelated events can legitimately evict it. + return true + + +func _legacy_operations_history_is_absent(runtime_data: Dictionary) -> bool: + # v1-v4 had no Operations wrapper or payroll settlement semantics. Reject a + # relabelled v5 payload instead of silently discarding production history. + if runtime_data.has(&"operations") or runtime_data.has("operations"): + return false + var staff_value: Variant = runtime_data.get(&"staff", null) + if staff_value is Dictionary: + var settlements: Variant = (staff_value as Dictionary).get(&"payroll_settlements", []) + if settlements is Array and not settlements.is_empty(): + return false + var economy_value: Variant = runtime_data.get(&"economy", null) + if economy_value is Dictionary: + var entries: Variant = (economy_value as Dictionary).get(&"entries", []) + if entries is Array: + for raw_entry: Variant in entries: + if raw_entry is Dictionary \ + and StringName((raw_entry as Dictionary).get(&"category", "")) == &"WAGE": + return false + return true + + +func _legacy_infrastructure_history_is_absent(runtime_data: Dictionary) -> bool: + # Infrastructure aggregates first exist in Runtime v6. A lower version with + # any look-alike field or retained v6-only history is a relabelled payload, + # not a migratable legacy save. + for key: StringName in [ + &"excavation", &"spatial_subslots", &"route_projection", + &"facility_infrastructure", + ]: + if runtime_data.has(key) or runtime_data.has(String(key)): + return false + var stream_value: Variant = runtime_data.get(&"domain_events", null) + if stream_value is Dictionary: + var recent_events: Variant = (stream_value as Dictionary).get("recent_events", []) + if recent_events is Array: + for raw_event: Variant in recent_events: + if raw_event is Dictionary and StringName( + (raw_event as Dictionary).get("event_type", "") + ) in [&"FACILITY_INFRASTRUCTURE_PROJECTED", &"EXCAVATION_COMPLETED"]: + return false + var queue_value: Variant = runtime_data.get(&"command_queue", null) + if queue_value is Dictionary: + for queue_key: String in ["pending", "in_flight"]: + var commands: Variant = (queue_value as Dictionary).get(queue_key, []) + if not commands is Array: + continue + for raw_command: Variant in commands: + if raw_command is Dictionary and StringName( + (raw_command as Dictionary).get("command_type", "") + ) in [&"start_excavation", &"pause_excavation", &"resume_excavation"]: + return false + return true + + +func _runtime_v5_outer_snapshot_shape_is_valid(snapshot: Dictionary) -> bool: + if not _dictionary_has_exact_canonical_keys( + snapshot, [&"schema_version", &"clock", &"game_state", &"systems"] + ) or typeof(snapshot.get(&"schema_version", null)) != TYPE_INT \ + or int(snapshot[&"schema_version"]) != SimulationSnapshot.SCHEMA_VERSION: + return false + var systems_value: Variant = snapshot.get(&"systems", null) + var clock_value: Variant = snapshot.get(&"clock", null) + var state_value: Variant = snapshot.get(&"game_state", null) + if not systems_value is Dictionary or not clock_value is Dictionary \ + or not state_value is Dictionary: + return false + var systems: Dictionary = systems_value + var clock_data: Dictionary = clock_value + var state_data: Dictionary = state_value + if not _dictionary_has_exact_canonical_keys(systems, [&"runtime"]) \ + or not systems[&"runtime"] is Dictionary \ + or not _dictionary_has_exact_canonical_keys( + clock_data, + [&"absolute_minute", &"speed", &"paused", &"snapshot_version"] + ) \ + or typeof(clock_data.get(&"absolute_minute", null)) != TYPE_INT \ + or int(clock_data[&"absolute_minute"]) < 0 \ + or typeof(clock_data.get(&"speed", null)) != TYPE_INT \ + or int(clock_data[&"speed"]) not in [1, 2, 3, 4] \ + or typeof(clock_data.get(&"paused", null)) != TYPE_BOOL \ + or typeof(clock_data.get(&"snapshot_version", null)) != TYPE_INT \ + or int(clock_data[&"snapshot_version"]) < 0: + return false + if not _dictionary_has_exact_canonical_keys( + state_data, + [&"resources", &"world_tree_rank", &"active_layer", &"revision"] + ) or not state_data[&"resources"] is Dictionary \ + or typeof(state_data.get(&"world_tree_rank", null)) != TYPE_INT \ + or int(state_data[&"world_tree_rank"]) < 1 \ + or int(state_data[&"world_tree_rank"]) > 7 \ + or typeof(state_data.get(&"active_layer", null)) != TYPE_INT \ + or int(state_data[&"active_layer"]) not in [0, 1] \ + or typeof(state_data.get(&"revision", null)) != TYPE_INT \ + or int(state_data[&"revision"]) < 0: + return false + var resources: Dictionary = state_data[&"resources"] + var seen_resources: Dictionary = {} + for raw_resource_id: Variant in resources: + if typeof(raw_resource_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var resource_id := StringName(raw_resource_id) + if resource_id.is_empty() or seen_resources.has(resource_id) \ + or typeof(resources[raw_resource_id]) != TYPE_INT \ + or int(resources[raw_resource_id]) < 0: + return false + seen_resources[resource_id] = true + for required_resource: StringName in [&"gold", &"mana", &"materials", &"faith"]: + if not seen_resources.has(required_resource): + return false + return true + + +func _connect_path_performance_signal() -> void: + if path_service == null or not path_service.has_signal(&"path_query_measured"): + return + var callback := Callable(self, "_on_path_query_measured") + if not path_service.is_connected(&"path_query_measured", callback): + path_service.connect(&"path_query_measured", callback) + + +func _on_path_query_measured(duration_us: int) -> void: + _record_runtime_performance(&"path_query", duration_us) + +func _initialize_rng_streams() -> void: + _rng_streams.clear() + for stream_id in RNG_STREAM_IDS: + _rng_streams[stream_id] = DeterministicRng.from_root_seed(world_seed, stream_id) + +func _connect_construction_signals() -> void: + if construction_service == null: + return + var completed_callback := Callable(self, "_on_facility_completed") + var demolished_callback := Callable(self, "_on_facility_demolished") + if not construction_service.facility_completed.is_connected(completed_callback): + construction_service.facility_completed.connect(completed_callback) + if not construction_service.facility_demolished.is_connected(demolished_callback): + construction_service.facility_demolished.connect(demolished_callback) + + +func _initialize_infrastructure_services() -> bool: + spatial_subslot_service = SpatialSubslotService.new() + route_subslot_path_adapter = RouteSubslotPathAdapter.new() + if not route_subslot_path_adapter.configure( + spatial_subslot_service, + path_service, + world_service.get_walkable_cells() + ): + return false + facility_infrastructure_projector = FacilityInfrastructureProjector.new() + if not facility_infrastructure_projector.configure( + route_subslot_path_adapter, + spatial_subslot_service, + path_service + ): + return false + excavation_service = ExcavationService.new(world_service, construction_resource_state) + excavation_service.current_minute = _clock.absolute_minute + var excavation_callback := Callable(self, "_on_excavation_completed") + if not excavation_service.excavation_completed.is_connected(excavation_callback): + excavation_service.excavation_completed.connect(excavation_callback) + return true + +func rebuild_path_graph_from_world() -> bool: + if path_service == null or world_service == null: + return false + var walkable_cells: Array[Vector3i] = world_service.get_walkable_cells() + var projected_walkable_cells: Array[Vector3i] = walkable_cells.duplicate() + if route_subslot_path_adapter != null \ + and route_subslot_path_adapter.is_configured() \ + and spatial_subslot_service != null: + var seen_projected: Dictionary = {} + projected_walkable_cells.clear() + for cell: Vector3i in walkable_cells: + if not seen_projected.has(cell): + seen_projected[cell] = true + projected_walkable_cells.append(cell) + for cell: Vector3i in spatial_subslot_service.get_route_cells(): + if not seen_projected.has(cell): + seen_projected[cell] = true + projected_walkable_cells.append(cell) + var current_path_snapshot: Dictionary = path_service.create_snapshot() + var raw_actor_cells: Variant = current_path_snapshot.get(&"actor_cells", null) + var has_runtime_actor_state: bool = ( + not _movement_credits.is_empty() + or (raw_actor_cells is Array and not raw_actor_cells.is_empty()) + ) + # PathService correctly owns its own graph, but Runtime owns the cross-system + # Actor/Path projection contract. Reject a topology change that would evict + # a live Guest/Staff projection instead of allowing PathService to prune it. + if has_runtime_actor_state: + if _clock == null or not _validate_runtime_path_crosslinks( + path_service, + guest_service, + staff_service, + _movement_credits, + _clock.absolute_minute + ): + return false + var walkable_set: Dictionary = {} + for cell: Vector3i in projected_walkable_cells: + walkable_set[cell] = true + var expected_cells: Dictionary = _expected_runtime_actor_cells( + guest_service, + staff_service + ) + for actor_id: StringName in _sorted_name_keys(expected_cells): + if not walkable_set.has(expected_cells[actor_id]): + return false + if route_subslot_path_adapter != null \ + and route_subslot_path_adapter.is_configured(): + var synchronized := route_subslot_path_adapter.synchronize_projection( + StringName( + "runtime.base_sync.%08d" % (route_subslot_path_adapter.projection_revision + 1) + ), + walkable_cells + ) + return synchronized.is_success() and _prune_legacy_stairs_and_movement() + return path_service.rebuild_graph(walkable_cells) and _prune_legacy_stairs_and_movement() + +func _initialize_world(rank: int) -> void: + var bounds := _bounds_for_rank(rank) + world_service.reset(bounds) + _seed_boundary_cells(bounds) + rebuild_path_graph_from_world() + path_service.add_connector( + &"starter.staff_door", + Vector3i(0, 0, WorldService.LAYER_FRONT), + Vector3i(0, 0, WorldService.LAYER_BACK), + PathService.DEFAULT_CONNECTOR_COST, + true, + &"staff" + ) + +func _initialize_mana_network() -> void: + mana_network_service.register_source(STARTER_MANA_SOURCE, STARTER_MANA_OUTPUT) + mana_network_service.register_connector(STARTER_MANA_BUS) + mana_network_service.connect_nodes(STARTER_MANA_SOURCE, STARTER_MANA_BUS) + +func _initialize_economy() -> void: + economy_service = EconomyService.new({ + PLAYER_CASH_ACCOUNT: {&"allow_negative": false}, + CONSTRUCTION_EXPENSE_ACCOUNT: {&"allow_negative": false}, + OPERATING_EXPENSE_ACCOUNT: {&"allow_negative": false}, + AUTHORITY_FINE_ACCOUNT: {&"allow_negative": false}, + WAGE_EXPENSE_ACCOUNT: {&"allow_negative": false}, + }) + economy_service.initialize_account( + PLAYER_CASH_ACCOUNT, + int(_state.get_resource(&"gold")), + _clock.absolute_minute, + &"runtime.initial_player_cash" + ) + facility_cleanliness = FacilityCleanliness.new() + cleaning_policy = CleaningPolicy.new() + cleaning_policy.load_file() + weather = WeatherTimeline.new() + weather.initialize(&"clear", _clock.absolute_minute) + facility_upkeep = FacilityUpkeepAccrual.new() + upkeep_settlement = FacilityUpkeepSettlement.new() + FacilityUpkeepSettlement.prepare_accounts(economy_service) + facility_upkeep.start_at(_clock.absolute_minute) + construction_resource_state = _create_resource_adapter( + economy_service, + CONSTRUCTION_EXPENSE_ACCOUNT, + &"CONSTRUCTION", + &"CONSTRUCTION_REFUND", + &"construction_service" + ) + operating_resource_state = _create_resource_adapter( + economy_service, + OPERATING_EXPENSE_ACCOUNT, + &"OPERATING_EXPENSE", + &"OPERATING_REFUND", + &"simulation_runtime" + ) + _connect_economy_signals() + +func _create_resource_adapter( + economy: EconomyService, + counter_account: StringName, + expense_category: StringName, + refund_category: StringName, + source_entity_id: StringName +) -> LedgerBackedResourceState: + return LedgerBackedResourceState.new( + _state, + economy, + counter_account, + expense_category, + refund_category, + source_entity_id, + func() -> int: return _runtime_event_minute() + ) + +func _connect_economy_signals() -> void: + if economy_service == null: + return + economy_service.transaction_posted.connect(Callable(self, "_on_ledger_transaction_posted")) + +func _initialize_s2_operations() -> void: + inventory_service = InventoryService.new() + inventory_service.current_minute = _clock.absolute_minute + logistics_dispatcher = LogisticsDispatcher.new() + logistics_requests = {} + facility_service = FacilityService.new() + facility_service.current_minute = _clock.absolute_minute + _configure_facility_boundaries() + _connect_facility_signals() + auto_purchase_plans = AutoPurchasePlansType.new() + kitchen_production = KitchenProductionService.new() + kitchen_production.configure(inventory_service, facility_service, definition_registry, _clock.absolute_minute) + +func _initialize_s3_actors() -> void: + guest_service = GuestService.new() + guest_service.current_minute = _clock.absolute_minute + guest_service.create_definition(&"traveler", { + &"tags": [&"general", &"traveler"], + &"wealth_min": 120, + &"wealth_max": 450, + &"base_patience": 45, + &"risk_tolerance": 50, + &"preference_weights": {&"dining": 8, &"lodging": 7, &"social": 3}, + &"group_size_weights": {1: 70, 2: 25, 3: 5}, + &"legal_sensitivity": 65, + &"quality_sensitivity": 50, + &"need_rates": {&"hunger": 1, &"sleep": 1, &"hygiene": 0, &"medical": 0, &"leisure": 1, &"intimacy": 0}, + &"credit_limit_gold": 50, + &"minimum_quality": 25, + }) + guest_service.create_definition(&"merchant", { + &"tags": [&"general", &"merchant", &"frugal"], + &"wealth_min": 300, + &"wealth_max": 1_200, + &"base_patience": 35, + &"risk_tolerance": 35, + &"preference_weights": {&"lodging": 9, &"quiet": 7, &"service": 4}, + &"group_size_weights": {1: 60, 2: 40}, + &"legal_sensitivity": 80, + &"quality_sensitivity": 70, + &"need_rates": {&"hunger": 1, &"sleep": 1, &"hygiene": 0, &"medical": 0, &"leisure": 1, &"intimacy": 0}, + &"credit_limit_gold": 200, + &"minimum_quality": 40, + }) + guest_service.create_definition(&"adventurer", { + &"tags": [&"adventurer", &"general", &"spendthrift"], + &"wealth_min": 180, + &"wealth_max": 800, + &"base_patience": 30, + &"risk_tolerance": 85, + &"preference_weights": {&"dining": 6, &"social": 8, &"service": 2}, + &"group_size_weights": {1: 45, 2: 35, 3: 15, 4: 5}, + &"legal_sensitivity": 35, + &"quality_sensitivity": 35, + &"adult_verified": true, + &"need_rates": {&"hunger": 2, &"sleep": 1, &"hygiene": 0, &"medical": 0, &"leisure": 1, &"intimacy": 0}, + &"credit_limit_gold": 100, + &"minimum_quality": 20, + }) + if bool(mvp_content_report.get(&"valid", false)): + for definition: GuestDefinition in mvp_content_catalog.build_all_guest_definitions(): + if not guest_service.register_definition(definition): + mvp_content_report = mvp_content_report.duplicate(true) + mvp_content_report[&"valid"] = false + mvp_content_report[&"runtime_registration_error"] = guest_service.last_error + break + staff_service = StaffService.new() + staff_service.current_minute = _clock.absolute_minute + _configure_staff_boundaries() + _connect_guest_signals() + _connect_staff_signals() + +func _configure_staff_boundaries() -> void: + if staff_service == null: + return + staff_service.configure_arrival_driver(Callable(self, "_handle_rescue_arrival")) + staff_service.configure_work_progress_driver(Callable(self, "_automatic_staff_work_units")) + staff_service.configure_callbacks( + Callable(self, "_reserve_staff_task_items"), + Callable(self, "_release_staff_task_items"), + Callable(self, "_estimate_staff_task_travel") + ) + +func _connect_guest_signals() -> void: + if guest_service == null: + return + guest_service.guest_spawned.connect(Callable(self, "_on_guest_spawned")) + guest_service.guest_state_changed.connect(Callable(self, "_on_guest_state_changed")) + guest_service.guest_queue_abandoned.connect(Callable(self, "_on_guest_queue_abandoned")) + guest_service.guest_recovery_started.connect(Callable(self, "_on_guest_recovery_started")) + guest_service.guest_despawned.connect(Callable(self, "_on_guest_despawned")) + +func _connect_staff_signals() -> void: + if staff_service == null: + return + staff_service.staff_registered.connect(Callable(self, "_on_staff_registered")) + staff_service.staff_removed.connect(Callable(self, "_on_staff_removed")) + staff_service.shift_registered.connect(Callable(self, "_on_shift_registered")) + staff_service.shift_state_changed.connect(Callable(self, "_on_shift_state_changed")) + staff_service.task_registered.connect(Callable(self, "_on_staff_task_registered")) + staff_service.task_assigned.connect(Callable(self, "_on_staff_task_assigned")) + staff_service.task_reopened.connect(Callable(self, "_on_staff_task_reopened")) + staff_service.task_completed.connect(Callable(self, "_on_staff_task_completed")) + +func _initialize_s4_relationship_events() -> void: + relationship_service = RelationshipService.new() + event_service = EventService.new() + event_service.create_definition(&"relationship.threshold", { + &"category": &"RELATIONSHIP", + &"priority": 80, + &"foreground": true, + &"expires_after": 1_440, + &"transaction_policy": &"ROLLBACK_ALL", + &"missing_actor_policy": &"CANCEL", + &"content_rating": &"GENERAL", + &"choices": [ + { + &"choice_id": &"acknowledge", + &"text_key": &"event.relationship.threshold.acknowledge", + &"actions": [{ + &"action_id": &"record_acknowledgement", + &"type": &"SET_FLAG", + &"payload": {&"flag_id": &"relationship_threshold_acknowledged"}, + }], + }, + { + &"choice_id": &"defer", + &"text_key": &"event.relationship.threshold.defer", + &"actions": [], + }, + ], + }) + _configure_relationship_event_boundaries() + _connect_relationship_signals() + _connect_event_signals() + +func _configure_relationship_event_boundaries() -> void: + if relationship_service == null or event_service == null: + return + relationship_service.configure_candidate_callback( + Callable(self, "_on_relationship_threshold_candidate") + ) + event_service.configure_relationship_service(relationship_service) + event_service.configure_candidate_eligibility_guard(Callable(self, "_event_candidate_placement_permitted")) + event_service.configure_callbacks( + Callable(self, "_event_actor_exists"), + Callable(self, "_execute_event_action_boundary"), + Callable(self, "_reserve_event_cost"), + Callable(self, "_release_event_cost"), + Callable(self, "_commit_event_cost"), + Callable(self, "_event_entity_exists"), + Callable(self, "_event_path_exists") + ) + +## Original 6.2/6.4: Tomari's placement prevents floor trouble. This does not +## choose a joining date, probability, defense score, or narrative content. +func is_floor_trouble_protected(floor_y: int) -> bool: + var tomari := staff_service.get_staff(&"heroine_tomari") + if tomari == null or tomari.employment_kind != StaffRuntime.EmploymentKind.UNIQUE: + return false + var assignment := staff_service.get_work_assignment(tomari.staff_id) + var facility := facility_service.get_instance(StringName(assignment.get(&"facility_id", &""))) + return facility != null and facility.origin.y == floor_y + + +func _event_candidate_placement_permitted(definition: EventDefinition, context: Dictionary) -> bool: + if definition.category != &"TROUBLE": + return true + # A business trouble identifies its existing target facility. Missing or + # conflicting location data cannot silently bypass placement protection. + var target: Variant = context.get(&"facility_id", definition.location_rule.get(&"facility_id", null)) + if typeof(target) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var declared: Variant = definition.location_rule.get(&"facility_id", target) + if typeof(declared) not in [TYPE_STRING, TYPE_STRING_NAME] or StringName(declared) != StringName(target): + return false + var facility := facility_service.get_instance(StringName(target)) + return facility != null and not is_floor_trouble_protected(facility.origin.y) + + +func _connect_relationship_signals() -> void: + if relationship_service == null: + return + relationship_service.relationship_registered.connect(Callable(self, "_on_relationship_registered")) + relationship_service.relationship_value_changed.connect(Callable(self, "_on_relationship_value_changed")) + relationship_service.shield_changed.connect(Callable(self, "_on_relationship_shield_changed")) + relationship_service.route_lock_changed.connect(Callable(self, "_on_relationship_route_lock_changed")) + +func _connect_event_signals() -> void: + if event_service == null: + return + event_service.event_enqueued.connect(Callable(self, "_on_event_enqueued")) + event_service.event_started.connect(Callable(self, "_on_event_started")) + event_service.event_finished.connect(Callable(self, "_on_event_finished")) + event_service.event_cancelled.connect(Callable(self, "_on_event_cancelled")) + event_service.choice_resolved.connect(Callable(self, "_on_event_choice_resolved")) + event_service.effect_transaction_started.connect(Callable(self, "_on_event_effect_transaction_started")) + event_service.effect_transaction_finished.connect(Callable(self, "_on_event_effect_transaction_finished")) + +func _initialize_s5_authority() -> void: + authority_service = AuthorityService.new() + authority_service.current_minute = _clock.absolute_minute + _configure_authority_boundaries() + _connect_authority_signals() + +func _configure_authority_boundaries() -> void: + if authority_service == null: + return + authority_service.configure_callbacks( + Callable(self, "_authority_line_of_sight"), + Callable(self, "_authority_path_query"), + Callable(self, "_apply_authority_resolution_boundary"), + Callable(self, "_roll_authority_inspection") + ) + +func _connect_authority_signals() -> void: + if authority_service == null: + return + authority_service.heat_changed.connect(Callable(self, "_on_authority_heat_changed")) + authority_service.incident_created.connect(Callable(self, "_on_authority_incident_created")) + authority_service.incident_detector_added.connect(Callable(self, "_on_authority_incident_detector_added")) + authority_service.evidence_registered.connect(Callable(self, "_on_authority_evidence_registered")) + authority_service.evidence_discovered.connect(Callable(self, "_on_authority_evidence_discovered")) + authority_service.inspection_scheduled.connect(Callable(self, "_on_authority_inspection_scheduled")) + authority_service.inspection_state_changed.connect(Callable(self, "_on_authority_inspection_state_changed")) + authority_service.resolution_applied.connect(Callable(self, "_on_authority_resolution_applied")) + +func _initialize_s5_defense() -> void: + _reset_defense_round_attempts() + defense_service = DefenseService.new() + defense_service.current_minute = _clock.absolute_minute + _configure_defense_boundaries() + _connect_defense_signals() + +func _defense_operation_minute() -> int: + return _active_command_minute if _active_command_minute >= 0 else _clock.absolute_minute + +func _runtime_event_minute() -> int: + return _active_command_minute if _active_command_minute >= 0 else _clock.absolute_minute + +func _configure_defense_boundaries() -> void: + if defense_service == null: + return + defense_service.configure_callbacks( + Callable(self, "_roll_defense_round"), + Callable(self, "_apply_defense_skill_boundary"), + Callable(self, "_apply_defense_outcome_boundary"), + Callable(self, "_apply_defense_rng_boundary") + ) + +func _connect_defense_signals() -> void: + if defense_service == null: + return + var bindings := [ + [&"raid_created", Callable(self, "_on_defense_raid_created")], + [&"raid_state_changed", Callable(self, "_on_defense_raid_state_changed")], + [&"active_skill_applied", Callable(self, "_on_defense_active_skill_applied")], + [&"round_resolved", Callable(self, "_on_defense_round_resolved")], + [&"raid_resolved", Callable(self, "_on_defense_raid_resolved")], + ] + for binding: Array in bindings: + var signal_name: StringName = binding[0] + var callback: Callable = binding[1] + if not defense_service.is_connected(signal_name, callback): + defense_service.connect(signal_name, callback) + +func _detach_defense_service(service: DefenseService) -> void: + if service == null: + return + # A caller may retain a RefCounted aggregate across Runtime initialize/load. + # Retiring it must sever both transaction callbacks and event projection so + # stale objects cannot consume the new Runtime's RNG/resources or emit ghost + # DomainEvents after an otherwise atomic restore. + service.configure_callbacks() + var bindings := [ + [&"raid_created", Callable(self, "_on_defense_raid_created")], + [&"raid_state_changed", Callable(self, "_on_defense_raid_state_changed")], + [&"active_skill_applied", Callable(self, "_on_defense_active_skill_applied")], + [&"round_resolved", Callable(self, "_on_defense_round_resolved")], + [&"raid_resolved", Callable(self, "_on_defense_raid_resolved")], + ] + for binding: Array in bindings: + var signal_name: StringName = binding[0] + var callback: Callable = binding[1] + if service.is_connected(signal_name, callback): + service.disconnect(signal_name, callback) + +func _configure_facility_boundaries() -> void: + if facility_service == null: + return + facility_service.configure_callbacks( + Callable(self, "_validate_service_start"), + Callable(self, "_complete_service_transaction") + ) + +func _connect_facility_signals() -> void: + if facility_service == null: + return + facility_service.instance_registered.connect(Callable(self, "_on_cleanliness_facility_registered")) + facility_service.instance_unregistered.connect(Callable(self, "_on_cleanliness_facility_unregistered")) + facility_service.facility_state_changed.connect(Callable(self, "_on_facility_state_changed")) + facility_service.service_started.connect(Callable(self, "_on_service_started")) + facility_service.service_interrupted.connect(Callable(self, "_on_service_interrupted")) + facility_service.service_completed.connect(Callable(self, "_on_service_completed")) + facility_service.service_failed.connect(Callable(self, "_on_service_failed")) + +func _seed_boundary_cells(bounds: Dictionary) -> void: + for x in range(int(bounds[&"min_x"]), int(bounds[&"max_x"]) + 1): + for layer in [WorldService.LAYER_FRONT, WorldService.LAYER_BACK]: + var cell := Vector3i(x, 0, layer) + world_service.set_walkable(cell, true) + world_service.set_support(cell, 0, true) + world_service.consume_dirty_cells() + +func _expand_world_to_rank(rank: int) -> bool: + var bounds := _bounds_for_rank(rank) + if not world_service.expand_bounds(bounds): + return false + _seed_boundary_cells(bounds) + return rebuild_path_graph_from_world() + +func _bounds_for_rank(rank: int) -> Dictionary: + var source: Variant = ProgressionService.RANK_BOUNDS.get(clampi(rank, 1, 7), {}) + return source.duplicate(true) if source is Dictionary else {} + + +func _sync_progression_live_metrics() -> bool: + return progression_service.update_metrics({ + &"active_above_ground_facilities": _count_active_facilities(facility_service, false), + &"active_underground_facilities": _count_active_facilities(facility_service, true), + &"asset_gold": economy_service.get_balance(PLAYER_CASH_ACCOUNT), + }) + + +func _count_active_facilities(service: FacilityService, underground: bool) -> int: + var count := 0 + for instance: FacilityInstance in service.get_instances(): + if instance.state not in [FacilityInstance.State.OPEN, FacilityInstance.State.DEGRADED]: + continue + if (instance.origin.y < 0) == underground: + count += 1 + return count + + +func _capture_rank_external_state() -> Dictionary: + return { + &"world": world_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"excavation": excavation_service.create_snapshot(), + &"spatial_subslots": spatial_subslot_service.create_snapshot(), + &"route_projection": route_subslot_path_adapter.create_snapshot(), + &"facility_infrastructure": facility_infrastructure_projector.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"movement_credits": _movement_credits.duplicate(true), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + } + + +func _apply_rank_external_state(target_rank: int, expected_bounds: Dictionary) -> bool: + if target_rank != int(_state.world_tree_rank) + 1 \ + or not _strict_variants_equal(_bounds_for_rank(target_rank), expected_bounds): + return false + if not _expand_world_to_rank(target_rank): + return false + if not _state.set_world_tree_rank(target_rank): + return false + return ( + int(_state.world_tree_rank) == target_rank + and _strict_variants_equal(world_service.get_bounds(), expected_bounds) + and _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ) + and _validate_runtime_path_crosslinks( + path_service, + guest_service, + staff_service, + _movement_credits, + _clock.absolute_minute + ) + ) + + +func _rollback_rank_external_state(snapshot: Dictionary) -> bool: + if not snapshot.get(&"world", null) is Dictionary \ + or not snapshot.get(&"path", null) is Dictionary \ + or not snapshot.get(&"excavation", null) is Dictionary \ + or not snapshot.get(&"spatial_subslots", null) is Dictionary \ + or not snapshot.get(&"route_projection", null) is Dictionary \ + or not snapshot.get(&"facility_infrastructure", null) is Dictionary \ + or not snapshot.get(&"game_state", null) is Dictionary \ + or not snapshot.get(&"movement_credits", null) is Dictionary \ + or not snapshot.get(&"domain_events", null) is Dictionary \ + or not snapshot.get(&"id_generator", null) is Dictionary: + return false + var restored := world_service.restore_snapshot(snapshot[&"world"]) + restored = spatial_subslot_service.restore_snapshot(snapshot[&"spatial_subslots"]) and restored + var route_snapshot: Dictionary = snapshot[&"route_projection"] + var projected_walkable: Variant = route_snapshot.get(&"projected_walkable_cells", null) + if not projected_walkable is Array: + return false + restored = path_service.rebuild_graph(projected_walkable) and restored + restored = path_service.restore_snapshot(snapshot[&"path"]) and restored + restored = elevators.restore_snapshot(snapshot[&"elevators"]) and restored + restored = legacy_stairs.restore_snapshot(snapshot[&"legacy_stairs"]) and restored + restored = route_subslot_path_adapter.restore_snapshot(route_snapshot) and restored + restored = facility_infrastructure_projector.restore_snapshot( + snapshot[&"facility_infrastructure"] + ) and restored + restored = excavation_service.restore_snapshot(snapshot[&"excavation"]) and restored + restored = _state.restore_snapshot(snapshot[&"game_state"]) and restored + _movement_credits = (snapshot[&"movement_credits"] as Dictionary).duplicate(true) + restored = domain_events.restore_snapshot(snapshot[&"domain_events"]) and restored + restored = id_generator.restore_snapshot(snapshot[&"id_generator"]) and restored + if not restored: + return false + return ( + _strict_variants_equal(world_service.create_snapshot(), snapshot[&"world"]) + and _strict_variants_equal(path_service.create_snapshot(), snapshot[&"path"]) + and _strict_variants_equal(elevators.create_snapshot(), snapshot[&"elevators"]) + and _strict_variants_equal(legacy_stairs.create_snapshot(), snapshot[&"legacy_stairs"]) + and _strict_variants_equal( + excavation_service.create_snapshot(), snapshot[&"excavation"] + ) + and _strict_variants_equal( + spatial_subslot_service.create_snapshot(), snapshot[&"spatial_subslots"] + ) + and _strict_variants_equal( + route_subslot_path_adapter.create_snapshot(), snapshot[&"route_projection"] + ) + and _strict_variants_equal( + facility_infrastructure_projector.create_snapshot(), + snapshot[&"facility_infrastructure"] + ) + and _strict_variants_equal(_state.create_snapshot(), snapshot[&"game_state"]) + and _strict_variants_equal(_movement_credits, snapshot[&"movement_credits"]) + and _strict_variants_equal(domain_events.create_snapshot(), snapshot[&"domain_events"]) + and _strict_variants_equal(id_generator.create_snapshot(), snapshot[&"id_generator"]) + and _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ) + and _validate_runtime_path_crosslinks( + path_service, + guest_service, + staff_service, + _movement_credits, + _clock.absolute_minute + ) + ) + +func _process_commands(absolute_minute: int) -> bool: + var previous_command_minute := _active_command_minute + _active_command_minute = absolute_minute + var results := command_queue.execute_ready(absolute_minute, Callable(self, "_execute_command")) + _active_command_minute = previous_command_minute + _synchronize_operations_population() + for result in results: + var entity_ids: Array[StringName] = [] + if not result.target_id.is_empty(): + entity_ids.append(result.target_id) + var event := SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"COMMAND_COMPLETED" if result.is_success() else &"COMMAND_FAILED", + absolute_minute, + &"simulation_runtime", + entity_ids, + result.to_dictionary(), + result.command_id + ) + _publish_domain_event(event) + command_completed.emit(result) + if _operations_resume_publish_pending: + _operations_resume_publish_pending = false + _publish_snapshot(absolute_minute) + _process_save_checkpoints(absolute_minute) + return true + return false + +func _process_tick_commands(current_absolute_minute: int) -> void: + if _operations_enabled: + _operations_tick_blocked = _operations_should_block_tick() + if _operations_tick_blocked: + _clock.set_paused(true) + _clock.request_current_tick_abort() + return + _process_commands(current_absolute_minute + 1) + _synchronize_operations_population() + + +func _synchronize_operations_population() -> bool: + if not _operations_enabled or operations_coordinator == null \ + or _operations_transaction_active: + return true + var active_count := guest_service.guest_count() + if operations_coordinator.get_population_count() == active_count: + return true + var synchronized := operations_coordinator.set_population_count(active_count) + if synchronized.is_success(): + return true + _operations_runtime_failure_latched = true + _operations_runtime_failure_report = synchronized.to_dictionary() + _operations_tick_blocked = true + _clock.set_paused(true) + return false + +func _execute_command(command: SimulationCommand) -> CommandResult: + if not _executors.has(command.command_type): + return CommandResult.failed( + CommandResult.Code.INVALID_COMMAND, + command.command_id, + "No executor is registered for command type '%s'." % command.command_type + ) + if command.command_type in DEFENSE_COMMAND_TYPES: + var advanced := defense_service.advance_time(_defense_operation_minute()) + if not advanced.is_success(): + advanced.command_id = command.command_id + return advanced + var executor: Callable = _executors[command.command_type] + var returned: Variant = executor.call(command) + if returned is CommandResult: + return returned + return CommandResult.failed( + CommandResult.Code.EXECUTOR_FAILED, + command.command_id, + "Command executor returned an invalid result." + ) + +func _execute_change_resources(command: SimulationCommand) -> CommandResult: + var deltas: Variant = command.payload.get(&"deltas", command.payload.get("deltas", null)) + if not deltas is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "deltas must be a Dictionary.") + var state_before: Dictionary = _state.create_snapshot() + var economy_before := economy_service.create_snapshot() + var progression_before := progression_service.create_snapshot() + var events_before := domain_events.create_snapshot() + var ids_before := id_generator.create_snapshot() + if not _apply_command_resource_deltas(command, deltas): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Resource balance would become negative.") + var faith_delta := 0 + for raw_resource_id: Variant in deltas: + if StringName(raw_resource_id) == &"faith": + faith_delta += int(deltas[raw_resource_id]) + if faith_delta > 0: + var next_faith_lifetime := int(progression_service.metrics[&"faith_lifetime"]) + faith_delta + if not progression_service.update_metrics({&"faith_lifetime": next_faith_lifetime}): + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + progression_service.restore_snapshot(progression_before) + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(ids_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Progression lifetime Faith could not be updated atomically." + ) + return CommandResult.succeeded(command.command_id, { + &"revision": _state.revision, + &"player_cash": economy_service.get_balance(PLAYER_CASH_ACCOUNT), + &"faith_lifetime": int(progression_service.metrics[&"faith_lifetime"]), + }) + +# Repay an existing attested liability through the ordinary command queue. +# No rate, issuance, eligibility or due-date values are supplied here. +func _execute_repay_loan_principal(command: SimulationCommand) -> CommandResult: + var loan_id: Variant = command.payload.get(&"loan_id", null) + if typeof(loan_id) not in [TYPE_STRING, TYPE_STRING_NAME] or String(loan_id).is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "loan_id must be a nonempty String or StringName.") + var result := repay_loan_principal( + StringName(loan_id), command.payload.get(&"amount", null), command.idempotency_key + ) + result.command_id = command.command_id + result.target_id = StringName(loan_id) + return result + + +func _execute_spend_resources(command: SimulationCommand) -> CommandResult: + var cost: Variant = command.payload.get(&"cost", command.payload.get("cost", null)) + if not cost is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "cost must be a Dictionary.") + if not operating_resource_state.spend(cost): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Resources are insufficient.") + return CommandResult.succeeded(command.command_id, { + &"revision": _state.revision, + &"player_cash": economy_service.get_balance(PLAYER_CASH_ACCOUNT), + }) + +func _apply_command_resource_deltas(command: SimulationCommand, deltas: Dictionary) -> bool: + var normalized: Dictionary = {} + for raw_name: Variant in deltas: + var resource_name := StringName(raw_name) + normalized[resource_name] = int(normalized.get(resource_name, 0)) + int(deltas[raw_name]) + for resource_name: StringName in normalized: + var current := economy_service.get_balance(PLAYER_CASH_ACCOUNT) \ + if resource_name == &"gold" else int(_state.get_resource(resource_name)) + if current + int(normalized[resource_name]) < 0: + return false + + var before_state: Dictionary = _state.create_snapshot() + var before_economy: Dictionary = economy_service.create_snapshot() + var non_gold := normalized.duplicate(true) + var gold_delta := int(non_gold.get(&"gold", 0)) + non_gold.erase(&"gold") + if not non_gold.is_empty() and not _state.apply_resource_deltas(non_gold): + return false + if gold_delta != 0: + var ledger_result: CommandResult + var ledger_idempotency := StringName("runtime.resource.%08d" % command.command_id) + if gold_delta > 0: + ledger_result = economy_service.transfer( + EconomyService.SYSTEM_SOURCE, + PLAYER_CASH_ACCOUNT, + gold_delta, + _runtime_event_minute(), + &"GENERATION", + command.actor_id, + ledger_idempotency + ) + else: + ledger_result = economy_service.transfer( + PLAYER_CASH_ACCOUNT, + EconomyService.SYSTEM_SINK, + -gold_delta, + _runtime_event_minute(), + &"DESTRUCTION", + command.actor_id, + ledger_idempotency + ) + if not ledger_result.is_success(): + _state.restore_snapshot(before_state) + economy_service.restore_snapshot(before_economy) + return false + _state.set_resource(&"gold", economy_service.get_balance(PLAYER_CASH_ACCOUNT)) + return true + +func _execute_add_inventory_stack(command: SimulationCommand) -> CommandResult: + var owner_id := StringName(command.payload.get(&"owner_inventory_id", command.payload.get("owner_inventory_id", ""))) + var item_id := StringName(command.payload.get(&"item_id", command.payload.get("item_id", ""))) + var quantity := int(command.payload.get(&"quantity", command.payload.get("quantity", 0))) + var result := inventory_service.add_stack( + owner_id, + item_id, + quantity, + int(command.payload.get(&"quality", command.payload.get("quality", InventoryService.DEFAULT_QUALITY))), + int(command.payload.get(&"expires_at", command.payload.get("expires_at", -1))), + _runtime_event_minute(), + int(command.payload.get(&"unit_weight", command.payload.get("unit_weight", InventoryService.DEFAULT_UNIT_WEIGHT))), + StringName(command.payload.get(&"stack_id", command.payload.get("stack_id", ""))) + ) + return _command_result_from_dictionary(command.command_id, result, "Inventory stack could not be added.") + +func _execute_create_logistics_request(command: SimulationCommand) -> CommandResult: + var source_id := StringName(command.payload.get(&"source_inventory_id", command.payload.get("source_inventory_id", ""))) + var destination_id := StringName(command.payload.get(&"destination_inventory_id", command.payload.get("destination_inventory_id", ""))) + var raw_requirements: Variant = command.payload.get(&"item_requirements", command.payload.get("item_requirements", null)) + if source_id.is_empty() or destination_id.is_empty() or source_id == destination_id \ + or not raw_requirements is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Source, destination, and item requirements are required.") + var requirements: Dictionary = {} + for raw_item_id: Variant in raw_requirements: + var item_id := StringName(raw_item_id) + var quantity := int(raw_requirements[raw_item_id]) + if item_id.is_empty() or quantity <= 0: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Logistics requirements must be positive.") + requirements[item_id] = quantity + if requirements.is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "At least one item is required.") + + var inventory_before := inventory_service.create_snapshot() + var id_before := id_generator.create_snapshot() + var request_id := StringName(command.payload.get(&"request_id", command.payload.get("request_id", ""))) + if request_id.is_empty(): + request_id = id_generator.next_id(&"logistics_request") + if logistics_requests.has(request_id): + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.DUPLICATE_COMMAND_ID, command.command_id, "Logistics request id already exists.") + var reservation_ids: Array[StringName] = [] + var stack_ids: Array[StringName] = [] + var total_weight := 0 + var deadline := int(command.payload.get(&"deadline", command.payload.get("deadline", -1))) + for item_id: StringName in _sorted_name_keys(requirements): + var reserve_result := inventory_service.reserve_item( + source_id, + item_id, + int(requirements[item_id]), + request_id, + &"logistics", + _runtime_event_minute(), + deadline, + StringName("logistics.reserve.%s.%s" % [request_id, item_id]) + ) + if not bool(reserve_result.get(&"ok", false)): + inventory_service.restore_snapshot(inventory_before) + id_generator.restore_snapshot(id_before) + return _command_result_from_dictionary(command.command_id, reserve_result, "Logistics stock could not be reserved.") + for reservation_id: StringName in reserve_result.get(&"reservation_ids", []): + reservation_ids.append(reservation_id) + var reservation := inventory_service.get_reservation(reservation_id) + var stack := inventory_service.get_stack(reservation.stack_id) + stack_ids.append(reservation.stack_id) + total_weight += reservation.quantity * int(stack.get(&"unit_weight", 1)) + var request := LogisticsRequest.new().configure( + request_id, + source_id, + destination_id, + requirements, + int(command.payload.get(&"priority", command.payload.get("priority", 50))), + _runtime_event_minute(), + deadline, + total_weight + ) + if not request.mark_reserved(reservation_ids, stack_ids, _runtime_event_minute()): + inventory_service.restore_snapshot(inventory_before) + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, command.command_id, "Logistics request could not enter RESERVED state.") + logistics_requests[request_id] = request + return CommandResult.succeeded(command.command_id, { + &"request_id": request_id, + &"reservation_ids": reservation_ids, + &"total_weight": total_weight, + }) + +func _execute_dispatch_logistics(command: SimulationCommand) -> CommandResult: + var carriers: Variant = command.payload.get(&"carriers", command.payload.get("carriers", null)) + if not carriers is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "carriers must be a Dictionary.") + var manual_requests: Array[LogisticsRequest] = [] + for request: LogisticsRequest in _sorted_logistics_requests(): + if not String(request.request_id).begins_with(SupplyLogisticsBridge.REQUEST_PREFIX): + manual_requests.append(request) + var assignments := logistics_dispatcher.dispatch(manual_requests, carriers, _runtime_event_minute()) + return CommandResult.succeeded(command.command_id, { + &"assignments": assignments, + &"report": logistics_dispatcher.last_report.duplicate(true), + }) + +func _execute_advance_logistics_request(command: SimulationCommand) -> CommandResult: + var request_id := StringName(command.payload.get(&"request_id", command.payload.get("request_id", ""))) + if command.command_id > 0 and String(request_id).begins_with(SupplyLogisticsBridge.REQUEST_PREFIX): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Supply deliveries advance only after the porter arrives.", {&"reason": &"SUPPLY_DRIVER_REQUIRED"}) + if not logistics_requests.has(request_id): + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Logistics request was not found.") + var request: LogisticsRequest = logistics_requests[request_id] + var request_before := request.create_snapshot() + var inventory_before_command := inventory_service.create_snapshot() + var dispatcher_before := logistics_dispatcher.create_snapshot() + match request.state: + LogisticsRequest.State.ASSIGNED: + if not request.transition_to(LogisticsRequest.State.PICKING_UP, "", _runtime_event_minute()): + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, command.command_id, "Logistics pickup could not begin.") + LogisticsRequest.State.PICKING_UP: + var carrier_id := request.assigned_carrier_id + var pickup := inventory_service.transfer_reserved( + request.reservation_ids, + StringName("cargo:%s" % carrier_id), + StringName("logistics.pickup.%s" % request_id), + _runtime_event_minute() + ) + if not bool(pickup.get(&"ok", false)): + request.mark_blocked(String(pickup.get(&"code", &"PICKUP_FAILED")), _runtime_event_minute()) + var released := logistics_dispatcher.release_assignment_for_request( + request_id, carrier_id, request.total_weight + ) + if not released: + inventory_service.restore_snapshot(inventory_before_command) + logistics_dispatcher.restore_snapshot(dispatcher_before) + logistics_requests[request_id] = LogisticsRequest.from_snapshot(request_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Logistics pickup failure could not release request ownership." + ) + return _command_result_from_dictionary(command.command_id, pickup, "Logistics pickup failed.") + request.transition_to(LogisticsRequest.State.DELIVERING, "", _runtime_event_minute()) + LogisticsRequest.State.DELIVERING: + var carrier_id := request.assigned_carrier_id + var cargo_id := StringName("cargo:%s" % carrier_id) + var inventory_before := inventory_service.create_snapshot() + for item_id: StringName in _sorted_name_keys(request.item_requirements): + var delivery := inventory_service.transfer_available( + cargo_id, + request.destination_inventory_id, + item_id, + int(request.item_requirements[item_id]), + StringName("logistics.delivery.%s.%s" % [request_id, item_id]), + _runtime_event_minute() + ) + if not bool(delivery.get(&"ok", false)): + inventory_service.restore_snapshot(inventory_before) + request.mark_blocked(String(delivery.get(&"code", &"DELIVERY_FAILED")), _runtime_event_minute()) + var released := logistics_dispatcher.release_assignment_for_request( + request_id, carrier_id, request.total_weight + ) + if not released: + inventory_service.restore_snapshot(inventory_before_command) + logistics_dispatcher.restore_snapshot(dispatcher_before) + logistics_requests[request_id] = LogisticsRequest.from_snapshot(request_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Logistics delivery failure could not release request ownership." + ) + return _command_result_from_dictionary(command.command_id, delivery, "Logistics delivery failed.") + request.transition_to(LogisticsRequest.State.COMPLETED, "", _runtime_event_minute()) + var released := logistics_dispatcher.release_assignment_for_request( + request_id, carrier_id, request.total_weight + ) + if not released: + inventory_service.restore_snapshot(inventory_before_command) + logistics_dispatcher.restore_snapshot(dispatcher_before) + logistics_requests[request_id] = LogisticsRequest.from_snapshot(request_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Completed Logistics delivery could not release request ownership." + ) + _: + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Logistics request cannot advance from its current state.") + return CommandResult.succeeded(command.command_id, { + &"request_id": request_id, + &"state": LogisticsRequest.State.keys()[request.state], + }) + +func _execute_register_guest_wallet(command: SimulationCommand) -> CommandResult: + var guest_id := StringName(command.payload.get(&"guest_id", command.payload.get("guest_id", ""))) + var amount := int(command.payload.get(&"gold", command.payload.get("gold", 0))) + if guest_id.is_empty() or amount < 0: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "A guest id and non-negative Gold are required.") + var account_id := _guest_wallet_account(guest_id) + if economy_service.has_account(account_id): + return CommandResult.failed(CommandResult.Code.DUPLICATE_COMMAND_ID, command.command_id, "Guest wallet already exists.") + var before := economy_service.create_snapshot() + if not economy_service.register_account(account_id): + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, command.command_id, "Guest wallet account could not be registered.") + if amount > 0: + var initialized := economy_service.initialize_account( + account_id, + amount, + _runtime_event_minute(), + StringName("guest.wallet.%s" % guest_id) + ) + if not initialized.is_success(): + economy_service.restore_snapshot(before) + return initialized + return CommandResult.succeeded(command.command_id, {&"account_id": account_id, &"balance": amount}) + +func _execute_spawn_guest(command: SimulationCommand) -> CommandResult: + if _operations_enabled and operations_coordinator != null: + if operations_coordinator.is_terminal() \ + or operations_coordinator.is_external_quarantined(): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Operations currently block new Guest arrivals." + ) + if guest_service.guest_count() >= int( + operations_coordinator.get_config().get(&"population_cap", 0) + ): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Operations Guest population capacity is full." + ) + var guest_id := StringName(command.payload.get(&"guest_id", command.payload.get("guest_id", ""))) + var id_before := id_generator.create_snapshot() + if guest_id.is_empty(): + guest_id = id_generator.next_id(&"guest") + if String(guest_id).begins_with("guest-auto-") \ + and not (_operations_transaction_active \ + and operations_coordinator != null \ + and command.actor_id == &"operations_coordinator"): + id_generator.restore_snapshot(id_before) + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "guest-auto IDs are reserved for the OperationsCoordinator." + ) + var guest_type_id := StringName(command.payload.get(&"guest_type_id", command.payload.get("guest_type_id", "traveler"))) + var definition := guest_service.get_definition(guest_type_id) + if definition == null: + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Guest definition was not found.") + if guest_service.has_guest(guest_id): + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.DUPLICATE_COMMAND_ID, command.command_id, "Guest already exists.") + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + var options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {} + var initial_cell_value: Variant = _parse_world_cell( + options.get(&"current_cell", options.get("current_cell", Vector3i.ZERO)) + ) + if initial_cell_value == null: + id_generator.restore_snapshot(id_before) + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "Guest current_cell must be Vector3i or [x, y, layer]." + ) + var initial_cell: Vector3i = initial_cell_value + var initial_traffic := path_service.get_cell_traffic(initial_cell) + var path_actor_id := _guest_path_actor_id(guest_id) + if initial_traffic.is_empty() or bool(initial_traffic.get(&"temporary_block", false)) \ + or path_service.has_actor_projection(path_actor_id): + id_generator.restore_snapshot(id_before) + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Guest current_cell must be an unblocked walkable cell with a free Path actor id." + ) + options[&"current_cell"] = initial_cell + var requested_gold := int(command.payload.get( + &"gold", + command.payload.get("gold", options.get(&"wallet_gold", options.get("wallet_gold", definition.wealth_min))) + )) + if requested_gold < 0: + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Guest Gold cannot be negative.") + var defer_spawn_notification := _operations_transaction_active \ + and operations_coordinator != null \ + and command.actor_id == &"operations_coordinator" + var account_id := _guest_wallet_account(guest_id) + var economy_before := economy_service.create_snapshot() + var guest_before := guest_service.create_snapshot() + var path_before := path_service.create_snapshot() + var movement_credits_before := _movement_credits.duplicate(true) + var events_before := domain_events.create_snapshot() + var progression_before := progression_service.create_snapshot() + if economy_service.has_account(account_id): + requested_gold = economy_service.get_balance(account_id) + else: + if not economy_service.register_account(account_id): + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, command.command_id, "Guest wallet account could not be registered.") + if requested_gold > 0: + var initialized := economy_service.initialize_account( + account_id, + requested_gold, + _runtime_event_minute(), + StringName("guest.wallet.%s" % guest_id), + not defer_spawn_notification + ) + if not initialized.is_success(): + economy_service.restore_snapshot(economy_before) + id_generator.restore_snapshot(id_before) + initialized.command_id = command.command_id + return initialized + if defer_spawn_notification \ + and not _stage_operations_economy_notification(initialized): + economy_service.restore_snapshot(economy_before) + id_generator.restore_snapshot(id_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Guest wallet notification could not be staged." + ) + options[&"wallet_gold"] = requested_gold + var guest := guest_service.spawn_guest( + guest_id, + guest_type_id, + _runtime_event_minute(), + options, + not defer_spawn_notification + ) + if guest != null and defer_spawn_notification: + # Runtime's Path projection and DomainEvent are part of the external + # transaction, while the observable GuestService signal is held until the + # Coordinator minute and DomainEvent batch have both committed. + _on_guest_spawned(guest) + if guest == null or not path_service.has_actor_projection(path_actor_id) \ + or path_service.get_actor_projected_cell(path_actor_id) != guest.current_cell \ + or not _movement_credits.has(path_actor_id): + economy_service.restore_snapshot(economy_before) + guest_service.restore_snapshot(guest_before) + path_service.restore_snapshot(path_before) + _movement_credits = movement_credits_before + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(id_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + guest_service.last_error if guest == null else "Guest Path projection failed." + ) + var next_guest_lifetime := int(progression_service.metrics[&"guest_lifetime"]) + 1 + if not progression_service.update_metrics({&"guest_lifetime": next_guest_lifetime}): + economy_service.restore_snapshot(economy_before) + guest_service.restore_snapshot(guest_before) + path_service.restore_snapshot(path_before) + _movement_credits = movement_credits_before + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(id_before) + progression_service.restore_snapshot(progression_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Progression lifetime Guest count could not be updated atomically." + ) + if defer_spawn_notification: + _operations_queued_guest_spawn_notifications.append(guest_id) + return CommandResult.succeeded(command.command_id, { + &"guest_id": guest_id, + &"guest_type_id": guest_type_id, + &"wallet_account": account_id, + &"wallet_gold": requested_gold, + &"guest_lifetime": next_guest_lifetime, + }) + +func _execute_transition_guest(command: SimulationCommand) -> CommandResult: + var guest_id := StringName(command.payload.get(&"guest_id", command.payload.get("guest_id", ""))) + var state_index := _guest_state_index(command.payload.get(&"state", command.payload.get("state", -1))) + if guest_id.is_empty() or state_index < 0: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Guest id and valid state are required.") + var guest := guest_service.get_guest(guest_id) + if guest == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Guest was not found.") + if not guest.queue_request_id.is_empty() or not guest.current_service_id.is_empty(): + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "A queued or serviced Guest must transition through the owning Facility transaction." + ) + var result := guest_service.transition_guest( + guest_id, + state_index, + _runtime_event_minute(), + StringName(command.payload.get(&"reason", command.payload.get("reason", "PLAYER_COMMAND"))) + ) + return _command_result_from_dictionary(command.command_id, result, "Guest transition failed.") + +func _execute_decide_guest(command: SimulationCommand) -> CommandResult: + var guest_id := StringName(command.payload.get(&"guest_id", command.payload.get("guest_id", ""))) + var guest := guest_service.get_guest(guest_id) + if guest == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Guest was not found.") + var wallet_account := _guest_wallet_account(guest_id) + if economy_service.has_account(wallet_account): + guest.wallet_gold = economy_service.get_balance(wallet_account) + var raw_candidates: Variant = command.payload.get(&"candidates", command.payload.get("candidates", [])) + var candidates: Array = raw_candidates.duplicate(true) if raw_candidates is Array else [] + if candidates.is_empty(): + candidates = _project_guest_candidates(guest_id) + var raw_context: Variant = command.payload.get(&"context", command.payload.get("context", {})) + var context: Dictionary = raw_context.duplicate(true) if raw_context is Dictionary else {} + context[&"absolute_minute"] = _runtime_event_minute() + var result := _decide_guest_with_log(guest_id, candidates, _runtime_event_minute(), context) + return _command_result_from_dictionary(command.command_id, result, "Guest decision failed.") + +func _execute_register_staff(command: SimulationCommand) -> CommandResult: + var staff_id := StringName(command.payload.get(&"staff_id", command.payload.get("staff_id", ""))) + var role_id := StringName(command.payload.get(&"role_id", command.payload.get("role_id", ""))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if staff_id.is_empty() or role_id.is_empty() or not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Staff id, role id and options are required.") + if _is_mvp_staff_candidate_id(staff_id) or mvp_content_catalog.get_unique_character_ids().has(staff_id): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Catalog identities must be created through their validated recruitment flow." + ) + var options: Dictionary = raw_options.duplicate(true) + var initial_cell_value: Variant = _parse_world_cell( + options.get(&"current_cell", options.get("current_cell", Vector3i.ZERO)) + ) + if initial_cell_value == null: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "Staff current_cell must be Vector3i or [x, y, layer]." + ) + var initial_cell: Vector3i = initial_cell_value + var initial_traffic := path_service.get_cell_traffic(initial_cell) + var path_actor_id := _staff_path_actor_id(staff_id) + if initial_traffic.is_empty() or bool(initial_traffic.get(&"temporary_block", false)) \ + or path_service.has_actor_projection(path_actor_id): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Staff current_cell must be an unblocked walkable cell with a free Path actor id." + ) + options[&"current_cell"] = initial_cell + var staff_before := staff_service.create_snapshot() + var path_before := path_service.create_snapshot() + var credits_before := _movement_credits.duplicate(true) + var events_before := domain_events.create_snapshot() + var ids_before := id_generator.create_snapshot() + options[&"employment_effective_minute"] = _runtime_event_minute() + var result := staff_service.create_staff(staff_id, role_id, options) + if result.is_success() and ( + not path_service.has_actor_projection(path_actor_id) + or path_service.get_actor_projected_cell(path_actor_id) != initial_cell + or not _movement_credits.has(path_actor_id) + ): + staff_service.restore_snapshot(staff_before) + path_service.restore_snapshot(path_before) + _movement_credits = credits_before + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(ids_before) + result = CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Staff Path projection failed." + ) + result.command_id = command.command_id + return result + + +# Original 6.1 plus the approved Anri staff-screen choice. Other unique +# characters still have no approved joining timing. Zero signing cost and both +# canonical wage fields must be actual integers; payload aliases cannot qualify. +func _is_approved_free_unique_hire(candidate_id: StringName, canonical: Dictionary) -> bool: + if candidate_id != &"heroine_anri" or not mvp_content_catalog.is_valid(): + return false + var staff_id_value: Variant = canonical.get(&"staff_id", null) + var role_value: Variant = canonical.get(&"role_id", null) + var options_value: Variant = canonical.get(&"options", null) + if typeof(role_value) not in [TYPE_STRING, TYPE_STRING_NAME] or StringName(role_value) != &"innkeeper": + return false + if typeof(staff_id_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(staff_id_value) != candidate_id or not options_value is Dictionary: + return false + var options: Dictionary = options_value + var employment_value: Variant = options.get(&"employment_kind", null) + if typeof(employment_value) not in [TYPE_STRING, TYPE_STRING_NAME] \ + or StringName(employment_value) != &"UNIQUE" \ + or typeof(canonical.get(&"adult_verified", null)) != TYPE_BOOL \ + or not bool(canonical[&"adult_verified"]): + return false + for value: Variant in [canonical.get(&"signing_cost", null), canonical.get(&"daily_wage", null), options.get(&"daily_wage", null)]: + if typeof(value) != TYPE_INT or int(value) != 0: + return false + return true + + +func _execute_hire_staff_candidate(command: SimulationCommand) -> CommandResult: + # Ordinary contracts retain the investment gate and its existing error + # priority. Only Anri has approved free recruitment; classify that exception + # from validated canonical data, never caller-supplied costs or employment. + var operations_gate := _operations_construction_investment_gate(command.command_id) + var raw_candidate_id: Variant = command.payload.get( + &"candidate_id", command.payload.get("candidate_id", null) + ) + if operations_gate != null and ( + typeof(raw_candidate_id) not in [TYPE_STRING, TYPE_STRING_NAME] + or StringName(raw_candidate_id) != &"heroine_anri" + ): + return operations_gate + if typeof(raw_candidate_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "A catalog Staff candidate id is required." + ) + var candidate_id := StringName(raw_candidate_id) + var canonical := mvp_content_catalog.staff_hire_payload(candidate_id) + if canonical.is_empty(): + return CommandResult.failed( + CommandResult.Code.NOT_FOUND, + command.command_id, + "Staff candidate was not found in the validated MVP catalog." + ) + if not bool(canonical.get(&"adult_verified", false)): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Staff candidate does not have verified adult eligibility." + ) + if operations_gate != null: + var reason := StringName(operations_gate.details.get(&"reason", &"")) + var can_join_without_investment := _is_approved_free_unique_hire(candidate_id, canonical) \ + and reason in [&"ARREARS_REMAIN", &"UNPAID_EXPENSES"] \ + and not _operations_should_block_tick() + if not can_join_without_investment: + return operations_gate + if _hired_staff_candidate_ids.has(candidate_id) or staff_service.has_staff(candidate_id): + return CommandResult.failed( + CommandResult.Code.DUPLICATE_COMMAND_ID, + command.command_id, + "Staff candidate has already been hired." + ) + var initial_cell_value: Variant = _parse_world_cell( + command.payload.get(&"current_cell", command.payload.get("current_cell", Vector3i.ZERO)) + ) + if initial_cell_value == null: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "Staff current_cell must be Vector3i or [x, y, layer]." + ) + var initial_cell: Vector3i = initial_cell_value + var path_actor_id := _staff_path_actor_id(candidate_id) + var traffic := path_service.get_cell_traffic(initial_cell) + if traffic.is_empty() or bool(traffic.get(&"temporary_block", false)) \ + or path_service.has_actor_projection(path_actor_id): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Staff current_cell must be an unblocked walkable cell with a free Path actor id." + ) + var assigned_facility_id := StringName(command.payload.get( + &"facility_id", command.payload.get("facility_id", "") + )) + if not assigned_facility_id.is_empty() \ + and not facility_service.has_instance(assigned_facility_id): + return CommandResult.failed( + CommandResult.Code.NOT_FOUND, + command.command_id, + "Assigned Staff facility was not found." + ) + + var before := { + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"staff": staff_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"movement_credits": _movement_credits.duplicate(true), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"hired_ids": _hired_staff_candidate_ids.duplicate(true), + &"staffing_projection_enabled": _staffing_projection_enabled, + } + var signing_cost := int(canonical[&"signing_cost"]) + if signing_cost > 0: + var payment := economy_service.transfer( + PLAYER_CASH_ACCOUNT, + OPERATING_EXPENSE_ACCOUNT, + signing_cost, + _runtime_event_minute(), + &"STAFF_SIGNING_COST", + candidate_id, + StringName("staff_signing_%s" % candidate_id), + &"staff.signing_cost" + ) + if not payment.is_success(): + payment.command_id = command.command_id + return payment + + var options: Dictionary = (canonical[&"options"] as Dictionary).duplicate(true) + options[&"current_cell"] = initial_cell + options[&"assigned_facility_id"] = assigned_facility_id + options[&"employment_effective_minute"] = _runtime_event_minute() + var staff_result := staff_service.create_staff( + candidate_id, + StringName(canonical[&"role_id"]), + options + ) + if not staff_result.is_success(): + _rollback_staff_candidate_hire(before) + staff_result.command_id = command.command_id + return staff_result + var preferred_shift := StringName(canonical[&"preferred_shift"]) + var shift_day := _candidate_shift_start_day(preferred_shift, _runtime_event_minute()) + var shift_result: CommandResult + if preferred_shift in [&"day", &"night"]: + shift_result = staff_service.create_standard_shift( + candidate_id, + preferred_shift, + shift_day, + assigned_facility_id + ) + else: + shift_result = staff_service.create_flex_shift( + candidate_id, + shift_day, + ShiftInstance.DAY_START, + ShiftInstance.DAY_END, + assigned_facility_id + ) + var shift_id := StringName(shift_result.details.get(&"shift_id", &"")) + var hired_staff := staff_service.get_staff(candidate_id) + var hired_shift := staff_service.get_shift(shift_id) + if not shift_result.is_success() or hired_staff == null or hired_shift == null \ + or hired_staff.daily_wage != int(canonical[&"daily_wage"]) \ + or hired_staff.get_employment_kind_name() != StringName(canonical[&"options"][&"employment_kind"]) \ + or not path_service.has_actor_projection(path_actor_id) \ + or path_service.get_actor_projected_cell(path_actor_id) != initial_cell \ + or not _movement_credits.has(path_actor_id): + _rollback_staff_candidate_hire(before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Staff hire could not commit its employee, Shift, finance, and Path state atomically." + ) + _hired_staff_candidate_ids[candidate_id] = true + _publish_actor_event( + &"STAFF_CANDIDATE_HIRED", + &"simulation_runtime", + [candidate_id, shift_id], + { + &"candidate_id": candidate_id, + &"role_id": StringName(canonical[&"role_id"]), + &"daily_wage": int(canonical[&"daily_wage"]), + &"employment_kind": hired_staff.get_employment_kind_name(), + &"signing_cost": signing_cost, + &"shift_id": shift_id, + &"preferred_shift": preferred_shift, + } + ) + return CommandResult.succeeded(command.command_id, { + &"candidate_id": candidate_id, + &"staff_id": candidate_id, + &"role_id": StringName(canonical[&"role_id"]), + &"daily_wage": int(canonical[&"daily_wage"]), + &"employment_kind": hired_staff.get_employment_kind_name(), + &"signing_cost": signing_cost, + &"shift_id": shift_id, + &"player_cash": economy_service.get_balance(PLAYER_CASH_ACCOUNT), + }) + +func _execute_create_staff_shift(command: SimulationCommand) -> CommandResult: + var staff_id := StringName(command.payload.get(&"staff_id", command.payload.get("staff_id", ""))) + var shift_id := StringName(command.payload.get(&"shift_id", command.payload.get("shift_id", ""))) + var start_day := int(command.payload.get(&"start_day", command.payload.get("start_day", _runtime_event_minute() / 1_440))) + var facility_id := StringName(command.payload.get(&"facility_id", command.payload.get("facility_id", ""))) + var template_id := StringName(command.payload.get(&"template_id", command.payload.get("template_id", "FLEX"))) + var result: CommandResult + if String(template_id).to_upper() in ["DAY", "NIGHT"]: + result = staff_service.create_standard_shift(staff_id, template_id, start_day, facility_id, shift_id) + else: + var start_minute := int(command.payload.get(&"start_minute_of_day", command.payload.get("start_minute_of_day", posmod(_runtime_event_minute(), 1_440)))) + var end_minute := int(command.payload.get(&"end_minute_of_day", command.payload.get("end_minute_of_day", posmod(start_minute + 480, 1_440)))) + result = staff_service.create_flex_shift(staff_id, start_day, start_minute, end_minute, facility_id, shift_id) + result.command_id = command.command_id + return result + + +func _candidate_shift_start_day(preferred_shift: StringName, absolute_minute: int) -> int: + var day := absolute_minute / ShiftInstance.MINUTES_PER_DAY + var minute_of_day := posmod(absolute_minute, ShiftInstance.MINUTES_PER_DAY) + # A NIGHT record starts at 18:00 of its named day and remains meaningful even + # when hired after that start. DAY/FLEX records move to tomorrow once today's + # daytime window has ended. + if preferred_shift != &"night" and minute_of_day >= ShiftInstance.DAY_END: + day += 1 + return day + + +func _rollback_staff_candidate_hire(snapshot: Dictionary) -> bool: + var restored := economy_service.restore_snapshot(snapshot[&"economy"]) + restored = _state.restore_snapshot(snapshot[&"game_state"]) and restored + restored = staff_service.restore_snapshot(snapshot[&"staff"]) and restored + restored = path_service.restore_snapshot(snapshot[&"path"]) and restored + restored = elevators.restore_snapshot(snapshot[&"elevators"]) and restored + restored = legacy_stairs.restore_snapshot(snapshot[&"legacy_stairs"]) and restored + _movement_credits = (snapshot[&"movement_credits"] as Dictionary).duplicate(true) + restored = domain_events.restore_snapshot(snapshot[&"domain_events"]) and restored + restored = id_generator.restore_snapshot(snapshot[&"id_generator"]) and restored + _hired_staff_candidate_ids = (snapshot[&"hired_ids"] as Dictionary).duplicate(true) + _staffing_projection_enabled = bool(snapshot[&"staffing_projection_enabled"]) + return restored and _validate_runtime_path_crosslinks( + path_service, + guest_service, + staff_service, + _movement_credits, + _runtime_event_minute() + ) + +func _staff_role_matches_facility(role_id: StringName, definition: FacilityDefinition) -> bool: + if definition.required_roles.is_empty() or role_id in definition.required_roles: + return true + # Existing public-bath data uses a legacy job ID; the paid roster exposes + # the canonical attendant. The other aliases likewise retain saved job IDs. + if definition.id == &"public_bath" and role_id == &"attendant" and &"bath_attendant" in definition.required_roles: + return true + if definition.id == &"massage_room" and role_id == &"masseur" and &"therapist" in definition.required_roles: + return true + return definition.id == &"security_station" and role_id == &"guard" and &"security" in definition.required_roles + +func _execute_set_staff_work_assignment(command: SimulationCommand) -> CommandResult: + for key: StringName in [&"staff_id", &"facility_id", &"template_id"]: + if typeof(command.payload.get(key, null)) not in [TYPE_STRING, TYPE_STRING_NAME]: + return _staff_assignment_failure(command.command_id, &"INVALID_PAYLOAD", "Staff, facility, and shift IDs must be strings.") + var staff_id := StringName(command.payload[&"staff_id"]) + var facility_id := StringName(command.payload[&"facility_id"]) + var template_id := StringName(command.payload[&"template_id"]) + var staff := staff_service.get_staff(staff_id) + if staff == null: + return _staff_assignment_failure(command.command_id, &"STAFF_NOT_FOUND", "Staff was not found.") + if template_id not in [&"DAY", &"NIGHT"]: + return _staff_assignment_failure(command.command_id, &"INVALID_TEMPLATE", "Choose DAY or NIGHT.") + var block_reason := _staff_assignment_block_reason(staff) + if not block_reason.is_empty(): + var messages := { + &"DEFENSE_LOCKED": "Staff is participating in a defense operation.", + &"EVENT_LOCKED": "Staff is participating in an event.", + &"STAFF_BUSY": "Finish the current task before changing assignment.", + &"STAFF_UNAVAILABLE": "Staff cannot change assignment in the current state.", + } + return _staff_assignment_failure(command.command_id, block_reason, messages[block_reason]) + if not facility_id.is_empty(): + var facility := facility_service.get_instance(facility_id) + if facility == null: + return _staff_assignment_failure(command.command_id, &"FACILITY_NOT_FOUND", "Facility was not found.") + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null or definition.staff_max <= 0: + return _staff_assignment_failure(command.command_id, &"FACILITY_UNSTAFFED", "This facility does not accept Staff assignments.") + if not _staff_role_matches_facility(staff.role_id, definition) and not _is_anri_manager(staff): + return _staff_assignment_failure(command.command_id, &"ROLE_MISMATCH", "Staff role does not match this facility.") + if _staff_assignment_count(facility_id, template_id, staff_id) >= definition.staff_max: + return _staff_assignment_failure(command.command_id, &"FACILITY_FULL", "This shift has reached the facility Staff limit.") + if not _staff_can_reach_facility(staff, facility): + return _staff_assignment_failure(command.command_id, &"NO_ROUTE", "Staff cannot reach this facility through an accessible route.") + var result := staff_service.set_work_assignment(staff_id, facility_id, template_id, _runtime_event_minute()) + result.command_id = command.command_id + if result.is_success(): + var actor_id := _staff_path_actor_id(staff_id) + var trip := elevators.get_actor_trip(actor_id) + if result.details.get(&"reason", &"") == &"ASSIGNMENT_UPDATED" and trip.get(&"state", &"") == PathService.ELEVATOR_REQUEST_QUEUED: + elevators.cancel_actor(actor_id) + _staffing_projection_enabled = true + _sync_facility_staffing(_runtime_event_minute()) + if result.details.get(&"reason", &"") == &"ASSIGNMENT_UPDATED": + _publish_actor_event(&"STAFF_WORK_ASSIGNMENT_CHANGED", &"staff_service", [staff_id], result.details) + return result + + +## Shared by the command and presentation; always derived from live state. +func _staff_assignment_block_reason(staff: StaffRuntime) -> StringName: + if not _defense_lock_owner(staff.staff_id, &"DEFENDER").is_empty(): + return &"DEFENSE_LOCKED" + if event_service.get_actor_locks().has(staff.staff_id): + return &"EVENT_LOCKED" + if not staff.current_task_id.is_empty(): + return &"STAFF_BUSY" + if not staff.can_take_shift() or staff.state not in [StaffRuntime.State.OFF_DUTY, StaffRuntime.State.COMMUTING, StaffRuntime.State.AVAILABLE]: + return &"STAFF_UNAVAILABLE" + return &"" + + +func _staff_assignment_failure(command_id: int, reason: StringName, message: String) -> CommandResult: + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command_id, message, {&"reason": reason}) + + +func _staff_assignment_count(facility_id: StringName, template_id: StringName, excluded_staff: StringName) -> int: + var counted: Dictionary = {} + for row: Dictionary in staff_service.get_work_assignments(): + var staff_id := StringName(row[&"staff_id"]) + if staff_id != excluded_staff and StringName(row[&"facility_id"]) == facility_id \ + and StringName(row[&"template_id"]) == template_id: + counted[staff_id] = true + var interval := StaffService._work_interval(template_id, _runtime_event_minute()) + for shift: ShiftInstance in staff_service.get_shifts(): + if shift.staff_id != excluded_staff and not shift.cancelled \ + and shift.assigned_facility_id == facility_id \ + and shift.end_at > maxi(interval.x, _runtime_event_minute()) and shift.start_at < interval.y: + counted[shift.staff_id] = true + return counted.size() + + +func _staff_can_reach_facility(staff: StaffRuntime, facility: FacilityInstance) -> bool: + var occupied: Array[Vector3i] = facility.occupied_cells.duplicate() + if occupied.is_empty(): + occupied.append(facility.origin) + var candidates: Dictionary = {} + for cell: Vector3i in occupied: + for offset: Vector3i in [Vector3i.ZERO, Vector3i.LEFT, Vector3i.RIGHT]: + var candidate := cell + offset + if path_service.has_cell(candidate): + candidates[candidate] = true + for candidate: Vector3i in candidates: + if not path_service.find_path(staff.current_cell, candidate, [WorldService.LAYER_FRONT, WorldService.LAYER_BACK], [&"staff"]).is_empty(): + return true + return false + + +func _execute_set_staff_schedule_override(command: SimulationCommand) -> CommandResult: + var staff_id := StringName(command.payload.get(&"staff_id", command.payload.get("staff_id", ""))) + var start_day := int(command.payload.get(&"start_day", command.payload.get("start_day", -1))) + var patch_value: Variant = command.payload.get(&"patch", command.payload.get("patch", null)) + if not patch_value is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Schedule override patch must be a Dictionary.") + var result := staff_service.set_schedule_override(staff_id, start_day, patch_value) + result.command_id = command.command_id + return result + +func _execute_create_staff_task(command: SimulationCommand) -> CommandResult: + var task_type := StringName(command.payload.get(&"task_type", command.payload.get("task_type", ""))) + var priority := int(command.payload.get(&"priority", command.payload.get("priority", 50))) + var task_id := StringName(command.payload.get(&"task_id", command.payload.get("task_id", ""))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if task_type == CleaningBridge.TASK_TYPE: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Cleaning jobs are scheduled from actual facility dirt.") + if task_type.is_empty() or not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Task type and options are required.") + var result := staff_service.create_task(task_type, priority, _runtime_event_minute(), raw_options, task_id) + result.command_id = command.command_id + return result + +func _execute_begin_staff_task(command: SimulationCommand) -> CommandResult: + var task_id := StringName(command.payload.get(&"task_id", command.payload.get("task_id", ""))) + var result := staff_service.begin_task(task_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_progress_staff_task(command: SimulationCommand) -> CommandResult: + var task_id := StringName(command.payload.get(&"task_id", command.payload.get("task_id", ""))) + var task := staff_service.get_task(task_id) + if task != null and task.task_type == CleaningBridge.TASK_TYPE: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Cleaning work advances only at its physical destination with game time.") + var minutes := int(command.payload.get(&"minutes", command.payload.get("minutes", 1))) + var result := staff_service.progress_task(task_id, minutes, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_create_relationship(command: SimulationCommand) -> CommandResult: + var actor_a_id := StringName(command.payload.get(&"actor_a_id", command.payload.get("actor_a_id", ""))) + var actor_b_id := StringName(command.payload.get(&"actor_b_id", command.payload.get("actor_b_id", ""))) + if not _event_actor_exists(actor_a_id) or not _event_actor_exists(actor_b_id): + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Both relationship actors must exist.") + var relationship_id := StringName(command.payload.get(&"relationship_id", command.payload.get("relationship_id", ""))) + var id_before := id_generator.create_snapshot() + if relationship_id.is_empty(): + relationship_id = id_generator.next_id(&"relationship") + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + var options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {} + var result := relationship_service.create_relationship(relationship_id, actor_a_id, actor_b_id, options) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + return result + +func _execute_change_relationship(command: SimulationCommand) -> CommandResult: + var relationship_id := StringName(command.payload.get(&"relationship_id", command.payload.get("relationship_id", ""))) + var metric_id := StringName(command.payload.get(&"metric_id", command.payload.get("metric_id", ""))) + var delta := int(command.payload.get(&"delta", command.payload.get("delta", 0))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + var options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {} + var result := relationship_service.apply_value_change( + relationship_id, metric_id, delta, _runtime_event_minute(), options + ) + result.command_id = command.command_id + return result + +func _execute_attack_relationship_shield(command: SimulationCommand) -> CommandResult: + var relationship_id := StringName(command.payload.get(&"relationship_id", command.payload.get("relationship_id", ""))) + var action_id := StringName(command.payload.get(&"action_id", command.payload.get("action_id", ""))) + var raw_terms: Variant = command.payload.get(&"terms", command.payload.get("terms", {})) + if not raw_terms is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Shield attack terms must be a Dictionary.") + var result := relationship_service.apply_shield_attack( + relationship_id, action_id, _runtime_event_minute(), raw_terms + ) + result.command_id = command.command_id + return result + +func _execute_request_route_lock(command: SimulationCommand) -> CommandResult: + var relationship_id := StringName(command.payload.get(&"relationship_id", command.payload.get("relationship_id", ""))) + var route_id := StringName(command.payload.get(&"route_id", command.payload.get("route_id", ""))) + var lock_index := _route_lock_index(command.payload.get(&"route_lock", command.payload.get("route_lock", -1))) + if lock_index < 0: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "A valid Route Lock state is required.") + var result := relationship_service.request_route_lock( + relationship_id, + lock_index, + route_id, + bool(command.payload.get(&"irreversible_event", command.payload.get("irreversible_event", false))) + ) + result.command_id = command.command_id + return result + +func _execute_confirm_route_lock(command: SimulationCommand) -> CommandResult: + var relationship_id := StringName(command.payload.get(&"relationship_id", command.payload.get("relationship_id", ""))) + var route_id := StringName(command.payload.get(&"route_id", command.payload.get("route_id", ""))) + var result := relationship_service.confirm_route_lock(relationship_id, route_id) + result.command_id = command.command_id + return result + +func _execute_register_event_definition(command: SimulationCommand) -> CommandResult: + var raw_definition: Variant = command.payload.get(&"definition", command.payload.get("definition", null)) + var definition := EventDefinition.from_variant(raw_definition) + if definition == null: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Event definition is malformed.") + var result := event_service.register_definition(definition) + result.command_id = command.command_id + return result + +func _execute_enqueue_event(command: SimulationCommand) -> CommandResult: + var event_id := StringName(command.payload.get(&"event_id", command.payload.get("event_id", ""))) + var actor_ids := _name_array(command.payload.get(&"actor_ids", command.payload.get("actor_ids", []))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + var options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {} + var result := event_service.enqueue_candidate(event_id, actor_ids, _runtime_event_minute(), options) + result.command_id = command.command_id + return result + +func _execute_reserve_event_choice_cost(command: SimulationCommand) -> CommandResult: + var instance_id := StringName(command.payload.get(&"event_instance_id", command.payload.get("event_instance_id", ""))) + var choice_id := StringName(command.payload.get(&"choice_id", command.payload.get("choice_id", ""))) + var result := event_service.reserve_choice_cost(instance_id, choice_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_submit_event_choice(command: SimulationCommand) -> CommandResult: + var instance_id := StringName(command.payload.get(&"event_instance_id", command.payload.get("event_instance_id", ""))) + var choice_instance_id := StringName(command.payload.get(&"choice_instance_id", command.payload.get("choice_instance_id", ""))) + var choice_id := StringName(command.payload.get(&"choice_id", command.payload.get("choice_id", ""))) + var result := event_service.submit_choice( + instance_id, choice_instance_id, choice_id, _runtime_event_minute() + ) + if result.is_success() and event_service.get_foreground_instance() == null: + _clock.set_paused(false) + result.command_id = command.command_id + return result + +func _execute_report_authority_incident(command: SimulationCommand) -> CommandResult: + var incident_id := StringName(command.payload.get(&"incident_id", command.payload.get("incident_id", ""))) + var incident_type := StringName(command.payload.get(&"incident_type", command.payload.get("incident_type", ""))) + var detector_id := StringName(command.payload.get(&"detector_id", command.payload.get("detector_id", command.actor_id))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Incident options must be a Dictionary.") + var id_before := id_generator.create_snapshot() + if incident_id.is_empty(): + incident_id = id_generator.next_id(&"incident") + var result := authority_service.create_incident( + incident_id, + incident_type, + _runtime_event_minute(), + detector_id, + (raw_options as Dictionary).duplicate(true) + ) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + return result + +func _execute_register_authority_evidence(command: SimulationCommand) -> CommandResult: + var evidence_id := StringName(command.payload.get(&"evidence_id", command.payload.get("evidence_id", ""))) + var source := StringName(command.payload.get(&"source", command.payload.get("source", ""))) + var severity := int(command.payload.get(&"severity", command.payload.get("severity", -1))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Evidence options must be a Dictionary.") + var options: Dictionary = (raw_options as Dictionary).duplicate(true) + if not options.has(&"created_at") and not options.has("created_at"): + options[&"created_at"] = _runtime_event_minute() + var id_before := id_generator.create_snapshot() + if evidence_id.is_empty(): + evidence_id = id_generator.next_id(&"evidence") + var result := authority_service.create_evidence(evidence_id, source, severity, options) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + return result + +func _execute_discover_authority_evidence(command: SimulationCommand) -> CommandResult: + var evidence_id := StringName(command.payload.get(&"evidence_id", command.payload.get("evidence_id", ""))) + var inspector_id := StringName(command.payload.get(&"inspector_id", command.payload.get("inspector_id", command.actor_id))) + var parsed_cell: Variant = _parse_world_cell(command.payload.get(&"inspector_cell", command.payload.get("inspector_cell", null))) + var raw_context: Variant = command.payload.get(&"context", command.payload.get("context", {})) + if parsed_cell == null or not raw_context is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Evidence discovery requires inspector_cell and Dictionary context.") + var result := authority_service.attempt_discover_evidence( + evidence_id, + inspector_id, + parsed_cell, + _runtime_event_minute(), + (raw_context as Dictionary).duplicate(true) + ) + result.command_id = command.command_id + return result + +func _execute_evaluate_authority_inspection(command: SimulationCommand) -> CommandResult: + var raw_terms: Variant = command.payload.get(&"terms", command.payload.get("terms", {})) + if not raw_terms is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection evaluation terms must be a Dictionary.") + var result := authority_service.evaluate_inspection( + _runtime_event_minute(), + (raw_terms as Dictionary).duplicate(true) + ) + if result.is_success() and not result.is_replay: + _publish_authority_evaluation(result.details) + result.command_id = command.command_id + return result + +func _execute_schedule_authority_inspection(command: SimulationCommand) -> CommandResult: + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection options must be a Dictionary.") + var scheduled_at := int(command.payload.get(&"scheduled_at", command.payload.get("scheduled_at", _runtime_event_minute()))) + var result := authority_service.schedule_inspection( + scheduled_at, + (raw_options as Dictionary).duplicate(true) + ) + result.command_id = command.command_id + return result + +func _execute_start_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var result := authority_service.start_inspection(inspection_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_arrive_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var result := authority_service.mark_inspector_arrived(inspection_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_plan_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var raw_candidates: Variant = command.payload.get(&"candidates", command.payload.get("candidates", null)) + if not raw_candidates is Array: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection patrol candidates must be an Array.") + var time_budget := int(command.payload.get(&"time_budget_minutes", command.payload.get("time_budget_minutes", 120))) + var result := authority_service.plan_patrol( + inspection_id, + raw_candidates, + _runtime_event_minute(), + time_budget + ) + result.command_id = command.command_id + return result + +func _execute_advance_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var raw_context: Variant = command.payload.get(&"context", command.payload.get("context", {})) + if not raw_context is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection path context must be a Dictionary.") + var result := authority_service.advance_patrol( + inspection_id, + _runtime_event_minute(), + (raw_context as Dictionary).duplicate(true) + ) + if result.is_success() and result.details.has(&"reachable"): + var event_type := &"INSPECTION_WAYPOINT_REACHED" if bool(result.details[&"reachable"]) else &"INSPECTION_PATH_BLOCKED" + _publish_actor_event( + event_type, + &"authority_service", + [inspection_id, StringName(result.details.get(&"waypoint_id", ""))], + result.details.duplicate(true) + ) + result.command_id = command.command_id + return result + +func _execute_inspect_authority_waypoint(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var evidence_ids := _name_array(command.payload.get(&"evidence_ids", command.payload.get("evidence_ids", []))) + var raw_context: Variant = command.payload.get(&"context", command.payload.get("context", {})) + if not raw_context is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection evidence context must be a Dictionary.") + var result := authority_service.inspect_current_waypoint( + inspection_id, + evidence_ids, + _runtime_event_minute(), + (raw_context as Dictionary).duplicate(true) + ) + if result.is_success(): + _publish_actor_event( + &"INSPECTION_WAYPOINT_INSPECTED", + &"authority_service", + [inspection_id], + result.details.duplicate(true) + ) + result.command_id = command.command_id + return result + +func _execute_resolve_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var resolution_id := StringName(command.payload.get(&"resolution_id", command.payload.get("resolution_id", ""))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Inspection resolution options must be a Dictionary.") + var id_before := id_generator.create_snapshot() + if resolution_id.is_empty(): + resolution_id = id_generator.next_id(&"resolution") + var result := authority_service.resolve_inspection( + inspection_id, + resolution_id, + _runtime_event_minute(), + (raw_options as Dictionary).duplicate(true) + ) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + return result + +func _execute_depart_authority_inspection(command: SimulationCommand) -> CommandResult: + var inspection_id := StringName(command.payload.get(&"inspection_id", command.payload.get("inspection_id", ""))) + var result := authority_service.depart_inspection(inspection_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + +## Existing Defense commands remain authoritative. This report only explains +## why a live employee or target can be registered; no balance data is invented. +func get_defense_management_report(selected_raid_id: StringName = &"") -> Dictionary: + var raids: Array[Dictionary] = defense_service.get_management_rows() + var selected: Dictionary = {} + for row: Dictionary in raids: + if row[&"raid_id"] == selected_raid_id: + selected = row + break + if selected.is_empty() and not raids.is_empty(): + selected = raids[0] + for row: Dictionary in raids: + if int(row[&"state"]) not in DefenseService.TERMINAL_STATES: + selected = row + break + var raid_id := StringName(selected.get(&"raid_id", &"")) + var detail := defense_service.get_management_detail(raid_id) + var defenders: Array = detail.get(&"defenders", []) + var assets: Array = detail.get(&"assets", []) + var defender_owners: Dictionary = {} + var asset_owners: Dictionary = {} + for row: Dictionary in raids: + if int(row[&"state"]) in DefenseService.TERMINAL_STATES: continue + for actor_id: StringName in row[&"defender_ids"]: defender_owners[actor_id] = row[&"raid_id"] + for asset_id: StringName in row[&"asset_ids"]: asset_owners[asset_id] = row[&"raid_id"] + var preparing := int(selected.get(&"state", -1)) == DefenseService.RaidState.PREPARING + var staff_rows: Array[Dictionary] = [] + for staff: StaffRuntime in staff_service.get_staff_members(): + var entry := mvp_content_catalog.get_recruitment_entry(staff.staff_id) + var registered := false + for actor: Dictionary in defenders: + registered = registered or actor[&"actor_id"] == staff.staff_id + var reason := "" + if not preparing: reason = "準備中だけ参加者を追加できます。" + elif registered: reason = "この防衛戦に参加済みです。" + elif defender_owners.has(staff.staff_id) and defender_owners[staff.staff_id] != raid_id: reason = "別の防衛戦に参加しています。" + elif not staff.can_take_shift(): reason = "現在の体調や状態では参加できません。" + elif not staff.current_task_id.is_empty(): reason = "担当中の業務が完了するまで参加できません。" + staff_rows.append({ + &"staff_id": staff.staff_id, &"display_name": String(entry.get(&"display_name", staff.staff_id)), + &"combat": int(staff.skills.get(&"combat", 0)), &"health": staff.health, + &"fatigue": staff.fatigue, &"registered": registered, + &"can_register": reason.is_empty(), &"reason": reason, + }) + var objective_rows: Array[Dictionary] = [] + for objective_id: StringName in selected.get(&"objective_ids", []): + var facility := facility_service.get_instance(objective_id) + var definition: Variant = definition_registry.get_facility(facility.definition_id) if facility != null else null + var registered := false + for asset: Dictionary in assets: + registered = registered or asset[&"asset_id"] == objective_id + var reason := "" + if not preparing: reason = "準備中だけ防衛対象を登録できます。" + elif registered: reason = "登録済みです。" + elif facility == null: reason = "指定された施設が見つかりません。" + elif facility.durability <= 0: reason = "破壊された施設は登録できません。" + elif not facility.queue_entries.is_empty() or not facility.active_services.is_empty(): reason = "利用中または待機中の顧客がいます。" + elif asset_owners.has(objective_id) and asset_owners[objective_id] != raid_id: reason = "別の防衛戦の対象です。" + objective_rows.append({ + &"facility_id": objective_id, &"display_name": String(definition.display_name) if definition != null else String(objective_id), + &"durability": facility.durability if facility != null else 0, + &"registered": registered, &"can_register": reason.is_empty(), &"reason": reason, + }) + return {&"raids": raids, &"selected": selected, &"staff": staff_rows, + &"objectives": objective_rows, &"defenders": defenders, &"assets": assets, + &"can_control": not (_operations_enabled and operations_coordinator != null and operations_coordinator.is_terminal())} + + +func _execute_create_defense_raid(command: SimulationCommand) -> CommandResult: + var raw_definition: Variant = command.payload.get(&"definition", command.payload.get("definition", null)) + if not raw_definition is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Defense Raid definition must be a Dictionary.") + var event_source_value: Variant = raw_definition.get(&"event_source", raw_definition.get("event_source", {})) + if not event_source_value is Dictionary or not event_source_value.is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Event threat provenance is reserved to the configured Event boundary.") + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var id_before := id_generator.create_snapshot() + if raid_id.is_empty(): + raid_id = id_generator.next_id(&"defense_raid") + var definition: Dictionary = (raw_definition as Dictionary).duplicate(true) + if not definition.has(&"source_id") and not definition.has("source_id"): + definition[&"source_id"] = command.actor_id + var result := defense_service.create_raid(raid_id, _defense_operation_minute(), definition) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_register_defense_combatant(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var actor_id := StringName(command.payload.get(&"actor_id", command.payload.get("actor_id", command.payload.get(&"staff_id", command.payload.get("staff_id", ""))))) + var side := StringName(String(command.payload.get(&"side", command.payload.get("side", ""))).to_upper()) + var combat := int(command.payload.get(&"combat", command.payload.get("combat", 0))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if raid_id.is_empty() or actor_id.is_empty() or not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Defense combatant requires raid_id, actor_id and Dictionary options.") + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before combatant registration.") + var options: Dictionary = (raw_options as Dictionary).duplicate(true) + var max_health := int(command.payload.get(&"max_health", command.payload.get("max_health", 100))) + if side == &"DEFENDER": + var staff := staff_service.get_staff(actor_id) + if staff == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Defense defender must reference existing Staff.") + if not staff.can_take_shift() or not staff.current_task_id.is_empty(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense defender must be healthy enough to participate and free of Staff tasks.") + var lock_owner: StringName = _defense_lock_owner(actor_id, &"DEFENDER", raid_id) + if not lock_owner.is_empty(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Staff is already assigned to another non-terminal Raid.", {&"raid_id": lock_owner}) + if max_health != StaffRuntime.MAX_PSYCHOLOGY_VALUE \ + or ((options.has(&"health") or options.has("health")) and int(options.get(&"health", options.get("health", -1))) != staff.health): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defender health must use the current Staff health on a 100-point baseline.") + max_health = StaffRuntime.MAX_PSYCHOLOGY_VALUE + options[&"health"] = staff.health + options[&"fatigue"] = staff.fatigue + var staff_before: Dictionary = staff_service.create_snapshot() + staff.transition_to(StaffRuntime.State.UNAVAILABLE, &"DEFENSE_ASSIGNED", _defense_operation_minute()) + var defender_result := defense_service.register_combatant( + raid_id, actor_id, side, combat, max_health, options + ) + if not defender_result.is_success(): + staff_service.restore_snapshot(staff_before) + defender_result.command_id = command.command_id + defender_result.target_id = raid_id + return defender_result + elif side != &"ATTACKER": + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Defense combatant side must be DEFENDER or ATTACKER.") + var result := defense_service.register_combatant( + raid_id, actor_id, side, combat, max_health, options + ) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_register_defense_asset(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var asset_id := StringName(command.payload.get(&"asset_id", command.payload.get("asset_id", command.payload.get(&"facility_id", command.payload.get("facility_id", ""))))) + var kind := StringName(String(command.payload.get(&"kind", command.payload.get("kind", ""))).to_upper()) + var defense := int(command.payload.get(&"defense", command.payload.get("defense", 0))) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if raid_id.is_empty() or asset_id.is_empty() or not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Defense asset requires raid_id, facility asset_id and Dictionary options.") + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before asset registration.") + var facility := facility_service.get_instance(asset_id) + if facility == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Defense asset must reference an existing Facility.") + if not facility.queue_entries.is_empty() or not facility.active_services.is_empty(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "A busy Facility cannot become a Defense asset.") + var lock_owner: StringName = _defense_lock_owner(asset_id, &"ASSET", raid_id) + if not lock_owner.is_empty(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Facility is already assigned to another non-terminal Raid.", {&"raid_id": lock_owner}) + var supplied_maximum := int(command.payload.get(&"max_integrity", command.payload.get("max_integrity", FacilityInstance.DEFAULT_DURABILITY))) + var options: Dictionary = (raw_options as Dictionary).duplicate(true) + if supplied_maximum != FacilityInstance.DEFAULT_DURABILITY \ + or ((options.has(&"integrity") or options.has("integrity")) and int(options.get(&"integrity", options.get("integrity", -1))) != facility.durability): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense asset integrity must use the current Facility durability on a 10000-point baseline.") + options[&"integrity"] = facility.durability + var result := defense_service.register_asset( + raid_id, + asset_id, + kind, + FacilityInstance.DEFAULT_DURABILITY, + defense, + options + ) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_start_defense_raid(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before Raid start.") + var result := defense_service.start_raid(raid_id, _defense_operation_minute()) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_set_defense_retreat_policy(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var policy := StringName(String(command.payload.get(&"policy", command.payload.get("policy", ""))).to_upper()) + var threshold := int(command.payload.get(&"threshold", command.payload.get("threshold", -1))) + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before retreat-policy update.") + var result := defense_service.set_retreat_policy(raid_id, policy, threshold) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_queue_defense_skill(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var action_id := StringName(command.payload.get(&"action_id", command.payload.get("action_id", ""))) + var actor_id := StringName(command.payload.get(&"actor_id", command.payload.get("actor_id", command.actor_id))) + var kind := StringName(String(command.payload.get(&"kind", command.payload.get("kind", ""))).to_upper()) + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Defense skill options must be a Dictionary.") + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before skill queueing.") + var id_before := id_generator.create_snapshot() + if action_id.is_empty(): + action_id = id_generator.next_id(&"defense_skill_action") + var result := defense_service.queue_active_skill( + raid_id, action_id, actor_id, kind, (raw_options as Dictionary).duplicate(true) + ) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_resolve_defense_round(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var resolution_id := StringName(command.payload.get(&"resolution_id", command.payload.get("resolution_id", ""))) + var result := _resolve_defense_round_internal(raid_id, resolution_id, _defense_operation_minute()) + result.command_id = command.command_id + result.target_id = raid_id + return result + + +## Both the explicit command and ordinary clock progression use the same +## transaction, generated-ID namespace and cross-domain callback boundaries. +func _resolve_defense_round_internal( + raid_id: StringName, + resolution_id: StringName, + absolute_minute: int +) -> CommandResult: + _prepare_defense_round_attempts(absolute_minute) + var already_attempted := _defense_round_attempted_raids.has(raid_id) + _defense_round_attempted_raids[raid_id] = true + var previous_command_minute := _active_command_minute + _active_command_minute = absolute_minute + if not _validate_live_defense_crosslinks(): + _active_command_minute = previous_command_minute + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, 0, "Defense cross-domain links are invalid before round resolution.") + var id_before := id_generator.create_snapshot() + if resolution_id.is_empty(): + # Existing explicit IDs can occupy this namespace without advancing the + # allocator. Skip those IDs instead of replaying history as a new attack. + while id_generator.get_counter(&"defense_round_resolution") < StableIdGenerator.MAX_COUNTER: + resolution_id = id_generator.next_id(&"defense_round_resolution") + if not defense_service.has_resolution(raid_id, resolution_id): + break + if resolution_id.is_empty() or defense_service.has_resolution(raid_id, resolution_id): + id_generator.restore_snapshot(id_before) + _active_command_minute = previous_command_minute + var exhausted := CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, 0, "Defense round ID namespace is exhausted.") + exhausted.target_id = raid_id + return exhausted + var result := defense_service.resolve_next_round(raid_id, resolution_id, absolute_minute) + # Reading an old canonical result is not a new round attempt. Restore only + # the guard introduced by this replay; an earlier real failure in this same + # minute must still prevent automatic progression from hiding that failure. + if result.is_replay and not already_attempted: + _defense_round_attempted_raids.erase(raid_id) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + _active_command_minute = previous_command_minute + result.target_id = raid_id + return result + + +func _prepare_defense_round_attempts(absolute_minute: int) -> void: + if _defense_round_attempt_minute == absolute_minute: + return + _defense_round_attempt_minute = absolute_minute + _defense_round_attempted_raids.clear() + _defense_automatic_failed_minute = -1 + + +func _reset_defense_round_attempts() -> void: + _defense_round_attempt_minute = -1 + _defense_round_attempted_raids.clear() + _defense_automatic_failed_minute = -1 + + +func _execute_begin_next_defense_wave(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before the next Wave.") + var result := defense_service.begin_next_wave(raid_id, _defense_operation_minute()) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_retreat_defenders(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var resolution_id := StringName(command.payload.get(&"resolution_id", command.payload.get("resolution_id", ""))) + var reason := StringName(command.payload.get(&"reason", command.payload.get("reason", &"PLAYER_RETREAT"))) + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before defender retreat.") + var id_before := id_generator.create_snapshot() + if resolution_id.is_empty(): + resolution_id = id_generator.next_id(&"defense_retreat_resolution") + var result := defense_service.retreat_defenders(raid_id, resolution_id, _defense_operation_minute(), reason) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_cancel_defense_raid(command: SimulationCommand) -> CommandResult: + var raid_id := StringName(command.payload.get(&"raid_id", command.payload.get("raid_id", command.target_id))) + var resolution_id := StringName(command.payload.get(&"resolution_id", command.payload.get("resolution_id", ""))) + var reason := StringName(command.payload.get(&"reason", command.payload.get("reason", &"CANCELLED"))) + if not _validate_live_defense_crosslinks(): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "Defense cross-domain links are invalid before Raid cancellation.") + var id_before := id_generator.create_snapshot() + if resolution_id.is_empty(): + resolution_id = id_generator.next_id(&"defense_cancel_resolution") + var result := defense_service.cancel_raid(raid_id, _defense_operation_minute(), reason, resolution_id) + if not result.is_success(): + id_generator.restore_snapshot(id_before) + result.command_id = command.command_id + result.target_id = raid_id + return result + +func _execute_create_service_request(command: SimulationCommand) -> CommandResult: + var facility_id := StringName(command.payload.get(&"facility_id", command.payload.get("facility_id", ""))) + var instance := facility_service.get_instance(facility_id) + if instance == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Facility was not found.") + var defense_owner: StringName = _defense_lock_owner(facility_id, &"ASSET") + if not defense_owner.is_empty(): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "A Facility assigned to a non-terminal Defense Raid cannot accept service requests.", + {&"raid_id": defense_owner} + ) + var guest_ids := _name_array(command.payload.get(&"guest_ids", command.payload.get("guest_ids", []))) + if guest_ids.is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "At least one guest id is required.") + for guest_id: StringName in guest_ids: + if not economy_service.has_account(_guest_wallet_account(guest_id)): + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Every guest needs a registered wallet.") + var raw_options: Variant = command.payload.get(&"options", command.payload.get("options", {})) + if not raw_options is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "Service request options must be a Dictionary.") + var options: Dictionary = raw_options.duplicate(true) + var quoted_price := maxi( + int(options.get(&"quoted_price", options.get("quoted_price", get_facility_business_price(instance)))), + 0 + ) + # Freeze the same price used by candidate selection and the business panel. + options[&"quoted_price"] = quoted_price + if not instance.operator_open or not instance.is_within_opening_hours(_runtime_event_minute()): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "This facility is closed to new service requests.", {&"reason": &"FACILITY_CLOSED"}) + if instance.requires_operating_kitchen() and not bool(facility_service.get_required_kitchen_report(facility_id).get(&"operating", false)): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "This dining facility requires an operating BACK kitchen.", {&"reason": &"FACILITY_CLOSED", &"dependency_reason": facility_service.get_required_kitchen_report(facility_id).get(&"reason", &"")}) + var payer_account := _guest_wallet_account(guest_ids[0]) + var committed_price := _outstanding_service_commitment(guest_ids[0]) + if not economy_service.account_allows_negative(payer_account) \ + and economy_service.get_balance(payer_account) < committed_price + quoted_price: + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "The guest cannot fund this service together with existing commitments.", + { + &"available_gold": economy_service.get_balance(payer_account), + &"committed_gold": committed_price, + &"quoted_price": quoted_price, + } + ) + + var inventory_before := inventory_service.create_snapshot() + var facility_before := facility_service.create_snapshot() + var guest_before := guest_service.create_snapshot() + var events_before := domain_events.create_snapshot() + var id_before := id_generator.create_snapshot() + var request_id := StringName(command.payload.get(&"request_id", command.payload.get("request_id", ""))) + if request_id.is_empty(): + request_id = id_generator.next_id(&"service_request") + var definition := definition_registry.get_facility(instance.definition_id) + if definition == null: + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Facility definition was not found.") + var reservation_ids: Array[StringName] = [] + for item_id: StringName in _sorted_name_keys(definition.inventory_inputs): + var reserve_result := inventory_service.reserve_item( + instance.local_inventory_id, + item_id, + int(definition.inventory_inputs[item_id]), + request_id, + &"facility_service", + _runtime_event_minute(), + _runtime_event_minute() + 240, + StringName("service.reserve.%s.%s" % [request_id, item_id]) + ) + if not bool(reserve_result.get(&"ok", false)): + inventory_service.restore_snapshot(inventory_before) + id_generator.restore_snapshot(id_before) + return _command_result_from_dictionary(command.command_id, reserve_result, "Facility input could not be reserved.") + for reservation_id: StringName in reserve_result.get(&"reservation_ids", []): + reservation_ids.append(reservation_id) + options[&"reserved_inventory_ids"] = reservation_ids + var request := facility_service.create_request( + request_id, + facility_id, + guest_ids, + StringName(command.payload.get(&"service_type", command.payload.get("service_type", "default"))), + _runtime_event_minute(), + options + ) + var enqueue_result: CommandResult + var runtime_guests: Array[StringName] = [] + for guest_id: StringName in guest_ids: + if guest_service.has_guest(guest_id): + runtime_guests.append(guest_id) + if runtime_guests.is_empty(): + enqueue_result = facility_service.enqueue_request(request, _runtime_event_minute(), not (_operations_enabled and _active_command_minute == _clock.absolute_minute + 1)) + else: + var first_guest := runtime_guests[0] + var queue_result := guest_service.enter_queue( + first_guest, + facility_id, + request_id, + _runtime_event_minute(), + int(options.get(&"initial_patience", options.get("initial_patience", -1))), + func(_guest_id: StringName, _facility_id: StringName, _request_id: StringName) -> CommandResult: + return facility_service.enqueue_request(request, _runtime_event_minute(), not (_operations_enabled and _active_command_minute == _clock.absolute_minute + 1)) + ) + if bool(queue_result.get(&"ok", false)): + for guest_index in range(1, runtime_guests.size()): + var joined := guest_service.enter_queue( + runtime_guests[guest_index], facility_id, request_id, _runtime_event_minute(), + int(options.get(&"initial_patience", options.get("initial_patience", -1))) + ) + if not bool(joined.get(&"ok", false)): + queue_result = joined + break + enqueue_result = CommandResult.succeeded(0, { + &"expected_wait": request.expected_wait, + }) if bool(queue_result.get(&"ok", false)) else CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, 0, + String(queue_result.get(&"message", "Guest could not enter the facility queue.")), + queue_result + ) + if not enqueue_result.is_success(): + inventory_service.restore_snapshot(inventory_before) + facility_service.restore_snapshot(facility_before) + guest_service.restore_snapshot(guest_before) + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(id_before) + enqueue_result.command_id = command.command_id + return enqueue_result + return CommandResult.succeeded(command.command_id, { + &"request_id": request_id, + &"reservation_ids": reservation_ids, + &"expected_wait": enqueue_result.details.get(&"expected_wait", 0), + }) + +func _execute_set_facility_conditions(command: SimulationCommand) -> CommandResult: + var facility_id := StringName(command.payload.get(&"facility_id", command.payload.get("facility_id", ""))) + var conditions: Variant = command.payload.get(&"conditions", command.payload.get("conditions", null)) + if not conditions is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "conditions must be a Dictionary.") + var defense_owner: StringName = _defense_lock_owner(facility_id, &"ASSET") + if not defense_owner.is_empty() and (conditions.has(&"durability") or conditions.has("durability")): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Defense-owned Facility durability can only change through its Raid.", + {&"raid_id": defense_owner} + ) + var result := facility_service.set_operational_status(facility_id, conditions, _runtime_event_minute()) + result.command_id = command.command_id + return result + +func _execute_set_facility_policy(command: SimulationCommand) -> CommandResult: + var facility_id := StringName(command.payload.get(&"facility_id", command.payload.get("facility_id", ""))) + var patch: Variant = command.payload.get(&"patch", command.payload.get("patch", null)) + if not patch is Dictionary: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "patch must be a Dictionary.") + var effective_at := int(command.payload.get(&"effective_at", command.payload.get("effective_at", -1))) + var result := facility_service.set_policy(facility_id, patch, effective_at) + result.command_id = command.command_id + return result + +func _execute_leave_facility_queue(command: SimulationCommand) -> CommandResult: + var facility_id := StringName(command.payload.get(&"facility_id", command.payload.get("facility_id", ""))) + var request_id := StringName(command.payload.get(&"request_id", command.payload.get("request_id", ""))) + var request := facility_service.get_request(request_id) + if request == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Queued service request was not found.") + var inventory_before := inventory_service.create_snapshot() + var facility_before := facility_service.create_snapshot() + var guest_before := guest_service.create_snapshot() + var events_before := domain_events.create_snapshot() + var id_before := id_generator.create_snapshot() + var external_leave := func(_guest_id: StringName = &"", _facility_id: StringName = &"", _request_id: StringName = &"") -> Dictionary: + for reservation_id: StringName in request.reserved_inventory_ids: + var released := inventory_service.release_reservation( + reservation_id, + StringName("service.release.%s.%s" % [request_id, reservation_id]), + _runtime_event_minute() + ) + if not bool(released.get(&"ok", false)): + return released + var leave_result := facility_service.leave_queue(facility_id, request_id) + return {&"ok": leave_result.is_success(), &"message": leave_result.message} + var runtime_guests: Array[StringName] = [] + for guest_id: StringName in request.guest_ids: + if guest_service.has_guest(guest_id): + runtime_guests.append(guest_id) + var successful := true + var failure_message := "Facility queue removal failed." + if runtime_guests.is_empty(): + var external_result: Dictionary = external_leave.call() + successful = bool(external_result.get(&"ok", false)) + failure_message = String(external_result.get(&"message", failure_message)) + else: + for guest_index in range(runtime_guests.size()): + var queued_guest := guest_service.get_guest(runtime_guests[guest_index]) + var abandon := guest_service.tick_queue_patience( + queued_guest.guest_id, + _runtime_event_minute(), + -queued_guest.patience_remaining, + external_leave if guest_index == 0 else Callable() + ) + if not bool(abandon.get(&"ok", false)): + successful = false + failure_message = String(abandon.get(&"message", failure_message)) + break + if not successful: + inventory_service.restore_snapshot(inventory_before) + facility_service.restore_snapshot(facility_before) + guest_service.restore_snapshot(guest_before) + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(id_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, command.command_id, failure_message) + return CommandResult.succeeded(command.command_id, {&"request_id": request_id, &"reason": &"GUEST_LEFT"}) + +func _execute_build_facility(command: SimulationCommand) -> CommandResult: + var operations_gate := _operations_construction_investment_gate(command.command_id) + if operations_gate != null: + return operations_gate + var definition_id := StringName(command.payload.get(&"definition_id", command.payload.get("definition_id", ""))) + var definition := definition_registry.get_facility(definition_id) + if definition == null: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Facility definition was not found.") + if _facility_definition_is_unsupported_vertical_proxy(definition): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Vertical infrastructure topology is not supported.", + { + &"reason": FacilityInfrastructureProjector.REASON_UNSUPPORTED_VERTICAL_TOPOLOGY, + &"definition_id": definition_id, + &"unchanged": true, + } + ) + var origin_value: Variant = _parse_world_cell(command.payload.get(&"origin", command.payload.get("origin", null))) + if origin_value == null: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "origin must be Vector3i or [x, y, layer].") + var origin: Vector3i = origin_value + if definition.id in [&"guest_stairs", &"service_stairs"] and not path_service.has_cell(origin + Vector3i(0, -1, 0)): + return _staff_assignment_failure(command.command_id, &"STAIR_LANDING_MISSING", "先に階段の一つ下の階に通路を作ってください。") + for shaft: Dictionary in elevators.get_report()[&"shafts"]: + if _elevator_touches_module(shaft, definition, origin) and _elevator_shaft_busy(shaft): + return _staff_assignment_failure(command.command_id, &"ELEVATOR_BUSY", "Wait until the shaft is idle before extending it.") + var rotation := int(command.payload.get(&"rotation", command.payload.get("rotation", 0))) + if rotation not in definition.allowed_rotations: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "The selected rotation is not allowed.") + var result := construction_service.start_construction( + definition, + origin, + rotation, + definition.build_minutes, + _runtime_event_minute() + ) + result.command_id = command.command_id + return result + +func _execute_cancel_construction(command: SimulationCommand) -> CommandResult: + var job_id := StringName(command.payload.get(&"job_id", command.payload.get("job_id", ""))) + if job_id.is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "job_id is required.") + var result := construction_service.cancel_job(job_id, _runtime_event_minute()) + result.command_id = command.command_id + return result + + +func _execute_start_excavation(command: SimulationCommand) -> CommandResult: + var operations_gate := _operations_construction_investment_gate(command.command_id) + if operations_gate != null: + return operations_gate + if progression_service.current_rank < 2: + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "Excavation requires World Tree Rank 2.", + {&"required_rank": 2, &"current_rank": progression_service.current_rank} + ) + var parsed_cell: Variant = _parse_world_cell( + command.payload.get(&"cell", command.payload.get("cell", null)) + ) + if parsed_cell == null: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "cell must be Vector3i or [x, y, layer]." + ) + var result := excavation_service.start_excavation(parsed_cell, _runtime_event_minute()) + result.command_id = command.command_id + return result + + +func _execute_pause_excavation(command: SimulationCommand) -> CommandResult: + var job_id := StringName(command.payload.get(&"job_id", command.payload.get("job_id", ""))) + if job_id.is_empty(): + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "job_id is required." + ) + var result := excavation_service.pause_job(job_id) + result.command_id = command.command_id + return result + + +func _execute_resume_excavation(command: SimulationCommand) -> CommandResult: + var job_id := StringName(command.payload.get(&"job_id", command.payload.get("job_id", ""))) + if job_id.is_empty(): + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "job_id is required." + ) + var result := excavation_service.resume_job(job_id) + result.command_id = command.command_id + return result + +func _execute_demolish_facility(command: SimulationCommand) -> CommandResult: + var instance_id := StringName(command.payload.get(&"instance_id", command.payload.get("instance_id", ""))) + if instance_id.is_empty(): + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "instance_id is required.") + for shaft: Dictionary in elevators.get_report()[&"shafts"]: + if instance_id in shaft[&"module_ids"] and _elevator_shaft_busy(shaft): + return _staff_assignment_failure(command.command_id, &"ELEVATOR_BUSY", "Wait until passengers have left before demolition.") + var lost_landing_cells := _demolition_lost_route_cells(instance_id) + for actor: Dictionary in path_service.create_snapshot()[&"actor_cells"]: + if actor[&"cell"] in lost_landing_cells: + return _staff_assignment_failure(command.command_id, &"FACILITY_OCCUPIED", "この通路・階段に人がいます。移動し終わってから撤去してください。") + var stair_dependents := _stair_demolition_dependents(instance_id) + if not stair_dependents.is_empty(): + return _staff_assignment_failure(command.command_id, &"STAIR_LANDING_IN_USE", "この通路につながる上の階段を先に撤去するか、建設を中止してください。") + var defense_owner: StringName = _defense_lock_owner(instance_id, &"ASSET") + if not defense_owner.is_empty(): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "A Facility assigned to a non-terminal Defense Raid cannot be demolished.", + {&"raid_id": defense_owner} + ) + var supply_guard: Dictionary = supply_management.validate_demolition(self, instance_id) + if not bool(supply_guard.get(&"ok", false)): + return _staff_assignment_failure(command.command_id, StringName(supply_guard.get(&"reason", &"SUPPLY_IN_USE")), "Facility still owns supply stock, a production plan, or an active delivery.") + for assignment: Dictionary in staff_service.get_work_assignments(): + if StringName(assignment[&"facility_id"]) == instance_id: + return _staff_assignment_failure(command.command_id, &"STAFF_ASSIGNED", "Unassign scheduled Staff before demolishing this facility.") + var operational_instance := facility_service.get_instance(instance_id) + if operational_instance != null \ + and (not operational_instance.queue_entries.is_empty() or not operational_instance.active_services.is_empty()): + return CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, "A busy facility cannot be demolished.") + if facility_infrastructure_projector.has_projection(instance_id): + var boundary_before := _capture_infrastructure_demolition_state() + if boundary_before.is_empty(): + return CommandResult.failed( + CommandResult.Code.TRANSACTION_CLOSED, + command.command_id, + "Infrastructure demolition state could not be captured." + ) + var unprojected := facility_infrastructure_projector.unproject_facility( + StringName("runtime.demolish:%s" % instance_id), + instance_id + ) + if not unprojected.is_success(): + if not _infrastructure_demolition_state_matches(boundary_before): + _restore_infrastructure_demolition_state(boundary_before) + var rejection_details := unprojected.details.duplicate(true) + rejection_details[&"reason"] = &"INFRASTRUCTURE_UNPROJECT_FAILED" + rejection_details[&"instance_id"] = instance_id + return CommandResult.failed( + unprojected.code, + command.command_id, + unprojected.message, + rejection_details + ) + var demolished := construction_service.demolish_facility(instance_id) + demolished.command_id = command.command_id + var transport_ok := false + if demolished.is_success(): + transport_ok = bool(_synchronize_elevators(_runtime_event_minute()).get(&"ok", false)) and _prune_legacy_stairs_and_movement() + if not transport_ok or not demolished.is_success() \ + or not _validate_runtime_path_crosslinks(path_service, guest_service, staff_service, _movement_credits, _runtime_event_minute()) \ + or facility_infrastructure_projector.has_projection(instance_id) \ + or not construction_service.get_facility(instance_id).is_empty() \ + or not world_service.get_entity_cells(instance_id).is_empty() \ + or not _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ): + var rolled_back := _restore_infrastructure_demolition_state(boundary_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Infrastructure demolition failed and was rolled back.", + { + &"instance_id": instance_id, + &"rolled_back": rolled_back, + &"cause": demolished.to_dictionary(), + } + ) + return demolished + var result := construction_service.demolish_facility(instance_id) + result.command_id = command.command_id + if result.is_success(): + kitchen_production.remove_plan(instance_id) + auto_purchase_plans.remove_warehouse(instance_id) + return result + + +func _capture_infrastructure_demolition_state() -> Dictionary: + return { + &"game_state": _state.create_snapshot(), + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"world": world_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"construction": construction_service.create_snapshot(), + &"excavation": excavation_service.create_snapshot(), + &"spatial_subslots": spatial_subslot_service.create_snapshot(), + &"route_projection": route_subslot_path_adapter.create_snapshot(), + &"facility_infrastructure": facility_infrastructure_projector.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"mana": mana_network_service.create_snapshot(), + &"movement_credits": _movement_credits.duplicate(true), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + } + + +func _restore_infrastructure_demolition_state(snapshot: Dictionary) -> bool: + for key: StringName in [ + &"game_state", &"economy", &"facility_upkeep", &"upkeep_settlement", + &"world", &"path", &"elevators", &"legacy_stairs", &"construction", + &"excavation", &"spatial_subslots", &"route_projection", + &"facility_infrastructure", &"facilities", &"facility_cleanliness", &"mana", &"movement_credits", + &"domain_events", &"id_generator", + ]: + if not snapshot.get(key, null) is Dictionary: + return false + var restored: bool = bool(_state.restore_snapshot(snapshot[&"game_state"])) + restored = economy_service.restore_snapshot(snapshot[&"economy"]) and restored + restored = facility_upkeep.restore_snapshot(snapshot[&"facility_upkeep"]) and restored + restored = upkeep_settlement.restore_snapshot(snapshot[&"upkeep_settlement"], economy_service) and restored + restored = world_service.restore_snapshot(snapshot[&"world"]) and restored + restored = spatial_subslot_service.restore_snapshot(snapshot[&"spatial_subslots"]) and restored + var route_snapshot: Dictionary = snapshot[&"route_projection"] + var projected_walkable: Variant = route_snapshot.get(&"projected_walkable_cells", null) + if not projected_walkable is Array: + return false + restored = path_service.rebuild_graph(projected_walkable) and restored + restored = path_service.restore_snapshot(snapshot[&"path"]) and restored + restored = elevators.restore_snapshot(snapshot[&"elevators"]) and restored + restored = legacy_stairs.restore_snapshot(snapshot[&"legacy_stairs"]) and restored + restored = route_subslot_path_adapter.restore_snapshot(route_snapshot) and restored + restored = facility_infrastructure_projector.restore_snapshot( + snapshot[&"facility_infrastructure"] + ) and restored + restored = construction_service.restore_snapshot(snapshot[&"construction"]) and restored + restored = excavation_service.restore_snapshot(snapshot[&"excavation"]) and restored + restored = facility_service.restore_snapshot(snapshot[&"facilities"]) and restored + restored = facility_cleanliness.restore_snapshot(snapshot.get(&"facility_cleanliness", {})) and restored + restored = mana_network_service.restore_snapshot(snapshot[&"mana"]) and restored + _movement_credits = (snapshot[&"movement_credits"] as Dictionary).duplicate(true) + restored = domain_events.restore_snapshot(snapshot[&"domain_events"]) and restored + restored = id_generator.restore_snapshot(snapshot[&"id_generator"]) and restored + return restored and _infrastructure_demolition_state_matches(snapshot) \ + and _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ) + + +func _infrastructure_demolition_state_matches(snapshot: Dictionary) -> bool: + return _strict_variants_equal(_state.create_snapshot(), snapshot.get(&"game_state", {})) \ + and _strict_variants_equal(economy_service.create_snapshot(), snapshot.get(&"economy", {})) \ + and _strict_variants_equal(facility_upkeep.create_snapshot(), snapshot.get(&"facility_upkeep", {})) \ + and _strict_variants_equal(upkeep_settlement.create_snapshot(), snapshot.get(&"upkeep_settlement", {})) \ + and _strict_variants_equal(world_service.create_snapshot(), snapshot.get(&"world", {})) \ + and _strict_variants_equal(path_service.create_snapshot(), snapshot.get(&"path", {})) \ + and _strict_variants_equal(elevators.create_snapshot(), snapshot.get(&"elevators", {})) \ + and _strict_variants_equal(legacy_stairs.create_snapshot(), snapshot.get(&"legacy_stairs", {})) \ + and _strict_variants_equal(construction_service.create_snapshot(), snapshot.get(&"construction", {})) \ + and _strict_variants_equal(excavation_service.create_snapshot(), snapshot.get(&"excavation", {})) \ + and _strict_variants_equal(spatial_subslot_service.create_snapshot(), snapshot.get(&"spatial_subslots", {})) \ + and _strict_variants_equal(route_subslot_path_adapter.create_snapshot(), snapshot.get(&"route_projection", {})) \ + and _strict_variants_equal(facility_infrastructure_projector.create_snapshot(), snapshot.get(&"facility_infrastructure", {})) \ + and _strict_variants_equal(facility_service.create_snapshot(), snapshot.get(&"facilities", {})) \ + and _strict_variants_equal(facility_cleanliness.create_snapshot(), snapshot.get(&"facility_cleanliness", {})) \ + and _strict_variants_equal(mana_network_service.create_snapshot(), snapshot.get(&"mana", {})) \ + and _strict_variants_equal(_movement_credits, snapshot.get(&"movement_credits", {})) \ + and _strict_variants_equal(domain_events.create_snapshot(), snapshot.get(&"domain_events", {})) \ + and _strict_variants_equal(id_generator.create_snapshot(), snapshot.get(&"id_generator", {})) + +func _execute_set_world_tree_rank(command: SimulationCommand) -> CommandResult: + var operations_gate := _operations_construction_investment_gate(command.command_id) + if operations_gate != null: + return operations_gate + var rank := int(command.payload.get(&"rank", command.payload.get("rank", 0))) + var request_id := StringName(command.payload.get( + &"request_id", + command.payload.get("request_id", "rank_up_%d" % rank) + )) + var progression_before := progression_service.create_snapshot() + if not _sync_progression_live_metrics(): + progression_service.restore_snapshot(progression_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "Live progression facts could not be synchronized." + ) + var external_before := _capture_rank_external_state() + var result := progression_service.request_rank_up( + request_id, + rank, + func(_current_rank: int, _target_rank: int) -> Dictionary: + return {&"ok": true, &"snapshot": external_before.duplicate(true)}, + func(target_rank: int, expected_bounds: Dictionary) -> Dictionary: + return {&"ok": _apply_rank_external_state(target_rank, expected_bounds)}, + func(snapshot: Dictionary) -> Dictionary: + return {&"ok": _rollback_rank_external_state(snapshot)}, + ) + result.command_id = command.command_id + if not result.is_success(): + progression_service.restore_snapshot(progression_before) + return result + if result.is_replay: + # Progression replays are read-only. The live-fact synchronization above is + # deliberately rolled back so a resent command reproduces the first result + # without silently changing any metric. + progression_service.restore_snapshot(progression_before) + return result + var event := SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"WORLD_TREE_RANK_ADVANCED", + _runtime_event_minute(), + &"progression_service", + [StringName("world_tree_rank_%d" % rank)], + result.details.duplicate(true), + command.command_id + ) + if not _publish_domain_event(event): + _rollback_rank_external_state(external_before) + progression_service.restore_snapshot(progression_before) + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, + command.command_id, + "World Tree promotion event could not be published; the promotion was rolled back." + ) + return result + + +func _execute_update_progression_metrics(command: SimulationCommand) -> CommandResult: + var patch: Variant = command.payload.get(&"metrics", command.payload.get("metrics", null)) + if not patch is Dictionary: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "Progression metrics must be a Dictionary." + ) + if patch.has(&"guest_lifetime") or patch.has("guest_lifetime"): + var requested_value: Variant = patch.get( + &"guest_lifetime", patch.get("guest_lifetime", null) + ) + var guest_snapshot := guest_service.create_snapshot() + var records_value: Variant = guest_snapshot.get(&"persistent_records", null) + var derived: int = guest_service.guest_count() \ + + (records_value.size() if records_value is Array else -1) + if typeof(requested_value) != TYPE_INT or derived < 0 \ + or int(requested_value) != derived: + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + "guest_lifetime is an authoritative Guest aggregate fact." + ) + if not progression_service.update_metrics(patch): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + progression_service.last_error + ) + return CommandResult.succeeded(command.command_id, { + &"metrics": progression_service.metrics.duplicate(true), + }) + + +func _execute_complete_progression_quest(command: SimulationCommand) -> CommandResult: + var raw_quest_id: Variant = command.payload.get(&"quest_id", command.payload.get("quest_id", null)) + if typeof(raw_quest_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return CommandResult.failed( + CommandResult.Code.INVALID_PAYLOAD, + command.command_id, + "A progression quest id is required." + ) + var quest_id := StringName(raw_quest_id) + if not progression_service.complete_quest(quest_id): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + progression_service.last_error + ) + return CommandResult.succeeded(command.command_id, {&"quest_id": quest_id}) + + +func _execute_acknowledge_operations_pause(command: SimulationCommand) -> CommandResult: + var acknowledged := acknowledge_operations_pause() + if not bool(acknowledged.get(&"ok", false)): + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command.command_id, + String(acknowledged.get(&"message", "Operations acknowledgement failed.")), + acknowledged.get(&"details", {}) + ) + return CommandResult.succeeded(command.command_id, acknowledged) + + +func _operations_construction_investment_gate(command_id: int) -> CommandResult: + if not _operations_enabled or operations_coordinator == null: + return null + var gate := operations_coordinator.can_start_construction_or_investment() + if bool(gate.get(&"allowed", false)) and _operations_total_arrears() > 0: + gate = {&"allowed": false, &"reason": &"UNPAID_EXPENSES", &"arrears_total": _operations_total_arrears()} + if bool(gate.get(&"allowed", false)): + return null + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command_id, + "Operations currently block construction and investment.", + gate + ) + +func _advance_construction(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + var preflight := _preflight_proxy_completions(absolute_minute) + if not bool(preflight.get(&"ok", false)): + _latch_infrastructure_failure( + StringName(preflight.get(&"code", &"INFRASTRUCTURE_PREFLIGHT_FAILED")), + absolute_minute, + String(preflight.get(&"reason", "Infrastructure completion preflight failed.")), + preflight.get(&"details", {}) + ) + return + # The expensive composed rollback token is only needed when Construction can + # cross the completion boundary this minute. Idle ticks and ordinary progress + # retain ConstructionService's direct job_changed notification semantics. + if not _construction_completion_is_due_this_tick(): + var fast_results: Array[CommandResult] = construction_service.advance_one_minute( + absolute_minute + ) + for fast_result: CommandResult in fast_results: + if fast_result == null or not fast_result.is_success(): + _latch_infrastructure_failure( + &"CONSTRUCTION_ADVANCE_FAILED", + absolute_minute, + ( + fast_result.message + if fast_result != null else "Construction returned an invalid result." + ), + ( + fast_result.to_dictionary() + if fast_result != null else {} + ) + ) + return + excavation_service.advance_one_minute(absolute_minute) + if _infrastructure_failure_latched: + return + if not _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ): + _latch_infrastructure_failure( + &"INFRASTRUCTURE_POSTCONDITION_FAILED", + absolute_minute, + "Construction and Excavation ended the minute with invalid infrastructure cross-links." + ) + return + var boundary_before := _capture_infrastructure_demolition_state() + if boundary_before.is_empty(): + _latch_infrastructure_failure( + &"INFRASTRUCTURE_CAPTURE_FAILED", + absolute_minute, + "The Construction completion boundary could not be captured." + ) + return + var previous_facility_ids: Dictionary = {} + for instance: Dictionary in construction_service.get_facilities(): + previous_facility_ids[StringName(instance.get(&"instance_id", &""))] = true + + _construction_completion_transaction_active = true + _construction_queued_domain_events.clear() + var progress_results: Array[CommandResult] = construction_service.advance_one_minute( + absolute_minute, {}, true + ) + var apply_failure: Dictionary = {} + for progress_result: CommandResult in progress_results: + if progress_result == null or not progress_result.is_success(): + apply_failure = { + &"code": &"CONSTRUCTION_ADVANCE_FAILED", + &"reason": ( + progress_result.message + if progress_result != null else "Construction returned an invalid result." + ), + &"details": ( + progress_result.to_dictionary() + if progress_result != null else {} + ), + } + break + if apply_failure.is_empty(): + for instance: Dictionary in construction_service.get_facilities(): + var instance_id := StringName(instance.get(&"instance_id", &"")) + if previous_facility_ids.has(instance_id): + continue + var applied := _apply_completed_facility_internal(instance, absolute_minute) + if not bool(applied.get(&"ok", false)): + apply_failure = applied + break + if apply_failure.is_empty() and not _construction_completion_crosslinks_are_valid( + absolute_minute + ): + apply_failure = { + &"code": &"CONSTRUCTION_COMPLETION_CROSSLINK_FAILED", + &"reason": "Construction completion produced invalid Runtime cross-links.", + &"details": {}, + } + if not apply_failure.is_empty(): + _fail_construction_completion_boundary( + boundary_before, + StringName(apply_failure.get(&"code", &"CONSTRUCTION_COMPLETION_FAILED")), + absolute_minute, + String(apply_failure.get(&"reason", "Construction completion failed.")), + apply_failure.get(&"details", {}) + ) + return + + # DomainEventStream validates and commits the whole batch before notifying + # subscribers. Construction's own raw signals are released only after the + # authoritative Runtime state and event batch have both committed. + var queued_events: Array[SimulationDomainEvent] = [] + for event: SimulationDomainEvent in _construction_queued_domain_events: + queued_events.append(event.copy()) + _construction_completion_transaction_active = false + _construction_queued_domain_events.clear() + if not domain_events.publish_batch(queued_events): + _fail_construction_completion_boundary( + boundary_before, + &"CONSTRUCTION_EVENT_COMMIT_FAILED", + absolute_minute, + "Construction completion DomainEvents could not be committed." + ) + return + _construction_committing_notifications = true + var notifications_committed := construction_service.commit_deferred_notifications() + _construction_committing_notifications = false + if not notifications_committed: + # Service-created deferred rows are prevalidated by ConstructionService, + # so this branch represents an unrecoverable notification boundary fault. + _latch_infrastructure_failure( + &"CONSTRUCTION_NOTIFICATION_COMMIT_FAILED", + absolute_minute, + "Committed Construction state could not release its deferred notifications.", + {&"rolled_back": false} + ) + return + + # Construction is authoritative first. Excavation then advances to the same + # absolute minute, preventing an excavation completion signal from escaping + # when the Construction boundary must be rolled back. + excavation_service.advance_one_minute(absolute_minute) + if _infrastructure_failure_latched: + return + if not _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector + ): + _latch_infrastructure_failure( + &"INFRASTRUCTURE_POSTCONDITION_FAILED", + absolute_minute, + "Construction and Excavation ended the minute with invalid infrastructure cross-links." + ) + + +func _construction_completion_is_due_this_tick() -> bool: + for job: ConstructionJob in construction_service.get_jobs(): + if job == null or job.is_terminal(): + continue + if job.work_units_done + ConstructionJob.NORMAL_WORK_RATE \ + >= job.build_minutes * ConstructionJob.MAX_PROGRESS: + return true + return false + + +func _apply_completed_facility_internal(instance: Dictionary, absolute_minute: int) -> Dictionary: + var instance_id := StringName(instance.get(&"instance_id", &"")) + var definition_id := StringName(instance.get(&"definition_id", &"")) + var definition := definition_registry.get_facility(definition_id) + if instance_id.is_empty() or definition == null: + return { + &"ok": false, + &"code": &"INVALID_COMPLETED_FACILITY", + &"reason": "Construction produced an invalid completed Facility.", + &"details": {&"instance_id": instance_id, &"definition_id": definition_id}, + } + if _facility_definition_is_schema_proxy(definition): + if not _facility_definition_is_supported_infrastructure_proxy(definition): + return { + &"ok": false, + &"code": &"UNSUPPORTED_VERTICAL_TOPOLOGY", + &"reason": "An unsupported vertical proxy reached Construction completion.", + &"details": {&"instance_id": instance_id, &"definition_id": definition.id}, + } + if not facility_infrastructure_projector.has_projection(instance_id): + var projection_request_id := StringName( + "runtime.complete:%s" % String(instance.get(&"source_job_id", instance_id)) + ) + var projected := facility_infrastructure_projector.project_completed_facility( + projection_request_id, definition, instance + ) + if not projected.is_success(): + return { + &"ok": false, + &"code": &"FACILITY_INFRASTRUCTURE_PROJECTION_FAILED", + &"reason": projected.message, + &"details": projected.details.duplicate(true), + } + if not _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"FACILITY_INFRASTRUCTURE_PROJECTED", + absolute_minute, + &"facility_infrastructure_projector", + [instance_id], + projected.details.duplicate(true), + 0 + )): + return { + &"ok": false, + &"code": &"FACILITY_INFRASTRUCTURE_EVENT_FAILED", + &"reason": "The infrastructure projection event could not be staged.", + &"details": {&"instance_id": instance_id}, + } + else: + if not facility_service.has_instance(instance_id): + _register_facility_mana_consumer(instance) + _register_operational_facility(instance) + if not facility_service.has_instance(instance_id) \ + or not economy_service.has_account(_facility_revenue_account(instance_id)): + return { + &"ok": false, + &"code": &"OPERATIONAL_FACILITY_REGISTRATION_FAILED", + &"reason": "The completed Facility could not be registered operationally.", + &"details": {&"instance_id": instance_id}, + } + if definition.maintenance_mana > 0 \ + and mana_network_service.get_node(instance_id).is_empty(): + return { + &"ok": false, + &"code": &"FACILITY_MANA_REGISTRATION_FAILED", + &"reason": "The completed Facility Mana consumer could not be registered.", + &"details": {&"instance_id": instance_id}, + } + if definition.id in [&"guest_elevator", &"service_elevator"]: + _register_facility_mana_consumer(instance) + var transport := _synchronize_elevators(absolute_minute) + if not bool(transport.get(&"ok", false)): + return {&"ok": false, &"code": &"ELEVATOR_SYNC_FAILED", &"reason": elevators.last_error, &"details": transport} + if not _prune_legacy_stairs_and_movement(): + return {&"ok": false, &"code": &"LEGACY_STAIR_PRUNE_FAILED", &"reason": "Stair topology could not be updated."} + if not _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"FACILITY_COMPLETED", + absolute_minute, + &"construction_service", + [instance_id], + instance.duplicate(true), + 0 + )): + return { + &"ok": false, + &"code": &"FACILITY_COMPLETION_EVENT_FAILED", + &"reason": "The Facility completion event could not be staged.", + &"details": {&"instance_id": instance_id}, + } + return {&"ok": true} + + +func _construction_completion_crosslinks_are_valid(absolute_minute: int) -> bool: + return construction_service.current_minute == absolute_minute \ + and bool(mana_network_service.validate_invariants().get(&"valid", false)) \ + and _validate_construction_facility_crosslinks( + world_service, + construction_service, + facility_service, + facility_infrastructure_projector + ) \ + and _validate_infrastructure_crosslinks( + world_service, + path_service, + construction_service, + construction_resource_state, + excavation_service, + spatial_subslot_service, + route_subslot_path_adapter, + facility_infrastructure_projector, + false + ) + + +func _fail_construction_completion_boundary( + boundary_before: Dictionary, + code: StringName, + absolute_minute: int, + reason: String, + details: Dictionary = {} +) -> void: + _construction_completion_transaction_active = false + _construction_committing_notifications = false + _construction_queued_domain_events.clear() + var notifications_discarded := construction_service.discard_deferred_notifications() + var rolled_back := notifications_discarded \ + and _restore_infrastructure_demolition_state(boundary_before) + var failure_details := details.duplicate(true) + failure_details[&"notifications_discarded"] = notifications_discarded + failure_details[&"rolled_back"] = rolled_back + _latch_infrastructure_failure( + code if rolled_back else &"INFRASTRUCTURE_COMPLETION_ROLLBACK_FAILED", + absolute_minute, + reason, + failure_details + ) + + +func _preflight_proxy_completions(absolute_minute: int) -> Dictionary: + if construction_service == null or facility_infrastructure_projector == null \ + or route_subslot_path_adapter == null or spatial_subslot_service == null: + return { + &"ok": false, + &"code": &"INFRASTRUCTURE_UNAVAILABLE", + &"reason": "Infrastructure services are unavailable.", + } + var due_proxy_ids: Array[StringName] = [] + for job: ConstructionJob in construction_service.get_jobs(): + if job == null or job.is_terminal(): + continue + var definition := definition_registry.get_facility(job.definition_id) + if definition == null: + return { + &"ok": false, + &"code": &"MISSING_FACILITY_DEFINITION", + &"reason": "A Construction job references a missing Facility definition.", + &"details": {&"job_id": job.job_id, &"definition_id": job.definition_id}, + } + if not _facility_definition_is_supported_infrastructure_proxy(definition): + continue + if job.work_units_done + ConstructionJob.NORMAL_WORK_RATE \ + >= job.build_minutes * ConstructionJob.MAX_PROGRESS: + due_proxy_ids.append(job.job_id) + if due_proxy_ids.is_empty(): + return {&"ok": true} + if route_subslot_path_adapter.is_quarantined() \ + or route_subslot_path_adapter.is_projection_stale() \ + or facility_infrastructure_projector.is_quarantined() \ + or facility_infrastructure_projector.is_projection_stale() \ + or not bool(spatial_subslot_service.validate_invariants().get(&"ok", false)) \ + or not bool(route_subslot_path_adapter.validate_invariants().get(&"ok", false)) \ + or not bool(facility_infrastructure_projector.validate_invariants().get(&"ok", false)): + return { + &"ok": false, + &"code": &"INFRASTRUCTURE_DEPENDENCY_STALE", + &"reason": "Infrastructure dependencies are stale or quarantined.", + &"details": {&"job_ids": due_proxy_ids.duplicate()}, + } + var projector_snapshot := facility_infrastructure_projector.create_snapshot() + if int((projector_snapshot.get(&"projections", []) as Array).size()) \ + > FacilityInfrastructureProjector.MAX_PROJECTIONS - due_proxy_ids.size() \ + or int((projector_snapshot.get(&"processed_requests", []) as Array).size()) \ + > FacilityInfrastructureProjector.MAX_PROCESSED_REQUESTS - due_proxy_ids.size(): + return { + &"ok": false, + &"code": &"INFRASTRUCTURE_CAPACITY_EXHAUSTED", + &"reason": "Infrastructure projection capacity is exhausted.", + &"details": {&"job_ids": due_proxy_ids.duplicate()}, + } + return {&"ok": true} + + +func _latch_infrastructure_failure( + code: StringName, + absolute_minute: int, + reason: String, + details: Dictionary = {} +) -> void: + _infrastructure_failure_latched = true + _infrastructure_failure_report = { + &"code": code, + &"minute": absolute_minute, + &"reason": reason, + &"details": details.duplicate(true), + } + _operations_tick_blocked = true + if _clock != null: + _clock.set_paused(true) + + +func get_infrastructure_report() -> Dictionary: + return { + &"failure_latched": _infrastructure_failure_latched, + &"failure_report": _infrastructure_failure_report.duplicate(true), + &"excavation": ( + excavation_service.validate_invariants().duplicate(true) + if excavation_service != null else {&"ok": false} + ), + &"spatial_subslots": ( + spatial_subslot_service.validate_invariants().duplicate(true) + if spatial_subslot_service != null else {&"ok": false} + ), + &"route_projection": ( + route_subslot_path_adapter.get_projection_status().duplicate(true) + if route_subslot_path_adapter != null else {&"configured": false} + ), + &"facility_infrastructure": ( + facility_infrastructure_projector.get_status().duplicate(true) + if facility_infrastructure_projector != null else {&"configured": false} + ), + }.duplicate(true) + +func _advance_inventory_and_logistics(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + inventory_service.current_minute = absolute_minute + inventory_service.process_expired(absolute_minute, &"inventory.waste") + if int(_state.get_resource(&"mana")) > 0: + supply_management.advance_auto_purchases(self, absolute_minute) + supply_management.ensure_deliveries(self, absolute_minute) + supply_logistics.tick(absolute_minute) + +func _advance_facilities(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + facility_service.advance_one_minute(absolute_minute) + kitchen_production.advance_one_minute(absolute_minute) + +func _advance_guest_vitals(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + var minute_of_day := posmod(absolute_minute, 1_440) + guest_service.advance_one_minute(absolute_minute, { + &"default": { + &"unstimulated": true, + &"solo_guest": true, + &"is_night": minute_of_day < 360 or minute_of_day >= 1_080, + &"intimacy_day": 3, + &"intimacy_night": 7, + } + }) + +func _advance_guest_queues(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + _release_closed_business_queues(absolute_minute) + var guests_by_request: Dictionary = {} + for guest: GuestRuntime in guest_service.get_guests(): + if guest.state != GuestRuntime.State.QUEUING: + continue + if not guests_by_request.has(guest.queue_request_id): + guests_by_request[guest.queue_request_id] = [] + (guests_by_request[guest.queue_request_id] as Array).append(guest) + for request_id: StringName in _sorted_name_keys(guests_by_request): + var grouped_guests: Array = guests_by_request[request_id] + var queued_facility := facility_service.get_instance(grouped_guests[0].target_facility_id) + if queued_facility != null and (not queued_facility.operator_open or not queued_facility.is_within_opening_hours(absolute_minute)): + continue # A deferred closure must not spend patience while retrying. + var abandon_group := false + for guest: GuestRuntime in grouped_guests: + if guest.patience_remaining <= 1: + abandon_group = true + break + if not abandon_group: + for guest: GuestRuntime in grouped_guests: + guest_service.tick_queue_patience(guest.guest_id, absolute_minute) + continue + var inventory_before := inventory_service.create_snapshot() + var facility_before := facility_service.create_snapshot() + var guest_before := guest_service.create_snapshot() + var events_before := domain_events.create_snapshot() + var id_before := id_generator.create_snapshot() + var group_succeeded := true + for guest_index in range(grouped_guests.size()): + var guest: GuestRuntime = grouped_guests[guest_index] + var abandoned := guest_service.tick_queue_patience( + guest.guest_id, + absolute_minute, + -guest.patience_remaining, + Callable(self, "_leave_guest_queue_boundary") if guest_index == 0 else Callable() + ) + if not bool(abandoned.get(&"ok", false)): + group_succeeded = false + break + if not group_succeeded: + inventory_service.restore_snapshot(inventory_before) + facility_service.restore_snapshot(facility_before) + guest_service.restore_snapshot(guest_before) + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(id_before) + +func _advance_authority_incidents(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + if _operations_morning_already_processed(absolute_minute): + return + var advanced := authority_service.advance_time(absolute_minute) + if not advanced.is_success(): + _clock.set_paused(true) + _publish_actor_event(&"AUTHORITY_ADVANCE_FAILED", &"authority_service", [], { + &"message": advanced.message, + &"details": advanced.details.duplicate(true), + }) + return + if posmod(absolute_minute, 1_440) != AuthorityService.INSPECTION_EVALUATION_MINUTE: + return + var evaluated := authority_service.evaluate_inspection(absolute_minute) + if not evaluated.is_success(): + _clock.set_paused(true) + _publish_actor_event(&"AUTHORITY_INSPECTION_EVALUATION_FAILED", &"authority_service", [], { + &"message": evaluated.message, + &"details": evaluated.details.duplicate(true), + }) + return + if not evaluated.is_replay: + _publish_authority_evaluation(evaluated.details) + +func _advance_defense(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + _prepare_defense_round_attempts(absolute_minute) + # A deferred operations suffix must not reattempt the same failed automatic + # batch. Resume on a later game minute, after the player resumes the clock. + if _defense_automatic_failed_minute == absolute_minute: + return + var advanced := defense_service.advance_time(absolute_minute) + if not advanced.is_success(): + _defense_automatic_failed_minute = absolute_minute + _clock.set_paused(true) + _publish_actor_event(&"DEFENSE_ADVANCE_FAILED", &"defense_service", [], { + &"message": advanced.message, + &"details": advanced.details.duplicate(true), + }) + return + # One attempt per due raid, in stable raid-ID order. No catch-up while-loop, + # invented deadline, offline replay, PREPARING start or BETWEEN_WAVES advance. + for due: Dictionary in defense_service.get_due_rounds(absolute_minute): + if _defense_automatic_failed_minute == absolute_minute: + return + var raid_id := StringName(due[&"raid_id"]) + if _defense_round_attempted_raids.has(raid_id): + continue + var resolved := _resolve_defense_round_internal(raid_id, &"", absolute_minute) + if not resolved.is_success(): + _defense_automatic_failed_minute = absolute_minute + _clock.set_paused(true) + _publish_actor_event(&"DEFENSE_AUTOMATIC_ROUND_FAILED", &"defense_service", [raid_id], { + &"round_number": due[&"round_number"], + &"earliest_minute": due[&"earliest_minute"], + &"message": resolved.message, + &"details": resolved.details.duplicate(true), + }) + return + + +func _advance_relationship_events(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + if _operations_morning_already_processed(absolute_minute): + return + event_service.process_expired(absolute_minute) + event_service.audit_actor_availability(absolute_minute) + _enqueue_pending_relationship_candidates() + if event_service.get_foreground_instance() == null: + var started := event_service.start_next_event( + absolute_minute, + _build_event_context(absolute_minute) + ) + if started.is_success() and bool(started.details.get(&"waiting_for_choice", false)): + _clock.set_paused(true) + if event_service.pause_requested: + _clock.set_paused(true) + + +func _operations_morning_already_processed(absolute_minute: int) -> bool: + if not _operations_enabled or operations_coordinator == null \ + or posmod(absolute_minute, SimulationKernel.MINUTES_PER_DAY) \ + != OPERATIONS_START_MINUTE: + return false + var day := absolute_minute / SimulationKernel.MINUTES_PER_DAY + 1 + var report := operations_coordinator.get_morning_report(day) + return not report.is_empty() and int(report.get(&"minute", -1)) == absolute_minute + +func _enqueue_pending_relationship_candidates() -> void: + for candidate: Dictionary in relationship_service.get_threshold_candidates(): + _on_relationship_threshold_candidate(candidate) + +func _build_event_context(absolute_minute: int) -> Dictionary: + return { + &"absolute_minute": absolute_minute, + &"day": absolute_minute / 1_440 + 1, + &"minute_of_day": posmod(absolute_minute, 1_440), + &"player": { + &"gold": economy_service.get_balance(PLAYER_CASH_ACCOUNT), + &"world_tree_rank": int(_state.world_tree_rank), + }, + } + +func _advance_staff_ai(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + _prune_expired_staff_elevator_waits(absolute_minute) + _advance_elevators(absolute_minute) + _advance_staff_rescue(absolute_minute) + staff_service.advance_one_minute(absolute_minute) + _prune_expired_staff_elevator_waits(absolute_minute) + staff_commute.tick(absolute_minute) + _sync_facility_staffing(absolute_minute) + cleaning_bridge.tick(absolute_minute) + for task: StaffTask in staff_service.get_tasks(): + if task.state == StaffTask.State.RESERVED: + if task.state_changed_at < absolute_minute: + task.begin_moving(task.state_changed_at) + elif task.state == StaffTask.State.WORKING and task.task_type == CleaningBridge.TASK_TYPE: + # Only cleaning is deferred from StaffService to these attendance and + # dependency checks. Other tasks already progressed once this minute. + if task.state_changed_at >= absolute_minute or not cleaning_bridge.task_can_work(task, staff_service.get_staff(task.assigned_staff_id)): + continue + var work_units := CleaningBridge.work_units_per_minute(staff_service.get_staff(task.assigned_staff_id)) + staff_service.progress_task(task.task_id, work_units, absolute_minute) + for staff: StaffRuntime in staff_service.get_staff_members(): + if absolute_minute % 30 != 0: + continue + if staff.state == StaffRuntime.State.WORKING or (staff.state == StaffRuntime.State.AVAILABLE and staff_commute.is_present(staff, facility_service.get_instance(staff.assigned_facility_id))): + staff.add_fatigue(1) + if _operations_enabled: + staff.health = maxi(staff.health - 1, 0) + elif staff.state == StaffRuntime.State.OFF_DUTY: + var resting := get_staff_rest_report(staff.staff_id) + if not _operations_enabled or resting.get(&"resting", false): + staff.add_fatigue(-1) + if _operations_enabled and staff.health > 0: + staff.health = mini(staff.health + 1, 100) + _advance_staff_rescue(absolute_minute) + _sync_facility_staffing(absolute_minute) + _advance_guest_ai_decisions(absolute_minute) + +## Record the actual completed choice, not a fresh prediction made by the UI. +func _decide_guest_with_log(guest_id: StringName, candidates: Array, minute: int, context: Dictionary) -> Dictionary: + var observation := guest_service.get_observation(guest_id) + var result: Dictionary + if get_script().resource_path == "res://autoload/simulation_runtime.gd" and guest_service.get_script().resource_path == "res://scripts/guest/guest_service.gd" and ClassDB.class_exists(&"TheTreeNumericCore"): + var core = ClassDB.instantiate(&"TheTreeNumericCore") + if core != null and core.has_method(&"guest_candidate_batch"): + result = guest_service.decide_with_native_candidates(core, guest_id, candidates, minute, context) + else: + result = guest_service.decide(guest_id, candidates, minute, context) + else: + result = guest_service.decide(guest_id, candidates, minute, context) + if not bool(result.get(&"ok", false)): + return result + var candidate: Dictionary = result.get(&"candidate", {}) + var rejections := guest_service.get_last_candidate_rejections(guest_id) + var reason_counts: Dictionary = {} + for rejection: Dictionary in rejections: + var reason := String(rejection.get(&"reason", "")) + reason_counts[reason] = int(reason_counts.get(reason, 0)) + 1 + var payload := { + &"rejection_counts": reason_counts, + &"rejection_examples": rejections.slice(0, 8), + &"rejection_count": rejections.size(), + &"action": result[&"action"], + &"needs": observation.get(&"needs", {}).duplicate(true), + &"primary_needs": observation.get(&"primary_needs", []).duplicate(), + &"facility_id": candidate.get(&"facility_id", &""), + &"need_priority": candidate.get(&"need_priority", 0), + &"utility": candidate.get(&"utility", 0), + &"travel_minutes": candidate.get(&"travel_minutes", 0), + &"wait_minutes": candidate.get(&"utility_terms", {}).get(&"wait_minutes", 0), + &"estimated_total_gold": maxi(int(candidate.get(&"estimated_total_gold", candidate.get(&"price_gold", candidate.get(&"quoted_price", 0)))), 0), + } + _publish_actor_event(&"GUEST_DECISION_RECORDED", &"guest_service", [guest_id], payload) + return result + + +func get_guest_decision_record(guest_id: StringName) -> Dictionary: + var events := domain_events.recent_events() + for index in range(events.size() - 1, -1, -1): + var event: SimulationDomainEvent = events[index] + if event.event_type == &"GUEST_DECISION_RECORDED" and guest_id in event.entity_ids: + var report := event.payload.duplicate(true) + report[&"absolute_minute"] = event.absolute_minute + return report + return {} + + +func _advance_guest_ai_decisions(absolute_minute: int) -> void: + for guest: GuestRuntime in guest_service.get_guests(): + match guest.state: + GuestRuntime.State.SPAWNING: + guest_service.transition_guest(guest.guest_id, GuestRuntime.State.ENTERING, absolute_minute, &"ENTRY_STARTED") + GuestRuntime.State.ENTERING: + guest_service.transition_guest(guest.guest_id, GuestRuntime.State.DECIDING, absolute_minute, &"ENTRY_COMPLETED") + GuestRuntime.State.DECIDING: + if guest.planned_exit_at <= absolute_minute: + guest_service.begin_leaving(guest.guest_id, absolute_minute, &"PLANNED_EXIT") + continue + guest.wallet_gold = economy_service.get_balance(_guest_wallet_account(guest.guest_id)) + _decide_guest_with_log( + guest.guest_id, + _project_guest_candidates(guest.guest_id), + absolute_minute, + {&"absolute_minute": absolute_minute} + ) + GuestRuntime.State.MOVING: + pass + GuestRuntime.State.REPLANNING, GuestRuntime.State.ABANDONING, GuestRuntime.State.INTERRUPTED: + guest_service.transition_guest(guest.guest_id, GuestRuntime.State.DECIDING, absolute_minute, &"REPLAN_AFTER_INTERRUPTION") + GuestRuntime.State.LEAVING: + if guest.state_entered_at < absolute_minute: + guest_service.despawn_guest(guest.guest_id, absolute_minute) + _advance_runtime_path_traffic(absolute_minute) + + +func _advance_runtime_path_traffic(absolute_minute: int) -> void: + var actors: Array[Dictionary] = [] + for guest: GuestRuntime in guest_service.get_guests(): + actors.append({ + &"actor_id": _guest_path_actor_id(guest.guest_id), + &"kind": &"guest", + &"entity_id": guest.guest_id, + }) + for staff: StaffRuntime in staff_service.get_staff_members(): + actors.append({ + &"actor_id": _staff_path_actor_id(staff.staff_id), + &"kind": &"staff", + &"entity_id": staff.staff_id, + }) + actors.sort_custom(func(left: Dictionary, right: Dictionary) -> bool: + return String(left[&"actor_id"]) < String(right[&"actor_id"]) + ) + for entry: Dictionary in actors: + var actor_id: StringName = entry[&"actor_id"] + if not elevators.get_actor_trip(actor_id).is_empty(): + _record_expected_actor_wait(actor_id, path_service.get_actor_projected_cell(actor_id), absolute_minute) + continue + var kind: StringName = entry[&"kind"] + var entity_id: StringName = entry[&"entity_id"] + if kind == &"guest": + var guest := guest_service.get_guest(entity_id) + if guest == null: + continue + if not _path_projection_matches(actor_id, guest.current_cell): + _report_path_integration_failure(actor_id, entity_id, kind, guest.current_cell) + continue + if guest.state == GuestRuntime.State.MOVING \ + and guest.state_entered_at < absolute_minute: + _advance_guest_path_travel(guest, actor_id, absolute_minute) + else: + _record_expected_actor_wait(actor_id, guest.current_cell, absolute_minute) + continue + var staff := staff_service.get_staff(entity_id) + if staff == null: + continue + if not _path_projection_matches(actor_id, staff.current_cell): + _report_path_integration_failure(actor_id, entity_id, kind, staff.current_cell) + continue + if staff.state == StaffRuntime.State.COMMUTING and staff_service.requires_attendance(staff.staff_id): + # The commute driver already consumed this tick, including fractional + # walking credit under congestion. Do not reset it as an idle task. + continue + if _operations_enabled and staff.state == StaffRuntime.State.OFF_DUTY and staff.current_task_id.is_empty(): + var rest := get_staff_rest_report(staff.staff_id) + if rest.get(&"reachable", false): + advance_staff_commute(staff.staff_id, rest[&"cell"], absolute_minute) + else: + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + continue + var task := staff_service.get_task(staff.current_task_id) + if task != null and task.state == StaffTask.State.MOVING \ + and task.assigned_staff_id == staff.staff_id \ + and supply_logistics.can_move_task(task.task_id): + _advance_staff_task_travel(task, actor_id, absolute_minute) + else: + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + + +func _path_projection_matches(actor_id: StringName, cell: Vector3i) -> bool: + return path_service.has_actor_projection(actor_id) \ + and path_service.get_actor_projected_cell(actor_id) == cell \ + and _movement_credits.has(actor_id) + + +func _report_path_integration_failure( + actor_id: StringName, + entity_id: StringName, + kind: StringName, + cell: Vector3i +) -> void: + _clock.set_paused(true) + _publish_actor_event(&"PATH_ACTOR_CROSSLINK_FAILED", &"simulation_runtime", [actor_id, entity_id], { + &"actor_kind": kind, + &"actor_cell": cell, + &"projected_cell": path_service.get_actor_projected_cell(actor_id), + &"has_projection": path_service.has_actor_projection(actor_id), + &"has_movement_credit": _movement_credits.has(actor_id), + }) + + +func _record_expected_actor_wait( + actor_id: StringName, + cell: Vector3i, + absolute_minute: int +) -> void: + # Intentional queue, service, decision, and idle waits are valid progress. Reset + # the stuck baseline so a later movement does not inherit intentional waiting. + path_service.clear_actor_progress(actor_id) + var recorded := path_service.record_actor_progress(actor_id, cell, absolute_minute) + if not bool(recorded.get(&"ok", false)): + _report_path_integration_failure(actor_id, actor_id, &"unknown", cell) + return + _movement_credits[actor_id] = {&"credit": 0, &"updated_at": absolute_minute} + + +func _record_blocked_actor_wait( + actor_id: StringName, + entity_id: StringName, + kind: StringName, + cell: Vector3i, + absolute_minute: int, + credit: int +) -> void: + var recorded := path_service.record_actor_progress(actor_id, cell, absolute_minute) + if not bool(recorded.get(&"ok", false)): + _report_path_integration_failure(actor_id, entity_id, kind, cell) + return + _movement_credits[actor_id] = { + &"credit": clampi(credit, 0, _cell_movement_credit_limit(path_service, cell) - 1), + &"updated_at": absolute_minute, + } + if int(recorded.get(&"minutes_without_progress", 0)) >= PathService.STUCK_THRESHOLD_MINUTES: + _recover_stuck_actor(actor_id, entity_id, kind, cell, absolute_minute) + + +func _movement_credit_after_one_minute( + actor_id: StringName, + cell: Vector3i, + absolute_minute: int +) -> int: + var current: Dictionary = _movement_credits.get(actor_id, { + &"credit": 0, + &"updated_at": absolute_minute - 1, + }) + var carried := int(current.get(&"credit", 0)) + if int(current.get(&"updated_at", -1)) >= absolute_minute: + return carried + var speed_credit := clampi( + roundi(path_service.get_speed_multiplier(cell) * MOVEMENT_CREDIT_SCALE), + MIN_MOVEMENT_CREDIT_PER_MINUTE, + MOVEMENT_CREDIT_SCALE + ) + return carried + speed_credit + + +func _advance_guest_path_travel( + guest: GuestRuntime, + actor_id: StringName, + absolute_minute: int +) -> void: + var target_cell := _path_handle_target(guest.path_handle, guest.current_cell) + if guest.current_cell == target_cell: + _record_expected_actor_wait(actor_id, guest.current_cell, absolute_minute) + _queue_guest_at_target(guest, absolute_minute) + return + var path := path_service.find_path(guest.current_cell, target_cell) + if path.size() <= 1: + _record_blocked_actor_wait( + actor_id, guest.guest_id, &"guest", guest.current_cell, absolute_minute, 0 + ) + return + if _request_elevator_step(actor_id, path[0], path[1], absolute_minute, []): + return + var required_credit := _step_movement_credit(path_service, path[0], path[1], []) + var accumulated := _movement_credit_after_one_minute( + actor_id, guest.current_cell, absolute_minute + ) + accumulated = mini(accumulated, required_credit + MOVEMENT_CREDIT_SCALE - 1) + if accumulated < required_credit: + _record_blocked_actor_wait( + actor_id, + guest.guest_id, + &"guest", + guest.current_cell, + absolute_minute, + accumulated + ) + return + var previous_cell := guest.current_cell + var previous_progress_cell := guest.last_progress_cell + var previous_progress_at := guest.last_progress_at + var previous_failure_count := guest.path_failure_count + var previous_recovery_kind := guest.recovery_kind + if not guest_service.record_path_success(guest.guest_id, path[1], absolute_minute) \ + or not path_service.project_actor_position(actor_id, path[1], absolute_minute): + guest.current_cell = previous_cell + guest.last_progress_cell = previous_progress_cell + guest.last_progress_at = previous_progress_at + guest.path_failure_count = previous_failure_count + guest.recovery_kind = previous_recovery_kind + _report_path_integration_failure(actor_id, guest.guest_id, &"guest", previous_cell) + return + var remaining_credit := accumulated - required_credit + _movement_credits[actor_id] = { + &"credit": remaining_credit, + &"updated_at": absolute_minute, + } + _publish_actor_event(&"GUEST_MOVED", &"path_service", [guest.guest_id, actor_id], { + &"from_cell": previous_cell, + &"cell": guest.current_cell, + &"target_cell": target_cell, + &"movement_credit": remaining_credit, + }) + if guest.current_cell == target_cell: + _queue_guest_at_target(guest, absolute_minute) + +func _queue_guest_at_target(guest: GuestRuntime, absolute_minute: int) -> void: + var operation_key := StringName( + "guest.auto_queue.%s.%d" % [guest.guest_id, guest.state_entered_at] + ) + var result := submit_command( + &"create_service_request", + { + &"facility_id": guest.target_facility_id, + &"guest_ids": [guest.guest_id], + &"service_type": &"default", + }, + guest.guest_id, + guest.target_facility_id, + 0, + absolute_minute, + operation_key + ) + if not result.is_success() and guest.state == GuestRuntime.State.MOVING: + guest_service.transition_guest( + guest.guest_id, + GuestRuntime.State.DECIDING, + absolute_minute, + &"QUEUE_REQUEST_FAILED" + ) + +func _guest_recovery_targets(current_cell: Vector3i) -> Array: + return [{ + &"kind": &"emergency_exit", + &"cell": current_cell, + &"path_handle": {&"recovery": true, &"target_cell": current_cell}, + }] + +func _guest_recovery_path_exists( + from_cell: Vector3i, + to_cell: Vector3i, + _guest_id: StringName, + _target: Dictionary +) -> bool: + return not path_service.find_path(from_cell, to_cell).is_empty() + +func _advance_staff_task_travel( + task: StaffTask, + actor_id: StringName, + absolute_minute: int +) -> void: + var staff := staff_service.get_staff(task.assigned_staff_id) + if staff == null or staff.current_task_id != task.task_id: + return + if task.task_type == CleaningBridge.TASK_TYPE and not cleaning_bridge.prepare_route(task, staff): + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + return + if staff.current_cell == task.target_cell: + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + staff_service.begin_task(task.task_id, absolute_minute) + return + var path := path_service.find_path( + staff.current_cell, + task.target_cell, + [WorldService.LAYER_FRONT, WorldService.LAYER_BACK], + [&"staff"] + ) + if task.task_type in [&"rescue_pickup", &"rescue_transport"]: + path = path_service.find_backyard_path(staff.current_cell, task.target_cell, true) + if path.size() <= 1: + if task.task_type in [&"rescue_pickup", &"rescue_transport"]: + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + return + _record_blocked_actor_wait( + actor_id, staff.staff_id, &"staff", staff.current_cell, absolute_minute, 0 + ) + return + if task.task_type == &"rescue_transport" and elevators.owns_connector(path_service.get_step_connector(path[0], path[1], [&"staff"])): + var patient_actor := _staff_path_actor_id(task.target_entity_id) + var connector := path_service.get_step_connector(path[0], path[1], [&"staff"]) + var pair := {} + if not _elevator_extension_pending(elevators.get_shaft_for_connector(connector)): + pair = elevators.request_pair(actor_id, patient_actor, path[0], path[1], absolute_minute, [&"staff"]) + if pair.get(&"ok", false) and not pair.get(&"replay", false): + _publish_actor_event(&"ELEVATOR_RESCUE_REQUESTED", &"elevators", [actor_id, patient_actor], pair[&"trip"]) + _record_expected_actor_wait(actor_id, staff.current_cell, absolute_minute) + return + if _request_elevator_step(actor_id, path[0], path[1], absolute_minute, [&"staff"]): + return + var required_credit := _step_movement_credit(path_service, path[0], path[1], [&"staff"]) + var accumulated := _movement_credit_after_one_minute( + actor_id, staff.current_cell, absolute_minute + ) + accumulated = mini(accumulated, required_credit + MOVEMENT_CREDIT_SCALE - 1) + if accumulated < required_credit: + _record_blocked_actor_wait( + actor_id, + staff.staff_id, + &"staff", + staff.current_cell, + absolute_minute, + accumulated + ) + return + var previous_cell := staff.current_cell + staff.current_cell = path[1] + if not path_service.project_actor_position(actor_id, staff.current_cell, absolute_minute): + staff.current_cell = previous_cell + _report_path_integration_failure(actor_id, staff.staff_id, &"staff", previous_cell) + return + if task.task_type == &"rescue_transport": + var patient := staff_service.get_staff(task.target_entity_id) + if patient == null or not path_service.project_actor_position(_staff_path_actor_id(patient.staff_id), staff.current_cell, absolute_minute): + staff.current_cell = previous_cell + path_service.project_actor_position(actor_id, previous_cell, absolute_minute) + return + patient.current_cell = staff.current_cell + _record_expected_actor_wait(_staff_path_actor_id(patient.staff_id), patient.current_cell, absolute_minute) + var remaining_credit := accumulated - required_credit + _movement_credits[actor_id] = { + &"credit": remaining_credit, + &"updated_at": absolute_minute, + } + _publish_actor_event(&"STAFF_MOVED", &"staff_service", [staff.staff_id, task.task_id], { + &"path_actor_id": actor_id, + &"from_cell": previous_cell, + &"cell": staff.current_cell, + &"target_cell": task.target_cell, + &"movement_credit": remaining_credit, + }) + if staff.current_cell == task.target_cell: + staff_service.begin_task(task.task_id, absolute_minute) + + +func _recover_stuck_actor( + actor_id: StringName, + entity_id: StringName, + kind: StringName, + cell: Vector3i, + absolute_minute: int +) -> void: + var path_before := path_service.create_snapshot() + var guests_before := guest_service.create_snapshot() + var staff_before := staff_service.create_snapshot() + var inventory_before := inventory_service.create_snapshot() + var events_before := domain_events.create_snapshot() + var ids_before := id_generator.create_snapshot() + var credits_before := _movement_credits.duplicate(true) + var report := path_service.get_actor_stuck_report( + actor_id, + absolute_minute, + [WorldService.LAYER_FRONT, WorldService.LAYER_BACK] + ) + if not bool(report.get(&"ok", false)) or not bool(report.get(&"should_recover", false)): + return + var action := &"NONE" + var action_ok := false + if kind == &"guest": + var guest := guest_service.get_guest(entity_id) + if guest != null: + var recovery_targets: Array = [] + var recovery_value: Variant = report.get(&"recovery", {}) + if recovery_value is Dictionary and bool(recovery_value.get(&"found", false)): + var recovery_cell: Vector3i = recovery_value[&"cell"] + recovery_targets.append({ + &"kind": &"guidance", + &"cell": recovery_cell, + &"path_handle": { + &"recovery": true, + &"target_cell": recovery_cell, + }, + }) + var recovery_result: Dictionary = {} + for _attempt in range(GuestService.PATH_FAILURE_LIMIT): + recovery_result = guest_service.record_path_failure( + entity_id, + absolute_minute, + recovery_targets, + Callable(self, "_guest_recovery_path_exists") + ) + if not bool(recovery_result.get(&"ok", false)) \ + or bool(recovery_result.get(&"recovery_started", false)): + break + action_ok = bool(recovery_result.get(&"ok", false)) \ + and bool(recovery_result.get(&"recovery_started", false)) + action = &"GUEST_SAFE_RECOVERY" if action_ok else &"GUEST_RECOVERY_FAILED" + elif kind == &"staff": + var staff := staff_service.get_staff(entity_id) + if staff != null and not staff.current_task_id.is_empty(): + if supply_logistics.owns_task(staff.current_task_id): + var recovery: Dictionary = supply_logistics.handle_path_stuck(staff.current_task_id, absolute_minute) + action_ok = bool(recovery.get(&"ok", false)) + action = StringName(recovery.get(&"action", &"SUPPLY_RECOVERY_FAILED")) + else: + var cancelled := staff_service.cancel_task(staff.current_task_id, &"PATH_STUCK", absolute_minute) + action_ok = cancelled.is_success() + action = &"STAFF_TASK_CANCELLED" if action_ok else &"STAFF_TASK_CANCEL_FAILED" + if not action_ok: + path_service.restore_snapshot(path_before) + guest_service.restore_snapshot(guests_before) + staff_service.restore_snapshot(staff_before) + inventory_service.restore_snapshot(inventory_before) + domain_events.restore_snapshot(events_before) + id_generator.restore_snapshot(ids_before) + _movement_credits = credits_before + return + _movement_credits[actor_id] = {&"credit": 0, &"updated_at": absolute_minute} + _publish_actor_event(&"PATH_ACTOR_STUCK", &"path_service", [actor_id, entity_id], { + &"actor_kind": kind, + &"cell": cell, + &"minutes_without_progress": int(report[&"minutes_without_progress"]), + &"threshold_minutes": int(report[&"threshold_minutes"]), + &"recovery": (report[&"recovery"] as Dictionary).duplicate(true), + &"action": action, + &"implicit_move_applied": false, + }) + +func _leave_guest_queue_boundary( + _guest_id: StringName, + facility_id: StringName, + request_id: StringName +) -> Dictionary: + var request := facility_service.get_request(request_id) + if request == null: + return {&"ok": true, &"orphan_repaired": true} + var inventory_before := inventory_service.create_snapshot() + for reservation_id: StringName in request.reserved_inventory_ids: + var released := inventory_service.release_reservation( + reservation_id, + StringName("guest.abandon.%s.%s" % [request_id, reservation_id]), + _clock.absolute_minute + ) + if not bool(released.get(&"ok", false)): + inventory_service.restore_snapshot(inventory_before) + return released + var leave_result := facility_service.leave_queue(facility_id, request_id, &"PATIENCE_EXHAUSTED") + if not leave_result.is_success(): + inventory_service.restore_snapshot(inventory_before) + return {&"ok": false, &"message": leave_result.message} + return {&"ok": true} + +func _reserve_staff_task_items(task: StaffTask, absolute_minute: int) -> Dictionary: + var inventory_id := &"staff.supplies" + var facility := facility_service.get_instance(task.target_entity_id) + if facility != null: + inventory_id = facility.local_inventory_id + var before := inventory_service.create_snapshot() + var reservation_ids: Array[StringName] = [] + for item_id: StringName in _sorted_name_keys(task.required_items): + var result := inventory_service.reserve_item( + inventory_id, + item_id, + int(task.required_items[item_id]), + task.task_id, + &"staff_task", + absolute_minute, + absolute_minute + 480, + StringName("staff.task.reserve.%s.%s" % [task.task_id, item_id]) + ) + if not bool(result.get(&"ok", false)): + inventory_service.restore_snapshot(before) + return { + &"ok": false, + &"reason": StringName(result.get(&"code", &"ITEM_RESERVATION_FAILED")), + } + for reservation_id: StringName in result.get(&"reservation_ids", []): + reservation_ids.append(reservation_id) + return {&"ok": true, &"reservation_ids": reservation_ids} + +func _release_staff_task_items( + reservation_ids: Array[StringName], + task: StaffTask, + absolute_minute: int +) -> Dictionary: + var before := inventory_service.create_snapshot() + for reservation_id: StringName in reservation_ids: + var result := inventory_service.release_reservation( + reservation_id, + StringName("staff.task.release.%s.%s" % [task.task_id, reservation_id]), + absolute_minute + ) + if not bool(result.get(&"ok", false)): + inventory_service.restore_snapshot(before) + return result + return {&"ok": true} + +func _estimate_staff_task_travel(staff: StaffRuntime, task: StaffTask, _absolute_minute: int) -> int: + if task.task_type == CleaningBridge.TASK_TYPE and not cleaning_bridge.can_dispatch(staff): return -1 + if task.task_type in [&"rescue_pickup", &"rescue_transport"]: + if not elevators.get_actor_trip(_staff_path_actor_id(staff.staff_id)).is_empty(): + return -1 + var route := path_service.find_backyard_path(staff.current_cell, task.target_cell, true) + return _estimated_actor_path_minutes(route, [&"staff"]) if not route.is_empty() else -1 + if staff.current_cell == task.target_cell: + return 0 + var path := path_service.find_path( + staff.current_cell, + task.target_cell, + [WorldService.LAYER_FRONT, WorldService.LAYER_BACK], + [&"staff"] + ) + if not path.is_empty(): + return _estimated_actor_path_minutes(path, [&"staff"]) + return -1 + +func _sync_facility_staffing(absolute_minute: int) -> void: + if not _staffing_projection_enabled: + return + var staff_members := staff_service.get_staff_members() + for facility: FacilityInstance in facility_service.get_instances(): + var active_ids: Array[StringName] = [] + for staff: StaffRuntime in staff_members: + if (staff_commute.is_present(staff, facility) or CleaningBridge.is_deployed(staff, facility, staff_service)) and not _is_anri_manager(staff): + active_ids.append(staff.staff_id) + facility_service.set_operational_status( + facility.instance_id, + {&"active_staff_ids": active_ids}, + absolute_minute + ) + +func _project_guest_candidates(guest_id: StringName) -> Array: + # Stateless native pipeline; missing old bindings/custom/observer domains + # retain the exact original projection below. + if get_script().resource_path == "res://autoload/simulation_runtime.gd" and ClassDB.class_exists(&"TheTreeNumericCore"): + var core = ClassDB.instantiate(&"TheTreeNumericCore") + if core != null and core.has_method(&"project_guest_candidates"): + var selected: Dictionary = core.project_guest_candidates(self, guest_id, FacilityInstance.State.OPEN, FacilityInstance.State.DEGRADED, MOVEMENT_CREDIT_SCALE, STAIR_MOVEMENT_CREDIT, PathService.ORTHOGONAL_MOVE_COST, Callable(Time, "get_ticks_usec")) + if bool(selected.get(&"supported", false)): + return selected[&"candidates"] + return _project_guest_candidates_without_native(guest_id) + + +func _project_guest_candidates_without_native(guest_id: StringName) -> Array: + var guest := guest_service.get_guest(guest_id) + var candidates: Array = [] + if guest == null: + return candidates + var query_goals: Array = [] + for instance: FacilityInstance in facility_service.get_instances(): + query_goals.append_array(_facility_access_candidates(instance)) + path_service.begin_guest_path_query_batch(guest.current_cell, query_goals) + for facility: FacilityInstance in facility_service.get_instances(): + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null or &"staff_only" in definition.tags: + continue + if &"entrance" in definition.tags and _guest_has_checked_in(guest): + continue + var has_inputs := true + for item_id: StringName in _sorted_name_keys(definition.inventory_inputs): + if inventory_service.available_quantity(facility.local_inventory_id, item_id) < int(definition.inventory_inputs[item_id]): + has_inputs = false + break + if not has_inputs: + # Preserve the existing exclusion without doing unnecessary path queries, + # but let the decision evidence explain why this facility was unavailable. + candidates.append({&"facility_id": facility.instance_id, &"inputs_available": false}) + continue + var access := _find_facility_access_path(guest.current_cell, facility) + var path: Array = access.get(&"path", []) + var need_relief := _need_relief_for_facility_tags(definition.tags) + candidates.append({ + &"facility_id": facility.instance_id, + &"facility_tags": definition.tags.duplicate(), + &"is_open": facility.state in [FacilityInstance.State.OPEN, FacilityInstance.State.DEGRADED], + &"reachable": bool(access.get(&"reachable", false)), + &"travel_minutes": _estimated_actor_path_minutes(path, []), + &"expected_wait": facility.queue_entries.size() * facility.base_service_minutes / maxi(facility.capacity, 1), + &"estimated_total_gold": get_facility_business_price(facility), + &"expected_quality": clampi(facility.base_quality, 0, 100), + &"need_relief": need_relief, + &"risk_level": 0, + &"illegal_level": 0, + &"group_fit": mini(facility.capacity, 4) * 5, + &"service_category": _service_category_for_tags(definition.tags), + &"path_handle": { + &"target_cell": access.get(&"target_cell", guest.current_cell), + &"graph_revision": path_service.graph_revision, + }, + }) + path_service.end_guest_path_query_batch() + return candidates + +func _facility_access_candidates(facility: FacilityInstance) -> Array: + var candidate_cells: Dictionary = {} + var occupied: Array[Vector3i] = facility.occupied_cells.duplicate() + if occupied.is_empty(): + occupied.append(facility.origin) + for cell: Vector3i in occupied: + for direction: Vector3i in [Vector3i.LEFT, Vector3i.RIGHT]: + var candidate := Vector3i(cell.x + direction.x, cell.y + direction.y, cell.z) + if path_service.has_cell(candidate): + candidate_cells[candidate] = true + if path_service.has_cell(facility.origin): + candidate_cells[facility.origin] = true + var ordered: Array = candidate_cells.keys() + ordered.sort_custom(func(a: Vector3i, b: Vector3i) -> bool: + if a.z != b.z: return a.z < b.z + if a.y != b.y: return a.y < b.y + return a.x < b.x + ) + return ordered + + +# External synchronous observers can mutate World after each old point query. +# Their presence (including the nested budget signal) retains that exact loop. +func _guest_access_batch_can_select() -> bool: + if get_script().resource_path != "res://autoload/simulation_runtime.gd" or path_service.get_script().resource_path != "res://scripts/world/path_service.gd": return false + if _clock == null or _clock.performance_budget == null: return false + var budget = _clock.performance_budget + if budget.get_script().resource_path != "res://scripts/core/performance_budget.gd" or not budget.get_signal_connection_list(&"budget_exceeded").is_empty(): return false + var listeners := path_service.get_signal_connection_list(&"path_query_measured") + return listeners.size() == 1 and listeners[0]["callable"] == Callable(self, "_on_path_query_measured") and int(listeners[0]["flags"]) == 0 + + +func _find_facility_access_path(start: Vector3i, facility: FacilityInstance) -> Dictionary: + var ordered := _facility_access_candidates(facility) + if _guest_access_batch_can_select(): + var selected := path_service.query_nearest_guest_access(start, ordered, facility.origin) + if bool(selected.get(&"supported", false)): + selected.erase(&"supported") + return selected + var best_path: Array[Vector3i] = [] + var best_cell := facility.origin + for candidate: Vector3i in ordered: + var path := path_service.find_path(start, candidate) + if path.is_empty(): + continue + if best_path.is_empty() or path_service.calculate_guest_batch_path_cost(start, candidate, path) < path_service.calculate_guest_batch_path_cost(start, best_cell, best_path): + best_path.assign(path) + best_cell = candidate + return {&"reachable": not best_path.is_empty(), &"path": best_path, &"target_cell": best_cell} + +func _need_relief_for_facility_tags(tags: Array[StringName]) -> Dictionary: + var relief := { + &"hunger": 0, &"sleep": 0, &"hygiene": 0, + &"medical": 0, &"leisure": 0, &"intimacy": 0, + } + if &"dining" in tags: + relief[&"hunger"] = 80 + relief[&"leisure"] = 10 + if &"lodging" in tags: + relief[&"sleep"] = 90 + relief[&"hygiene"] = maxi(int(relief[&"hygiene"]), 10) + if &"social" in tags or &"leisure" in tags: + relief[&"leisure"] = maxi(int(relief[&"leisure"]), 40) + if &"hygiene" in tags or &"bath" in tags: + relief[&"hygiene"] = maxi(int(relief[&"hygiene"]), 80) + if &"medical" in tags: + relief[&"medical"] = 90 + elif &"wellness" in tags: + relief[&"medical"] = maxi(int(relief[&"medical"]), 20) + if &"adult_only" in tags or &"restricted_service" in tags: + relief[&"intimacy"] = 80 + return relief + +func _service_category_for_tags(tags: Array[StringName]) -> StringName: + if &"dining" in tags: + return &"food" + if &"lodging" in tags: + return &"lodging" + if &"social" in tags: + return &"leisure" + return &"service" + +func _path_handle_target(path_handle: Variant, fallback: Vector3i) -> Vector3i: + if path_handle is Dictionary: + var value: Variant = path_handle.get(&"target_cell", path_handle.get("target_cell", fallback)) + var parsed: Variant = _parse_world_cell(value) + if parsed != null: + return parsed + return fallback + +func _event_actor_exists(actor_id: StringName) -> bool: + if actor_id == &"player": + return true + return guest_service.has_guest(actor_id) or staff_service.has_staff(actor_id) + +func _event_entity_exists(entity_id: Variant) -> bool: + var normalized := StringName(entity_id) + return _event_actor_exists(normalized) \ + or facility_service.has_instance(normalized) \ + or relationship_service.has_relationship(normalized) \ + or event_service.get_instance(normalized) != null + +func _event_path_exists(value: Variant) -> bool: + if not value is Dictionary: + return false + var from_value: Variant = _parse_world_cell(value.get(&"from", value.get("from", null))) + var to_value: Variant = _parse_world_cell(value.get(&"to", value.get("to", null))) + if from_value == null or to_value == null: + return false + return not path_service.find_path(from_value, to_value).is_empty() + +func _roll_authority_inspection(_day_index: int, _chance: int, _terms: Dictionary) -> int: + var stream := get_rng_stream(&"authority") + return stream.randi_range(0, 99) if stream != null else 99 + +func _authority_line_of_sight( + from_cell: Vector3i, + to_cell: Vector3i, + _context: Dictionary +) -> bool: + if from_cell.z != to_cell.z \ + or not world_service.is_in_bounds(from_cell) \ + or not world_service.is_in_bounds(to_cell): + return false + if from_cell == to_cell: + return true + var x := from_cell.x + var y := from_cell.y + var delta_x := absi(to_cell.x - from_cell.x) + var delta_y := absi(to_cell.y - from_cell.y) + var step_x := 1 if from_cell.x < to_cell.x else -1 + var step_y := 1 if from_cell.y < to_cell.y else -1 + var error := delta_x - delta_y + while x != to_cell.x or y != to_cell.y: + var doubled_error := error * 2 + if doubled_error > -delta_y: + error -= delta_y + x += step_x + if doubled_error < delta_x: + error += delta_x + y += step_y + var current := Vector3i(x, y, from_cell.z) + if current == to_cell: + return true + if not world_service.is_walkable(current) \ + or not world_service.get_occupant(current).is_empty(): + return false + return true + +func _authority_path_query( + from_cell: Vector3i, + to_cell: Vector3i, + context: Dictionary +) -> Dictionary: + var connector_access := _name_array( + context.get(&"connector_access", context.get("connector_access", [])) + ) + var path := path_service.find_path( + from_cell, + to_cell, + [WorldService.LAYER_FRONT, WorldService.LAYER_BACK], + connector_access + ) + if path.is_empty(): + return { + &"reachable": false, + &"reason": StringName(path_service.last_error if not path_service.last_error.is_empty() else "PATH_UNREACHABLE"), + &"travel_minutes": 0, + } + return { + &"reachable": true, + &"reason": &"OK", + &"travel_minutes": maxi(path.size() - 1, 0), + &"path": path, + } + +func _apply_authority_resolution_boundary( + payload: Dictionary, + phase: StringName, + rollback_token: Variant +) -> Dictionary: + if phase == &"rollback": + if not rollback_token is Dictionary \ + or not rollback_token.get(&"economy", null) is Dictionary \ + or not rollback_token.get(&"game_state", null) is Dictionary \ + or not rollback_token.get(&"facilities", null) is Dictionary \ + or not rollback_token.get(&"domain_events", null) is Dictionary \ + or not rollback_token.get(&"id_generator", null) is Dictionary: + return {&"ok": false, &"error": "Authority rollback token is malformed."} + var economy_ok: bool = economy_service.restore_snapshot(rollback_token[&"economy"]) + var facilities_ok: bool = facility_service.restore_snapshot(rollback_token[&"facilities"]) + facilities_ok = facility_cleanliness.restore_snapshot(rollback_token.get(&"facility_cleanliness", {})) and facilities_ok + var events_ok: bool = domain_events.restore_snapshot(rollback_token[&"domain_events"]) + var ids_ok: bool = id_generator.restore_snapshot(rollback_token[&"id_generator"]) + var state_ok: bool = _state.restore_snapshot(rollback_token[&"game_state"]) + return { + &"ok": economy_ok and state_ok and facilities_ok and events_ok and ids_ok, + &"error": "Authority fine rollback failed." if not economy_ok or not state_ok or not facilities_ok or not events_ok or not ids_ok else "", + } + var resolution_id := StringName(payload.get(&"resolution_id", payload.get("resolution_id", ""))) + var inspection_id := StringName(payload.get(&"inspection_id", payload.get("inspection_id", ""))) + var fine_amount := int(payload.get(&"fine_amount", payload.get("fine_amount", -1))) + var absolute_minute := int(payload.get(&"absolute_minute", payload.get("absolute_minute", -1))) + var idempotency_key := _authority_resolution_idempotency_key(resolution_id) + if resolution_id.is_empty() or inspection_id.is_empty() or fine_amount < 0 \ + or absolute_minute != _runtime_event_minute() \ + or not economy_service.has_account(PLAYER_CASH_ACCOUNT) \ + or not economy_service.has_account(AUTHORITY_FINE_ACCOUNT): + return {&"ok": false, &"error": "Authority resolution payload is invalid."} + if phase == &"validate": + var existing_transaction := economy_service.get_transaction_id_for_idempotency_key(idempotency_key) + if not existing_transaction.is_empty(): + if not _authority_fine_transaction_matches( + economy_service, existing_transaction, inspection_id, fine_amount + ): + return {&"ok": false, &"error": "Authority fine idempotency key conflicts with its ledger transaction."} + return {&"ok": true, &"token": { + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"already_applied": true, + &"transaction_id": existing_transaction, + }} + if fine_amount > 0 \ + and not economy_service.account_allows_negative(PLAYER_CASH_ACCOUNT) \ + and economy_service.get_balance(PLAYER_CASH_ACCOUNT) < fine_amount: + return {&"ok": false, &"error": "PLAYER_CASH cannot fund the Authority fine."} + return {&"ok": true, &"token": { + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"already_applied": false, + }} + if phase != &"apply" or not rollback_token is Dictionary: + return {&"ok": false, &"token": rollback_token, &"error": "Unknown Authority resolution phase or token."} + if StringName(payload.get(&"result", &"")) == &"TEMPORARY_CLOSURE": + var targets: Dictionary = {} + for raw_id: Variant in payload.get(&"evidence_ids", []): + var evidence := authority_service.get_evidence(StringName(raw_id)) + if evidence != null and evidence.is_discovered() and not evidence.is_expired(absolute_minute) and facility_service.has_instance(evidence.facility_id): + targets[evidence.facility_id] = true + for target_id: StringName in _sorted_name_keys(targets): + var stopped := facility_service.set_operational_status(target_id, {&"suspension_reason": &"RAIDED"}, absolute_minute) + if not stopped.is_success(): + return {&"ok": false, &"token": rollback_token, &"error": stopped.message} + if bool(rollback_token.get(&"already_applied", false)) or fine_amount == 0: + return { + &"ok": true, + &"transaction_id": StringName(rollback_token.get(&"transaction_id", &"")), + } + var posted := economy_service.transfer( + PLAYER_CASH_ACCOUNT, + AUTHORITY_FINE_ACCOUNT, + fine_amount, + absolute_minute, + &"AUTHORITY_FINE", + inspection_id, + idempotency_key, + &"authority.inspection.fine" + ) + if not posted.is_success(): + return { + &"ok": false, + &"token": rollback_token, + &"error": posted.message, + } + return { + &"ok": true, + &"transaction_id": posted.details.get(&"transaction_id", &""), + } + +func _authority_resolution_idempotency_key(resolution_id: StringName) -> StringName: + return StringName("authority.resolution.%s" % resolution_id) + +func _authority_fine_transaction_matches( + economy: EconomyService, + transaction_id: StringName, + inspection_id: StringName, + fine_amount: int +) -> bool: + if fine_amount == 0: + return transaction_id.is_empty() + var entries := economy.get_transaction_entries(transaction_id) + if entries.size() != 1: + return false + var entry: LedgerEntry = entries[0] + return entry.debit_account == AUTHORITY_FINE_ACCOUNT \ + and entry.credit_account == PLAYER_CASH_ACCOUNT \ + and entry.amount == fine_amount \ + and entry.category == &"AUTHORITY_FINE" \ + and entry.source_entity_id == inspection_id + +func _roll_defense_round(_key: StringName, _context: Dictionary) -> int: + var stream := get_rng_stream(&"defense") + return stream.randi_range(0, 100) if stream != null else 50 + +func _apply_defense_rng_boundary( + _context: Dictionary, + phase: StringName, + token: Variant +) -> Dictionary: + var stream := get_rng_stream(&"defense") + if stream == null: + return {&"ok": false, &"error": "Defense RNG stream is unavailable."} + if phase == &"snapshot": + return {&"ok": true, &"token": stream.snapshot()} + if phase == &"commit": + return {&"ok": true, &"token": token} + if phase == &"rollback": + if not token is Dictionary or not stream.restore(token): + return {&"ok": false, &"error": "Defense RNG rollback token is invalid."} + return {&"ok": true} + return {&"ok": false, &"error": "Unknown Defense RNG boundary phase."} + +func _apply_defense_skill_boundary( + payload: Dictionary, + phase: StringName, + rollback_token: Variant +) -> Dictionary: + if phase == &"rollback": + return _restore_defense_skill_token(rollback_token) + var cost_report := _parse_defense_skill_cost(payload) + if not bool(cost_report[&"ok"]): + return cost_report + var cost: Dictionary = cost_report[&"cost"] + var raid_id := StringName(payload.get(&"raid_id", payload.get("raid_id", ""))) + var action_id := StringName(payload.get(&"action_id", payload.get("action_id", ""))) + if raid_id.is_empty() or action_id.is_empty(): + return {&"ok": false, &"error": "Defense skill boundary IDs are invalid."} + if phase == &"validate": + var token := { + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"inventory": inventory_service.create_snapshot(), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + &"cost": cost.duplicate(true), + &"reservation_ids": [], + } + var gold := int(cost[&"gold"]) + var mana := int(cost[&"mana"]) + if economy_service.get_balance(PLAYER_CASH_ACCOUNT) < gold \ + or int(_state.get_resource(&"mana")) < mana: + return {&"ok": false, &"error": "Defense skill resources are insufficient."} + var ledger_key := _defense_skill_ledger_key(raid_id, action_id) + if gold > 0 and not economy_service.get_transaction_id_for_idempotency_key(ledger_key).is_empty(): + return {&"ok": false, &"error": "Defense skill ledger key already exists without an applied skill."} + var reservation_ids: Array[StringName] = [] + var items: Array = cost[&"items"] + for item_index: int in range(items.size()): + var item: Dictionary = items[item_index] + var reserved := inventory_service.reserve_item( + StringName(item[&"inventory_id"]), + StringName(item[&"item_id"]), + int(item[&"quantity"]), + action_id, + &"defense_skill", + _defense_operation_minute(), + -1, + StringName("defense.skill.reserve.%s.%s.%d" % [raid_id, action_id, item_index]) + ) + if not bool(reserved.get(&"ok", false)): + token[&"reservation_ids"] = reservation_ids + return { + &"ok": false, + &"token": token, + &"error": "Defense skill item reservation failed.", + &"details": reserved, + } + for reservation_value: Variant in reserved.get(&"reservation_ids", []): + reservation_ids.append(StringName(reservation_value)) + token[&"reservation_ids"] = reservation_ids + return {&"ok": true, &"token": token} + if phase != &"apply" or not _defense_skill_token_is_valid(rollback_token): + return {&"ok": false, &"token": rollback_token, &"error": "Defense skill apply token is invalid."} + var token: Dictionary = rollback_token + var mana := int(cost[&"mana"]) + if mana > 0 and not bool(_state.apply_resource_deltas({&"mana": -mana})): + return {&"ok": false, &"token": token, &"error": "Defense skill Mana application failed."} + var gold := int(cost[&"gold"]) + if gold > 0: + var posted := economy_service.transfer( + PLAYER_CASH_ACCOUNT, + OPERATING_EXPENSE_ACCOUNT, + gold, + _defense_operation_minute(), + &"DEFENSE_SKILL_COST", + action_id, + _defense_skill_ledger_key(raid_id, action_id), + &"defense.skill.cost" + ) + if not posted.is_success(): + return {&"ok": false, &"token": token, &"error": posted.message} + var reservation_ids: Array[StringName] = [] + for reservation_value: Variant in token[&"reservation_ids"]: + reservation_ids.append(StringName(reservation_value)) + if not reservation_ids.is_empty(): + var consumed := inventory_service.consume_reservations( + reservation_ids, + StringName("defense.skill.consume.%s.%s" % [raid_id, action_id]), + _defense_operation_minute() + ) + if not bool(consumed.get(&"ok", false)): + return {&"ok": false, &"token": token, &"error": "Defense skill item consumption failed.", &"details": consumed} + return {&"ok": true, &"token": token} + +func _parse_defense_skill_cost(payload: Dictionary) -> Dictionary: + var metadata_value: Variant = payload.get(&"metadata", payload.get("metadata", {})) + if not metadata_value is Dictionary: + return {&"ok": false, &"error": "Defense skill metadata must be a Dictionary."} + var metadata: Dictionary = metadata_value + var cost_value: Variant = metadata.get(&"cost", metadata.get("cost", {})) + if not cost_value is Dictionary: + return {&"ok": false, &"error": "Defense skill metadata.cost must be a Dictionary."} + var cost_data: Dictionary = cost_value + var gold_value: Variant = cost_data.get(&"gold", cost_data.get("gold", 0)) + var mana_value: Variant = cost_data.get(&"mana", cost_data.get("mana", 0)) + if not gold_value is int or not mana_value is int: + return {&"ok": false, &"error": "Defense skill Gold and Mana costs must be integers."} + var gold := int(gold_value) + var mana := int(mana_value) + if gold < 0 or mana < 0: + return {&"ok": false, &"error": "Defense skill costs cannot be negative."} + var items_value: Variant = cost_data.get(&"items", cost_data.get("items", [])) + if not items_value is Array: + return {&"ok": false, &"error": "Defense skill item costs must be an Array."} + var items: Array[Dictionary] = [] + for raw_item: Variant in items_value: + if not raw_item is Dictionary: + return {&"ok": false, &"error": "Defense skill item cost is malformed."} + var inventory_value: Variant = raw_item.get(&"inventory_id", raw_item.get("inventory_id", "")) + var item_value: Variant = raw_item.get(&"item_id", raw_item.get("item_id", "")) + var quantity_value: Variant = raw_item.get(&"quantity", raw_item.get("quantity", 0)) + if not (inventory_value is String or inventory_value is StringName) \ + or not (item_value is String or item_value is StringName) \ + or not quantity_value is int: + return {&"ok": false, &"error": "Defense skill item cost types are invalid."} + var inventory_id := StringName(inventory_value) + var item_id := StringName(item_value) + var quantity := int(quantity_value) + if inventory_id.is_empty() or item_id.is_empty() or quantity <= 0: + return {&"ok": false, &"error": "Defense skill item cost requires inventory_id, item_id and positive quantity."} + items.append({&"inventory_id": inventory_id, &"item_id": item_id, &"quantity": quantity}) + items.sort_custom(func(left: Dictionary, right: Dictionary) -> bool: + var left_key := "%s:%s" % [left[&"inventory_id"], left[&"item_id"]] + var right_key := "%s:%s" % [right[&"inventory_id"], right[&"item_id"]] + return left_key < right_key + ) + return {&"ok": true, &"cost": {&"gold": gold, &"mana": mana, &"items": items}} + +func _defense_skill_ledger_key(raid_id: StringName, action_id: StringName) -> StringName: + return StringName("defense.skill.%s.%s" % [raid_id, action_id]) + +func _defense_skill_token_is_valid(token: Variant) -> bool: + return token is Dictionary \ + and token.get(&"economy", null) is Dictionary \ + and token.get(&"game_state", null) is Dictionary \ + and token.get(&"inventory", null) is Dictionary \ + and token.get(&"domain_events", null) is Dictionary \ + and token.get(&"id_generator", null) is Dictionary \ + and token.get(&"reservation_ids", null) is Array + +func _restore_defense_skill_token(token: Variant) -> Dictionary: + if not _defense_skill_token_is_valid(token): + return {&"ok": false, &"error": "Defense skill rollback token is malformed."} + var economy_ok: bool = economy_service.restore_snapshot(token[&"economy"]) + var state_ok: bool = _state.restore_snapshot(token[&"game_state"]) + var inventory_ok: bool = inventory_service.restore_snapshot(token[&"inventory"]) + var events_ok: bool = domain_events.restore_snapshot(token[&"domain_events"]) + var ids_ok: bool = id_generator.restore_snapshot(token[&"id_generator"]) + return { + &"ok": economy_ok and state_ok and inventory_ok and events_ok and ids_ok, + &"error": "Defense skill rollback failed." if ( + not economy_ok or not state_ok or not inventory_ok or not events_ok or not ids_ok + ) else "", + } + +func _apply_defense_outcome_boundary( + payload: Dictionary, + phase: StringName, + rollback_token: Variant +) -> Dictionary: + if phase == &"rollback": + return _restore_defense_outcome_token(rollback_token) + var validation := _validate_defense_outcome_payload(payload) + if not bool(validation[&"ok"]): + return validation + if phase == &"validate": + return {&"ok": true, &"token": { + &"staff": staff_service.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + }} + if phase != &"apply" or not _defense_outcome_token_is_valid(rollback_token): + return {&"ok": false, &"token": rollback_token, &"error": "Defense outcome apply token is invalid."} + var token: Dictionary = rollback_token + var combatant_results: Array = payload[&"combatant_results"] + for result_value: Variant in combatant_results: + var result: Dictionary = result_value + if StringName(result[&"side"]) != &"DEFENDER": + continue + var staff := staff_service.get_staff(StringName(result[&"actor_id"])) + staff.health = int(result[&"health"]) + staff.fatigue = int(result[&"fatigue"]) + var defense_state := StringName(result[&"state"]) + if defense_state == &"ACTIVE": + staff.transition_to(StaffRuntime.State.AVAILABLE, &"DEFENSE_RELEASED", _defense_operation_minute()) + elif defense_state == &"INCAPACITATED": + staff.transition_to(StaffRuntime.State.INCAPACITATED, &"DEFENSE_INCAPACITATED", _defense_operation_minute()) + elif defense_state == &"RETREATED": + staff.transition_to(StaffRuntime.State.FLEEING, &"DEFENSE_RETREATED", _defense_operation_minute()) + var asset_results: Array = payload[&"asset_results"] + for result_value: Variant in asset_results: + var result: Dictionary = result_value + var updated := facility_service.set_operational_status( + StringName(result[&"asset_id"]), + {&"durability": int(result[&"integrity"])}, + _defense_operation_minute() + ) + if not updated.is_success(): + return {&"ok": false, &"token": token, &"error": updated.message} + var staff_report := staff_service.validate_invariants() + if not bool(staff_report.get(&"ok", false)): + return {&"ok": false, &"token": token, &"error": "Defense outcome violates Staff invariants.", &"details": staff_report} + return {&"ok": true, &"token": token} + +func _validate_defense_outcome_payload(payload: Dictionary) -> Dictionary: + var raid_id := StringName(payload.get(&"raid_id", payload.get("raid_id", ""))) + var resolution_id := StringName(payload.get(&"resolution_id", payload.get("resolution_id", ""))) + var operation_kind := StringName(payload.get(&"operation_kind", payload.get("operation_kind", ""))) + var absolute_minute := int(payload.get(&"absolute_minute", payload.get("absolute_minute", -1))) + var combatants_value: Variant = payload.get(&"combatant_results", payload.get("combatant_results", null)) + var assets_value: Variant = payload.get(&"asset_results", payload.get("asset_results", null)) + var raid := defense_service.get_raid(raid_id) + if raid_id.is_empty() or resolution_id.is_empty() \ + or operation_kind not in DefenseService.VALID_OPERATION_KINDS \ + or absolute_minute != _defense_operation_minute() \ + or not combatants_value is Array or not assets_value is Array \ + or raid.is_empty(): + return {&"ok": false, &"error": "Defense outcome payload root is invalid."} + var expected_combatants: Dictionary = raid[&"combatants"] + var expected_assets: Dictionary = raid[&"assets"] + if combatants_value.size() != expected_combatants.size() \ + or assets_value.size() != expected_assets.size(): + return {&"ok": false, &"error": "Defense outcome does not cover the complete Raid roster."} + var seen_combatants: Dictionary = {} + for value: Variant in combatants_value: + if not value is Dictionary: + return {&"ok": false, &"error": "Defense combatant outcome is malformed."} + var actor_id := StringName(value.get(&"actor_id", value.get("actor_id", ""))) + var side := StringName(value.get(&"side", value.get("side", ""))) + var state := StringName(value.get(&"state", value.get("state", ""))) + var health := int(value.get(&"health", value.get("health", -1))) + var maximum := int(value.get(&"max_health", value.get("max_health", -1))) + var fatigue := int(value.get(&"fatigue", value.get("fatigue", -1))) + if actor_id.is_empty() or seen_combatants.has(actor_id) or not expected_combatants.has(actor_id) \ + or side not in [&"DEFENDER", &"ATTACKER"] \ + or state not in [&"ACTIVE", &"INCAPACITATED", &"RETREATED"] \ + or health < 0 or health > maximum or fatigue < 0 or fatigue > 100 \ + or (health == 0 and state == &"ACTIVE"): + return {&"ok": false, &"error": "Defense combatant outcome values are invalid."} + var expected_combatant: Dictionary = expected_combatants[actor_id] + if side != StringName(expected_combatant[&"side"]) \ + or maximum != int(expected_combatant[&"max_health"]): + return {&"ok": false, &"error": "Defense combatant outcome differs from the Raid roster."} + seen_combatants[actor_id] = true + if side == &"DEFENDER" and (maximum != StaffRuntime.MAX_PSYCHOLOGY_VALUE or not staff_service.has_staff(actor_id)): + return {&"ok": false, &"error": "Defense outcome references invalid Staff."} + var seen_assets: Dictionary = {} + for value: Variant in assets_value: + if not value is Dictionary: + return {&"ok": false, &"error": "Defense asset outcome is malformed."} + var asset_id := StringName(value.get(&"asset_id", value.get("asset_id", ""))) + var integrity := int(value.get(&"integrity", value.get("integrity", -1))) + var maximum := int(value.get(&"max_integrity", value.get("max_integrity", -1))) + if asset_id.is_empty() or seen_assets.has(asset_id) or not expected_assets.has(asset_id) \ + or maximum != FacilityInstance.DEFAULT_DURABILITY \ + or integrity < 0 or integrity > maximum \ + or not facility_service.has_instance(asset_id): + return {&"ok": false, &"error": "Defense outcome references invalid Facility data."} + var expected_asset: Dictionary = expected_assets[asset_id] + if maximum != int(expected_asset[&"max_integrity"]): + return {&"ok": false, &"error": "Defense asset outcome differs from the Raid roster."} + seen_assets[asset_id] = true + return {&"ok": true} + +func _defense_outcome_token_is_valid(token: Variant) -> bool: + return token is Dictionary \ + and token.get(&"staff", null) is Dictionary \ + and token.get(&"facilities", null) is Dictionary \ + and token.get(&"domain_events", null) is Dictionary \ + and token.get(&"id_generator", null) is Dictionary + +func _restore_defense_outcome_token(token: Variant) -> Dictionary: + if not _defense_outcome_token_is_valid(token): + return {&"ok": false, &"error": "Defense outcome rollback token is malformed."} + var staff_ok: bool = staff_service.restore_snapshot(token[&"staff"]) + var facilities_ok: bool = facility_service.restore_snapshot(token[&"facilities"]) + facilities_ok = facility_cleanliness.restore_snapshot(token.get(&"facility_cleanliness", {})) and facilities_ok + var events_ok: bool = domain_events.restore_snapshot(token[&"domain_events"]) + var ids_ok: bool = id_generator.restore_snapshot(token[&"id_generator"]) + return { + &"ok": staff_ok and facilities_ok and events_ok and ids_ok, + &"error": "Defense outcome rollback failed." if not staff_ok or not facilities_ok or not events_ok or not ids_ok else "", + } + +func _execute_event_action_boundary( + action: EventAction, + phase: StringName, + context: Dictionary, + rollback_token: Variant +) -> Dictionary: + if action.type not in [ + EventAction.Type.ADD_LEDGER_ENTRY, + EventAction.Type.ADD_OR_REMOVE_ITEM, + EventAction.Type.CREATE_TASK, + EventAction.Type.CREATE_DEFENSE_RAID, + EventAction.Type.SET_FACILITY_STATE, + EventAction.Type.TELEPORT_ENTITY_FOR_RECOVERY, + ]: + return {&"not_handled": true} + if phase == &"rollback": + return _restore_event_action_token(rollback_token) + var validation := _build_event_defense_request(action, context) if action.type == EventAction.Type.CREATE_DEFENSE_RAID else _validate_event_action(action) + if not bool(validation.get(&"ok", false)) or phase == &"validate": + return validation + var token := _capture_event_action_token() + if action.type == EventAction.Type.CREATE_DEFENSE_RAID: + token[&"defense"] = defense_service.create_snapshot() + var result := _apply_event_action(action, context) + if not bool(result.get(&"ok", false)): + var rollback := _restore_event_action_token(token) + if not bool(rollback.get(&"ok", false)): + result[&"fatal"] = true + result[&"rollback"] = rollback + result[&"error"] = "Event Action failed and rollback failed: %s; %s" % [result.get(&"error", ""), rollback.get(&"error", "")] + return result + result[&"token"] = token + return result + +func _validate_event_action(action: EventAction) -> Dictionary: + match action.type: + EventAction.Type.ADD_LEDGER_ENTRY: + var from_account := StringName(action.payload.get(&"from_account", action.payload.get("from_account", PLAYER_CASH_ACCOUNT))) + var to_account := StringName(action.payload.get(&"to_account", action.payload.get("to_account", OPERATING_EXPENSE_ACCOUNT))) + var amount := int(action.payload.get(&"amount", action.payload.get("amount", 0))) + if amount <= 0 or not economy_service.has_account(from_account) or not economy_service.has_account(to_account): + return {&"ok": false, &"error": "Ledger Action has invalid accounts or amount."} + if not economy_service.account_allows_negative(from_account) and economy_service.get_balance(from_account) < amount: + return {&"ok": false, &"error": "Ledger Action source cannot fund the amount."} + EventAction.Type.ADD_OR_REMOVE_ITEM: + var inventory_id := StringName(action.payload.get(&"inventory_id", action.payload.get("inventory_id", ""))) + var item_id := StringName(action.payload.get(&"item_id", action.payload.get("item_id", ""))) + var delta := int(action.payload.get(&"quantity_delta", action.payload.get("quantity_delta", 0))) + if inventory_id.is_empty() or item_id.is_empty() or delta == 0: + return {&"ok": false, &"error": "Inventory Action requires inventory, item and non-zero delta."} + if delta < 0 and inventory_service.available_quantity(inventory_id, item_id) < -delta: + return {&"ok": false, &"error": "Inventory Action stock is unavailable."} + EventAction.Type.CREATE_TASK: + if StringName(action.payload.get(&"task_type", action.payload.get("task_type", ""))).is_empty(): + return {&"ok": false, &"error": "CREATE_TASK requires task_type."} + EventAction.Type.SET_FACILITY_STATE: + var facility_id := StringName(action.payload.get(&"facility_id", action.payload.get("facility_id", ""))) + var conditions_value: Variant = action.payload.get(&"conditions", action.payload.get("conditions", null)) + if not facility_service.has_instance(facility_id) or not conditions_value is Dictionary: + return {&"ok": false, &"error": "Facility Action target or conditions are invalid."} + var defense_owner: StringName = _defense_lock_owner(facility_id, &"ASSET") + if not defense_owner.is_empty() \ + and (conditions_value.has(&"durability") or conditions_value.has("durability")): + return {&"ok": false, &"error": "Event Action cannot mutate Defense-owned Facility durability."} + EventAction.Type.TELEPORT_ENTITY_FOR_RECOVERY: + var entity_id := StringName(action.payload.get(&"entity_id", action.payload.get("entity_id", ""))) + var cell_value: Variant = _parse_world_cell( + action.payload.get(&"cell", action.payload.get("cell", null)) + ) + if not _event_actor_exists(entity_id) or cell_value == null: + return {&"ok": false, &"error": "Recovery teleport target is invalid."} + var target_cell: Vector3i = cell_value + var traffic := path_service.get_cell_traffic(target_cell) + var actor_id := ( + _guest_path_actor_id(entity_id) + if guest_service.has_guest(entity_id) + else _staff_path_actor_id(entity_id) + ) + if traffic.is_empty() or bool(traffic.get(&"temporary_block", false)) \ + or not path_service.has_actor_projection(actor_id): + return {&"ok": false, &"error": "Recovery teleport requires a projected actor and an unblocked walkable target."} + return {&"ok": true} + +func _apply_event_action(action: EventAction, context: Dictionary) -> Dictionary: + var instance_id := StringName(context.get(&"event_instance_id", "")) + match action.type: + EventAction.Type.CREATE_DEFENSE_RAID: + return _apply_event_defense_raid(action, context) + EventAction.Type.ADD_LEDGER_ENTRY: + var from_account := StringName(action.payload.get(&"from_account", action.payload.get("from_account", PLAYER_CASH_ACCOUNT))) + var to_account := StringName(action.payload.get(&"to_account", action.payload.get("to_account", OPERATING_EXPENSE_ACCOUNT))) + var amount := int(action.payload.get(&"amount", action.payload.get("amount", 0))) + var result := economy_service.transfer( + from_account, to_account, amount, _runtime_event_minute(), + &"EVENT_ACTION", instance_id, + StringName("event.action.%s.%s" % [instance_id, action.action_id]) + ) + return {&"ok": result.is_success(), &"error": result.message} + EventAction.Type.ADD_OR_REMOVE_ITEM: + var inventory_id := StringName(action.payload.get(&"inventory_id", action.payload.get("inventory_id", ""))) + var item_id := StringName(action.payload.get(&"item_id", action.payload.get("item_id", ""))) + var delta := int(action.payload.get(&"quantity_delta", action.payload.get("quantity_delta", 0))) + if delta > 0: + var added := inventory_service.add_stack(inventory_id, item_id, delta, 100, -1, _runtime_event_minute()) + return {&"ok": bool(added.get(&"ok", false)), &"error": added.get(&"message", "")} + var reserved := inventory_service.reserve_item( + inventory_id, item_id, -delta, instance_id, &"event_action", + _runtime_event_minute(), _runtime_event_minute() + 1, + StringName("event.item.reserve.%s.%s" % [instance_id, action.action_id]) + ) + if not bool(reserved.get(&"ok", false)): + return {&"ok": false, &"error": reserved.get(&"message", "Item reservation failed.")} + var consumed := inventory_service.consume_reservations( + _name_array(reserved.get(&"reservation_ids", [])), + StringName("event.item.consume.%s.%s" % [instance_id, action.action_id]), + _runtime_event_minute() + ) + return {&"ok": bool(consumed.get(&"ok", false)), &"error": consumed.get(&"message", "")} + EventAction.Type.CREATE_TASK: + var raw_options: Variant = action.payload.get(&"options", action.payload.get("options", {})) + var options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {} + var created := staff_service.create_task( + StringName(action.payload.get(&"task_type", action.payload.get("task_type", ""))), + int(action.payload.get(&"priority", action.payload.get("priority", 50))), + _runtime_event_minute(), + options, + StringName(action.payload.get(&"task_id", action.payload.get("task_id", ""))) + ) + return {&"ok": created.is_success(), &"error": created.message} + EventAction.Type.SET_FACILITY_STATE: + var updated := facility_service.set_operational_status( + StringName(action.payload.get(&"facility_id", action.payload.get("facility_id", ""))), + action.payload.get(&"conditions", action.payload.get("conditions", {})), + _runtime_event_minute() + ) + return {&"ok": updated.is_success(), &"error": updated.message} + EventAction.Type.TELEPORT_ENTITY_FOR_RECOVERY: + var entity_id := StringName(action.payload.get(&"entity_id", action.payload.get("entity_id", ""))) + var cell: Vector3i = _parse_world_cell(action.payload.get(&"cell", action.payload.get("cell", null))) + var guest := guest_service.get_guest(entity_id) + var actor_id: StringName + var moved := false + if guest != null: + actor_id = _guest_path_actor_id(entity_id) + moved = guest_service.record_path_success( + entity_id, cell, _runtime_event_minute() + ) + else: + var staff := staff_service.get_staff(entity_id) + actor_id = _staff_path_actor_id(entity_id) + staff.current_cell = cell + moved = true + if not moved or not path_service.project_actor_position( + actor_id, cell, _runtime_event_minute() + ): + return {&"ok": false, &"error": "Recovery teleport could not commit its Path projection."} + _movement_credits[actor_id] = { + &"credit": 0, + &"updated_at": _runtime_event_minute(), + } + _publish_actor_event(&"ENTITY_RECOVERY_TELEPORTED", &"event_service", [entity_id, actor_id], { + &"cell": cell, + &"path_actor_id": actor_id, + }) + return {&"ok": true} + return {&"ok": false, &"error": "Unsupported Event Action."} + +func _capture_event_action_token() -> Dictionary: + return { + &"economy": economy_service.create_snapshot(), + &"facility_upkeep": facility_upkeep.create_snapshot(), + &"upkeep_settlement": upkeep_settlement.create_snapshot(), + &"game_state": _state.create_snapshot(), + &"inventory": inventory_service.create_snapshot(), + &"staff": staff_service.create_snapshot(), + &"facilities": facility_service.create_snapshot(), + &"facility_cleanliness": facility_cleanliness.create_snapshot(), + &"guests": guest_service.create_snapshot(), + &"path": path_service.create_snapshot(), + &"elevators": elevators.create_snapshot(), + &"legacy_stairs": legacy_stairs.create_snapshot(), + &"movement_credits": _movement_credits.duplicate(true), + &"domain_events": domain_events.create_snapshot(), + &"id_generator": id_generator.create_snapshot(), + } + +func _restore_event_action_token(token: Variant) -> Dictionary: + if not token is Dictionary: + return {&"ok": false, &"error": "Event rollback token is malformed."} + # Every participant must be asked to restore even if an earlier participant + # reports an error; short-circuiting here would leave a half-rolled-back world. + var economy_ok: bool = economy_service.restore_snapshot(token.get(&"economy", {})) + var state_ok: bool = _state.restore_snapshot(token.get(&"game_state", {})) + var inventory_ok: bool = inventory_service.restore_snapshot(token.get(&"inventory", {})) + var staff_ok: bool = staff_service.restore_snapshot(token.get(&"staff", {})) + var facilities_ok: bool = facility_service.restore_snapshot(token.get(&"facilities", {})) + facilities_ok = facility_cleanliness.restore_snapshot(token.get(&"facility_cleanliness", {})) and facilities_ok + var guests_ok: bool = guest_service.restore_snapshot(token.get(&"guests", {})) + var path_ok: bool = path_service.restore_snapshot(token.get(&"path", {})) + path_ok = elevators.restore_snapshot(token.get(&"elevators", {})) and path_ok + path_ok = legacy_stairs.restore_snapshot(token.get(&"legacy_stairs", {})) and path_ok + var credits_value: Variant = token.get(&"movement_credits", null) + var credits_ok := credits_value is Dictionary + if credits_ok: + _movement_credits = (credits_value as Dictionary).duplicate(true) + var defense_ok := true + if token.has(&"defense"): + # This creates PREPARING incidents only; rollback must not reset another + # raid's pre-existing same-tick automatic/manual attempt guard. + defense_ok = token[&"defense"] is Dictionary and defense_service.restore_snapshot(token[&"defense"]) + var events_ok: bool = domain_events.restore_snapshot(token.get(&"domain_events", {})) + var ids_ok: bool = id_generator.restore_snapshot(token.get(&"id_generator", {})) + var ok: bool = economy_ok and state_ok and inventory_ok and staff_ok \ + and facilities_ok and guests_ok and path_ok and credits_ok and defense_ok and events_ok and ids_ok + return {&"ok": ok, &"error": "Event Action rollback failed." if not ok else ""} + +func _reserve_event_cost(cost: Dictionary, context: Dictionary) -> Dictionary: + var normalized: Dictionary = {} + for raw_resource: Variant in cost: + var resource_id := StringName(raw_resource) + var amount := int(cost[raw_resource]) + if resource_id.is_empty() or amount < 0: + return {&"ok": false, &"error": "Event Choice cost is invalid."} + normalized[resource_id] = amount + var economy_before := economy_service.create_snapshot() + var state_before: Dictionary = _state.create_snapshot() + var ids_before := id_generator.create_snapshot() + var instance_id := StringName(context.get(&"event_instance_id", "")) + var reservation_id: StringName = &"" + for amount: int in normalized.values(): + if amount > 0: + if id_generator.get_counter(&"event_cost") >= StableIdGenerator.MAX_COUNTER: + return {&"ok": false, &"error": "Event cost reservation IDs are exhausted."} + reservation_id = id_generator.next_id(&"event_cost") + break + var escrow_account := StringName("EVENT_ESCROW:%s" % instance_id) + var reservation := {&"event_instance_id": instance_id, &"cost": normalized, &"escrow_account": escrow_account} + if not reservation_id.is_empty(): + reservation[&"reservation_id"] = reservation_id + var gold := int(normalized.get(&"gold", 0)) + if gold > 0: + if not economy_service.has_account(escrow_account): + economy_service.register_account(escrow_account) + var transfer := economy_service.transfer( + PLAYER_CASH_ACCOUNT, escrow_account, gold, _runtime_event_minute(), + &"EVENT_COST_RESERVED", instance_id, + _event_cost_ledger_key(reservation, &"reserve") + ) + if not transfer.is_success(): + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + id_generator.restore_snapshot(ids_before) + return {&"ok": false, &"error": transfer.message} + var other_costs := normalized.duplicate(true) + other_costs.erase(&"gold") + if not other_costs.is_empty() and not _state.spend(other_costs): + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + id_generator.restore_snapshot(ids_before) + return {&"ok": false, &"error": "Event Choice resources are unavailable."} + return {&"ok": true, &"token": reservation} + +func _release_event_cost(token: Variant, _context: Dictionary) -> Dictionary: + if token is Dictionary and token.is_empty(): + return {&"ok": true} + if not token is Dictionary or not token.get(&"cost", null) is Dictionary: + return {&"ok": false, &"error": "Event Cost release token is malformed."} + var cost: Dictionary = token[&"cost"] + var instance_id := StringName(token.get(&"event_instance_id", "")) + var escrow_account := StringName(token.get(&"escrow_account", "")) + var gold := int(cost.get(&"gold", 0)) + if gold > 0: + var released := economy_service.transfer( + escrow_account, PLAYER_CASH_ACCOUNT, gold, _runtime_event_minute(), + &"EVENT_COST_RELEASED", instance_id, + _event_cost_ledger_key(token, &"release") + ) + if not released.is_success(): + return {&"ok": false, &"error": released.message} + for raw_resource: Variant in cost: + var resource_id := StringName(raw_resource) + if resource_id != &"gold": + _state.add_resource(resource_id, int(cost[raw_resource])) + return {&"ok": true} + +func _commit_event_cost(token: Variant, _context: Dictionary) -> Dictionary: + if token is Dictionary and token.is_empty(): + return {&"ok": true} + if not token is Dictionary or not token.get(&"cost", null) is Dictionary: + return {&"ok": false, &"error": "Event Cost commit token is malformed."} + var cost: Dictionary = token[&"cost"] + var gold := int(cost.get(&"gold", 0)) + if gold <= 0: + return {&"ok": true} + var instance_id := StringName(token.get(&"event_instance_id", "")) + var committed := economy_service.transfer( + StringName(token.get(&"escrow_account", "")), OPERATING_EXPENSE_ACCOUNT, + gold, _runtime_event_minute(), &"EVENT_COST_COMMITTED", instance_id, + _event_cost_ledger_key(token, &"commit") + ) + return {&"ok": committed.is_success(), &"error": committed.message} + +func _event_cost_ledger_key(token: Dictionary, operation: StringName) -> StringName: + var reservation_id := StringName(token.get(&"reservation_id", "")) + if not reservation_id.is_empty(): + return StringName("event.reserved_cost.%s.%s" % [operation, reservation_id]) + # Existing pending save tokens keep the original ledger operation identity. + return StringName("event.cost.%s.%s" % [operation, token.get(&"event_instance_id", "")]) + +func _on_relationship_threshold_candidate(candidate: Dictionary) -> void: + var candidate_id := StringName(candidate.get(&"candidate_id", "")) + if candidate_id.is_empty() or event_service.get_instance(candidate_id) != null: + return + event_service.enqueue_candidate( + &"relationship.threshold", + candidate.get(&"actor_ids", []), + int(candidate.get(&"created_at", _runtime_event_minute())), + { + &"event_instance_id": candidate_id, + &"deduplication_key": StringName(candidate.get(&"deduplication_key", candidate_id)), + &"context": {&"relationship_candidate": candidate.duplicate(true)}, + } + ) + +func _route_lock_index(value: Variant) -> int: + if value is int: + return value if value >= 0 and value < RelationshipState.RouteLock.keys().size() else -1 + return RelationshipState.RouteLock.keys().find(String(value).to_upper()) + + +func _validate_construction_facility_crosslinks( + world: WorldService, + construction: ConstructionService, + facilities: FacilityService, + projector: FacilityInfrastructureProjector = null +) -> bool: + for construction_facility: Dictionary in construction.get_facilities(): + var instance_id := StringName(construction_facility.get(&"instance_id", &"")) + var definition_id := StringName(construction_facility.get(&"definition_id", &"")) + var definition := definition_registry.get_facility(definition_id) + if instance_id.is_empty() or definition == null: + return false + if _facility_definition_is_schema_proxy(definition): + if facilities.has_instance(instance_id): + return false + if _facility_definition_is_supported_infrastructure_proxy(definition): + if projector == null or not projector.has_projection(instance_id): + return false + elif projector != null and projector.has_projection(instance_id): + return false + for cell: Vector3i in construction_facility.get(&"occupied_cells", []): + if world.get_occupant(cell) != instance_id \ + or world.get_occupant_kind(cell) != &"facility": + return false + continue + var operational := facilities.get_instance(instance_id) + if operational == null or (projector != null and projector.has_projection(instance_id)): + return false + if operational.definition_id != StringName( + construction_facility.get(&"definition_id", &"") + ) or operational.origin != construction_facility.get(&"origin", Vector3i.ZERO): + return false + var expected_cells: Dictionary = {} + for cell: Vector3i in construction_facility.get(&"occupied_cells", []): + expected_cells[cell] = true + var actual_cells: Dictionary = {} + for cell: Vector3i in operational.occupied_cells: + actual_cells[cell] = true + if expected_cells != actual_cells: + return false + for cell: Vector3i in expected_cells: + if world.get_occupant(cell) != instance_id \ + or world.get_occupant_kind(cell) != &"facility": + return false + return true + + +func _facility_definition_is_schema_proxy(definition: Variant) -> bool: + return definition is FacilityDefinition and &"schema_facility_proxy" in definition.tags + + +func _facility_definition_is_supported_infrastructure_proxy(definition: Variant) -> bool: + return _facility_definition_is_schema_proxy(definition) \ + and definition.id in FacilityInfrastructureProjector.SUPPORTED_KINDS + + +func _facility_definition_is_unsupported_vertical_proxy(definition: Variant) -> bool: + return _facility_definition_is_schema_proxy(definition) \ + and definition.id in FacilityInfrastructureProjector.UNSUPPORTED_VERTICAL_KINDS + + +func _migrate_legacy_infrastructure_proxies( + construction: ConstructionService, + facilities: FacilityService, + projector: FacilityInfrastructureProjector +) -> bool: + if construction == null or facilities == null or projector == null: + return false + for instance: Dictionary in construction.get_facilities(): + var instance_id := StringName(instance.get(&"instance_id", &"")) + var definition := definition_registry.get_facility( + StringName(instance.get(&"definition_id", &"")) + ) + if instance_id.is_empty() or definition == null: + return false + if not _facility_definition_is_schema_proxy(definition): + continue + if facilities.has_instance(instance_id) \ + and not facilities.unregister_instance(instance_id).is_success(): + return false + if _facility_definition_is_unsupported_vertical_proxy(definition): + continue + if not _facility_definition_is_supported_infrastructure_proxy(definition): + return false + var projected := projector.project_completed_facility( + StringName("runtime.migrate.v6:%s" % instance_id), + definition, + instance + ) + if not projected.is_success(): + return false + return true + + +func _validate_infrastructure_crosslinks( + world: WorldService, + path: PathService, + construction: ConstructionService, + _resource_state: Variant, + excavation: ExcavationService, + spatial: SpatialSubslotService, + adapter: RouteSubslotPathAdapter, + projector: FacilityInfrastructureProjector, + require_minute_alignment := true +) -> bool: + if world == null or path == null or construction == null or excavation == null \ + or spatial == null or adapter == null or projector == null: + return false + # An active projector validates its bound Spatial and RouteAdapter services + # itself. Reuse that composed check only for these exact dependencies. + # Quarantine intentionally suppresses its live dependency check, so retain + # the independent validations on that path (and for a different binding). + var composed_dependencies := projector.is_bound_to(adapter, spatial, path) and not projector.is_quarantined() + if not adapter.is_bound_to(spatial, path) \ + or (not composed_dependencies and ( + not bool(spatial.validate_invariants().get(&"ok", false)) + or not bool(adapter.validate_invariants().get(&"ok", false)))) \ + or not bool(projector.validate_invariants().get(&"ok", false)) \ + or not bool(excavation.validate_invariants().get(&"ok", false)) \ + or (require_minute_alignment \ + and excavation.current_minute != construction.current_minute) \ + or not _same_vector3i_set( + adapter.get_base_walkable_cells(false), world.get_walkable_cells(false) + ) \ + or not _same_vector3i_set( + adapter.get_projected_route_cells(), spatial.get_route_cells() + ) \ + or not path.matches_passable_cells(adapter.get_projected_walkable_cells()): + return false + var expected_projection_ids: Dictionary = {} + for instance: Dictionary in construction.get_facilities(): + var instance_id := StringName(instance.get(&"instance_id", &"")) + var definition_id := StringName(instance.get(&"definition_id", &"")) + var definition := definition_registry.get_facility(definition_id) + if instance_id.is_empty() or definition == null: + return false + if not _facility_definition_is_schema_proxy(definition): + if projector.has_projection(instance_id): + return false + continue + if _facility_definition_is_unsupported_vertical_proxy(definition): + if projector.has_projection(instance_id): + return false + continue + if not _facility_definition_is_supported_infrastructure_proxy(definition): + return false + expected_projection_ids[instance_id] = true + var projection := projector.get_projection(instance_id) + if projection.is_empty() \ + or StringName(projection.get(&"definition_id", &"")) != definition_id \ + or StringName(projection.get(&"source_job_id", &"")) \ + != StringName(instance.get(&"source_job_id", &"")) \ + or projection.get(&"origin", null) != instance.get(&"origin", null) \ + or int(projection.get(&"rotation", -1)) != int(instance.get(&"rotation", -2)) \ + or int(projection.get(&"layer", -1)) != int(instance.get(&"layer", -2)) \ + or not _same_vector3i_set( + projection.get(&"cells", []), instance.get(&"occupied_cells", []) + ): + return false + var actual_projection_ids: Dictionary = {} + for instance_id: StringName in projector.get_projection_ids(): + if actual_projection_ids.has(instance_id): + return false + actual_projection_ids[instance_id] = true + return actual_projection_ids == expected_projection_ids + + +func _same_vector3i_set(first: Variant, second: Variant) -> bool: + if not first is Array or not second is Array or first.size() != second.size(): + return false + var expected: Dictionary = {} + for value: Variant in first: + if not value is Vector3i or expected.has(value): + return false + expected[value] = true + for value: Variant in second: + if not value is Vector3i or not expected.has(value): + return false + expected.erase(value) + return expected.is_empty() + + +func _validate_runtime_crosslinks( + facilities: FacilityService, + guests: GuestService, + economy: EconomyService, + inventory: InventoryService, + staff: StaffService, + absolute_minute: int, + staffing_projection_enabled: bool +) -> bool: + if absolute_minute < 0 \ + or facilities.current_minute != absolute_minute \ + or guests.current_minute != absolute_minute \ + or inventory.current_minute != absolute_minute \ + or staff.current_minute != absolute_minute: + return false + for assignment: Dictionary in staff.get_work_assignments(): + var facility_id := StringName(assignment[&"facility_id"]) + if facility_id.is_empty(): + continue + var assigned_facility := facilities.get_instance(facility_id) + if assigned_facility == null: + return false + var assigned_staff := staff.get_staff(StringName(assignment[&"staff_id"])) + var definition := definition_registry.get_facility(assigned_facility.definition_id) + if assigned_staff == null or definition == null or definition.staff_max <= 0 \ + or (not _staff_role_matches_facility(assigned_staff.role_id, definition) and not _is_anri_manager(assigned_staff)): + return false + var queued_links: Dictionary = {} + var service_links: Dictionary = {} + for facility: FacilityInstance in facilities.get_instances(): + if staffing_projection_enabled: + for staff_id: StringName in facility.active_staff_ids: + var active_staff := staff.get_staff(staff_id) + if active_staff == null \ + or active_staff.assigned_facility_id != facility.instance_id \ + or (active_staff.state != StaffRuntime.State.AVAILABLE and not CleaningBridge.is_deployed(active_staff, facility, staff)) \ + or _is_anri_manager(active_staff): + return false + for request: ServiceRequest in facilities.get_queue(facility.instance_id): + if not _reservation_references_are_valid( + request.reserved_inventory_ids, request.request_id, inventory + ): + return false + for guest_id: StringName in request.guest_ids: + if not guests.has_guest(guest_id): + continue + var guest := guests.get_guest(guest_id) + if guest.state != GuestRuntime.State.QUEUING \ + or guest.queue_request_id != request.request_id \ + or guest.target_facility_id != facility.instance_id: + return false + queued_links[guest_id] = request.request_id + for service: ServiceInstance in facilities.get_active_services(facility.instance_id): + if not _reservation_references_are_valid( + service.inventory_reservations, service.request_id, inventory + ): + return false + for guest_id: StringName in service.guest_ids: + if not guests.has_guest(guest_id): + continue + var guest := guests.get_guest(guest_id) + if guest.state != GuestRuntime.State.RECEIVING_SERVICE \ + or guest.current_service_id != service.service_id \ + or guest.target_facility_id != facility.instance_id: + return false + service_links[guest_id] = service.service_id + for guest: GuestRuntime in guests.get_guests(): + if not guest.queue_request_id.is_empty() \ + and queued_links.get(guest.guest_id, &"") != guest.queue_request_id: + return false + if not guest.current_service_id.is_empty() \ + and service_links.get(guest.guest_id, &"") != guest.current_service_id: + return false + var account_id := _guest_wallet_account(guest.guest_id) + if not economy.has_account(account_id) \ + or economy.get_balance(account_id) != guest.wallet_gold: + return false + for task: StaffTask in staff.get_tasks(): + if not _reservation_references_are_valid( + task.reservation_ids, task.task_id, inventory + ): + return false + return true + +func _validate_authority_economy_crosslinks( + authority: AuthorityService, + economy: EconomyService, + absolute_minute: int +) -> bool: + if authority == null or authority.current_minute != absolute_minute \ + or not bool(authority.validate_invariants().get(&"ok", false)) \ + or not economy.has_account(AUTHORITY_FINE_ACCOUNT): + return false + var authority_snapshot := authority.create_snapshot() + var raw_resolutions: Variant = authority_snapshot.get(&"applied_resolutions", null) + if not raw_resolutions is Array: + return false + var expected_fine_balance := 0 + for raw_resolution: Variant in raw_resolutions: + if not raw_resolution is Dictionary \ + or not raw_resolution.get(&"payload", null) is Dictionary: + return false + var resolution_id := StringName(raw_resolution.get(&"resolution_id", "")) + var payload: Dictionary = raw_resolution[&"payload"] + var inspection_id := StringName(payload.get(&"inspection_id", "")) + var fine_amount := int(payload.get(&"fine_amount", -1)) + if resolution_id.is_empty() or inspection_id.is_empty() or fine_amount < 0: + return false + expected_fine_balance += fine_amount + if fine_amount == 0: + continue + var transaction_id := economy.get_transaction_id_for_idempotency_key( + _authority_resolution_idempotency_key(resolution_id) + ) + if transaction_id.is_empty() or not _authority_fine_transaction_matches( + economy, + transaction_id, + inspection_id, + fine_amount + ): + return false + return economy.get_balance(AUTHORITY_FINE_ACCOUNT) == expected_fine_balance + +func _validate_live_defense_crosslinks() -> bool: + return _validate_defense_crosslinks( + defense_service, + staff_service, + facility_service, + _defense_operation_minute() + ) + +func _validate_defense_crosslinks( + defense: DefenseService, + staff: StaffService, + facilities: FacilityService, + absolute_minute: int +) -> bool: + if defense == null or staff == null or facilities == null \ + or absolute_minute < 0 or defense.current_minute != absolute_minute \ + or not bool(defense.validate_invariants().get(&"ok", false)): + return false + var defender_owners: Dictionary = {} + var asset_owners: Dictionary = {} + for raid_id: StringName in defense.get_raid_ids(): + var raid := defense.get_raid(raid_id) + if raid.is_empty(): + return false + var state := int(raid.get(&"state", -1)) + var terminal := state in DefenseService.TERMINAL_STATES + var preparing := state == DefenseService.RaidState.PREPARING + var combatants_value: Variant = raid.get(&"combatants", null) + var assets_value: Variant = raid.get(&"assets", null) + if not combatants_value is Dictionary or not assets_value is Dictionary: + return false + var combatants: Dictionary = combatants_value + for actor_id: StringName in _sorted_name_keys(combatants): + var combatant_value: Variant = combatants[actor_id] + if not combatant_value is Dictionary: + return false + var combatant: Dictionary = combatant_value + if StringName(combatant.get(&"side", &"")) != &"DEFENDER": + continue + if not terminal: + if defender_owners.has(actor_id): + return false + defender_owners[actor_id] = raid_id + if int(combatant.get(&"max_health", -1)) != StaffRuntime.MAX_PSYCHOLOGY_VALUE \ + or int(combatant.get(&"initial_health", -1)) != StaffRuntime.MAX_PSYCHOLOGY_VALUE: + return false + # A terminal Raid is historical. Its reconciled Staff may later heal, + # work elsewhere, leave the roster, or enter another Raid; requiring the + # old outcome to remain a permanent live mirror would make future saves + # unrestorable. Capacity baselines remain self-contained above. + if terminal: + continue + var linked_staff := staff.get_staff(actor_id) + if linked_staff == null or linked_staff.state != StaffRuntime.State.UNAVAILABLE \ + or not linked_staff.current_task_id.is_empty(): + return false + if preparing and ( + int(combatant.get(&"health", -1)) != linked_staff.health + or int(combatant.get(&"fatigue", -1)) != linked_staff.fatigue + ): + return false + var assets: Dictionary = assets_value + for asset_id: StringName in _sorted_name_keys(assets): + var asset_value: Variant = assets[asset_id] + if not asset_value is Dictionary: + return false + var asset: Dictionary = asset_value + if not terminal: + if asset_owners.has(asset_id): + return false + asset_owners[asset_id] = raid_id + if int(asset.get(&"max_integrity", -1)) != FacilityInstance.DEFAULT_DURABILITY \ + or int(asset.get(&"initial_integrity", -1)) != FacilityInstance.DEFAULT_DURABILITY: + return false + # Terminal assets are historical for the same reason as terminal Staff: + # the live Facility can subsequently be repaired, reused, or demolished. + if terminal: + continue + var facility := facilities.get_instance(asset_id) + if facility == null: + return false + if preparing and int(asset.get(&"integrity", -1)) != facility.durability: + return false + return true + +func _defense_lock_owner( + external_id: StringName, + lock_kind: StringName, + excluded_raid_id: StringName = &"" +) -> StringName: + if defense_service == null or external_id.is_empty() \ + or lock_kind not in [&"DEFENDER", &"ASSET"]: + return &"" + for raid_id: StringName in defense_service.get_raid_ids(): + if raid_id == excluded_raid_id: + continue + var raid := defense_service.get_raid(raid_id) + if raid.is_empty() or int(raid.get(&"state", -1)) in DefenseService.TERMINAL_STATES: + continue + if lock_kind == &"DEFENDER": + var combatants_value: Variant = raid.get(&"combatants", {}) + if not combatants_value is Dictionary or not combatants_value.has(external_id): + continue + var combatant_value: Variant = combatants_value[external_id] + if combatant_value is Dictionary \ + and StringName(combatant_value.get(&"side", &"")) == &"DEFENDER": + return raid_id + else: + var assets_value: Variant = raid.get(&"assets", {}) + if assets_value is Dictionary and assets_value.has(external_id): + return raid_id + return &"" + +func _reservation_references_are_valid( + reservation_ids: Array[StringName], + requester_id: StringName, + inventory: InventoryService +) -> bool: + for reservation_id: StringName in reservation_ids: + var reservation := inventory.get_reservation(reservation_id) + if reservation == null or reservation.requester_id != requester_id: + return false + return true + +func _advance_mana(absolute_minute: int) -> void: + if _operations_tick_blocked: + return + var infrastructure_preflight := _preflight_proxy_completions(absolute_minute) + if not bool(infrastructure_preflight.get(&"ok", false)): + _latch_infrastructure_failure( + StringName(infrastructure_preflight.get( + &"code", &"INFRASTRUCTURE_PREFLIGHT_FAILED" + )), + absolute_minute, + String(infrastructure_preflight.get( + &"reason", "Infrastructure completion preflight failed." + )), + infrastructure_preflight.get(&"details", {}) + ) + return + var report := mana_network_service.advance_one_minute(absolute_minute) + # Finite reserve is an additional gate, even between network evaluations and + # for zero-demand facilities. The network remains the local supply authority. + preload("res://scripts/mana/mana_power_projection.gd").apply( + facility_service, mana_network_service, int(_state.get_resource(&"mana")), absolute_minute + ) + for change: Dictionary in report.get(&"state_changes", []): + var consumer_id := StringName(change.get(&"consumer_id", "")) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"MANA_STATE_CHANGED", + absolute_minute, + &"mana_network_service", + [consumer_id], + change, + 0 + )) + +func _on_facility_completed(instance: Dictionary) -> void: + # The staged Runtime boundary has already projected/registered this Facility + # and committed its DomainEvents before Construction releases raw signals. + if _construction_committing_notifications: + return + var instance_id := StringName(instance.get(&"instance_id", &"")) + var definition := definition_registry.get_facility( + StringName(instance.get(&"definition_id", &"")) + ) + if instance_id.is_empty() or definition == null: + _latch_infrastructure_failure( + &"INVALID_COMPLETED_FACILITY", + _runtime_event_minute(), + "Construction emitted an invalid completed Facility.", + {&"instance_id": instance_id} + ) + return + if _facility_definition_is_schema_proxy(definition): + if not _facility_definition_is_supported_infrastructure_proxy(definition): + _latch_infrastructure_failure( + &"UNSUPPORTED_VERTICAL_TOPOLOGY", + _runtime_event_minute(), + "An unsupported vertical proxy reached Construction completion.", + {&"instance_id": instance_id, &"definition_id": definition.id} + ) + return + var projection_request_id := StringName( + "runtime.complete:%s" % String(instance.get(&"source_job_id", instance_id)) + ) + var projected := facility_infrastructure_projector.project_completed_facility( + projection_request_id, + definition, + instance + ) + if not projected.is_success(): + _latch_infrastructure_failure( + &"FACILITY_INFRASTRUCTURE_PROJECTION_FAILED", + _runtime_event_minute(), + projected.message, + projected.details + ) + return + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"FACILITY_INFRASTRUCTURE_PROJECTED", + _runtime_event_minute(), + &"facility_infrastructure_projector", + [instance_id], + projected.details.duplicate(true), + 0 + )) + else: + _register_facility_mana_consumer(instance) + _register_operational_facility(instance) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"FACILITY_COMPLETED", + _runtime_event_minute(), + &"construction_service", + [instance_id], + instance, + 0 + )) + + +func _on_excavation_completed(report: Dictionary) -> void: + var job_id := StringName(report.get(&"job_id", &"")) + if job_id.is_empty(): + return + var synchronized := route_subslot_path_adapter.synchronize_projection( + StringName("runtime.excavation:%s" % job_id), + world_service.get_walkable_cells() + ) + if not synchronized.is_success(): + _latch_infrastructure_failure( + &"EXCAVATION_ROUTE_SYNCHRONIZATION_FAILED", + int(report.get(&"completed_at", _runtime_event_minute())), + synchronized.message, + synchronized.details + ) + return + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"EXCAVATION_COMPLETED", + int(report.get(&"completed_at", _runtime_event_minute())), + &"excavation_service", + [job_id], + report.duplicate(true), + 0 + )) + +func _on_facility_demolished(instance_id: StringName, refund: Dictionary) -> void: + if not mana_network_service.get_node(instance_id).is_empty(): + mana_network_service.unregister_node(instance_id) + if facility_service.has_instance(instance_id): + facility_service.unregister_instance(instance_id) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + &"FACILITY_DEMOLISHED", + _runtime_event_minute(), + &"construction_service", + [instance_id], + {&"refund": refund}, + 0 + )) + +func _on_ledger_transaction_posted(transaction_id: StringName, _entries: Array) -> void: + if _operations_flushing_economy_notifications.has(transaction_id): + return + if _state != null: + _state.set_resource(&"gold", economy_service.get_balance(PLAYER_CASH_ACCOUNT)) + + +func get_mvp_content_report() -> Dictionary: + return mvp_content_report.duplicate(true) + + +func get_mvp_guest_definition_ids() -> Array[StringName]: + var result: Array[StringName] = [] + for definition: GuestDefinition in mvp_content_catalog.build_all_guest_definitions(): + result.append(definition.guest_type_id) + return result + + +func get_mvp_staff_candidate_ids() -> Array[StringName]: + return mvp_content_catalog.get_staff_candidate_ids() + + +func get_mvp_staff_candidate_payload(candidate_id: StringName) -> Dictionary: + return mvp_content_catalog.staff_hire_payload(candidate_id).duplicate(true) + + +## Read-only presentation data for the hiring screen. The validated catalog +## remains authoritative and the UI never receives a mutable reference to it. +func get_mvp_staff_candidate_summaries() -> Array[Dictionary]: + var summaries: Array[Dictionary] = [] + for candidate_id: StringName in mvp_content_catalog.get_recruitable_staff_ids(): + var entry := mvp_content_catalog.get_recruitment_entry(candidate_id) + var payload := mvp_content_catalog.staff_hire_payload(candidate_id) + if entry.is_empty() or payload.is_empty(): + continue + var options_value: Variant = payload.get(&"options", {}) + var options: Dictionary = options_value if options_value is Dictionary else {} + var skills_value: Variant = options.get(&"skills", {}) + var skills: Dictionary = skills_value if skills_value is Dictionary else {} + summaries.append({ + &"candidate_id": candidate_id, + &"display_name": String(entry.get(&"display_name", candidate_id)), + &"age": int(payload.get(&"age", 0)), + &"role_id": StringName(payload.get(&"role_id", &"")), + &"daily_wage": int(payload.get(&"daily_wage", 0)), + &"signing_cost": int(payload.get(&"signing_cost", 0)), + &"preferred_shift": StringName(payload.get(&"preferred_shift", &"any")), + &"skills": skills.duplicate(true), + &"hired": _hired_staff_candidate_ids.has(candidate_id), + &"unique": candidate_id == &"heroine_anri", + }) + return summaries + + +## Defensive presentation snapshot for the Staff management panel. Planned +## assignment remains visible at night/off-duty even when the active link clears. +func get_staff_management_report() -> Dictionary: + var rows: Array[Dictionary] = [] + for staff: StaffRuntime in staff_service.get_staff_members(): + var entry := mvp_content_catalog.get_recruitment_entry(staff.staff_id) + var plan := staff_service.get_work_assignment(staff.staff_id) + var shift := staff_service.get_shift(staff.shift_id) + var template_id: StringName = &"DAY" + var effective_from := _runtime_event_minute() + var next_start_at := -1 + var assigned_facility_id := staff.assigned_facility_id + if not plan.is_empty(): + template_id = StringName(plan[&"template_id"]) + assigned_facility_id = StringName(plan[&"facility_id"]) + effective_from = int(plan[&"effective_from"]) + next_start_at = int(plan[&"next_start_at"]) + elif shift != null: + template_id = shift.template_id + effective_from = shift.start_at + else: + template_id = &"NIGHT" if StringName(entry.get(&"preferred_shift", &"day")) == &"night" else &"DAY" + var block_reason := _staff_assignment_block_reason(staff) + rows.append({ + &"staff_id": staff.staff_id, &"display_name": String(entry.get(&"display_name", staff.staff_id)), + &"role_id": staff.role_id, &"state": staff.state, &"state_name": StaffRuntime.State.keys()[staff.state], + &"assigned_facility_id": assigned_facility_id, &"active_facility_id": staff.assigned_facility_id, + &"template_id": template_id, &"recurring": not plan.is_empty() and not assigned_facility_id.is_empty(), + &"effective_from": effective_from, &"next_start_at": next_start_at, + &"daily_wage": staff.get_effective_daily_wage(), &"health": staff.health, &"fatigue": staff.fatigue, &"unpaid_wages": staff.unpaid_wages, + &"current_task_id": staff.current_task_id, &"rescue_status": _staff_rescue_status(staff.staff_id), + &"rest_status": get_staff_rest_report(staff.staff_id).get(&"label", ""), + &"can_edit": block_reason.is_empty(), + &"assignment_block_reason": block_reason, + &"unique_contract": _staff_unique_contract_report(staff), + }) + var facilities: Array[Dictionary] = [] + for facility: FacilityInstance in facility_service.get_instances(): + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null or definition.staff_max <= 0: + continue + facilities.append({ + &"facility_id": facility.instance_id, &"display_name": definition.display_name, + &"definition_id": facility.definition_id, &"layer": facility.origin.z, &"origin": facility.origin, + &"required_roles": definition.required_roles.duplicate(), &"staff_min": definition.staff_min, &"staff_max": definition.staff_max, + }) + return {&"staff": rows, &"facilities": facilities} + + +## Original 6.1 / 6.2 presentation, derived from validated canonical content +## and the same planned placement as pricing. This report owns all containers; +## it does not add a hire, consent, growth policy, save field or tick-side effect. +func _staff_unique_contract_report(staff: StaffRuntime) -> Dictionary: + if staff == null or staff.employment_kind != StaffRuntime.EmploymentKind.UNIQUE or not mvp_content_catalog.is_valid(): + return {} + var definition := mvp_content_catalog.get_entry(&"unique_characters", staff.staff_id) + if definition.is_empty() or StringName(definition.get(&"role_id", &"")) != staff.role_id: + return {} + var passive_effects: Array[Dictionary] = [] + var contract := { + &"canonical_id": staff.staff_id, + &"free_employment": true, + &"free_upkeep": staff.get_effective_daily_wage() == 0, + &"permanent_removal_forbidden": true, + &"passive_effects": passive_effects, + } + # Only Anri's explicitly specified effect is presented here. Neither kind + # heroine nor a zero wage grants this effect to another employee. + if not _is_anri_manager(staff): + return contract + var effects: Dictionary = definition.get(&"mechanical_effects", {}) + if not effects.has(&"assigned_floor_revenue_multiplier_bp"): + return contract + var plan := staff_service.get_work_assignment(staff.staff_id) + var facility_id := StringName(plan.get(&"facility_id", &"")) + var facility := facility_service.get_instance(facility_id) + var effect := { + &"effect_id": &"assigned_floor_revenue_multiplier_bp", + &"display_name": "看板娘の微笑", + &"multiplier_bp": int(effects[&"assigned_floor_revenue_multiplier_bp"]), + &"scope": &"ASSIGNED_FLOOR_ALL_LAYERS", + &"applied": facility != null, + &"assigned_facility_id": facility_id, + } + if facility != null: + effect[&"floor_y"] = facility.origin.y + passive_effects.append(effect) + return contract + + +func get_hired_staff_candidate_ids() -> Array[StringName]: + return _sorted_name_keys(_hired_staff_candidate_ids) + + +func get_live_progression_report() -> Dictionary: + # Project current cash/facility facts without changing saved progression. + var projected := ProgressionService.new() + var source := progression_service.create_snapshot() + if not projected.restore_snapshot(source): + return {&"snapshot":source, &"evaluation":{&"eligible":false,&"requirements":[],&"reason":&"UNAVAILABLE"}} + var synchronized := projected.update_metrics({ + &"asset_gold":economy_service.get_balance(PLAYER_CASH_ACCOUNT), + &"active_above_ground_facilities":_count_active_facilities(facility_service,false), + &"active_underground_facilities":_count_active_facilities(facility_service,true), + }) + var evaluation := projected.evaluate_rank() + if not synchronized: + evaluation[&"eligible"] = false + evaluation[&"reason"] = &"UNAVAILABLE" + var gate := _operations_construction_investment_gate(0) + if gate != null: + evaluation[&"eligible"] = false + evaluation[&"reason"] = &"OPERATIONS_BLOCKED" + evaluation[&"block_reason"] = gate.details.get(&"reason", &"") + return {&"snapshot":projected.create_snapshot(), &"evaluation":evaluation} + + +func get_progression_report(target_rank := -1) -> Dictionary: + return { + &"snapshot": progression_service.create_snapshot(), + &"evaluation": progression_service.evaluate_rank(target_rank).duplicate(true), + } + + +func _saved_content_manifest_matches(catalog: MvpContentCatalog, data: Dictionary) -> bool: + var expected := _create_mvp_content_manifest(catalog) + var saved: Variant = data.get(&"catalog_manifest", null) + if _strict_variants_equal(expected, saved): + return true + # The sole v1-to-v2 catalog addition is the chapel cleric. Require the + # complete old manifest, not an arbitrary subset of current content. + expected[&"manifest_version"] = 1 + expected[&"staff_candidate_ids"].erase("staff_uma") + if not _strict_variants_equal(expected, saved): + return false + var hired: Variant = data.get(&"hired_staff_candidate_ids", null) + var staff_section: Variant = data.get(&"staff", null) + if not hired is Array or "staff_uma" in hired or not staff_section is Dictionary: + return false + var staff_rows: Variant = staff_section.get(&"staff", null) + if not staff_rows is Array: + return false + for staff: Variant in staff_rows: + if not staff is Dictionary or String(staff.get(&"staff_id", "")) == "staff_uma": + return false + return true + + +func _clear_mvp_content_manifest_cache() -> void: + _mvp_manifest_cache_catalog = null + _mvp_manifest_cache_generation = -1 + _mvp_manifest_cache = {} + + +func _create_mvp_content_manifest(catalog: MvpContentCatalog) -> Dictionary: + # Restore validates a temporary catalog through the full original builder. + # A rejected restore must not replace or invalidate the live Runtime cache. + if catalog != mvp_content_catalog: + return _build_mvp_content_manifest(catalog) + var generation := catalog.get_manifest_generation() + if _mvp_manifest_cache_catalog == catalog \ + and _mvp_manifest_cache_generation == generation: + return _mvp_manifest_cache.duplicate(true) + var manifest := _build_mvp_content_manifest(catalog) + _mvp_manifest_cache_catalog = catalog + _mvp_manifest_cache_generation = generation + _mvp_manifest_cache = manifest + # Legacy v1 matching edits its returned manifest, including a nested array. + # The private template must stay owned even on the first cache fill. + return _mvp_manifest_cache.duplicate(true) + + +func _build_mvp_content_manifest(catalog: MvpContentCatalog) -> Dictionary: + var guest_definition_ids: Array[String] = [] + for definition: GuestDefinition in catalog.build_all_guest_definitions(): + guest_definition_ids.append(String(definition.guest_type_id)) + return { + &"manifest_version": MVP_CONTENT_MANIFEST_VERSION, + &"schema_version": MvpContentCatalog.SCHEMA_VERSION, + &"guest_class_ids": _names_to_strings_for_manifest(catalog.get_guest_class_ids()), + &"species_ids": _names_to_strings_for_manifest(catalog.get_species_ids()), + &"staff_candidate_ids": _names_to_strings_for_manifest(catalog.get_staff_candidate_ids()), + &"unique_character_ids": _names_to_strings_for_manifest(catalog.get_unique_character_ids()), + &"guest_definition_ids": guest_definition_ids, + } + + +func _names_to_strings_for_manifest(values: Array[StringName]) -> Array[String]: + var result: Array[String] = [] + for value: StringName in values: + result.append(String(value)) + return result + + +func _catalog_definitions_are_registered(service: GuestService) -> bool: + if not bool(mvp_content_report.get(&"valid", false)): + return false + return _saved_catalog_guest_definitions_match( + service.create_snapshot(), + mvp_content_catalog + ) + + +func _saved_catalog_guest_definitions_match( + guest_snapshot: Dictionary, + catalog: MvpContentCatalog +) -> bool: + var raw_definitions: Variant = guest_snapshot.get(&"definitions", null) + if not raw_definitions is Array: + return false + var saved_by_id: Dictionary = {} + for raw_definition: Variant in raw_definitions: + if not raw_definition is Dictionary: + return false + var raw_id: Variant = raw_definition.get(&"guest_type_id", null) + if typeof(raw_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return false + var definition_id := StringName(raw_id) + if definition_id.is_empty() or saved_by_id.has(definition_id): + return false + saved_by_id[definition_id] = raw_definition + var expected_definitions := catalog.build_all_guest_definitions() + if expected_definitions.size() != 32: + return false + for definition: GuestDefinition in expected_definitions: + if not saved_by_id.has(definition.guest_type_id) \ + or not _strict_variants_equal( + definition.create_snapshot(), + saved_by_id[definition.guest_type_id] + ): + return false + return true + + +func _register_or_validate_legacy_catalog_definitions( + service: GuestService, + catalog: MvpContentCatalog +) -> bool: + var definitions := catalog.build_all_guest_definitions() + if definitions.size() != 32: + return false + for definition: GuestDefinition in definitions: + var existing := service.get_definition(definition.guest_type_id) + if existing == null: + if not service.register_definition(definition): + return false + elif not _strict_variants_equal( + existing.create_snapshot(), + definition.create_snapshot() + ): + return false + return true + + +func _serialize_hired_staff_candidate_ids() -> Array[String]: + var result: Array[String] = [] + for candidate_id: StringName in _sorted_name_keys(_hired_staff_candidate_ids): + result.append(String(candidate_id)) + return result + + +func _is_mvp_staff_candidate_id(staff_id: StringName) -> bool: + return mvp_content_catalog.get_staff_candidate_ids().has(staff_id) + + +func _deserialize_hired_staff_candidate_ids( + raw_ids: Array, + catalog: MvpContentCatalog +) -> Variant: + var allowed: Dictionary = {} + for candidate_id: StringName in catalog.get_recruitable_staff_ids(): + allowed[candidate_id] = true + var result: Dictionary = {} + var previous := "" + for raw_id: Variant in raw_ids: + if typeof(raw_id) not in [TYPE_STRING, TYPE_STRING_NAME]: + return null + var candidate_id := StringName(raw_id) + var candidate_text := String(candidate_id) + if not allowed.has(candidate_id) or result.has(candidate_id) \ + or (not previous.is_empty() and candidate_text <= previous): + return null + result[candidate_id] = true + previous = candidate_text + return result + + +func _validate_catalog_staff_crosslinks( + staff: StaffService, + hired_ids: Dictionary, + catalog: MvpContentCatalog +) -> bool: + if hired_ids.has(&"heroine_anri") and not staff.has_staff(&"heroine_anri"): + return false + var candidate_ids: Dictionary = {} + for candidate_id: StringName in catalog.get_recruitable_staff_ids(): + candidate_ids[candidate_id] = true + for member: StaffRuntime in staff.get_staff_members(): + if not candidate_ids.has(member.staff_id): + continue + if not hired_ids.has(member.staff_id): + return false + var canonical := catalog.staff_hire_payload(member.staff_id) + if canonical.is_empty() \ + or member.role_id != StringName(canonical[&"role_id"]) \ + or member.daily_wage != int(canonical[&"daily_wage"]) \ + or member.get_employment_kind_name() != StringName(canonical[&"options"][&"employment_kind"]) \ + or not _strict_variants_equal( + member.permitted_task_tags, + (canonical[&"options"] as Dictionary)[&"permitted_task_tags"] + ) \ + or not _strict_variants_equal( + member.skills, + (canonical[&"options"] as Dictionary)[&"skills"] + ): + return false + return true + + +func _derive_legacy_hired_staff_candidate_ids( + staff: StaffService, + staff_snapshot: Dictionary, + catalog: MvpContentCatalog +) -> Dictionary: + var allowed: Dictionary = {} + for candidate_id: StringName in catalog.get_recruitable_staff_ids(): + allowed[candidate_id] = true + var result: Dictionary = {} + for member: StaffRuntime in staff.get_staff_members(): + if allowed.has(member.staff_id): + result[member.staff_id] = true + var raw_departed: Variant = staff_snapshot.get(&"departed_payroll", []) + if raw_departed is Array: + for raw_record: Variant in raw_departed: + if raw_record is Dictionary: + var candidate_id := StringName(raw_record.get(&"staff_id", "")) + if allowed.has(candidate_id): + result[candidate_id] = true + return result + + +func _strict_variants_equal(expected: Variant, actual: Variant) -> bool: + if typeof(expected) != typeof(actual): + return false + if expected is Dictionary: + var expected_dictionary := expected as Dictionary + var actual_dictionary := actual as Dictionary + if expected_dictionary.size() != actual_dictionary.size(): + return false + var unmatched_actual_keys: Array = actual_dictionary.keys() + for expected_key: Variant in expected_dictionary: + var matched_index := -1 + for index in range(unmatched_actual_keys.size()): + var actual_key: Variant = unmatched_actual_keys[index] + if typeof(actual_key) == typeof(expected_key) and actual_key == expected_key: + matched_index = index + break + if matched_index < 0: + return false + var matched_key: Variant = unmatched_actual_keys[matched_index] + if not _strict_variants_equal( + expected_dictionary[expected_key], + actual_dictionary[matched_key] + ): + return false + unmatched_actual_keys.remove_at(matched_index) + return unmatched_actual_keys.is_empty() + if expected is Array: + var expected_array := expected as Array + var actual_array := actual as Array + if expected_array.size() != actual_array.size(): + return false + for index in range(expected_array.size()): + if not _strict_variants_equal(expected_array[index], actual_array[index]): + return false + return true + return expected == actual + + +func _operations_snapshot_comparison_value(value: Variant) -> Variant: + if typeof(value) == TYPE_STRING_NAME: + return String(value) + if value is Array: + var normalized_array: Array = [] + for member: Variant in value: + normalized_array.append(_operations_snapshot_comparison_value(member)) + return normalized_array + if value is Dictionary: + var normalized_dictionary: Dictionary = {} + for raw_key: Variant in value: + var normalized_key: Variant = raw_key + if typeof(raw_key) == TYPE_STRING_NAME: + normalized_key = String(raw_key) + if normalized_dictionary.has(normalized_key): + # A String/StringName alias collision is not a canonical snapshot. + return null + normalized_dictionary[normalized_key] = _operations_snapshot_comparison_value( + value[raw_key] + ) + return normalized_dictionary + return value + + +func get_actor_movement_credit(actor_id: StringName) -> Dictionary: + if not _movement_credits.has(actor_id): + return {} + return (_movement_credits[actor_id] as Dictionary).duplicate(true) + + +func _guest_path_actor_id(guest_id: StringName) -> StringName: + return StringName("guest:%s" % guest_id) + + +func _staff_path_actor_id(staff_id: StringName) -> StringName: + return StringName("staff:%s" % staff_id) + + +func _expected_runtime_actor_cells( + guests: GuestService, + staff: StaffService +) -> Dictionary: + var expected: Dictionary = {} + for guest: GuestRuntime in guests.get_guests(): + var guest_actor_id := _guest_path_actor_id(guest.guest_id) + if guest_actor_id.is_empty() or expected.has(guest_actor_id): + return {} + expected[guest_actor_id] = guest.current_cell + for member: StaffRuntime in staff.get_staff_members(): + var staff_actor_id := _staff_path_actor_id(member.staff_id) + if staff_actor_id.is_empty() or expected.has(staff_actor_id): + return {} + expected[staff_actor_id] = member.current_cell + return expected + + +func _serialize_movement_credits() -> Array[Dictionary]: + var saved: Array[Dictionary] = [] + for actor_id: StringName in _sorted_name_keys(_movement_credits): + var entry: Dictionary = _movement_credits[actor_id] + saved.append({ + &"actor_id": String(actor_id), + &"credit": int(entry[&"credit"]), + &"updated_at": int(entry[&"updated_at"]), + }) + return saved + + +func _deserialize_movement_credits(raw_entries: Array, absolute_minute: int) -> Variant: + var restored: Dictionary = {} + for raw_entry: Variant in raw_entries: + if not raw_entry is Dictionary: + return null + var actor_id_value: Variant = raw_entry.get(&"actor_id", null) + var credit_value: Variant = raw_entry.get(&"credit", null) + var updated_at_value: Variant = raw_entry.get(&"updated_at", null) + if not (actor_id_value is String or actor_id_value is StringName) \ + or not credit_value is int or not updated_at_value is int: + return null + var actor_id := StringName(actor_id_value) + var credit := int(credit_value) + var updated_at := int(updated_at_value) + if actor_id.is_empty() or restored.has(actor_id) \ + or credit < 0 or credit >= STAIR_MOVEMENT_CREDIT \ + or updated_at < 0 or updated_at > absolute_minute: + return null + restored[actor_id] = { + &"credit": credit, + &"updated_at": updated_at, + } + return restored + + +func _rebuild_legacy_path_actor_projection( + path: PathService, + guests: GuestService, + staff: StaffService, + absolute_minute: int +) -> Variant: + var expected := _expected_runtime_actor_cells(guests, staff) + var entries: Array[Dictionary] = [] + var progress_entries: Array[Dictionary] = [] + var expected_density: Dictionary = {} + var rebuilt: Dictionary = {} + for actor_id: StringName in _sorted_name_keys(expected): + var cell: Vector3i = expected[actor_id] + if not path.has_cell(cell): + return null + entries.append({&"actor_id": actor_id, &"cell": cell}) + progress_entries.append({ + &"actor_id": actor_id, + &"last_cell": cell, + &"last_progress_at": absolute_minute, + &"last_observed_at": absolute_minute, + &"stuck_reported_at": -1, + }) + expected_density[cell] = int(expected_density.get(cell, 0)) + 1 + rebuilt[actor_id] = {&"credit": 0, &"updated_at": absolute_minute} + var migrated_path := path.create_snapshot() + migrated_path[&"actor_cells"] = entries + migrated_path[&"actor_progress"] = progress_entries + migrated_path[&"traffic_revision"] = int(migrated_path[&"traffic_revision"]) + 1 + for traffic: Dictionary in migrated_path[&"cell_traffic"]: + traffic[&"current_density"] = int(expected_density.get(traffic[&"cell"], 0)) + if not path.restore_snapshot(migrated_path): + return null + return rebuilt + + +func _validate_runtime_path_crosslinks( + path: PathService, + guests: GuestService, + staff: StaffService, + credits: Dictionary, + absolute_minute: int +) -> bool: + if path == null or guests == null or staff == null or absolute_minute < 0: + return false + var expected := _expected_runtime_actor_cells(guests, staff) + if expected.size() != guests.guest_count() + staff.get_staff_members().size() \ + or credits.size() != expected.size(): + return false + var path_snapshot := path.create_snapshot() + var raw_actor_cells: Variant = path_snapshot.get(&"actor_cells", null) + var raw_progress: Variant = path_snapshot.get(&"actor_progress", null) + var raw_traffic: Variant = path_snapshot.get(&"cell_traffic", null) + if not raw_actor_cells is Array or not raw_progress is Array or not raw_traffic is Array: + return false + var projected: Dictionary = {} + for raw_actor: Variant in raw_actor_cells: + if not raw_actor is Dictionary: + return false + var actor_id := StringName(raw_actor.get(&"actor_id", &"")) + var cell: Variant = raw_actor.get(&"cell", null) + if actor_id.is_empty() or not cell is Vector3i or projected.has(actor_id): + return false + projected[actor_id] = cell + if projected.size() != expected.size(): + return false + var progress_by_actor: Dictionary = {} + for raw_entry: Variant in raw_progress: + if not raw_entry is Dictionary: + return false + var actor_id := StringName(raw_entry.get(&"actor_id", &"")) + if actor_id.is_empty() or progress_by_actor.has(actor_id): + return false + progress_by_actor[actor_id] = raw_entry + if progress_by_actor.size() != expected.size(): + return false + var expected_density: Dictionary = {} + for actor_id: StringName in _sorted_name_keys(expected): + var cell: Vector3i = expected[actor_id] + if projected.get(actor_id, null) != cell or not credits.has(actor_id): + return false + var credit_entry: Variant = credits[actor_id] + var progress_entry: Variant = progress_by_actor.get(actor_id, null) + if not credit_entry is Dictionary or not progress_entry is Dictionary: + return false + var credit_value: Variant = credit_entry.get(&"credit", null) + var credit_updated_value: Variant = credit_entry.get(&"updated_at", null) + var last_progress_value: Variant = progress_entry.get(&"last_progress_at", null) + var last_observed_value: Variant = progress_entry.get(&"last_observed_at", null) + var stuck_reported_value: Variant = progress_entry.get(&"stuck_reported_at", null) + if not credit_value is int or not credit_updated_value is int \ + or not last_progress_value is int or not last_observed_value is int \ + or not stuck_reported_value is int: + return false + var credit := int(credit_value) + var updated_at := int(credit_updated_value) + var last_progress_at := int(last_progress_value) + var last_observed_at := int(last_observed_value) + var stuck_reported_at := int(stuck_reported_value) + if credit < 0 or credit >= _cell_movement_credit_limit(path, cell) \ + or updated_at < 0 or updated_at > absolute_minute \ + or progress_entry.get(&"last_cell", null) != cell \ + or last_progress_at < 0 or last_progress_at > last_observed_at \ + or last_observed_at != updated_at \ + or last_observed_at > absolute_minute \ + or (stuck_reported_at != -1 and ( + stuck_reported_at < last_progress_at or stuck_reported_at > last_observed_at + )): + return false + if not path.is_actor_in_transit(actor_id): + expected_density[cell] = int(expected_density.get(cell, 0)) + 1 + for raw_cell: Variant in raw_traffic: + if not raw_cell is Dictionary: + return false + var cell: Variant = raw_cell.get(&"cell", null) + var density_value: Variant = raw_cell.get(&"current_density", null) + if not cell is Vector3i or not density_value is int \ + or int(density_value) != int(expected_density.get(cell, 0)): + return false + return true + + +func _path_snapshot_cells_match_world( + path_snapshot: Dictionary, + walkable_cells: Array[Vector3i] +) -> bool: + var schema_value: Variant = path_snapshot.get( + &"schema_version", + path_snapshot.get("schema_version", null) + ) + if not schema_value is int or int(schema_value) not in [PathService.ELEVATOR_INDEX_SNAPSHOT_VERSION, PathService.SHAFT_SNAPSHOT_VERSION, PathService.SNAPSHOT_VERSION]: + return false + var raw_traffic: Variant = path_snapshot.get( + &"cell_traffic", + path_snapshot.get("cell_traffic", null) + ) + if not raw_traffic is Array or raw_traffic.size() != walkable_cells.size(): + return false + var expected_cells: Dictionary = {} + for cell: Vector3i in walkable_cells: + if expected_cells.has(cell): + return false + expected_cells[cell] = true + var actual_cells: Dictionary = {} + for raw_entry: Variant in raw_traffic: + if not raw_entry is Dictionary: + return false + var cell_value: Variant = raw_entry.get(&"cell", raw_entry.get("cell", null)) + if not cell_value is Vector3i \ + or actual_cells.has(cell_value) \ + or not expected_cells.has(cell_value): + return false + actual_cells[cell_value] = true + return actual_cells.size() == expected_cells.size() + + +func _serialize_logistics_requests() -> Array[Dictionary]: + var saved: Array[Dictionary] = [] + for request_id: StringName in _sorted_name_keys(logistics_requests): + saved.append((logistics_requests[request_id] as LogisticsRequest).create_snapshot()) + return saved + + +func _derive_legacy_logistics_ownership( + dispatcher: LogisticsDispatcher, + requests: Dictionary, + absolute_minute: int +) -> Dictionary: + var latest_history: Dictionary = {} + for assignment: Dictionary in dispatcher.get_assignment_history(): + var request_id := StringName(assignment.get(&"request_id", &"")) + var assigned_at := int(assignment.get(&"assigned_at", -1)) + if request_id.is_empty() or assigned_at < 0 or assigned_at > absolute_minute: + return {} + latest_history[request_id] = assignment + var expected: Dictionary = {} + for request_id: StringName in _sorted_name_keys(requests): + var request: LogisticsRequest = requests[request_id] + if request.state not in [ + LogisticsRequest.State.ASSIGNED, + LogisticsRequest.State.PICKING_UP, + LogisticsRequest.State.DELIVERING, + ]: + continue + if request.assigned_carrier_id.is_empty() or request.total_weight <= 0 \ + or not latest_history.has(request_id): + return {} + var latest: Dictionary = latest_history[request_id] + if StringName(latest.get(&"carrier_id", &"")) != request.assigned_carrier_id \ + or int(latest.get(&"weight", -1)) != request.total_weight: + return {} + expected[request_id] = { + &"carrier_id": request.assigned_carrier_id, + &"weight": request.total_weight, + &"assigned_at": int(latest[&"assigned_at"]), + } + return expected + + +func _validate_logistics_dispatcher_crosslinks( + dispatcher: LogisticsDispatcher, + requests: Dictionary, + absolute_minute: int +) -> bool: + if dispatcher == null or absolute_minute < 0: + return false + var ownership := dispatcher.get_assignment_ownership() + var expected_ids: Dictionary = {} + for request_id: StringName in _sorted_name_keys(requests): + var request: LogisticsRequest = requests[request_id] + if request.created_at < 0 or request.state_changed_at < request.created_at \ + or request.state_changed_at > absolute_minute: + return false + var active := request.state in [ + LogisticsRequest.State.ASSIGNED, + LogisticsRequest.State.PICKING_UP, + LogisticsRequest.State.DELIVERING, + ] + if not active: + if not request.assigned_carrier_id.is_empty(): + return false + continue + if request.assigned_carrier_id.is_empty() or request.total_weight <= 0: + return false + expected_ids[request_id] = true + var entry: Variant = ownership.get(request_id, null) + if not entry is Dictionary \ + or StringName(entry.get(&"carrier_id", &"")) != request.assigned_carrier_id \ + or int(entry.get(&"weight", -1)) != request.total_weight: + return false + var assigned_at := int(entry.get(&"assigned_at", -1)) + if assigned_at < request.created_at or assigned_at > request.state_changed_at: + return false + if ownership.size() != expected_ids.size(): + return false + for request_id: StringName in _sorted_name_keys(ownership): + if not expected_ids.has(request_id): + return false + var latest_history: Dictionary = {} + var history_fingerprints: Dictionary = {} + for assignment: Dictionary in dispatcher.get_assignment_history(): + var request_id := StringName(assignment.get(&"request_id", &"")) + if request_id.is_empty() or not requests.has(request_id): + return false + var request: LogisticsRequest = requests[request_id] + var carrier_id := StringName(assignment.get(&"carrier_id", &"")) + var weight := int(assignment.get(&"weight", -1)) + var assigned_at := int(assignment.get(&"assigned_at", -1)) + var fingerprint := "%s|%s|%d|%d" % [request_id, carrier_id, weight, assigned_at] + if carrier_id.is_empty() or weight != request.total_weight \ + or assigned_at < request.created_at or assigned_at > absolute_minute \ + or history_fingerprints.has(fingerprint): + return false + history_fingerprints[fingerprint] = true + latest_history[request_id] = assignment + for request_id: StringName in _sorted_name_keys(ownership): + if not latest_history.has(request_id): + return false + var entry: Dictionary = ownership[request_id] + var latest: Dictionary = latest_history[request_id] + if StringName(latest[&"carrier_id"]) != StringName(entry[&"carrier_id"]) \ + or int(latest[&"weight"]) != int(entry[&"weight"]) \ + or int(latest[&"assigned_at"]) != int(entry[&"assigned_at"]): + return false + return true + +func _serialize_event_definitions() -> Array[Dictionary]: + var saved: Array[Dictionary] = [] + for definition: EventDefinition in event_service.get_definitions(): + saved.append(definition.create_snapshot()) + return saved + +func _deserialize_logistics_requests(raw_requests: Array) -> Variant: + var restored: Dictionary = {} + for raw_request: Variant in raw_requests: + if not raw_request is Dictionary: + return null + var request := LogisticsRequest.from_snapshot(raw_request) + if request == null or restored.has(request.request_id): + return null + restored[request.request_id] = request + return restored + +func _sorted_logistics_requests() -> Array: + var requests: Array = [] + for request_id: StringName in _sorted_name_keys(logistics_requests): + requests.append(logistics_requests[request_id]) + return requests + +func _sorted_name_keys(source: Dictionary) -> Array[StringName]: + var keys: Array[StringName] = [] + for raw_key: Variant in source: + keys.append(StringName(raw_key)) + keys.sort_custom(func(first: StringName, second: StringName) -> bool: + return String(first) < String(second) + ) + return keys + +func _name_array(source: Variant) -> Array[StringName]: + var result: Array[StringName] = [] + if not source is Array: + return result + for value: Variant in source: + result.append(StringName(value)) + return result + +func _guest_wallet_account(guest_id: StringName) -> StringName: + return StringName("GUEST_WALLET:%s" % guest_id) + +func _outstanding_service_commitment(guest_id: StringName) -> int: + var total := 0 + var counted_requests: Dictionary = {} + for facility: FacilityInstance in facility_service.get_instances(): + for request: ServiceRequest in facility_service.get_queue(facility.instance_id): + if not request.guest_ids.is_empty() and request.guest_ids[0] == guest_id: + total += request.quoted_price + counted_requests[request.request_id] = true + for service: ServiceInstance in facility_service.get_active_services(facility.instance_id): + if counted_requests.has(service.request_id): + continue + var request := facility_service.get_request(service.request_id) + if request != null and not request.guest_ids.is_empty() \ + and request.guest_ids[0] == guest_id: + total += request.quoted_price + counted_requests[request.request_id] = true + return total + +func _facility_revenue_account(facility_id: StringName) -> StringName: + return StringName("FACILITY_REVENUE:%s" % facility_id) + +func _command_result_from_dictionary( + command_id: int, + result: Dictionary, + fallback_message: String +) -> CommandResult: + if bool(result.get(&"ok", result.get("ok", false))): + return CommandResult.succeeded(command_id, result.duplicate(true)) + return CommandResult.failed( + CommandResult.Code.VALIDATION_FAILED, + command_id, + String(result.get(&"message", result.get("message", fallback_message))), + result.duplicate(true) + ) + +func _register_facility_mana_consumer(instance: Dictionary) -> void: + var instance_id := StringName(instance.get(&"instance_id", &"")) + var definition_id := StringName(instance.get(&"definition_id", &"")) + var definition := definition_registry.get_facility(definition_id) + if instance_id.is_empty() or definition == null or definition.maintenance_mana <= 0: + return + var priority := ManaNetworkService.ConsumerPriority.NORMAL + if &"entrance" in definition.tags or &"medical" in definition.tags: + priority = ManaNetworkService.ConsumerPriority.ESSENTIAL + if mana_network_service.register_consumer(instance_id, definition.maintenance_mana, priority): + mana_network_service.connect_nodes(instance_id, STARTER_MANA_BUS) + +func _register_operational_facility(construction_instance: Dictionary) -> void: + var instance_id := StringName(construction_instance.get(&"instance_id", &"")) + var definition_id := StringName(construction_instance.get(&"definition_id", &"")) + var definition := definition_registry.get_facility(definition_id) + if instance_id.is_empty() or definition == null or facility_service.has_instance(instance_id): + return + economy_service.register_account(_facility_revenue_account(instance_id)) + facility_service.create_instance({ + &"instance_id": instance_id, + &"definition_id": definition_id, + &"origin": construction_instance.get(&"origin", Vector3i.ZERO), + &"rotation": construction_instance.get(&"rotation", 0), + &"occupied_cells": construction_instance.get(&"occupied_cells", []), + &"local_inventory_id": StringName("facility.inventory:%s" % instance_id), + &"power_available": int(_state.get_resource(&"mana")) > 0, + &"customer_capacity": definition.customer_capacity, + &"service_attribute": definition.service_attribute, + &"capacity": maxi(definition.capacity, 1), + &"queue_capacity": definition.queue_capacity, + &"base_service_minutes": definition.base_service_minutes, + &"base_quality": definition.base_quality, + &"base_price": definition.base_price, + &"staff_min": definition.staff_min, + &"staff_max": definition.staff_max, + &"created_at": int(construction_instance.get(&"completed_at", _clock.absolute_minute)), + }) + +func _validate_service_start(request: ServiceRequest, _facility: FacilityInstance, absolute_minute: int) -> Dictionary: + if int(_state.get_resource(&"mana")) == 0: + return {&"ok": false, &"message": "The tower has no stored Mana."} + for guest_id: StringName in request.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest == null: + continue + if guest.state != GuestRuntime.State.QUEUING \ + or guest.queue_request_id != request.request_id \ + or guest.target_facility_id != request.facility_id: + return {&"ok": false, &"message": "Guest and Facility queue ownership do not match."} + if guest.transition_tick == absolute_minute \ + and guest.transitions_this_tick >= GuestService.MAX_TRANSITIONS_PER_TICK: + return {&"ok": false, &"message": "Guest transition budget is exhausted for this minute."} + for reservation_id: StringName in request.reserved_inventory_ids: + var reservation := inventory_service.get_reservation(reservation_id) + if reservation == null or not reservation.is_active() or reservation.is_expired(absolute_minute) \ + or inventory_service.is_stack_expired(reservation.stack_id, absolute_minute): + return {&"ok": false, &"message": "A required inventory reservation is unavailable or expired."} + var payer_account := _guest_wallet_account(request.guest_ids[0]) + if not economy_service.has_account(payer_account) \ + or economy_service.get_balance(payer_account) < request.quoted_price: + return {&"ok": false, &"message": "The guest cannot pay the quoted service price."} + return {&"ok": true} + +func _complete_service_transaction( + service: ServiceInstance, + request: ServiceRequest, + facility: FacilityInstance, + absolute_minute: int +) -> Variant: + # A sale is only observable after its inventory, rewards and cleanliness + # effects commit. Rollback removes provisional receipts before scope exit. + economy_service.begin_notification_scope() + var result: Variant = _apply_service_transaction(service, request, facility, absolute_minute) + if result is bool and result: + _state.set_resource(&"gold", economy_service.get_balance(PLAYER_CASH_ACCOUNT)) + economy_service.end_notification_scope() + return result + + +func _apply_service_transaction( + service: ServiceInstance, + request: ServiceRequest, + facility: FacilityInstance, + absolute_minute: int +) -> Variant: + for guest_id: StringName in service.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest == null: + continue + if guest.state != GuestRuntime.State.RECEIVING_SERVICE \ + or guest.current_service_id != service.service_id \ + or guest.target_facility_id != facility.instance_id: + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, + "Guest and Facility service ownership do not match." + ) + if guest.transition_tick == absolute_minute \ + and guest.transitions_this_tick >= GuestService.MAX_TRANSITIONS_PER_TICK: + return CommandResult.failed( + CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, + "Guest transition budget is exhausted for this minute." + ) + var inventory_before := inventory_service.create_snapshot() + var economy_before := economy_service.create_snapshot() + var state_before: Dictionary = _state.create_snapshot() + if not service.inventory_reservations.is_empty(): + var consumed := inventory_service.consume_reservations( + service.inventory_reservations, + StringName("service.consume.%s" % service.service_id), + absolute_minute + ) + if not bool(consumed.get(&"ok", false)): + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, "Reserved service inventory could not be consumed.", consumed) + + if service.price_snapshot > 0: + var payer_account := _guest_wallet_account(request.guest_ids[0]) + var revenue_account := _facility_revenue_account(facility.instance_id) + if not economy_service.has_account(payer_account) or not economy_service.has_account(revenue_account): + inventory_service.restore_snapshot(inventory_before) + return CommandResult.failed(CommandResult.Code.NOT_FOUND, 0, "A service settlement account is missing.") + var sale_entries: Array = [ + LedgerEntry.new().configure( + &"", absolute_minute, revenue_account, payer_account, + service.price_snapshot, &"SERVICE_SALE", facility.instance_id + ), + LedgerEntry.new().configure( + &"", absolute_minute, PLAYER_CASH_ACCOUNT, revenue_account, + service.price_snapshot, &"SERVICE_CASH_SWEEP", facility.instance_id + ), + ] + var payment := economy_service.post( + sale_entries, + StringName("service.payment.%s" % service.service_id) + ) + if not payment.is_success(): + inventory_service.restore_snapshot(inventory_before) + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + return payment + + var definition := definition_registry.get_facility(facility.definition_id) + if definition != null: + for item_id: StringName in _sorted_name_keys(definition.inventory_outputs): + var output := inventory_service.add_stack( + facility.local_inventory_id, + item_id, + int(definition.inventory_outputs[item_id]), + service.quality_snapshot, + -1, + absolute_minute + ) + if not bool(output.get(&"ok", false)): + inventory_service.restore_snapshot(inventory_before) + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, "Facility outputs could not be committed.", output) + var progression_before: Dictionary = {} + if definition != null and definition.faith_per_service > 0: + progression_before = progression_service.create_snapshot() + var next_faith := int(progression_service.metrics[&"faith_lifetime"]) + definition.faith_per_service + if not progression_service.update_metrics({&"faith_lifetime":next_faith}) or not _state.apply_resource_deltas({&"faith":definition.faith_per_service}): + inventory_service.restore_snapshot(inventory_before) + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + progression_service.restore_snapshot(progression_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, "Service Faith reward could not be committed.") + if definition != null and definition.cleanliness_decay_per_service > 0: + if not facility_cleanliness.record_use(facility.instance_id, service.service_id, definition.cleanliness_decay_per_service): + inventory_service.restore_snapshot(inventory_before) + economy_service.restore_snapshot(economy_before) + _state.restore_snapshot(state_before) + if not progression_before.is_empty(): progression_service.restore_snapshot(progression_before) + return CommandResult.failed(CommandResult.Code.TRANSACTION_APPLY_FAILED, 0, "Facility cleanliness could not be committed.") + return true + +func _on_facility_state_changed(instance_id: StringName, old_state: int, new_state: int, reasons: Array[StringName]) -> void: + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), &"FACILITY_STATE_CHANGED", _runtime_event_minute(), + &"facility_service", [instance_id], + {&"old_state": old_state, &"state": new_state, &"reasons": reasons}, 0 + )) + +func _on_service_started(service: ServiceInstance) -> void: + var effective_minute := _runtime_event_minute() + for guest_id: StringName in service.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest == null: + continue + var wallet_account := _guest_wallet_account(guest_id) + if economy_service.has_account(wallet_account): + guest.wallet_gold = economy_service.get_balance(wallet_account) + var synchronized := guest_service.begin_service( + guest_id, service.facility_id, service.service_id, effective_minute + ) + if not bool(synchronized.get(&"ok", false)): + _publish_actor_event( + &"GUEST_SERVICE_SYNC_FAILED", &"simulation_runtime", + [guest_id, service.service_id], synchronized + ) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), &"SERVICE_STARTED", effective_minute, + &"facility_service", [service.facility_id, service.service_id], service.create_snapshot(), 0 + )) + +func _on_service_interrupted(service: ServiceInstance, reason: StringName) -> void: + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), &"SERVICE_INTERRUPTED", _runtime_event_minute(), + &"facility_service", [service.facility_id, service.service_id], + {&"reason": reason, &"service": service.create_snapshot()}, 0 + )) + +func _on_service_completed(service: ServiceInstance) -> void: + var effective_minute := _runtime_event_minute() + for guest_id: StringName in service.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest == null: + continue + var wallet_account := _guest_wallet_account(guest_id) + if economy_service.has_account(wallet_account): + guest.wallet_gold = economy_service.get_balance(wallet_account) + var synchronized := guest_service.complete_service( + guest_id, + service.service_id, + effective_minute, + _service_satisfaction_sample(service, guest), + _service_need_effects(service.facility_id) + ) + if not bool(synchronized.get(&"ok", false)): + _publish_actor_event( + &"GUEST_SERVICE_SYNC_FAILED", &"simulation_runtime", + [guest_id, service.service_id], synchronized + ) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), &"SERVICE_COMPLETED", effective_minute, + &"facility_service", [service.facility_id, service.service_id], service.create_snapshot(), 0 + )) + +func _on_service_failed(service: ServiceInstance, reason: StringName) -> void: + var effective_minute := _runtime_event_minute() + for reservation_id: StringName in service.inventory_reservations: + inventory_service.release_reservation( + reservation_id, + StringName("service.failed.%s.%s" % [service.service_id, reservation_id]), + effective_minute + ) + for guest_id: StringName in service.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest != null and guest.current_service_id == service.service_id: + guest_service.interrupt_service( + guest_id, service.service_id, effective_minute + ) + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), &"SERVICE_FAILED", effective_minute, + &"facility_service", [service.facility_id, service.service_id], + {&"reason": reason, &"service": service.create_snapshot()}, 0 + )) + +func _on_guest_spawned(guest: GuestRuntime) -> void: + if _operations_flushing_guest_spawn_notifications.has(guest.guest_id): + return + var actor_id := _guest_path_actor_id(guest.guest_id) + var projected := path_service.actor_enter_cell( + actor_id, + guest.current_cell, + _runtime_event_minute() + ) + if projected: + _movement_credits[actor_id] = { + &"credit": 0, + &"updated_at": _runtime_event_minute(), + } + var payload := guest.create_snapshot() + payload[&"path_actor_id"] = actor_id + payload[&"path_projected"] = projected + payload[&"path_error"] = path_service.last_error if not projected else "" + _publish_actor_event(&"GUEST_SPAWNED", &"guest_service", [guest.guest_id], payload) + +func _on_guest_state_changed( + guest_id: StringName, + old_state: int, + new_state: int, + reason: StringName +) -> void: + _publish_actor_event(&"GUEST_STATE_CHANGED", &"guest_service", [guest_id], { + &"old_state": old_state, + &"state": new_state, + &"reason": reason, + }) + +func _on_guest_queue_abandoned( + guest_id: StringName, + facility_id: StringName, + request_id: StringName +) -> void: + _publish_actor_event( + &"GUEST_QUEUE_ABANDONED", &"guest_service", + [guest_id, facility_id, request_id], {} + ) + +func _on_guest_recovery_started( + guest_id: StringName, + recovery_kind: StringName, + target_cell: Vector3i +) -> void: + _publish_actor_event(&"GUEST_RECOVERY_STARTED", &"guest_service", [guest_id], { + &"recovery_kind": recovery_kind, + &"target_cell": target_cell, + }) + +func _on_guest_despawned(guest_id: StringName, persistent_record: Dictionary) -> void: + var actor_id := _guest_path_actor_id(guest_id) + elevators.cancel_actor(actor_id) + var path_removed := path_service.despawn_actor(actor_id) + _movement_credits.erase(actor_id) + _synchronize_operations_population() + var payload := persistent_record.duplicate(true) + payload[&"path_actor_id"] = actor_id + payload[&"path_projection_removed"] = path_removed + _publish_actor_event(&"GUEST_DESPAWNED", &"guest_service", [guest_id], payload) + +func _on_staff_registered(staff: StaffRuntime) -> void: + _staffing_projection_enabled = true + var actor_id := _staff_path_actor_id(staff.staff_id) + var projected := path_service.actor_enter_cell( + actor_id, + staff.current_cell, + _runtime_event_minute() + ) + if projected: + _movement_credits[actor_id] = { + &"credit": 0, + &"updated_at": _runtime_event_minute(), + } + var payload := staff.create_snapshot() + payload[&"path_actor_id"] = actor_id + payload[&"path_projected"] = projected + payload[&"path_error"] = path_service.last_error if not projected else "" + _publish_actor_event(&"STAFF_REGISTERED", &"staff_service", [staff.staff_id], payload) + +func _on_staff_removed(staff_id: StringName, reason: StringName) -> void: + var actor_id := _staff_path_actor_id(staff_id) + elevators.cancel_actor(actor_id) + var path_removed := path_service.despawn_actor(actor_id) + _movement_credits.erase(actor_id) + _publish_actor_event(&"STAFF_REMOVED", &"staff_service", [staff_id], { + &"reason": reason, + &"path_actor_id": actor_id, + &"path_projection_removed": path_removed, + }) + +func _on_shift_registered(shift: ShiftInstance) -> void: + _publish_actor_event( + &"STAFF_SHIFT_REGISTERED", &"staff_service", + [shift.staff_id, shift.shift_instance_id], shift.create_snapshot() + ) + +func _on_shift_state_changed(staff_id: StringName, shift_id: StringName, state: int) -> void: + _publish_actor_event( + &"STAFF_SHIFT_STATE_CHANGED", &"staff_service", + [staff_id, shift_id], {&"state": state} + ) + +func _on_staff_task_registered(task: StaffTask) -> void: + _publish_actor_event(&"STAFF_TASK_REGISTERED", &"staff_service", [task.task_id], task.create_snapshot()) + +func _on_staff_task_assigned(task_id: StringName, staff_id: StringName) -> void: + var task := staff_service.get_task(task_id) + if task != null and task.state == StaffTask.State.RESERVED: + task.begin_moving(_runtime_event_minute()) + _publish_actor_event(&"STAFF_TASK_ASSIGNED", &"staff_service", [task_id, staff_id], {}) + +func _on_staff_task_reopened(task_id: StringName, reason: StringName) -> void: + _publish_actor_event(&"STAFF_TASK_REOPENED", &"staff_service", [task_id], {&"reason": reason}) + +func _on_staff_task_completed(task_id: StringName, staff_id: StringName) -> void: + var task := staff_service.get_task(task_id) + if task != null and task.task_type == CleaningBridge.TASK_TYPE: + if not cleaning_bridge.completed(task, staff_service.get_staff(staff_id)): + _latch_infrastructure_failure(&"CLEANING_COMPLETION_FAILED", _runtime_event_minute(), "Cleaning task effect could not be committed.") + if task != null and task.task_type == &"rescue_transport": + var patient := staff_service.get_staff(task.target_entity_id) + var clinic := facility_service.get_instance(task.rescue_facility_id) + if patient != null and clinic != null and patient.current_cell == task.target_cell and clinic.operation_state == FacilityInstance.OperationState.OPERATING: + patient.health = 100 + patient.fatigue = 0 + patient.transition_to(StaffRuntime.State.OFF_DUTY, &"RESCUE_TREATED", _runtime_event_minute()) + _publish_actor_event(&"STAFF_RESCUED", &"staff_service", [patient.staff_id, staff_id, clinic.instance_id], {}) + _publish_actor_event(&"STAFF_TASK_COMPLETED", &"staff_service", [task_id, staff_id], {}) + +func _on_authority_heat_changed( + old_value: int, + new_value: int, + source_id: StringName +) -> void: + var entity_ids: Array[StringName] = [] + if not source_id.is_empty(): + entity_ids.append(source_id) + _publish_actor_event(&"AUTHORITY_HEAT_CHANGED", &"authority_service", entity_ids, { + &"old_value": old_value, + &"new_value": new_value, + &"source_id": source_id, + }) + +func _on_authority_incident_created(incident: AuthorityIncident) -> void: + _publish_actor_event( + &"INCIDENT_CREATED", + &"authority_service", + [incident.incident_id], + incident.create_snapshot() + ) + +func _on_authority_incident_detector_added( + incident_id: StringName, + detector_id: StringName +) -> void: + var incident := authority_service.get_incident(incident_id) + _publish_actor_event( + &"INCIDENT_DETECTOR_ADDED", + &"authority_service", + [incident_id, detector_id], + {&"incident": incident.create_snapshot() if incident != null else {}} + ) + +func _on_authority_evidence_registered(evidence: AuthorityEvidence) -> void: + _publish_actor_event( + &"AUTHORITY_EVIDENCE_REGISTERED", + &"authority_service", + [evidence.evidence_id, evidence.incident_id, evidence.facility_id], + evidence.create_snapshot() + ) + +func _on_authority_evidence_discovered( + evidence: AuthorityEvidence, + method: StringName +) -> void: + _publish_actor_event( + &"AUTHORITY_EVIDENCE_DISCOVERED", + &"authority_service", + [evidence.evidence_id, evidence.incident_id, evidence.facility_id], + { + &"method": method, + &"evidence": evidence.create_snapshot(), + &"authority_evidence_points": authority_service.get_authority_state().evidence_points, + } + ) + +func _on_authority_inspection_scheduled(inspection: AuthorityInspection) -> void: + _publish_actor_event( + &"INSPECTION_SCHEDULED", + &"authority_service", + [inspection.inspection_id, inspection.inspector_id], + inspection.create_snapshot() + ) + +func _on_authority_inspection_state_changed( + inspection_id: StringName, + old_state: int, + new_state: int, + reason: StringName +) -> void: + var inspection := authority_service.get_inspection(inspection_id) + var entity_ids: Array[StringName] = [inspection_id] + if inspection != null: + entity_ids.append(inspection.inspector_id) + var payload := { + &"old_state": StringName(AuthorityInspection.State.keys()[old_state]), + &"new_state": StringName(AuthorityInspection.State.keys()[new_state]), + &"reason": reason, + } + _publish_actor_event( + &"INSPECTION_STATE_CHANGED", + &"authority_service", + entity_ids, + payload + ) + if new_state == AuthorityInspection.State.ARRIVING: + _publish_actor_event( + &"INSPECTION_STARTED", + &"authority_service", + entity_ids, + payload + ) + +func _on_authority_resolution_applied( + inspection_id: StringName, + resolution: Dictionary +) -> void: + _publish_actor_event( + &"INSPECTION_RESOLVED", + &"authority_service", + [inspection_id, StringName(resolution.get(&"resolution_id", ""))], + resolution.duplicate(true) + ) + +func _on_defense_raid_created(raid_id: StringName) -> void: + _publish_actor_event( + &"DEFENSE_RAID_CREATED", + &"defense_service", + [raid_id], + defense_service.get_raid(raid_id) + ) + +func _on_defense_raid_state_changed( + raid_id: StringName, + old_state: int, + new_state: int, + reason: StringName +) -> void: + _publish_actor_event( + &"DEFENSE_RAID_STATE_CHANGED", + &"defense_service", + [raid_id], + { + &"old_state": StringName(DefenseService.RaidState.keys()[old_state]), + &"new_state": StringName(DefenseService.RaidState.keys()[new_state]), + &"reason": reason, + } + ) + +func _on_defense_active_skill_applied( + raid_id: StringName, + action_id: StringName, + round_number: int +) -> void: + _publish_actor_event( + &"DEFENSE_SKILL_APPLIED", + &"defense_service", + [raid_id, action_id], + {&"round_number": round_number} + ) + +func _on_defense_round_resolved(raid_id: StringName, resolution: Dictionary) -> void: + var entity_ids: Array[StringName] = [raid_id] + var resolution_id := StringName(resolution.get(&"resolution_id", "")) + var wave_id := StringName(resolution.get(&"wave_id", "")) + if not resolution_id.is_empty(): + entity_ids.append(resolution_id) + if not wave_id.is_empty(): + entity_ids.append(wave_id) + _publish_actor_event( + &"DEFENSE_ROUND_RESOLVED", + &"defense_service", + entity_ids, + resolution.duplicate(true) + ) + +func _on_defense_raid_resolved(raid_id: StringName, outcome: Dictionary) -> void: + var entity_ids: Array[StringName] = [raid_id] + var resolution_id := StringName(outcome.get(&"resolution_id", "")) + if not resolution_id.is_empty(): + entity_ids.append(resolution_id) + _publish_actor_event( + &"DEFENSE_RAID_RESOLVED", + &"defense_service", + entity_ids, + outcome.duplicate(true) + ) + +func _publish_authority_evaluation(details: Dictionary) -> void: + var entity_ids: Array[StringName] = [] + var inspection_id := StringName(details.get(&"inspection_id", "")) + if not inspection_id.is_empty(): + entity_ids.append(inspection_id) + _publish_actor_event( + &"AUTHORITY_INSPECTION_EVALUATED", + &"authority_service", + entity_ids, + details.duplicate(true) + ) + +func _on_relationship_registered(state: RelationshipState) -> void: + _publish_actor_event( + &"RELATIONSHIP_REGISTERED", + &"relationship_service", + [state.actor_a_id, state.actor_b_id, state.relationship_id], + state.create_snapshot() + ) + +func _on_relationship_value_changed( + relationship_id: StringName, + metric_id: StringName, + old_value: int, + new_value: int +) -> void: + var state := relationship_service.get_relationship(relationship_id) + var actor_ids: Array[StringName] = [relationship_id] + if state != null: + actor_ids = [state.actor_a_id, state.actor_b_id, relationship_id] + _publish_actor_event(&"RELATIONSHIP_VALUE_CHANGED", &"relationship_service", actor_ids, { + &"metric_id": metric_id, + &"old_value": old_value, + &"new_value": new_value, + }) + +func _on_relationship_shield_changed( + relationship_id: StringName, + old_value: int, + new_value: int +) -> void: + var state := relationship_service.get_relationship(relationship_id) + var actor_ids: Array[StringName] = [relationship_id] + if state != null: + actor_ids = [state.actor_a_id, state.actor_b_id, relationship_id] + _publish_actor_event(&"RELATIONSHIP_SHIELD_CHANGED", &"relationship_service", actor_ids, { + &"old_value": old_value, + &"new_value": new_value, + }) + +func _on_relationship_route_lock_changed( + relationship_id: StringName, + old_lock: int, + new_lock: int, + route_id: StringName +) -> void: + var state := relationship_service.get_relationship(relationship_id) + var actor_ids: Array[StringName] = [relationship_id] + if state != null: + actor_ids = [state.actor_a_id, state.actor_b_id, relationship_id] + _publish_actor_event(&"RELATIONSHIP_ROUTE_LOCK_CHANGED", &"relationship_service", actor_ids, { + &"old_lock": old_lock, + &"new_lock": new_lock, + &"route_id": route_id, + }) + +func _on_event_effect_transaction_started() -> void: + economy_service.begin_notification_scope() + + +func _on_event_effect_transaction_finished() -> void: + # A nested action batch ends before the enclosing choice cost commits. + # Keep the authoritative mirror current without releasing observer receipts. + if economy_service.notification_scope_depth() == 1: + _state.set_resource(&"gold", economy_service.get_balance(PLAYER_CASH_ACCOUNT)) + economy_service.end_notification_scope() + + +func _on_event_enqueued(instance: EventInstance) -> void: + _publish_actor_event( + &"EVENT_ENQUEUED", &"event_service", instance.actor_ids, + instance.create_snapshot() + ) + +func _on_event_started(instance: EventInstance) -> void: + _publish_actor_event( + &"EVENT_STARTED", &"event_service", instance.actor_ids, + instance.create_snapshot() + ) + +func _on_event_finished(instance: EventInstance) -> void: + _resolve_relationship_threshold_event(instance) + _publish_actor_event( + &"EVENT_FINISHED", &"event_service", instance.actor_ids, + instance.create_snapshot() + ) + +func _on_event_cancelled(instance: EventInstance, reason: StringName) -> void: + _consume_relationship_candidate_from_event(instance) + # Placement rejection occurs before an Event starts and never owns a pause. + if reason != &"PLACEMENT_PROTECTION" and event_service.get_foreground_instance() == null and not event_service.pause_requested: + _clock.set_paused(false) + _publish_actor_event(&"EVENT_CANCELLED", &"event_service", instance.actor_ids, { + &"reason": reason, + &"event": instance.create_snapshot(), + }) + +func _on_event_choice_resolved( + instance_id: StringName, + choice_id: StringName, + result: Dictionary +) -> void: + var instance := event_service.get_instance(instance_id) + var actor_ids: Array[StringName] = [] + if instance != null: + actor_ids = instance.actor_ids.duplicate() + _publish_actor_event(&"EVENT_CHOICE_RESOLVED", &"event_service", actor_ids, { + &"event_instance_id": instance_id, + &"choice_id": choice_id, + &"result": result.duplicate(true), + }) + +func _resolve_relationship_threshold_event(instance: EventInstance) -> void: + if instance.source_event_id != &"relationship.threshold": + return + var raw_candidate: Variant = instance.context.get(&"relationship_candidate", null) + if not raw_candidate is Dictionary: + return + var candidate: Dictionary = raw_candidate + if instance.selected_choice_id == &"acknowledge": + var relationship_id := StringName(candidate.get(&"relationship_id", "")) + var metric_id := StringName(candidate.get(&"metric_id", "")) + var state := relationship_service.get_relationship(relationship_id) + if state != null and RelationshipState.METRIC_IDS.has(metric_id): + var threshold := int(candidate.get(&"threshold", state.get_metric(metric_id))) + var delta := maxi(threshold - state.get_metric(metric_id), 0) + if delta > 0: + relationship_service.apply_value_change( + relationship_id, + metric_id, + delta, + _runtime_event_minute(), + {&"important": true, &"allow_threshold_crossing": true} + ) + _consume_relationship_candidate_from_event(instance) + +func _consume_relationship_candidate_from_event(instance: EventInstance) -> void: + var raw_candidate: Variant = instance.context.get(&"relationship_candidate", null) + if not raw_candidate is Dictionary: + return + var candidate_id := StringName(raw_candidate.get(&"candidate_id", "")) + if not candidate_id.is_empty(): + relationship_service.consume_threshold_candidate(candidate_id) + +func _publish_actor_event( + event_type: StringName, + source_system: StringName, + entity_ids: Array[StringName], + payload: Dictionary +) -> void: + _publish_domain_event(SimulationDomainEvent.new( + id_generator.next_id(&"domain_event"), + event_type, + _runtime_event_minute(), + source_system, + entity_ids, + payload, + 0 + )) + +func _service_need_effects(facility_id: StringName) -> Dictionary: + var effects := { + &"hunger": 0, &"sleep": 0, &"hygiene": 0, + &"medical": 0, &"leisure": 0, &"intimacy": 0, + } + var facility := facility_service.get_instance(facility_id) + if facility == null: + return effects + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null: + return effects + if &"dining" in definition.tags: + effects[&"hunger"] = -70 + effects[&"leisure"] = -10 + if &"lodging" in definition.tags: + effects[&"sleep"] = -80 + effects[&"hygiene"] = mini(int(effects[&"hygiene"]), -10) + if &"social" in definition.tags or &"leisure" in definition.tags: + effects[&"leisure"] = mini(int(effects[&"leisure"]), -40) + if &"hygiene" in definition.tags or &"bath" in definition.tags: + effects[&"hygiene"] = -75 + if &"medical" in definition.tags: + effects[&"medical"] = -85 + elif &"wellness" in definition.tags: + effects[&"medical"] = -20 + if &"adult_only" in definition.tags or &"restricted_service" in definition.tags: + effects[&"intimacy"] = -75 + return effects + +func _parse_world_cell(value: Variant) -> Variant: + if value is Vector3i: + return value + if value is Array and value.size() == 3: + return Vector3i(int(value[0]), int(value[1]), int(value[2])) + return null + +func _guest_state_index(value: Variant) -> int: + if value is int: + return value if value >= 0 and value < GuestRuntime.State.size() else -1 + var normalized := String(value).to_upper() + return GuestRuntime.State.keys().find(normalized) + +func _publish_snapshot(_absolute_minute: int) -> void: + latest_snapshot = create_snapshot() + _latest_digest_dirty = true + if not snapshot_published.get_connections().is_empty(): + snapshot_published.emit(latest_snapshot, latest_digest) + state_updated.emit(latest_snapshot) + + +func _execute_purchase_supplies(command: SimulationCommand) -> CommandResult: + return supply_management.purchase(self, command) + + +func _execute_set_supply_auto_purchase(command: SimulationCommand) -> CommandResult: + return supply_management.set_auto_purchase(self, command) + + +func _execute_set_kitchen_production(command: SimulationCommand) -> CommandResult: + return supply_management.set_production(self, command) + + +func get_supply_management_report() -> Dictionary: + return supply_management.get_report(self) + + +func preview_supply_purchase(warehouse_id: StringName, item_id: StringName, quantity: int) -> Dictionary: + return supply_management.preview_purchase(self, warehouse_id, item_id, quantity) + + +# Existing saves retain each facility's stored base rate; reception never quotes +# a new direct sale. Already queued/in-service requests retain their old quote. +func _is_anri_manager(staff: StaffRuntime) -> bool: + return staff.staff_id == &"heroine_anri" and staff.employment_kind == StaffRuntime.EmploymentKind.UNIQUE and staff.role_id == &"innkeeper" + + +func get_floor_price_multiplier(floor_y: int) -> int: + var anri := staff_service.get_staff(&"heroine_anri") + if anri == null or not _is_anri_manager(anri): return 10000 + var assignment := staff_service.get_work_assignment(anri.staff_id) + var facility := facility_service.get_instance(StringName(assignment.get(&"facility_id", &""))) + if facility == null or facility.origin.y != floor_y: return 10000 + var definition := mvp_content_catalog.get_entry(&"unique_characters", anri.staff_id) + return int(definition.get(&"mechanical_effects", {}).get(&"assigned_floor_revenue_multiplier_bp", 10000)) + + +## Original 6.2 / 6.4: Amelia's assigned chapel receives triple donations. +## This is a placement passive; attendance does not remove it. Existing service +## quotes remain frozen by ServiceRequest/ServiceInstance as for Anri. +func get_donation_multiplier(facility: FacilityInstance) -> int: + if facility.definition_id != &"chapel": return 1 + var amelia := staff_service.get_staff(&"heroine_amelia") + if amelia == null or amelia.employment_kind != StaffRuntime.EmploymentKind.UNIQUE or amelia.role_id != &"cleric": return 1 + var assignment := staff_service.get_work_assignment(amelia.staff_id) + return 3 if StringName(assignment.get(&"facility_id", &"")) == facility.instance_id else 1 + + +func get_facility_business_price(facility: FacilityInstance) -> int: + var donation := FacilityPricing.quote(_business_base_price(facility), facility.policy_current) * get_donation_multiplier(facility) + return FacilityPricing.apply_multiplier(donation, get_floor_price_multiplier(facility.origin.y)) + + +## Owned presentation data; accepted request/service quotations stay frozen. +## Matching-surcharge charging remains pending until its inputs are specified. +func get_facility_service_pricing_readmodel(facility: FacilityInstance) -> Dictionary: + return FacilityPricing.pending_service_readmodel( + get_facility_business_price(facility), facility.service_attribute + ) + + +func _business_base_price(facility: FacilityInstance) -> int: + return 0 if facility.definition_id == &"reception" else facility.base_price + + +func get_business_management_report() -> Dictionary: + var minute: int = _clock.absolute_minute + var start := (minute / SimulationKernel.MINUTES_PER_DAY) * SimulationKernel.MINUTES_PER_DAY + var totals: Dictionary = {} + for entry: LedgerEntry in economy_service.get_entries(): + if entry.absolute_minute < start or entry.absolute_minute > minute: + continue + if not totals.has(entry.source_entity_id): + totals[entry.source_entity_id] = {&"revenue": 0, &"expenses": 0} + if entry.category == &"SERVICE_SALE": + totals[entry.source_entity_id][&"revenue"] += entry.amount + elif entry.category in [&"OPERATING_EXPENSE", &"STAFF_SIGNING_COST", &"EVENT_ACTION", &"EVENT_COST_COMMITTED", &"DEFENSE_SKILL_COST", &"AUTHORITY_FINE", &"REFUND"]: + totals[entry.source_entity_id][&"expenses"] += entry.amount + var rows: Array[Dictionary] = [] + var kitchens: Array[Dictionary] = [] + for facility: FacilityInstance in facility_service.get_instances(): + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null: + continue + if facility.definition_id == &"kitchen" and facility.origin.z == WorldService.LAYER_BACK: + kitchens.append({&"facility_id": facility.instance_id, &"display_name": definition.display_name, &"origin": Vector2i(facility.origin.x, facility.origin.y), &"layer": facility.origin.z, &"operation_state": StringName(FacilityInstance.OperationState.keys()[facility.operation_state])}) + var amounts: Dictionary = totals.get(facility.instance_id, {}) + var base := _business_base_price(facility) + var service_pricing := get_facility_service_pricing_readmodel(facility) + var queued_customers: Dictionary = {} + for request: ServiceRequest in facility_service.get_queue(facility.instance_id): + for guest_id: StringName in request.guest_ids: + queued_customers[guest_id] = true + rows.append({ + &"facility_id": facility.instance_id, + &"definition_id": facility.definition_id, + &"category": definition.category, + &"display_name": definition.display_name, + &"origin": Vector2i(facility.origin.x, facility.origin.y), + &"layer": facility.origin.z, + &"state": StringName(FacilityInstance.State.keys()[facility.state]), + &"kitchen_dependency": facility_service.get_required_kitchen_report(facility.instance_id), + &"business_open": facility.operator_open, + &"price_mode": StringName(facility.policy_current.get(&"price_mode", &"standard")), + &"base_price": base, + &"price": service_pricing[&"normal_price"], + &"service_pricing": service_pricing, + &"floor_price_multiplier_bp": get_floor_price_multiplier(facility.origin.y), + &"donation_multiplier": get_donation_multiplier(facility), + &"faith_per_service": definition.faith_per_service, + &"can_price": base > 0, + &"queued_count": facility.queue_entries.size(), + &"active_count": facility.active_services.size(), + &"queued_customer_count": queued_customers.size(), + &"active_customer_count": facility.customer_count(), + &"customer_capacity": facility.customer_capacity, + &"cleanliness": facility_cleanliness.get_facility(facility.instance_id).get("current", -1), + &"cleaning_status": cleaning_bridge.status(facility.instance_id), + &"today_revenue": int(amounts.get(&"revenue", 0)), + &"today_expenses": int(amounts.get(&"expenses", 0)), + }) + return {&"minute": minute, &"modes": FacilityPricing.modes(), &"facilities": rows, &"kitchens": kitchens} + + +func _guest_has_checked_in(guest: GuestRuntime) -> bool: + for visited_id: StringName in guest.visited_facility_ids: + var visited := facility_service.get_instance(visited_id) + if visited != null and visited.definition_id == &"reception": + return true + return false + + +func _service_satisfaction_sample(service: ServiceInstance, _guest: GuestRuntime) -> int: + # P1 uses a common expectation of 50 until archetypes have an explicit + # expected-quality field. Quality sensitivity is a separate concept. + var expectation := 50 + return clampi(service.quality_snapshot + FacilityPricing.satisfaction_modifier( + service.policy_snapshot, service.quality_snapshot, expectation + ), 0, 100) + + +func _release_closed_business_queues(absolute_minute: int) -> void: + for facility: FacilityInstance in facility_service.get_instances(): + if facility.operator_open and facility.is_within_opening_hours(absolute_minute): + continue + for request: ServiceRequest in facility_service.get_queue(facility.instance_id): + _release_closed_business_request(facility, request, absolute_minute) + for guest: GuestRuntime in guest_service.get_guests(): + if guest.state != GuestRuntime.State.MOVING: + continue + var facility := facility_service.get_instance(guest.target_facility_id) + if facility == null or (facility.operator_open and facility.is_within_opening_hours(absolute_minute)): + continue + var transition := guest_service.transition_guest(guest.guest_id, GuestRuntime.State.REPLANNING, absolute_minute, &"FACILITY_CLOSED") + if bool(transition.get(&"ok", false)): + guest.target_facility_id = &"" + guest.path_handle = null + + +func _release_closed_business_request(facility: FacilityInstance, request: ServiceRequest, minute: int) -> void: + # Validate the entire group before any queue/state signals become observable. + for guest_id: StringName in request.guest_ids: + var guest := guest_service.get_guest(guest_id) + if guest == null: + continue + if guest.state != GuestRuntime.State.QUEUING or guest.queue_request_id != request.request_id or guest.target_facility_id != facility.instance_id: + return + if guest.transition_tick == minute and guest.transitions_this_tick >= GuestService.MAX_TRANSITIONS_PER_TICK: + return + # A group releases its one reservation and queue atomically. A transition-budget + # failure retries next minute, without taking patience or dropping any stock. + var before_inventory := inventory_service.create_snapshot() + var before_facility := facility_service.create_snapshot() + var before_guest := guest_service.create_snapshot() + var before_events := domain_events.create_snapshot() + var before_ids := id_generator.create_snapshot() + var released := false + var release := func(_guest_id: StringName = &"", _facility_id: StringName = &"", _request_id: StringName = &"") -> Dictionary: + for reservation_id: StringName in request.reserved_inventory_ids: + var result := inventory_service.release_reservation(reservation_id, StringName("business.close.%s.%s" % [request.request_id, reservation_id]), minute) + if not bool(result.get(&"ok", false)): + return result + var result := facility_service.leave_queue(facility.instance_id, request.request_id, &"FACILITY_CLOSED") + return {&"ok": result.is_success()} + var ok := true + for guest_id: StringName in request.guest_ids: + if not guest_service.has_guest(guest_id): + continue + var result: Dictionary = guest_service.release_queue_for_replanning(guest_id, minute, release if not released else Callable()) + if not bool(result.get(&"ok", false)): + ok = false + break + released = true + if ok and not released: + ok = bool(release.call().get(&"ok", false)) + if not ok: + inventory_service.restore_snapshot(before_inventory) + facility_service.restore_snapshot(before_facility) + guest_service.restore_snapshot(before_guest) + domain_events.restore_snapshot(before_events) + id_generator.restore_snapshot(before_ids) + + +## Commute and elevator movement share the authoritative Path projection and +## fixed-point walking credit used by errands and guests. +func advance_staff_commute(staff_id: StringName, target_cell: Vector3i, minute: int, reason: StringName = &"") -> Dictionary: + var staff := staff_service.get_staff(staff_id) + if staff == null: + return {&"ok": false, &"reason": &"STAFF_NOT_FOUND"} + var actor_id := _staff_path_actor_id(staff_id) + if not _path_projection_matches(actor_id, staff.current_cell): + _report_path_integration_failure(actor_id, staff_id, &"staff", staff.current_cell) + return {&"ok": false} + if not reason.is_empty() or staff.current_cell == target_cell or not elevators.get_actor_trip(actor_id).is_empty(): + _record_expected_actor_wait(actor_id, staff.current_cell, minute) + return {&"ok": true, &"moved": false, &"reason": reason} + var path := path_service.find_path(staff.current_cell, target_cell, + [WorldService.LAYER_FRONT, WorldService.LAYER_BACK], [&"staff"]) + if path.size() < 2: + _record_expected_actor_wait(actor_id, staff.current_cell, minute) + return {&"ok": true, &"moved": false, &"reason": &"COMMUTE_ROUTE_BLOCKED"} + if _request_elevator_step(actor_id, path[0], path[1], minute, [&"staff"]): + return {&"ok": true, &"moved": false, &"reason": &"ELEVATOR_WAIT"} + var required_credit := _step_movement_credit(path_service, path[0], path[1], [&"staff"]) + var credit := _movement_credit_after_one_minute(actor_id, staff.current_cell, minute) + credit = mini(credit, required_credit + MOVEMENT_CREDIT_SCALE - 1) + if credit < required_credit: + _record_expected_actor_wait(actor_id, staff.current_cell, minute) + _movement_credits[actor_id] = {&"credit": credit, &"updated_at": minute} + return {&"ok": true, &"moved": false} + var previous := staff.current_cell + if not path_service.project_actor_position(actor_id, path[1], minute): + _report_path_integration_failure(actor_id, staff_id, &"staff", previous) + return {&"ok": false} + staff.current_cell = path[1] + _movement_credits[actor_id] = {&"credit": credit - required_credit, &"updated_at": minute} + _publish_actor_event(&"STAFF_MOVED", &"staff_commute", [staff_id, actor_id], { + &"path_actor_id": actor_id, &"from_cell": previous, &"cell": staff.current_cell, + &"target_cell": target_cell, &"reason": &"COMMUTE"}) + return {&"ok": true, &"moved": true, &"cell": staff.current_cell} + + +func _request_elevator_step(actor_id: StringName, from: Vector3i, to: Vector3i, + minute: int, access: Array[StringName]) -> bool: + var connector_id := path_service.get_step_connector(from, to, access) + if not elevators.owns_connector(connector_id): + return false + var shaft_id := elevators.get_shaft_for_connector(connector_id) + if not _elevator_extension_pending(shaft_id): + var result := elevators.request_trip(actor_id, from, to, minute, access) + if bool(result.get(&"ok", false)) and not bool(result.get(&"replay", false)): + _publish_actor_event(&"ELEVATOR_TRIP_REQUESTED", &"elevators", [actor_id, shaft_id], result[&"trip"]) + # Waiting for a cabin or a construction extension is intentional, never a + # walk across floors and never a stuck-actor timeout. + _record_expected_actor_wait(actor_id, from, minute) + return true + + +func _advance_elevators(minute: int) -> void: + var queued_before: Dictionary = {} + for trip: Dictionary in elevators.get_report()[&"trips"]: + if trip[&"state"] == PathService.ELEVATOR_REQUEST_QUEUED: + queued_before[trip[&"request_id"]] = true + for shaft: Dictionary in elevators.get_report()[&"shafts"]: + var powered := int(_state.get_resource(&"mana")) > 0 + for module_id: StringName in shaft[&"module_ids"]: + var state := mana_network_service.get_consumer_state(module_id) + if state not in [ManaNetworkService.ConsumerState.ACTIVE, ManaNetworkService.ConsumerState.DEGRADED]: + powered = false + _apply_elevator_arrivals(elevators.set_powered(shaft[&"shaft_id"], powered, minute), minute) + _apply_elevator_arrivals(elevators.advance_one_minute(minute), minute) + for trip: Dictionary in elevators.get_report()[&"trips"]: + if trip[&"state"] == PathService.ELEVATOR_REQUEST_BOARDED and queued_before.has(trip[&"request_id"]): + var payload := trip.duplicate(true) + payload[&"boarded_at"] = minute + payload[&"wait_minutes"] = minute - int(trip[&"enqueued_at"]) + _publish_actor_event(&"ELEVATOR_BOARDED", &"elevators", [trip[&"actor_id"], trip[&"shaft_id"]], payload) + + +func _apply_elevator_arrivals(arrivals: Array[Dictionary], minute: int) -> void: + for arrival: Dictionary in arrivals: + var actor_id := StringName(arrival[&"actor_id"]) + if not path_service.has_actor_projection(actor_id): + continue + var previous: Vector3i = path_service.get_actor_projected_cell(actor_id) + var cell: Vector3i = arrival[&"cell"] + var entity_id := StringName(String(actor_id).trim_prefix("guest:").trim_prefix("staff:")) + var guest := guest_service.get_guest(entity_id) if String(actor_id).begins_with("guest:") else null + var staff := staff_service.get_staff(entity_id) if String(actor_id).begins_with("staff:") else null + if guest == null and staff == null: + _report_path_integration_failure(actor_id, entity_id, &"elevator", previous) + continue + if not path_service.project_actor_position(actor_id, cell, minute): + _report_path_integration_failure(actor_id, entity_id, &"elevator", previous) + continue + if guest != null: + guest_service.record_path_success(guest.guest_id, cell, minute) + else: + staff.current_cell = cell + _movement_credits[actor_id] = {&"credit": 0, &"updated_at": minute} + _publish_actor_event(&"ELEVATOR_ARRIVED", &"elevators", [actor_id, entity_id], arrival) + + +func _execute_set_elevator_operation(command: SimulationCommand) -> CommandResult: + var shaft_id := StringName(command.payload.get(&"shaft_id", &"")) + var open_value: Variant = command.payload.get(&"operator_open", null) + if typeof(open_value) != TYPE_BOOL: + return CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, "operator_open must be a bool.") + var found := false + for shaft: Dictionary in elevators.get_report()[&"shafts"]: + if shaft[&"shaft_id"] == shaft_id: found = true + if not found: + return CommandResult.failed(CommandResult.Code.NOT_FOUND, command.command_id, "Elevator shaft was not found.") + _apply_elevator_arrivals(elevators.set_operator_open(shaft_id, open_value, _runtime_event_minute()), _runtime_event_minute()) + _publish_actor_event(&"ELEVATOR_OPERATION_CHANGED", &"elevators", [shaft_id], {&"operator_open": open_value}) + return CommandResult.succeeded(command.command_id, {&"shaft_id": shaft_id, &"operator_open": open_value}) + + +func _synchronize_elevators(minute: int) -> Dictionary: + return elevators.synchronize(ElevatorService.configurations_from_facilities( + construction_service.get_facilities(), definition_registry), minute) + + +func _elevator_shaft_busy(shaft: Dictionary) -> bool: + return shaft.get(&"phase", &"IDLE") != &"IDLE" or int(shaft.get(&"waiting_count", 0)) > 0 \ + or int(shaft.get(&"passenger_count", 0)) > 0 + + +func _elevator_touches_module(shaft: Dictionary, definition: FacilityDefinition, origin: Vector3i) -> bool: + if definition == null or definition.id not in [&"guest_elevator", &"service_elevator"]: + return false + var stops: Array = shaft[&"stops"] + var bottom: Vector3i = stops.front() + var top: Vector3i = stops.back() + return origin.x == bottom.x and origin.z == bottom.z and definition.footprint.x == int(shaft[&"width"]) \ + and origin.y <= top.y + 1 and origin.y + definition.footprint.y >= bottom.y + + +func _elevator_extension_pending(shaft_id: StringName) -> bool: + for shaft: Dictionary in elevators.get_report()[&"shafts"]: + if shaft[&"shaft_id"] != shaft_id: continue + for job: ConstructionJob in construction_service.get_jobs(): + if job.state in [ConstructionJob.State.COMPLETED, ConstructionJob.State.CANCELLED]: continue + if _elevator_touches_module(shaft, definition_registry.get_facility(job.definition_id), job.origin): + return true + return false + + +func _validate_elevator_crosslinks(service: ElevatorService, paths: PathService, + construction: ConstructionService, guests: GuestService, staff: StaffService, minute: int) -> bool: + if service.current_minute != minute: return false + var expected := ElevatorService.configurations_from_facilities(construction.get_facilities(), definition_registry) + var saved_configs: Array = [] + for car: Dictionary in service.create_snapshot()[&"shafts"]: + saved_configs.append(car[&"config"]) + # Construction uses numeric spatial order while snapshots use lexical IDs. + # Compare canonical shaft identity order (x=-2/10, floors=2/10 otherwise differ). + var by_id := func(a: Dictionary, b: Dictionary) -> bool: + return String(a[&"shaft_id"]) < String(b[&"shaft_id"]) + expected.sort_custom(by_id) + saved_configs.sort_custom(by_id) + if expected != saved_configs: return false + for trip: Dictionary in service.get_report()[&"trips"]: + var actor_id := StringName(trip[&"actor_id"]) + var entity_id := StringName(String(actor_id).trim_prefix("guest:").trim_prefix("staff:")) + var guest := guests.get_guest(entity_id) if String(actor_id).begins_with("guest:") else null + var worker := staff.get_staff(entity_id) if String(actor_id).begins_with("staff:") else null + if guest == null and worker == null: return false + if guest != null and (guest.current_cell != trip[&"from"] or trip[&"from"].z != WorldService.LAYER_FRONT): return false + if worker != null and worker.current_cell != trip[&"from"]: return false + if not paths.has_actor_projection(actor_id) or paths.get_actor_projected_cell(actor_id) != trip[&"from"]: return false + return true + + +func is_staff_in_transit(staff_id: StringName) -> bool: + return not elevators.get_actor_trip(_staff_path_actor_id(staff_id)).is_empty() + + +func _estimated_actor_path_minutes(path: Array, access: Array[StringName]) -> int: + for index: int in range(1, path.size()): + var connector_id := path_service.get_step_connector(path[index - 1], path[index], access) + if elevators.owns_connector(connector_id) \ + or _step_movement_credit_for_connector(path_service, path[index - 1], path[index], connector_id) > MOVEMENT_CREDIT_SCALE: + var cost: int + if access.is_empty() and path_service.get_script().resource_path == "res://scripts/world/path_service.gd" \ + and path[0] is Vector3i and path[path.size() - 1] is Vector3i: + cost = path_service.calculate_guest_batch_path_cost(path[0], path[path.size() - 1], path) + else: + cost = path_service.calculate_path_cost(path, access) + return ceili(float(cost) / PathService.ORTHOGONAL_MOVE_COST) + return maxi(path.size() - 1, 0) + + +func _prune_expired_staff_elevator_waits(minute: int) -> void: + for trip: Dictionary in elevators.get_report()[&"trips"]: + if trip.has(&"companion_id"): continue + var actor_id := StringName(trip[&"actor_id"]) + if trip[&"state"] != PathService.ELEVATOR_REQUEST_QUEUED or not String(actor_id).begins_with("staff:"): + continue + var staff := staff_service.get_staff(StringName(String(actor_id).trim_prefix("staff:"))) + if staff == null: + elevators.cancel_actor(actor_id) + continue + if staff.state == StaffRuntime.State.OFF_DUTY and get_staff_rest_report(staff.staff_id).get(&"reachable", false): + continue + if not staff_service.requires_attendance(staff.staff_id): + continue + var task := staff_service.get_task(staff.current_task_id) + if task != null and task.state == StaffTask.State.MOVING and task.assigned_staff_id == staff.staff_id: + continue + var shift := staff_service.get_shift(staff.shift_id) + if not staff.can_take_shift() or shift == null or (not shift.contains_minute(minute) and not shift.is_commute_window(minute)): + elevators.cancel_actor(actor_id) + _publish_actor_event(&"ELEVATOR_COMMUTE_CANCELLED", &"staff_commute", [staff.staff_id, actor_id], {&"reason": &"SHIFT_ENDED_OR_UNAVAILABLE"}) + + +## Stairs carry half-minute progress between ticks. Doors keep their established +## one-step walking behavior, and elevator time is owned by the cabin service. +static func _step_movement_credit(path: PathService, from: Vector3i, to: Vector3i, + access: Array[StringName]) -> int: + return _step_movement_credit_for_connector(path,from,to,path.get_step_connector(from,to,access)) + + +static func _step_movement_credit_for_connector(path: PathService, from: Vector3i, to: Vector3i, connector_id: StringName) -> int: + if String(connector_id).begins_with("infra.connector:") and from.x == to.x \ + and from.z == to.z and absi(from.y - to.y) == 1: + var connector := path.get_connector(connector_id) + if connector.get(&"movement_type", &"") == PathService.MOVEMENT_CONNECTOR \ + and int(connector.get(&"cost", 0)) == 150: + return STAIR_MOVEMENT_CREDIT + return MOVEMENT_CREDIT_SCALE + + +static func _cell_movement_credit_limit(path: PathService, cell: Vector3i) -> int: + # Temporary blockades must not invalidate progress saved on a staircase. + # Inspect structural edges here instead of querying currently usable routes. + for edge: Dictionary in path.get_neighbors(cell): + var next: Vector3i = edge[&"to"] + if String(edge[&"connector_id"]).begins_with("infra.connector:") \ + and edge[&"movement_type"] == PathService.MOVEMENT_CONNECTOR \ + and int(edge[&"base_cost"]) == 150 and cell.x == next.x \ + and cell.z == next.z and absi(cell.y - next.y) == 1: + return STAIR_MOVEMENT_CREDIT + return MOVEMENT_CREDIT_SCALE + + +func _prune_legacy_stairs_and_movement() -> bool: + if not legacy_stairs.prune_invalid(): + return false + # A removed staircase discards only progress that can no longer be used. + for actor_id: StringName in _movement_credits: + if path_service.has_actor_projection(actor_id): + var cell: Vector3i = path_service.get_actor_projected_cell(actor_id) + _movement_credits[actor_id][&"credit"] = mini(int(_movement_credits[actor_id][&"credit"]), + _cell_movement_credit_limit(path_service, cell) - 1) + return true + + +func get_elevator_wait_statistics(shaft_id: StringName) -> Dictionary: + var samples: Array[int] = [] + var oldest_wait := 0 + var minute := _runtime_event_minute() + for event: SimulationDomainEvent in domain_events.recent_events(): + if event.event_type != &"ELEVATOR_BOARDED" or event.absolute_minute < minute - 60 \ + or event.absolute_minute > minute or event.payload.get(&"shaft_id", &"") != shaft_id: + continue + var wait: int = int(event.payload.get(&"wait_minutes", -1)) + if wait >= 0: + samples.append(wait) + for trip: Dictionary in elevators.get_report()[&"trips"]: + if trip[&"shaft_id"] == shaft_id and trip[&"state"] == PathService.ELEVATOR_REQUEST_QUEUED: + oldest_wait = maxi(oldest_wait, minute - int(trip[&"enqueued_at"])) + samples.sort() + var total := 0 + for wait: int in samples: + total += wait + return {&"sample_count": samples.size(), &"window_minutes": 60, + &"event_history_limit": DomainEventStream.RECENT_EVENT_LIMIT, + &"mean_wait_minutes": float(total) / samples.size() if not samples.is_empty() else 0.0, + &"p95_wait_minutes": samples[ceili(samples.size() * 0.95) - 1] if not samples.is_empty() else 0, + &"oldest_wait_minutes": oldest_wait} + + +func _demolition_lost_route_cells(instance_id: StringName) -> Array[Vector3i]: + var lost_cells: Array[Vector3i] = [] + var projection := facility_infrastructure_projector.get_projection(instance_id) + var base := route_subslot_path_adapter.get_base_walkable_cells() + for cell: Vector3i in projection.get(&"cells", []): + if cell not in base: + lost_cells.append(cell) + return lost_cells + + +func _stair_demolition_dependents(instance_id: StringName) -> Array[StringName]: + var lost_cells := _demolition_lost_route_cells(instance_id) + var dependents := facility_infrastructure_projector.get_stair_dependents(lost_cells) + dependents.erase(instance_id) + # A staircase under construction already relies on its lower landing too. + for job: ConstructionJob in construction_service.get_jobs(): + if not job.is_terminal() and job.definition_id in [&"guest_stairs", &"service_stairs"] \ + and job.origin + Vector3i(0, -1, 0) in lost_cells: + dependents.append(job.job_id) + return dependents + + +## Use the same entrance and horizontal access cells as ordinary Guest AI. +## Facility access_available is an operating override, not a topology cache. +func is_facility_reachable(facility_id: StringName) -> bool: + var facility := facility_service.get_instance(facility_id) + var entrance: Variant = _operations_entrance_cell() + if facility == null or entrance == null or not facility.access_available: + return false + # Read-only UI queries need existence, not the cheapest destination. + # Share Guest AI's candidates and path rules without caching topology state. + for candidate: Vector3i in _facility_access_candidates(facility): + if not path_service.find_path(entrance, candidate).is_empty(): + return true + return false + + +func get_facility_access_report(facility_id: StringName) -> Dictionary: + var facility := facility_service.get_instance(facility_id) + var entrance: Variant = _operations_entrance_cell() + if facility == null or entrance == null or not facility.access_available: + return {&"reachable": false, &"path": []} + return _find_facility_access_path(entrance, facility) + + +func _staff_is_being_carried(patient_id: StringName) -> bool: + for task: StaffTask in staff_service.get_tasks(): + if task.task_type == &"rescue_transport" and not task.is_terminal() and not task.assigned_staff_id.is_empty() and task.target_entity_id == patient_id: + return true + return false + +func _rescue_destination(patient_cell: Vector3i) -> Dictionary: + var best := {} + var distance := 2147483647 + for clinic: FacilityInstance in facility_service.get_instances(): + if clinic.definition_id != &"infirmary" or clinic.operation_state != FacilityInstance.OperationState.OPERATING: + continue + var cells := {clinic.origin: true} + for cell: Vector3i in clinic.occupied_cells: + for delta in [Vector3i.LEFT, Vector3i.RIGHT, Vector3i.UP, Vector3i.DOWN]: + cells[cell + delta] = true + var ordered := cells.keys() + ordered.sort_custom(func(a: Vector3i, b: Vector3i): return a.y < b.y if a.y != b.y else a.x < b.x) + for cell: Vector3i in ordered: + if cell.z != WorldService.LAYER_BACK: + continue + var route := path_service.find_backyard_path(patient_cell, cell, true) + if not route.is_empty() and route.size() < distance: + distance = route.size() + best = {&"facility_id": clinic.instance_id, &"cell": cell} + return best + +func _handle_rescue_arrival(task: StaffTask, carrier: StaffRuntime, minute: int) -> bool: + if task.task_type == CleaningBridge.TASK_TYPE: + return carrier.current_cell == task.target_cell and cleaning_bridge.task_can_work(task, carrier) + if task.task_type not in [&"rescue_pickup", &"rescue_transport"]: + return true + var patient := staff_service.get_staff(task.target_entity_id) + if patient == null or patient.state != StaffRuntime.State.INCAPACITATED or carrier.current_cell != task.target_cell: + return false + if task.task_type == &"rescue_transport": + var clinic := facility_service.get_instance(task.rescue_facility_id) + return clinic != null and clinic.operation_state == FacilityInstance.OperationState.OPERATING and patient.current_cell == carrier.current_cell + if patient.current_cell != carrier.current_cell: + return false + var destination := _rescue_destination(patient.current_cell) + if destination.is_empty(): + return false + task.task_type = &"rescue_transport" + task.rescue_facility_id = destination[&"facility_id"] + task.target_cell = destination[&"cell"] + task.state = StaffTask.State.MOVING + task.state_changed_at = minute + _publish_actor_event(&"STAFF_RESCUE_PICKED_UP", &"staff_service", [patient.staff_id, carrier.staff_id], {&"facility_id": task.rescue_facility_id}) + return false + +func _advance_staff_rescue(minute: int) -> void: + for task: StaffTask in staff_service.get_tasks(): + if task.task_type not in [&"rescue_pickup", &"rescue_transport"] or task.is_terminal(): + continue + var patient := staff_service.get_staff(task.target_entity_id) + var carrier := staff_service.get_staff(task.assigned_staff_id) + var invalid := patient == null or patient.state != StaffRuntime.State.INCAPACITATED + if not task.assigned_staff_id.is_empty(): + invalid = invalid or carrier == null or not carrier.can_take_shift() or carrier.current_task_id != task.task_id + if task.task_type == &"rescue_transport": + var clinic := facility_service.get_instance(task.rescue_facility_id) + invalid = invalid or carrier == null or clinic == null or clinic.operation_state != FacilityInstance.OperationState.OPERATING + if patient != null and carrier != null: + invalid = invalid or patient.current_cell != carrier.current_cell + if invalid: + if carrier != null and elevators.get_actor_trip(_staff_path_actor_id(carrier.staff_id)).get(&"state", &"") == PathService.ELEVATOR_REQUEST_BOARDED: + continue # Keep the pair aboard until a real or emergency landing. + staff_service.cancel_task(task.task_id, &"RESCUE_INTERRUPTED", minute) + if patient != null: elevators.cancel_actor(_staff_path_actor_id(patient.staff_id)) + if carrier != null: elevators.cancel_actor(_staff_path_actor_id(carrier.staff_id)) + for patient: StaffRuntime in staff_service.get_staff_members(): + if not _defense_lock_owner(patient.staff_id, &"DEFENDER").is_empty(): + continue + if patient.health > 0 and patient.state != StaffRuntime.State.INCAPACITATED: + continue + if not patient.current_task_id.is_empty(): + staff_service.cancel_task(patient.current_task_id, &"STAFF_COLLAPSED", minute) + if patient.state != StaffRuntime.State.INCAPACITATED or patient.state_reason.is_empty(): + patient.transition_to(StaffRuntime.State.INCAPACITATED, &"STAFF_COLLAPSED", minute) + _publish_actor_event(&"STAFF_COLLAPSED", &"staff_service", [patient.staff_id], {&"cell": patient.current_cell}) + if patient.current_cell.z == WorldService.LAYER_FRONT and patient.state_reason != &"COLLAPSE_WITNESSED": + for guest: GuestRuntime in guest_service.get_guests(): + if _authority_line_of_sight(guest.current_cell, patient.current_cell, {}): + if progression_service.update_metrics({&"reputation": maxi(int(progression_service.metrics[&"reputation"]) - 1, 0)}): + patient.state_reason = &"COLLAPSE_WITNESSED" + _publish_actor_event(&"STAFF_COLLAPSE_WITNESSED", &"staff_service", [patient.staff_id, guest.guest_id], {}) + break + var pending := false + for task: StaffTask in staff_service.get_tasks(): + if task.task_type in [&"rescue_pickup", &"rescue_transport"] and task.target_entity_id == patient.staff_id and not task.is_terminal(): + pending = true + if not elevators.get_actor_trip(_staff_path_actor_id(patient.staff_id)).is_empty(): + continue + if pending or _rescue_destination(patient.current_cell).is_empty(): + continue + staff_service.create_task(&"rescue_pickup", 95, minute, { + &"target_entity_id": patient.staff_id, &"target_cell": patient.current_cell, + &"required_role_tags": [&"medic"], &"task_tags": [&"rescue"], + &"estimated_minutes": 30, &"interrupt_level": 0, &"emergency": true, + }) + + +func get_staff_rescue_report() -> Dictionary: + var report := {&"waiting": 0, &"transporting": 0, &"treating": 0} + for patient: StaffRuntime in staff_service.get_staff_members(): + if patient.state != StaffRuntime.State.INCAPACITATED: + continue + var category: StringName = &"waiting" + for task: StaffTask in staff_service.get_tasks(): + if task.target_entity_id == patient.staff_id and task.task_type == &"rescue_transport" and not task.is_terminal(): + category = &"treating" if task.state == StaffTask.State.WORKING else &"transporting" + report[category] += 1 + return report + + +func _staff_rescue_status(staff_id: StringName) -> String: + var staff := staff_service.get_staff(staff_id) + if staff == null or staff.state != StaffRuntime.State.INCAPACITATED: + return "" + for task: StaffTask in staff_service.get_tasks(): + if task.target_entity_id != staff_id or task.is_terminal(): continue + if task.task_type == &"rescue_transport": + return "治療中" if task.state == StaffTask.State.WORKING else "搬送中" + if task.task_type == &"rescue_pickup" and not task.assigned_staff_id.is_empty(): + return "救護班が向かっています" + return "救護待ち(医療職・医務室・裏経路を確認)" + + +## Rest destinations derive from saved facilities and position, with no hidden timer. +func get_staff_rest_report(staff_id: StringName) -> Dictionary: + var staff := staff_service.get_staff(staff_id) + if staff == null or staff.state != StaffRuntime.State.OFF_DUTY or staff.health <= 0 or not staff.current_task_id.is_empty(): return {} + if not _defense_lock_owner(staff_id, &"DEFENDER").is_empty() or event_service.get_actor_locks().has(staff_id): return {} + var best := {&"reachable": false, &"resting": false, &"label": "休憩先なし(稼働中の待機室・宿舎と経路を確認)"} + var best_cost := 2147483647 + for room: FacilityInstance in facility_service.get_instances(): + if room.definition_id not in [&"staff_waiting_room", &"staff_dormitory"] or room.operation_state != FacilityInstance.OperationState.OPERATING: continue + var route := staff_commute.find_facility_access_path(staff.current_cell, room) + if not route.get(&"reachable", false): continue + var cost := path_service.calculate_path_cost(route[&"path"], [&"staff"]) + if cost >= best_cost: continue + best_cost = cost + var resting := StaffCommuteService.is_at_facility(staff, room) and not is_staff_in_transit(staff_id) + best = {&"reachable": true, &"resting": resting, &"cell": route[&"cell"], &"facility_id": room.instance_id, + &"label": ("宿舎で休憩中" if room.definition_id == &"staff_dormitory" else "待機室で休憩中") if resting else "休憩先へ移動中"} + return best + + +func _advance_weather(absolute_minute: int) -> void: + weather.advance_to(absolute_minute) + + +func get_weather_report() -> Dictionary: + return {&"kind": weather.get_kind(), &"minute": weather.get_minute()} + + +## Read-only migration preview; applying dimensions remains a separate transaction. +func preview_facility_dimension_migration(instance_id: StringName) -> Dictionary: + var instance := construction_service.get_facility(instance_id) + if instance.is_empty(): + return {&"geometry_ok": false, &"ready_to_apply": false, &"errors": [&"COMPLETED_FACILITY_REQUIRED"]} + var weights := {} + for built: Dictionary in construction_service.get_facilities(): + var definition := definition_registry.get_facility(built[&"definition_id"]) + if definition == null: + return {&"geometry_ok": false, &"ready_to_apply": false, &"errors": [&"MISSING_FACILITY_DEFINITION"]} + weights[built[&"instance_id"]] = definition.weight_per_cell + var preview: Dictionary = preload("res://scripts/construction/facility_resize_preview.gd").inspect(world_service, instance, weights[instance_id], weights) + if preview.has(&"remaining_gates"): + preview[&"remaining_gates"].erase(&"DEFINITION_WEIGHT_VALIDATION") + preview[&"definition_weights"] = weights + if preview.get(&"geometry_ok", false): + preview[&"construction_candidate"] = preload("res://scripts/construction/facility_resize_preview.gd").prepare_construction_candidate(world_service, construction_service, instance_id, weights[instance_id], weights) + preview[&"actors_on_removed_cells"] = [] + for guest: GuestRuntime in guest_service.get_guests(): + if guest.current_cell in preview.get(&"removed", []): + preview[&"actors_on_removed_cells"].append({&"kind": &"guest", &"id": guest.guest_id, &"cell": guest.current_cell}) + for worker: StaffRuntime in staff_service.get_staff_members(): + if worker.current_cell in preview.get(&"removed", []): + preview[&"actors_on_removed_cells"].append({&"kind": &"staff", &"id": worker.staff_id, &"cell": worker.current_cell}) + preview[&"construction_jobs"] = [] + for job: ConstructionJob in construction_service.get_jobs(): + preview[&"construction_jobs"].append({&"job_id": job.job_id, &"definition_id": job.definition_id, &"state": job.state}) + return preview + +## Assemble and validate a snapshot in an isolated Runtime, including access +## preservation. Disk backup, actor relocation and atomic commit remain separate. +func prepare_facility_dimension_snapshot(instance_id: StringName) -> Dictionary: + if construction_service.get_facility(instance_id).is_empty() and construction_service.get_job(instance_id) != null: + return _prepare_construction_dimension_snapshot(instance_id) + var preview := preview_facility_dimension_migration(instance_id) + var result := {&"ok": false, &"ready_to_apply": false, &"errors": [], &"preview": preview} + if not preview.get(&"construction_candidate", {}).get(&"ok", false): + result[&"errors"].append(&"CONSTRUCTION_CANDIDATE_REQUIRED") + return result + if not preview[&"actors_on_removed_cells"].is_empty(): + result[&"errors"].append(&"ACTOR_RELOCATION_REQUIRED") + return result + var candidate := create_snapshot() + var data: Dictionary = candidate[&"systems"][&"runtime"] + data[&"world"] = preview[&"construction_candidate"][&"world"].duplicate(true) + data[&"construction"] = preview[&"construction_candidate"][&"construction"].duplicate(true) + var found := false + for instance: Dictionary in data[&"facilities"][&"instances"]: + if StringName(instance[&"instance_id"]) != instance_id: continue + found = true + var cells: Array = [] + for cell: Vector3i in preview[&"target_cells"]: cells.append([cell.x, cell.y, cell.z]) + instance[&"occupied_cells"] = cells + if not found: + result[&"errors"].append(&"OPERATIONAL_FACILITY_REQUIRED") + return result + var isolated: Variant = get_script().new() + var candidate_clock: Variant = load("res://autoload/game_clock.gd").new() + var candidate_state: Variant = load("res://autoload/game_state.gd").new() + candidate_clock.reset(1, 6, 0) + candidate_state.reset() + isolated.initialize(candidate_clock, candidate_state, world_seed) + # The immutable definition resources must match the source registry, + # including any explicitly registered expansion definitions. + isolated.definition_registry = definition_registry + var restored: bool = isolated.restore_snapshot(candidate) + if restored: + result[&"routes"] = preload("res://scripts/construction/facility_resize_routes.gd").inspect(self, isolated, instance_id) + if result[&"routes"][&"errors"].is_empty() and not result[&"routes"][&"guest_replans"].is_empty(): + result[&"retargeting"] = preload("res://scripts/construction/facility_resize_routes.gd").retarget_guests(isolated, result[&"routes"]) + if result[&"retargeting"][&"ok"]: + candidate = isolated.create_snapshot() + restored = isolated.restore_snapshot(candidate) + if restored: + result[&"routes"] = preload("res://scripts/construction/facility_resize_routes.gd").inspect(self, isolated, instance_id) + isolated.free() + candidate_clock.free() + candidate_state.free() + if not restored: + result[&"errors"].append(&"RUNTIME_CANDIDATE_REJECTED") + return result + if not result[&"routes"][&"ok"]: + result[&"errors"].append(&"ROUTE_MIGRATION_REQUIRED") + return result + result[&"ok"] = true + result[&"snapshot"] = candidate + return result + +## Explicit disk migration. Source Runtime stays untouched; the formal package +## is replaced only after isolated domain/route validation and verified backup. +func migrate_facility_dimensions_at_path(save_path: String, instance_id: StringName = &"", expected_source_digest: String = "") -> Dictionary: + var loaded := SaveService.load_snapshot(save_path) + if not loaded[&"ok"]: return loaded + if not expected_source_digest.is_empty() and SimulationDigest.compute(loaded[&"snapshot"]) != expected_source_digest: + return {&"ok": false, &"code": &"MIGRATION_SOURCE_CHANGED"} + var isolated: Variant = get_script().new() + var migration_clock: Variant = load("res://autoload/game_clock.gd").new() + var migration_state: Variant = load("res://autoload/game_state.gd").new() + migration_clock.reset(1, 6, 0); migration_state.reset() + isolated.initialize(migration_clock, migration_state, world_seed) + isolated.definition_registry = definition_registry + var prepared := {&"ok": false, &"errors": [&"SOURCE_RUNTIME_REJECTED"]} + if isolated.restore_snapshot(loaded[&"snapshot"]): + if instance_id.is_empty(): + prepared = isolated.prepare_all_facility_dimension_snapshots() + else: + prepared = isolated.prepare_facility_dimension_snapshot(instance_id) + isolated.free(); migration_clock.free(); migration_state.free() + if not prepared[&"ok"]: + return {&"ok": false, &"code": &"DIMENSION_MIGRATION_REJECTED", &"details": prepared} + return SaveService.replace_snapshot_with_backup(save_path, loaded[&"snapshot"], prepared[&"snapshot"]) + +## Runs on an isolated migration Runtime; caller commits only the final snapshot. +func prepare_all_facility_dimension_snapshots() -> Dictionary: + var original := create_snapshot() + var targets: Array[StringName] = [] + var shapes: Dictionary = preload("res://scripts/construction/facility_resize_preview.gd").DIMENSIONS + for job: ConstructionJob in construction_service.get_jobs(): + if job.is_terminal() or not shapes.has(job.definition_id): continue + var size: Vector2i = shapes[job.definition_id][&"new"] + if job.rotation in [90,270]: size = Vector2i(size.y,size.x) + if not preload("res://scripts/construction/facility_resize_preview.gd")._same_cells(job.reserved_cells, world_service.cells_for_footprint(job.origin,size)): + targets.append(job.job_id) + for facility: Dictionary in construction_service.get_facilities(): + if not shapes.has(facility[&"definition_id"]): continue + var size: Vector2i = shapes[facility[&"definition_id"]][&"new"] + if facility[&"rotation"] in [90,270]: size = Vector2i(size.y,size.x) + if not preload("res://scripts/construction/facility_resize_preview.gd")._same_cells(facility[&"occupied_cells"], world_service.cells_for_footprint(facility[&"origin"],size)): + targets.append(facility[&"instance_id"]) + for id: StringName in targets: + var prepared := prepare_facility_dimension_snapshot(id) + if not prepared[&"ok"] or not restore_snapshot(prepared[&"snapshot"]): + var rolled_back := restore_snapshot(original) + return {&"ok": false, &"errors": [&"BATCH_DIMENSION_REJECTED"], &"facility_id": id, &"details": prepared, &"rolled_back": rolled_back} + return {&"ok": true, &"snapshot": create_snapshot(), &"facility_ids": targets} + +func _prepare_construction_dimension_snapshot(job_id: StringName) -> Dictionary: + var weights := {} + for facility: Dictionary in construction_service.get_facilities(): + var definition := definition_registry.get_facility(facility[&"definition_id"]) + if definition == null: return {&"ok": false, &"errors": [&"MISSING_FACILITY_DEFINITION"]} + weights[facility[&"instance_id"]] = definition.weight_per_cell + var job := construction_service.get_job(job_id) + var definition := definition_registry.get_facility(job.definition_id) + if job.is_terminal() or definition == null: + return {&"ok": false, &"errors": [&"ACTIVE_JOB_REQUIRED"]} + weights[job_id] = definition.weight_per_cell + var prepared: Dictionary = preload("res://scripts/construction/facility_resize_preview.gd").prepare_construction_candidate(world_service, construction_service, job_id, definition.weight_per_cell, weights) + if not prepared[&"ok"]: return prepared + var candidate := create_snapshot() + candidate[&"systems"][&"runtime"][&"world"] = prepared[&"world"] + candidate[&"systems"][&"runtime"][&"construction"] = prepared[&"construction"] + var isolated: Variant = get_script().new() + var candidate_clock: Variant = load("res://autoload/game_clock.gd").new() + var candidate_state: Variant = load("res://autoload/game_state.gd").new() + candidate_clock.reset(1,6,0); candidate_state.reset() + isolated.initialize(candidate_clock, candidate_state, world_seed) + isolated.definition_registry = definition_registry + var valid: bool = isolated.restore_snapshot(candidate) + isolated.free(); candidate_clock.free(); candidate_state.free() + if not valid: return {&"ok": false, &"errors": [&"RUNTIME_CANDIDATE_REJECTED"]} + return {&"ok": true, &"ready_to_apply": false, &"snapshot": candidate} + +## Read-only saved-game preflight used by the load menu before confirmation. +func preview_facility_dimensions_at_path(save_path: String) -> Dictionary: + var loaded := SaveService.inspect_snapshot(save_path) + if not loaded[&"ok"]: return loaded + var isolated: Variant = get_script().new() + var preview_clock: Variant = load("res://autoload/game_clock.gd").new() + var preview_state: Variant = load("res://autoload/game_state.gd").new() + preview_clock.reset(1,6,0); preview_state.reset() + isolated.initialize(preview_clock,preview_state,world_seed) + isolated.definition_registry=definition_registry + var result := {&"ok": false, &"code": &"SOURCE_RUNTIME_REJECTED"} + if isolated.restore_snapshot(loaded[&"snapshot"]): + result=isolated.prepare_all_facility_dimension_snapshots() + result[&"source_digest"]=SimulationDigest.compute(loaded[&"snapshot"]) + result[&"changes"]=[] + if result[&"ok"]: + for id: StringName in result[&"facility_ids"]: + var facility: Dictionary=isolated.construction_service.get_facility(id) + var job: ConstructionJob=isolated.construction_service.get_job(id) + var definition_id: StringName=facility.get(&"definition_id",&"") if job==null else job.definition_id + var definition: FacilityDefinition=definition_registry.get_facility(definition_id) + result[&"changes"].append({&"id":id,&"name":definition.display_name,&"size":definition.footprint,&"building":job!=null}) + result.erase(&"snapshot") + isolated.free();preview_clock.free();preview_state.free() + return result + + +func _on_cleanliness_facility_registered(facility: FacilityInstance) -> void: + var values := cleaning_policy.create_snapshot() + if facility_cleanliness.get_facility(facility.instance_id).is_empty(): + facility_cleanliness.register_facility(facility.instance_id, values["initial_cleanliness"], values["maximum_cleanliness"]) + + +func _on_cleanliness_facility_unregistered(facility_id: StringName) -> void: + for task: StaffTask in staff_service.get_tasks(): + if task.task_type == CleaningBridge.TASK_TYPE and task.target_entity_id == facility_id and not task.is_terminal(): + staff_service.cancel_task(task.task_id, &"CLEANING_TARGET_REMOVED", _runtime_event_minute()) + if not facility_cleanliness.get_facility(facility_id).is_empty(): + facility_cleanliness.unregister_facility(facility_id) + _sync_facility_staffing(_runtime_event_minute()) + + +func _validate_cleanliness_crosslinks(cleanliness: RefCounted, facilities: FacilityService, staff: StaffService, path: PathService) -> bool: + var snapshot: Dictionary = cleanliness.create_snapshot() + var instances := facilities.get_instances() + var completed_cleanings: Dictionary = {} + if snapshot["facilities"].size() != instances.size(): return false + for facility: FacilityInstance in instances: + var row: Dictionary = cleanliness.get_facility(facility.instance_id) + if row.is_empty() or row["maximum"] != 100 or row["initial"] != 100: return false + for receipt: Dictionary in snapshot["receipts"]: + if receipt["kind"] == "clean": + var task := staff.get_task(StringName(receipt["source_id"])) + if task == null or task.task_type != CleaningBridge.TASK_TYPE or task.state != StaffTask.State.COMPLETED or task.target_entity_id != StringName(receipt["facility_id"]) or receipt["amount"] != cleaning_policy.create_snapshot()["recovery_per_completed_task"]: return false + if task.progress_minutes != task.estimated_minutes: return false + completed_cleanings[task.task_id] = true + continue + if receipt["kind"] != "use": return false + var service := facilities.get_service(StringName(receipt["source_id"])) + if service == null or service.state != ServiceInstance.State.COMPLETED or service.facility_id != StringName(receipt["facility_id"]): return false + var facility := facilities.get_instance(service.facility_id) + var definition := definition_registry.get_facility(facility.definition_id) + if definition == null or receipt["amount"] != definition.cleanliness_decay_per_service: return false + var pending: Dictionary = {} + for task: StaffTask in staff.get_tasks(): + if task.task_type != CleaningBridge.TASK_TYPE: continue + if task.estimated_minutes != cleaning_policy.create_snapshot()["work_minutes"] or task.required_role_tags != [&"cleaner"]: return false + if task.state == StaffTask.State.COMPLETED and facilities.has_instance(task.target_entity_id) and not completed_cleanings.has(task.task_id): return false + if task.is_terminal(): continue + var facility := facilities.get_instance(task.target_entity_id) + if facility == null or task.target_cell not in CleaningBridge.access_cells(facility, path, false) or pending.has(task.target_entity_id): return false + pending[task.target_entity_id] = true + if not task.assigned_staff_id.is_empty(): + var worker := staff.get_staff(task.assigned_staff_id) + if not CleaningBridge.is_deployed(worker, facilities.get_instance(worker.assigned_facility_id) if worker != null else null, staff): return false + return true + +func _automatic_staff_work_units(task_id: StringName) -> int: + var task := staff_service.get_task(task_id) + # Cleaning is progressed after attendance, dependency and cancellation checks. + return 0 if task != null and task.task_type == CleaningBridge.TASK_TYPE else 1 + + +## This is a configured event sink, not a thief/riot/loan predicate. Producers +## must supply a cause identity and a complete, approved threat template. +func _build_event_defense_request(action: EventAction, context: Dictionary) -> Dictionary: + var instance_value: Variant = context.get(&"event_instance_id", context.get("event_instance_id", null)) + var source_value: Variant = context.get(&"threat_source_id", context.get("threat_source_id", null)) + var template_value: Variant = action.payload.get(&"template_id", action.payload.get("template_id", null)) + var kind_value: Variant = action.payload.get(&"source_kind", action.payload.get("source_kind", null)) + for raw: Variant in [instance_value, source_value, template_value, kind_value]: + if typeof(raw) not in [TYPE_STRING, TYPE_STRING_NAME] or String(raw).is_empty(): + return {&"ok": false, &"error": "Configured threat requires event, source, template and source-kind identities."} + var source_kind := String(kind_value).to_upper() + if source_kind not in ["THIEF", "BANKRUPTCY_RIOT", "BANK_DELINQUENCY", "AUTHORITY_ESCALATION"]: + return {&"ok": false, &"error": "Configured threat source kind is unknown."} + var identity := JSON.stringify([String(instance_value), String(action.action_id)], "", true, true) + var raid_id := StringName("event_defense_raid." + identity.sha256_text()) + var prepared := _prepare_event_threat_template(action, StringName(source_value), raid_id) + if not bool(prepared.get(&"ok", false)): + return prepared + var definition: Dictionary = prepared[&"definition"] + var digest := String(prepared[&"digest"]) + var event_source := { + "event_instance_id": String(instance_value), "event_action_id": String(action.action_id), + "template_id": String(template_value), "template_digest": digest, + "source_kind": source_kind, + } + definition[&"event_source"] = event_source + var existing := defense_service.get_raid(raid_id) + if not existing.is_empty(): + if existing.get(&"event_source", {}) != event_source or not _event_threat_template_matches_raid(existing, prepared[&"canonical_raid"]): + return {&"ok": false, &"error": "Event threat identity conflicts with an already-created incident."} + return {&"ok": true, &"raid_id": raid_id, &"definition": definition, &"is_replay": true} + for objective_id: StringName in prepared[&"objective_ids"]: + var objective := facility_service.get_instance(objective_id) + if objective == null or objective.durability <= 0: + return {&"ok": false, &"error": "Configured threat objective is unavailable."} + if not _defense_lock_owner(objective_id, &"ASSET", raid_id).is_empty(): + return {&"ok": false, &"error": "Configured threat objective already belongs to another active incident."} + return {&"ok": true, &"raid_id": raid_id, &"definition": definition, &"is_replay": false} + + +func _prepare_event_threat_template(action: EventAction, source_id: StringName, raid_id: StringName) -> Dictionary: + var raw_definition: Variant = action.payload.get(&"definition", action.payload.get("definition", null)) + if not raw_definition is Dictionary: + return {&"ok": false, &"error": "Configured threat requires its complete definition."} + var definition: Dictionary = raw_definition.duplicate(true) + # Do not silently turn service defaults into newly approved enemy values. + for field: StringName in [&"round_minutes", &"max_duration_minutes", &"defender_retreat_threshold", &"terrain_bonus", &"command_bonus", &"surprise_penalty", &"multiple_entry_penalty"]: + if typeof(definition.get(field, definition.get(String(field), null))) != TYPE_INT: + return {&"ok": false, &"error": "Configured threat requires an explicit integer: %s." % field} + var retreat_value: Variant = definition.get(&"retreat_policy", definition.get("retreat_policy", null)) + if typeof(retreat_value) not in [TYPE_STRING, TYPE_STRING_NAME]: + return {&"ok": false, &"error": "Configured threat requires an explicit retreat policy."} + for field: StringName in [&"entry_points", &"objective_ids"]: + var raw_ids: Variant = definition.get(field, definition.get(String(field), null)) + if not raw_ids is Array or raw_ids.is_empty(): + return {&"ok": false, &"error": "Configured threat requires explicit %s." % field} + for raw_id: Variant in raw_ids: + if typeof(raw_id) not in [TYPE_STRING, TYPE_STRING_NAME] or String(raw_id).is_empty(): + return {&"ok": false, &"error": "Configured threat entry/objective IDs must be nonempty names."} + var raw_waves: Variant = definition.get(&"waves", definition.get("waves", null)) + if not raw_waves is Array or raw_waves.is_empty(): + return {&"ok": false, &"error": "Configured threat requires explicit waves."} + for raw_wave: Variant in raw_waves: + if not raw_wave is Dictionary: + return {&"ok": false, &"error": "Configured threat wave must be a dictionary."} + for field: StringName in [&"threat_strength", &"max_rounds", &"retreat_threshold"]: + if typeof(raw_wave.get(field, raw_wave.get(String(field), null))) != TYPE_INT: + return {&"ok": false, &"error": "Configured threat wave requires an explicit integer: %s." % field} + definition[&"source_id"] = source_id + # An isolated aggregate validates and canonicalizes without touching live + # clocks, RNG, IDs, facilities, events or the queue. Time zero is only the + # canonical probe's timestamp, never the actual incident creation time. + definition.erase(&"event_source") + definition.erase("event_source") + var probe := DefenseService.new() + var valid := probe.create_raid(raid_id, 0, definition) + if not valid.is_success(): + return {&"ok": false, &"error": valid.message, &"details": valid.details} + var canonical: Dictionary = (probe.create_snapshot()[&"raids"] as Array)[0] + var digest := JSON.stringify(canonical, "", true, true).sha256_text() + var canonical_raid := probe.get_raid(raid_id) + return {&"ok": true, &"definition": definition, &"digest": digest, &"objective_ids": canonical_raid[&"objective_ids"], &"canonical_raid": canonical_raid} + + +func _apply_event_defense_raid(action: EventAction, context: Dictionary) -> Dictionary: + var request := _build_event_defense_request(action, context) + if not bool(request.get(&"ok", false)): + return request + if bool(request.get(&"is_replay", false)): + return {&"ok": true, &"raid_id": request[&"raid_id"], &"is_replay": true} + var advanced := defense_service.advance_time(_defense_operation_minute()) + if not advanced.is_success(): + return {&"ok": false, &"error": advanced.message} + var created := defense_service.create_raid(request[&"raid_id"], _defense_operation_minute(), request[&"definition"]) + if not created.is_success(): + return {&"ok": false, &"error": created.message} + if not _validate_live_defense_crosslinks(): + return {&"ok": false, &"error": "Configured event threat violates live Defense crosslinks."} + return {&"ok": true, &"raid_id": request[&"raid_id"], &"is_replay": false} + + +## Historical provenance is checked against the saved event definition and +## cause context, without requiring a departed guest or repaid loan to exist. +func _validate_event_defense_crosslinks(events: EventService, defense: DefenseService) -> bool: + for raid_id: StringName in defense.get_raid_ids(): + var raid := defense.get_raid(raid_id) + var source: Dictionary = raid.get(&"event_source", {}) + if source.is_empty(): + continue + var instance_id := StringName(source["event_instance_id"]) + var action_id := StringName(source["event_action_id"]) + var identity := JSON.stringify([String(instance_id), String(action_id)], "", true, true) + if raid_id != StringName("event_defense_raid." + identity.sha256_text()): + return false + var instance := events.get_instance(instance_id) + if instance == null: + return false + var source_value: Variant = instance.context.get(&"threat_source_id", instance.context.get("threat_source_id", null)) + if typeof(source_value) not in [TYPE_STRING, TYPE_STRING_NAME] or StringName(source_value) != raid[&"source_id"]: + return false + var definition := events.get_definition(instance.resolved_event_id) + if definition == null: + return false + var actions: Array[EventAction] = [] + for collection: Array in [definition.automatic_actions, definition.fallback_actions, definition.failure_actions]: + actions.append_array(collection) + for choice: EventChoice in definition.choices: + actions.append_array(choice.actions) + var matches := false + for action: EventAction in actions: + if action.action_id != action_id or action.type != EventAction.Type.CREATE_DEFENSE_RAID: + continue + if String(action.payload.get(&"template_id", action.payload.get("template_id", ""))) != source["template_id"] or String(action.payload.get(&"source_kind", action.payload.get("source_kind", ""))).to_upper() != source["source_kind"]: + continue + var prepared := _prepare_event_threat_template(action, StringName(source_value), raid_id) + if bool(prepared.get(&"ok", false)) and String(prepared[&"digest"]) == source["template_digest"] and _event_threat_template_matches_raid(raid, prepared[&"canonical_raid"]): + matches = true + break + if not matches: + return false + return true + + +## Compare the immutable creation configuration to its original template. +## Combat progress, damage, roster, timestamps and player retreat-policy edits +## remain mutable and must not be compared to a newly-created probe. +func _event_threat_template_matches_raid(raid: Dictionary, canonical: Dictionary) -> bool: + for field: StringName in [&"raid_id", &"source_id", &"max_duration_minutes", &"round_minutes", &"terrain_bonus", &"command_bonus", &"surprise_penalty", &"multiple_entry_penalty", &"entry_points", &"objective_ids"]: + if not _strict_variants_equal(raid.get(field, null), canonical.get(field, null)): + return false + var waves: Array = raid.get(&"waves", []) + var template_waves: Array = canonical.get(&"waves", []) + if waves.size() != template_waves.size(): + return false + for index: int in range(waves.size()): + var wave: Dictionary = waves[index] + var template_wave: Dictionary = template_waves[index] + for field: StringName in [&"wave_id", &"threat_strength", &"retreat_threshold", &"max_rounds", &"entry_points", &"objective_ids"]: + if not _strict_variants_equal(wave.get(field, null), template_wave.get(field, null)): + return false + return true diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/023-guest_candidate_batch.inc b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/023-guest_candidate_batch.inc new file mode 100644 index 0000000..29d7fff --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/023-guest_candidate_batch.inc @@ -0,0 +1,395 @@ +private: + // This scope owns names only for one call. It retains no guest, candidate, + // callback, result, cache or saved simulation state across calls. + struct GuestBatchKey { + const StringName name; + const String text; + explicit GuestBatchKey(const char *s):name(s,false),text(name) {} + }; + // Immutable key objects belong to one public batch call only. No guest, + // dictionary, callback, cached value or name survives that call. + struct GuestBatchNames { + const GuestBatchKey k_empty{""}; + const GuestBatchKey k_ADULT_NOT_VERIFIED{"ADULT_NOT_VERIFIED"}; + const GuestBatchKey k_CANNOT_PAY{"CANNOT_PAY"}; + const GuestBatchKey k_CONTENT_FILTERED{"CONTENT_FILTERED"}; + const GuestBatchKey k_ETA_AFTER_EXIT{"ETA_AFTER_EXIT"}; + const GuestBatchKey k_FACILITY_CLOSED{"FACILITY_CLOSED"}; + const GuestBatchKey k_FORBIDDEN_GUEST_TAG{"FORBIDDEN_GUEST_TAG"}; + const GuestBatchKey k_GUEST_TYPE_NOT_ALLOWED{"GUEST_TYPE_NOT_ALLOWED"}; + const GuestBatchKey k_ILLEGALITY_REFUSED{"ILLEGALITY_REFUSED"}; + const GuestBatchKey k_INVALID_NEED_MAP{"INVALID_NEED_MAP"}; + const GuestBatchKey k_MISSING_INPUTS{"MISSING_INPUTS"}; + const GuestBatchKey k_MISSING_PERMISSION{"MISSING_PERMISSION"}; + const GuestBatchKey k_QUALITY_TOO_LOW{"QUALITY_TOO_LOW"}; + const GuestBatchKey k_RISK_REFUSED{"RISK_REFUSED"}; + const GuestBatchKey k_UNREACHABLE{"UNREACHABLE"}; + const GuestBatchKey k_WAIT_HARD_LIMIT{"WAIT_HARD_LIMIT"}; + const GuestBatchKey k_absolute_minute{"absolute_minute"}; + const GuestBatchKey k_accepted{"accepted"}; + const GuestBatchKey k_addiction_by_tag{"addiction_by_tag"}; + const GuestBatchKey k_adult{"adult"}; + const GuestBatchKey k_adult_content_enabled{"adult_content_enabled"}; + const GuestBatchKey k_adult_only{"adult_only"}; + const GuestBatchKey k_adult_verified{"adult_verified"}; + const GuestBatchKey k_allow_credit{"allow_credit"}; + const GuestBatchKey k_allowed_guest_types{"allowed_guest_types"}; + const GuestBatchKey k_credit_allowed{"credit_allowed"}; + const GuestBatchKey k_credit_limit_gold{"credit_limit_gold"}; + const GuestBatchKey k_current_minute{"current_minute"}; + const GuestBatchKey k_debt_gold{"debt_gold"}; + const GuestBatchKey k_discretionary{"discretionary"}; + const GuestBatchKey k_entertainment{"entertainment"}; + const GuestBatchKey k_estimated_total_gold{"estimated_total_gold"}; + const GuestBatchKey k_exit_reason{"exit_reason"}; + const GuestBatchKey k_exit_threshold{"exit_threshold"}; + const GuestBatchKey k_expected_quality{"expected_quality"}; + const GuestBatchKey k_expected_wait{"expected_wait"}; + const GuestBatchKey k_facility_id{"facility_id"}; + const GuestBatchKey k_facility_tags{"facility_tags"}; + const GuestBatchKey k_forbidden_guest_tags{"forbidden_guest_tags"}; + const GuestBatchKey k_frugal{"frugal"}; + const GuestBatchKey k_gambling{"gambling"}; + const GuestBatchKey k_get_definition{"get_definition"}; + const GuestBatchKey k_get_guest{"get_guest"}; + const GuestBatchKey k_group_fit{"group_fit"}; + const GuestBatchKey k_guest_type_id{"guest_type_id"}; + const GuestBatchKey k_hunger{"hunger"}; + const GuestBatchKey k_hygiene{"hygiene"}; + const GuestBatchKey k_illegal_level{"illegal_level"}; + const GuestBatchKey k_inputs_available{"inputs_available"}; + const GuestBatchKey k_instance_id{"instance_id"}; + const GuestBatchKey k_intimacy{"intimacy"}; + const GuestBatchKey k_is_open{"is_open"}; + const GuestBatchKey k_legal_permission_override{"legal_permission_override"}; + const GuestBatchKey k_legal_sensitivity{"legal_sensitivity"}; + const GuestBatchKey k_leisure{"leisure"}; + const GuestBatchKey k_medical{"medical"}; + const GuestBatchKey k_minimum_quality{"minimum_quality"}; + const GuestBatchKey k_need_effects{"need_effects"}; + const GuestBatchKey k_need_priority{"need_priority"}; + const GuestBatchKey k_need_relief{"need_relief"}; + const GuestBatchKey k_needs{"needs"}; + const GuestBatchKey k_novelty{"novelty"}; + const GuestBatchKey k_ok{"ok"}; + const GuestBatchKey k_open{"open"}; + const GuestBatchKey k_open_at_arrival{"open_at_arrival"}; + const GuestBatchKey k_ordered{"ordered"}; + const GuestBatchKey k_planned_exit_at{"planned_exit_at"}; + const GuestBatchKey k_preference{"preference"}; + const GuestBatchKey k_preference_weights{"preference_weights"}; + const GuestBatchKey k_price_burden{"price_burden"}; + const GuestBatchKey k_price_gold{"price_gold"}; + const GuestBatchKey k_quality{"quality"}; + const GuestBatchKey k_quoted_price{"quoted_price"}; + const GuestBatchKey k_ranked{"ranked"}; + const GuestBatchKey k_reachable{"reachable"}; + const GuestBatchKey k_reason{"reason"}; + const GuestBatchKey k_rejected{"rejected"}; + const GuestBatchKey k_repetition_penalty{"repetition_penalty"}; + const GuestBatchKey k_required_guest_tags{"required_guest_tags"}; + const GuestBatchKey k_requires_adult_verified{"requires_adult_verified"}; + const GuestBatchKey k_respect_survival_reserve{"respect_survival_reserve"}; + const GuestBatchKey k_risk{"risk"}; + const GuestBatchKey k_risk_level{"risk_level"}; + const GuestBatchKey k_risk_sensitivity{"risk_sensitivity"}; + const GuestBatchKey k_risk_tolerance{"risk_tolerance"}; + const GuestBatchKey k_service_category{"service_category"}; + const GuestBatchKey k_sleep{"sleep"}; + const GuestBatchKey k_spendthrift{"spendthrift"}; + const GuestBatchKey k_supported{"supported"}; + const GuestBatchKey k_tags{"tags"}; + const GuestBatchKey k_tourism{"tourism"}; + const GuestBatchKey k_travel_minutes{"travel_minutes"}; + const GuestBatchKey k_urgency{"urgency"}; + const GuestBatchKey k_utility{"utility"}; + const GuestBatchKey k_utility_terms{"utility_terms"}; + const GuestBatchKey k_visited_facility_ids{"visited_facility_ids"}; + const GuestBatchKey k_wait_hard_limit{"wait_hard_limit"}; + const GuestBatchKey k_wait_minutes{"wait_minutes"}; + const GuestBatchKey k_wallet_gold{"wallet_gold"}; + Variant value(const Dictionary &d,const GuestBatchKey &k,const Variant &fallback=Variant()) { + if(d.has(k.name)) return d[k.name]; + return d.has(k.text) ? d[k.text] : fallback; + } + bool has(const Dictionary &d,const GuestBatchKey &k) { return d.has(k.name) || d.has(k.text); } + int64_t integer(const Dictionary &d,const GuestBatchKey &k,int64_t fallback=0) { return value(d,k,fallback); } + bool flag(const Dictionary &d,const GuestBatchKey &k,bool fallback=false) { + const Variant v=value(d,k,fallback); + return v.get_type()==Variant::INT ? int64_t(v)!=0 : bool(v); + } + }; + struct GuestBatchRow { + Dictionary candidate,relief; + StringName id; + String id_text; + bool need_map_valid=true; + int64_t priority=0,utility=0,urgency=0,travel=0; + }; + struct GuestBatchFacilityOrder { + bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const { return a.id_text < b.id_text; } + }; + struct GuestBatchRankOrder { + bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const { + if(a.priority!=b.priority) return a.priority>b.priority; + if(a.utility!=b.utility) return a.utility>b.utility; + if(a.urgency!=b.urgency) return a.urgency>b.urgency; + if(a.travel!=b.travel) return a.travel(std::max(x,low),high); + } + static bool guest_name_value(const Variant &v) { + return v.get_type()==Variant::STRING || v.get_type()==Variant::STRING_NAME; + } + static bool guest_names_supported(const Variant &v) { + // The original name helper ignores non-arrays, but converting unusual + // array elements is deliberately left to the original GDScript path. + if(v.get_type()!=Variant::ARRAY) return true; + const Array a=v; + for(int64_t i=0;i ordered; + for(int64_t i=0;i sorter; + if(!ordered.empty()) sorter.sort(ordered.data(),ordered.size()); + out.clear();for(const String &s:ordered) out.append(StringName(s)); + return out; + } + static bool guest_normalize_need(GuestBatchNames &n,const Variant &v,Dictionary &out) { + if(v.get_type()!=Variant::DICTIONARY) return false; + const Dictionary source=v; + if(source.size()>6) return false; + const Array keys=source.keys(); + for(int64_t i=0;iname) {valid=true;break;} + if(!valid || out.has(k) || source[keys[i]].get_type()!=Variant::INT) return false; + out[k]=source[keys[i]]; + } + return true; + } + static bool guest_candidate_supported(GuestBatchNames &n,const Dictionary &d) { + // Adding canonical/result StringName keys to a typed dictionary can + // invoke conversion/error semantics; that entire domain stays original. + if(d.is_typed()) return false; + for(const GuestBatchKey *s: {&n.k_travel_minutes,&n.k_wait_minutes,&n.k_expected_wait,&n.k_wait_hard_limit,&n.k_risk_level,&n.k_risk,&n.k_illegal_level,&n.k_expected_quality,&n.k_quality,&n.k_minimum_quality,&n.k_estimated_total_gold,&n.k_price_gold,&n.k_quoted_price,&n.k_need_priority,&n.k_preference,&n.k_novelty,&n.k_group_fit,&n.k_price_burden,&n.k_risk_sensitivity,&n.k_repetition_penalty,&n.k_urgency}) + if(n.has(d,*s) && n.value(d,*s).get_type()!=Variant::INT) return false; + for(const GuestBatchKey *s: {&n.k_inputs_available,&n.k_adult_only,&n.k_requires_adult_verified,&n.k_is_open,&n.k_open,&n.k_open_at_arrival,&n.k_reachable,&n.k_credit_allowed,&n.k_allow_credit,&n.k_discretionary,&n.k_respect_survival_reserve,&n.k_legal_permission_override,&n.k_ok}) { + if(!n.has(d,*s)) continue; + const Variant::Type t=n.value(d,*s).get_type(); + if(t!=Variant::BOOL && t!=Variant::INT) return false; + } + for(const GuestBatchKey *s: {&n.k_facility_id,&n.k_instance_id,&n.k_service_category}) if(n.has(d,*s) && !guest_name_value(n.value(d,*s))) return false; + for(const GuestBatchKey *s: {&n.k_required_guest_tags,&n.k_forbidden_guest_tags,&n.k_allowed_guest_types,&n.k_facility_tags,&n.k_tags}) if(!guest_names_supported(n.value(d,*s,Array()))) return false; + return true; + } + static int64_t guest_price(GuestBatchNames &n,const Dictionary &c) { + return std::max(int64_t(n.value(c,n.k_estimated_total_gold,n.value(c,n.k_price_gold,n.value(c,n.k_quoted_price,int64_t(0))))),0); + } + static bool guest_discretionary(GuestBatchNames &n,const Dictionary &c) { + if(n.flag(c,n.k_discretionary)) return true; + const StringName category=n.value(c,n.k_service_category,n.k_empty.name); + for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_intimacy,&n.k_tourism}) if(category==s->name) return true; + const Array tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array()))); + for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_adult,&n.k_intimacy}) if(tags.has(s->name)) return true; + return false; + } + static StringName guest_rejection(GuestBatchNames &n,const GuestBatchRow &row, + const Dictionary &context,const StringName &type,const Array &tags,bool adult, + int64_t planned_exit,int64_t decision_minute,int64_t cash,int64_t credit, + int64_t reserve,int64_t tolerance,int64_t legal,int64_t minimum) { + const Dictionary &c=row.candidate; + if(!row.need_map_valid) return n.k_INVALID_NEED_MAP.name; + if(!n.flag(c,n.k_inputs_available,true)) return n.k_MISSING_INPUTS.name; + if(n.flag(c,n.k_adult_only,n.flag(c,n.k_requires_adult_verified))) { + if(!adult) return n.k_ADULT_NOT_VERIFIED.name; + if(!n.flag(context,n.k_adult_content_enabled,true)) return n.k_CONTENT_FILTERED.name; + } + const Array required=guest_names(n.value(c,n.k_required_guest_tags,Array())); + for(int64_t i=0;i(n.integer(c,n.k_travel_minutes),0); + if(decision_minute>=0 && the_tree_native::signed_add(decision_minute,travel)>planned_exit) return n.k_ETA_AFTER_EXIT.name; + const int64_t price=guest_price(n,c); + const int64_t available=n.flag(c,n.k_respect_survival_reserve,guest_discretionary(n,c)) ? std::max(guest_sub(cash,reserve),0) : cash; + if(price>available && (!n.flag(c,n.k_credit_allowed,n.flag(c,n.k_allow_credit)) || guest_sub(price,available)>credit)) return n.k_CANNOT_PAY.name; + const int64_t wait=std::max(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0); + const int64_t hard=std::max(int64_t(n.value(c,n.k_wait_hard_limit,n.value(context,n.k_wait_hard_limit,int64_t(120)))),0); + if(wait>=hard) return n.k_WAIT_HARD_LIMIT.name; + const int64_t risk=guest_clamp(int64_t(n.value(c,n.k_risk_level,n.value(c,n.k_risk,int64_t(0)))),0,100); + if(risk>tolerance) return n.k_RISK_REFUSED.name; + if(guest_clamp(n.integer(c,n.k_illegal_level),0,100)>guest_sub(100,legal) && !n.flag(c,n.k_legal_permission_override)) return n.k_ILLEGALITY_REFUSED.name; + const int64_t quality=guest_clamp(int64_t(n.value(c,n.k_expected_quality,n.value(c,n.k_quality,int64_t(0)))),0,100); + if(quality(int64_t(raw_relief),0); + else if(raw_relief.get_type()==Variant::DICTIONARY) { + for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) { + const int64_t effect=row.relief.get(s->name,int64_t(0)); + const int64_t need=needs[s->name]; + relief=std::max(relief,signed_product(std::max(effect,0),need)/100); + if(effect>0) { + default_urgency=std::max(default_urgency,need); + if(s->name==n.k_hunger.name || s->name==n.k_sleep.name || s->name==n.k_leisure.name || s->name==n.k_intimacy.name) priority=std::max(priority,need); + } + } + } + int64_t default_preference=0; + const Array facility_tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array()))); + for(int64_t i=0;i(the_tree_native::signed_add(cash,credit),1); + const int64_t numerator=guest_sub(the_tree_native::signed_add(signed_product(guest_price(n,c),100),power),1); + const int64_t burden=n.integer(c,n.k_price_burden,guest_clamp(numerator/power,0,100)); + const int64_t travel=std::max(n.integer(c,n.k_travel_minutes),0); + const int64_t wait=std::max(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0); + const int64_t risk=std::max(int64_t(n.value(c,n.k_risk,n.value(c,n.k_risk_level,int64_t(0)))),0); + const int64_t sensitivity=std::max(n.integer(c,n.k_risk_sensitivity,the_tree_native::signed_add(guest_sub(100,tolerance),24)/25),0); + const int64_t repetition=n.integer(c,n.k_repetition_penalty,seen?10:0); + int64_t utility=signed_product(relief,8); + utility=the_tree_native::signed_add(utility,signed_product(preference,5)); + utility=the_tree_native::signed_add(utility,signed_product(quality,3)); + utility=the_tree_native::signed_add(utility,signed_product(novelty,2)); + utility=the_tree_native::signed_add(utility,signed_product(group,2)); + utility=guest_sub(utility,signed_product(burden,5)); + utility=guest_sub(utility,signed_product(travel,2)); + utility=guest_sub(utility,signed_product(wait,3)); + utility=guest_sub(utility,signed_product(risk,sensitivity)); + utility=guest_sub(utility,repetition); + Dictionary result=c.duplicate(true); + result[n.k_facility_id.name]=row.id;result[n.k_need_priority.name]=priority; + result[n.k_utility.name]=utility;result[n.k_urgency.name]=n.integer(c,n.k_urgency,default_urgency);result[n.k_travel_minutes.name]=travel; + Dictionary terms; + terms[n.k_need_relief.name]=relief;terms[n.k_preference.name]=preference;terms[n.k_expected_quality.name]=quality; + terms[n.k_novelty.name]=novelty;terms[n.k_group_fit.name]=group;terms[n.k_price_burden.name]=burden; + terms[n.k_travel_minutes.name]=travel;terms[n.k_wait_minutes.name]=wait;terms[n.k_risk.name]=risk; + terms[n.k_risk_sensitivity.name]=sensitivity;terms[n.k_repetition_penalty.name]=repetition; + result[n.k_utility_terms.name]=terms; + row.candidate=result;row.priority=priority;row.utility=utility;row.urgency=result[n.k_urgency.name];row.travel=travel; + } +public: + Dictionary guest_candidate_batch(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) { + // No owner/input mutation occurs in the entire implementation. A failed + // new standard-container allocation cannot escape the native boundary + // or publish a partially built result. Engine-internal allocation failure + // is not claimed to be covered by these standard C++ exception catches. + Dictionary unsupported;unsupported[StringName("supported",false)]=false; + try { return guest_candidate_batch_impl(owner,guest_id,facilities,context); } + catch(const std::bad_alloc &) { return unsupported; } + catch(const std::length_error &) { return unsupported; } + } +private: + Dictionary guest_candidate_batch_impl(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) { + GuestBatchNames n;const ProjectionNames p; + Dictionary unsupported;unsupported[n.k_supported.name]=false; + if(!builtin(p,owner,"res://scripts/guest/guest_service.gd")) return unsupported; + // No caller callback is invoked during preflight or computation. Callback + // contexts use original extraction/evaluation/decision in their entirety. + const Array context_keys=context.keys(); + for(int64_t i=0;icall(n.k_get_guest.name,guest_id); + if(!builtin(p,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported; + const Variant typev=guest->get(n.k_guest_type_id.name); + if(!guest_name_value(typev)) return unsupported; + const StringName type=typev; + Object *definition=owner->call(n.k_get_definition.name,type); + if(!builtin(p,definition,"res://scripts/guest/guest_definition.gd")) return unsupported; + for(const GuestBatchKey *s: {&n.k_wallet_gold,&n.k_credit_limit_gold,&n.k_debt_gold,&n.k_planned_exit_at}) if(guest->get(s->name).get_type()!=Variant::INT) return unsupported; + for(const GuestBatchKey *s: {&n.k_risk_tolerance,&n.k_legal_sensitivity,&n.k_minimum_quality}) if(definition->get(s->name).get_type()!=Variant::INT) return unsupported; + if(definition->get(n.k_adult_verified.name).get_type()!=Variant::BOOL || owner->get(n.k_current_minute.name).get_type()!=Variant::INT) return unsupported; + if(guest->get(n.k_needs.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_addiction_by_tag.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_visited_facility_ids.name).get_type()!=Variant::ARRAY || definition->get(n.k_tags.name).get_type()!=Variant::ARRAY || definition->get(n.k_preference_weights.name).get_type()!=Variant::DICTIONARY) return unsupported; + const Dictionary needs=guest->get(n.k_needs.name),addiction=guest->get(n.k_addiction_by_tag.name),weights=definition->get(n.k_preference_weights.name); + const Array visited=guest->get(n.k_visited_facility_ids.name),tags=definition->get(n.k_tags.name); + if(!guest_names_supported(visited) || !guest_names_supported(tags)) return unsupported; + for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) if(!needs.has(s->name) || needs[s->name].get_type()!=Variant::INT) return unsupported; + const Array addiction_values=addiction.values(),weight_values=weights.values(); + int64_t max_addiction=0; + for(int64_t i=0;i(max_addiction,int64_t(addiction_values[i]));} + for(int64_t i=0;i ordered; + for(int64_t i=0;iname==n.k_need_relief.name && v.get_type()==Variant::INT) continue; + Dictionary normalized; + if(!guest_normalize_need(n,v,normalized)) {row.need_map_valid=false;break;} + if(s->name==n.k_need_relief.name) row.relief=normalized; + } + ordered.push_back(row); + } + SortArray facility_sort; + if(!ordered.empty()) facility_sort.sort(ordered.data(),ordered.size()); + const int64_t cash=guest->get(n.k_wallet_gold.name); + const int64_t credit=std::max(guest_sub(guest->get(n.k_credit_limit_gold.name),guest->get(n.k_debt_gold.name)),0); + int64_t reserve=0; + if(max_addiction<75) reserve=tags.has(n.k_spendthrift.name) ? cash/10 : (tags.has(n.k_frugal.name) ? cash/2 : signed_product(cash,3)/10); + const int64_t tolerance=definition->get(n.k_risk_tolerance.name); + const int64_t minute=n.integer(context,n.k_absolute_minute,owner->get(n.k_current_minute.name)); + TypedArray raw_ordered,accepted,rejected,ranked; + std::vector rank_rows; + for(GuestBatchRow &row:ordered) { + raw_ordered.append(row.candidate); + const StringName reason=guest_rejection(n,row,context,type,tags,definition->get(n.k_adult_verified.name),guest->get(n.k_planned_exit_at.name),minute,cash,credit,reserve,tolerance,definition->get(n.k_legal_sensitivity.name),definition->get(n.k_minimum_quality.name)); + if(!reason.is_empty()) {Dictionary failure;failure[n.k_facility_id.name]=row.id_text;failure[n.k_reason.name]=String(reason);rejected.append(failure);continue;} + accepted.append(row.candidate); + guest_evaluate(n,row,needs,weights,visited,cash,credit,tolerance); + if(n.flag(row.candidate,n.k_ok,true)) rank_rows.push_back(row); + } + SortArray rank_sort; + if(!rank_rows.empty()) rank_sort.sort(rank_rows.data(),rank_rows.size()); + for(const GuestBatchRow &row:rank_rows) ranked.append(row.candidate); + Dictionary result;result[n.k_supported.name]=true;result[n.k_ordered.name]=raw_ordered; + result[n.k_accepted.name]=accepted;result[n.k_rejected.name]=rejected;result[n.k_ranked.name]=ranked; + return result; + } + +public: diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/024-tree_core.hpp b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/024-tree_core.hpp new file mode 100644 index 0000000..ea7ebd9 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/024-tree_core.hpp @@ -0,0 +1,78 @@ +#pragma once +// Standalone numeric prototype; not connected to Godot or production. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +namespace the_tree_native { +using I = std::int64_t; +struct Edge { I neighbor, cost; }; +struct Result { + std::string status = "usable"; + std::vector costs, parents, discovered, parent_discovered, settled; +}; +I signed_add(I a, I b) { + const auto sum = static_cast(a) + static_cast(b); + if (sum <= static_cast(std::numeric_limits::max())) return static_cast(sum); + return std::numeric_limits::min() + static_cast(sum - (std::uint64_t(1) << 63)); +} +template +Result search(I n, I start, const std::vector& goals, EdgeProvider&& edge_provider) { + Result r; + if (start < 0 || start >= n) { r.status = "unusable"; return r; } + r.costs.assign(n, std::numeric_limits::max()); + r.parents.assign(n, -1); + std::vector finalized(n, 0), pending(n, 0); + bool unknown_goal = false; + I remaining = 0; + for (I goal : goals) { + if (goal < 0 || goal >= n) { unknown_goal = true; continue; } + if (!pending[goal]) { pending[goal] = 1; ++remaining; } + } + r.costs[start] = 0; r.discovered.push_back(start); + // Positive edges cannot enqueue another node at this entry cost. + // Lexicographic (cost,index) ordering preserves the old sorted cost buckets. + using Entry=std::pair; + std::priority_queue,std::greater> frontier; + frontier.emplace(0,start); + while (!frontier.empty()) { + const auto entry=frontier.top();frontier.pop(); + const I entry_cost=entry.first,current=entry.second; + { + if (finalized[current] || entry_cost != r.costs[current]) continue; + finalized[current] = 1; + r.settled.push_back(current); + if (pending[current]) { pending[current] = 0; --remaining; } + if (!remaining && !unknown_goal) return r; + for (const Edge& edge : edge_provider(current)) { + if (edge.cost <= 0) { r.status = "unusable"; return r; } + const I neighbor = edge.neighbor; + if (neighbor < 0 || neighbor >= n) { r.status = "unusable"; return r; } + const I cost = signed_add(r.costs[current], edge.cost); + if (cost < r.costs[current]) { r.status = "wrapped"; return r; } + const I known = r.costs[neighbor]; + const bool better_parent = cost == known && r.parents[neighbor] >= 0 && current < r.parents[neighbor]; + if (cost > known || (cost == known && !better_parent)) continue; + if (r.parents[neighbor] < 0) { + r.parent_discovered.push_back(neighbor); + if (neighbor != start) r.discovered.push_back(neighbor); + } + r.parents[neighbor] = current; + r.costs[neighbor] = cost; + if (finalized[neighbor]) r.settled.erase(std::remove(r.settled.begin(), r.settled.end(), neighbor), r.settled.end()); + finalized[neighbor] = 0; + frontier.emplace(cost,neighbor); + } + } + } + return r; +} +} // namespace the_tree_native diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/025-tree_numeric_core.cpp b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/025-tree_numeric_core.cpp new file mode 100644 index 0000000..8a16025 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/025-tree_numeric_core.cpp @@ -0,0 +1,862 @@ +// Isolated, uncompiled bridge prototype. No production registration or integration yet. +#include "tree_core.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace godot; +using the_tree_native::I; +using the_tree_native::Edge; + +class TheTreeNumericCore : public RefCounted { + GDCLASS(TheTreeNumericCore, RefCounted) +protected: + static void _bind_methods() { + ClassDB::bind_method(D_METHOD("performance_record_sample", "owner", "metric_id", "duration_us"), &TheTreeNumericCore::performance_record_sample); + ClassDB::bind_method(D_METHOD("guest_candidate_batch", "owner", "guest_id", "facilities", "context"), &TheTreeNumericCore::guest_candidate_batch); + ClassDB::bind_method(D_METHOD("guest_tree_edge_rows", "path", "current", "layers", "access"), &TheTreeNumericCore::guest_tree_edge_rows); + ClassDB::bind_method(D_METHOD("search", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search); + ClassDB::bind_method(D_METHOD("search_cached", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search_cached); + ClassDB::bind_method(D_METHOD("clear_edge_cache"), &TheTreeNumericCore::clear_edge_cache); + ClassDB::bind_method(D_METHOD("nearest_guest_access", "path", "start", "goals", "fallback_target", "layers", "access", "ticks"), &TheTreeNumericCore::nearest_guest_access); + ClassDB::bind_method(D_METHOD("project_guest_candidates", "runtime", "guest_id", "open_state", "degraded_state", "movement_scale", "stair_credit", "orthogonal_cost", "ticks"), &TheTreeNumericCore::project_guest_candidates); + } +private: + // Cache belongs to this instance and one caller-owned graph workspace. + // No reuse after cells, indices, filters or edge values change: the caller + // must clear it or release this core. The original search never uses it. + std::map> cached_edges; + // Per-public-call immutable names. No static/global lifetime, cached + // object values, script dispatch result or profile; recursive calls own + // separate scopes. Destruction precedes leaving the engine call. + struct ProjectionNames { + const StringName k_ACCESS_LAYER_DENIED{"ACCESS_LAYER_DENIED",false}; + const StringName k_CONNECTOR{"CONNECTOR",false}; + const StringName k_GOAL_NOT_PASSABLE{"GOAL_NOT_PASSABLE",false}; + const StringName k_GOAL_TEMPORARILY_BLOCKED{"GOAL_TEMPORARILY_BLOCKED",false}; + const StringName k_GOAL_UNREACHABLE{"GOAL_UNREACHABLE",false}; + const StringName k_OK{"OK",false}; + const StringName k_START_NOT_PASSABLE{"START_NOT_PASSABLE",false}; + const StringName k_START_TEMPORARILY_BLOCKED{"START_TEMPORARILY_BLOCKED",false}; + const StringName k__build_guest_query_tree_compact{"_build_guest_query_tree_compact",false}; + const StringName k__cache_key{"_cache_key",false}; + const StringName k__cell_traffic{"_cell_traffic",false}; + const StringName k__copy_path{"_copy_path",false}; + const StringName k__diagnose_no_route_reason{"_diagnose_no_route_reason",false}; + const StringName k__find_facility_access_path{"_find_facility_access_path",false}; + const StringName k__find_path_internal{"_find_path_internal",false}; + const StringName k__guest_access_batch_can_select{"_guest_access_batch_can_select",false}; + const StringName k__guest_batch_has_permitted_layer_crossing{"_guest_batch_has_permitted_layer_crossing",false}; + const StringName k__guest_has_checked_in{"_guest_has_checked_in",false}; + const StringName k__guest_step_connector_memo{"_guest_step_connector_memo",false}; + const StringName k__guest_tree_arithmetic_wrapped{"_guest_tree_arithmetic_wrapped",false}; + const StringName k__guest_tree_reconstruct_path{"_guest_tree_reconstruct_path",false}; + const StringName k__need_relief_for_facility_tags{"_need_relief_for_facility_tags",false}; + const StringName k__passable_cells{"_passable_cells",false}; + const StringName k__path_cache{"_path_cache",false}; + const StringName k__query_batch{"_query_batch",false}; + const StringName k__route_failure{"_route_failure",false}; + const StringName k__service_category_for_tags{"_service_category_for_tags",false}; + const StringName k__sorted_name_keys{"_sorted_name_keys",false}; + const StringName k_arithmetic_wrapped{"arithmetic_wrapped",false}; + const StringName k_available_quantity{"available_quantity",false}; + const StringName k_base_quality{"base_quality",false}; + const StringName k_base_service_minutes{"base_service_minutes",false}; + const StringName k_begin_guest_path_query_batch{"begin_guest_path_query_batch",false}; + const StringName k_cache_misses{"cache_misses",false}; + const StringName k_calculate_guest_batch_path_cost{"calculate_guest_batch_path_cost",false}; + const StringName k_candidates{"candidates",false}; + const StringName k_capacity{"capacity",false}; + const StringName k_compact{"compact",false}; + const StringName k_cost{"cost",false}; + const StringName k_cost_values{"cost_values",false}; + const StringName k_costs{"costs",false}; + const StringName k_current_cell{"current_cell",false}; + const StringName k_definition_id{"definition_id",false}; + const StringName k_definition_registry{"definition_registry",false}; + const StringName k_elevators{"elevators",false}; + const StringName k_end_guest_path_query_batch{"end_guest_path_query_batch",false}; + const StringName k_entrance{"entrance",false}; + const StringName k_estimated_total_gold{"estimated_total_gold",false}; + const StringName k_expected_quality{"expected_quality",false}; + const StringName k_expected_wait{"expected_wait",false}; + const StringName k_facility_id{"facility_id",false}; + const StringName k_facility_service{"facility_service",false}; + const StringName k_facility_tags{"facility_tags",false}; + const StringName k_get_connector{"get_connector",false}; + const StringName k_get_facility{"get_facility",false}; + const StringName k_get_facility_business_price{"get_facility_business_price",false}; + const StringName k_get_guest{"get_guest",false}; + const StringName k_get_instances{"get_instances",false}; + const StringName k_get_step_connector{"get_step_connector",false}; + const StringName k_graph_revision{"graph_revision",false}; + const StringName k_group_fit{"group_fit",false}; + const StringName k_guest_service{"guest_service",false}; + const StringName k_illegal_level{"illegal_level",false}; + const StringName k_indices{"indices",false}; + const StringName k_inputs_available{"inputs_available",false}; + const StringName k_instance_id{"instance_id",false}; + const StringName k_inventory_inputs{"inventory_inputs",false}; + const StringName k_inventory_service{"inventory_service",false}; + const StringName k_is_open{"is_open",false}; + const StringName k_last_error{"last_error",false}; + const StringName k_last_no_route_reason{"last_no_route_reason",false}; + const StringName k_last_path_cost{"last_path_cost",false}; + const StringName k_local_inventory_id{"local_inventory_id",false}; + const StringName k_movement_type{"movement_type",false}; + const StringName k_need_relief{"need_relief",false}; + const StringName k_occupied_cells{"occupied_cells",false}; + const StringName k_origin{"origin",false}; + const StringName k_owns_connector{"owns_connector",false}; + const StringName k_path{"path",false}; + const StringName k_path_handle{"path_handle",false}; + const StringName k_path_query_measured{"path_query_measured",false}; + const StringName k_path_service{"path_service",false}; + const StringName k_queue_entries{"queue_entries",false}; + const StringName k_reachable{"reachable",false}; + const StringName k_ready{"ready",false}; + const StringName k_resource_path{"resource_path",false}; + const StringName k_risk_level{"risk_level",false}; + const StringName k_service_category{"service_category",false}; + const StringName k_settled{"settled",false}; + const StringName k_staff_only{"staff_only",false}; + const StringName k_start{"start",false}; + const StringName k_state{"state",false}; + const StringName k_supported{"supported",false}; + const StringName k_tags{"tags",false}; + const StringName k_tagproj_hunger{"hunger",false}; + const StringName k_tagproj_sleep{"sleep",false}; + const StringName k_tagproj_hygiene{"hygiene",false}; + const StringName k_tagproj_medical{"medical",false}; + const StringName k_tagproj_leisure{"leisure",false}; + const StringName k_tagproj_intimacy{"intimacy",false}; + const StringName k_tagproj_dining{"dining",false}; + const StringName k_tagproj_lodging{"lodging",false}; + const StringName k_tagproj_social{"social",false}; + const StringName k_tagproj_bath{"bath",false}; + const StringName k_tagproj_wellness{"wellness",false}; + const StringName k_tagproj_adult_only{"adult_only",false}; + const StringName k_tagproj_restricted_service{"restricted_service",false}; + const StringName k_tagproj_food{"food",false}; + const StringName k_tagproj_service{"service",false}; + const StringName k_target_cell{"target_cell",false}; + const StringName k_targets{"targets",false}; + const StringName k_temporary_block{"temporary_block",false}; + const StringName k_travel_minutes{"travel_minutes",false}; + const StringName k_tree{"tree",false}; + const StringName k_usable{"usable",false}; + }; +public: + // Whole builtin integer record operation. No retained sample values or time + // suppression. Unsupported data returns before any caller-owned mutation. + Dictionary performance_record_sample(Object *owner, const StringName &metric, int64_t duration) { + const StringName supported("supported",false), report_key("report",false); + Dictionary unsupported; unsupported[supported]=false; + Object *script=owner ? owner->get_script() : nullptr; + if (!script || String(script->get(StringName("resource_path",false))) != "res://scripts/core/performance_budget.gd" || metric==StringName() || duration<0) return unsupported; + const StringName samples_key("_samples",false), ordered_key("_ordered_samples",false), bytes_key("_ordered_sample_bytes",false), integer_key("_integer_window_bytes",false), totals_key("_totals",false), counts_key("_sample_counts",false), budgets_key("_budgets",false); + const Variant sv=owner->get(samples_key), ov=owner->get(ordered_key), bv=owner->get(bytes_key), iv=owner->get(integer_key), tv=owner->get(totals_key), cv=owner->get(counts_key), uv=owner->get(budgets_key), capacityv=owner->get(StringName("sample_capacity",false)); + if (sv.get_type()!=Variant::DICTIONARY || ov.get_type()!=Variant::DICTIONARY || bv.get_type()!=Variant::DICTIONARY || iv.get_type()!=Variant::DICTIONARY || tv.get_type()!=Variant::DICTIONARY || cv.get_type()!=Variant::DICTIONARY || uv.get_type()!=Variant::DICTIONARY || capacityv.get_type()!=Variant::INT) return unsupported; + Dictionary samples=sv, orders=ov, rawbytes=bv, integers=iv, totals=tv, counts=cv, budgets=uv; + if (samples.is_read_only() || orders.is_read_only() || rawbytes.is_read_only() || integers.is_read_only() || totals.is_read_only() || counts.is_read_only()) return unsupported; + const std::array maps{samples,orders,rawbytes,integers,totals,counts,budgets}; + for (size_t i=0;i ordered; + Variant savedbytes=rawbytes.get(metric,PackedByteArray()); + bool reuse=existing && orders.has(metric) && savedbytes.get_type()==Variant::PACKED_BYTE_ARRAY && PackedByteArray(savedbytes)==before; + if (reuse) { + Variant orderv=orders[metric]; + if (orderv.get_type()!=Variant::ARRAY) return unsupported; + Array prior=orderv; + if (prior.is_read_only() || !prior.is_typed() || prior.get_typed_builtin()!=Variant::INT || prior.size()!=values.size()) return unsupported; + ordered=prior; + } else { + for (int64_t i=0;iint64_t(capacityv)) { + Variant removed=values.pop_front(); + ordered.remove_at(ordered.bsearch(removed)); + } + PackedByteArray after=UtilityFunctions::var_to_bytes(values); + rawbytes[metric]=after; integers[metric]=after; + const int64_t lifetime_total=the_tree_native::signed_add(int64_t(totalv),duration); + const int64_t lifetime_count=the_tree_native::signed_add(int64_t(countv),1); + totals[metric]=lifetime_total; counts[metric]=lifetime_count; + const int64_t average=lifetime_count>0 ? lifetime_total/lifetime_count : 0; + const int64_t maximum=ordered.is_empty() ? 0 : std::max(0,int64_t(ordered[ordered.size()-1])); + int64_t p95=0; + if (!ordered.is_empty()) { + const int64_t index=std::max(the_tree_native::signed_add(the_tree_native::signed_add(signed_product(95,ordered.size()),99)/100,-1),0); + p95=ordered[std::min(index,ordered.size()-1)]; + } + const int64_t aggregation=aggregationv, limit=limitv; + // Original default match is P95, including unknown aggregation values. + const int64_t measured=aggregation==0 ? average : (aggregation==2 ? maximum : p95); + Dictionary report; + report[StringName("metric_id",false)]=metric; + report[StringName("window_sample_count",false)]=values.size(); + report[StringName("lifetime_sample_count",false)]=lifetime_count; + report[StringName("average_us",false)]=average; + report[StringName("p95_us",false)]=p95; + report[StringName("maximum_us",false)]=maximum; + report[aggregation_key]=aggregation; + report[StringName("measured_us",false)]=measured; + report[limit_key]=limit; + report[StringName("budget_exceeded",false)]=limit>0 && measured>limit; + Dictionary result; result[supported]=true; result[report_key]=report; return result; + } +#include "guest_candidate_batch.inc" + void clear_edge_cache() { cached_edges.clear(); } + Dictionary search(const Array &cells, const Dictionary &indices, I start_index, + const Dictionary &goals, const Callable &edge_provider) { + return search_impl(cells, indices, start_index, goals, edge_provider, false); + } + Dictionary search_cached(const Array &cells, const Dictionary &indices, I start_index, + const Dictionary &goals, const Callable &edge_provider) { + return search_impl(cells, indices, start_index, goals, edge_provider, true); + } + // One ordered projection, with no new persistent ownership/cache. Only + // builtin pure getters and the already guarded sole budget observer qualify. + Dictionary project_guest_candidates(Object *runtime, const StringName &guest_id, + int64_t open_state, int64_t degraded_state, int64_t movement_scale, + int64_t stair_credit, int64_t orthogonal_cost, const Callable &ticks) { + const ProjectionNames n; + Dictionary unsupported; + unsupported[n.k_supported] = false; + if (!builtin(n,runtime, "res://autoload/simulation_runtime.gd") || !ticks.is_valid()) return unsupported; + Object *path = runtime->get(n.k_path_service); + Object *elevators = runtime->get(n.k_elevators); + Object *facilities = runtime->get(n.k_facility_service); + Object *definitions = runtime->get(n.k_definition_registry); + Object *inventory = runtime->get(n.k_inventory_service); + Object *guests = runtime->get(n.k_guest_service); + if (!builtin(n,path,"res://scripts/world/path_service.gd") || + !builtin(n,elevators,"res://scripts/transport/elevator_service.gd") || + !builtin(n,facilities,"res://scripts/facility/facility_service.gd") || + !builtin(n,definitions,"res://scripts/core/definition_registry.gd") || + !builtin(n,inventory,"res://scripts/inventory/inventory_service.gd") || + !builtin(n,guests,"res://scripts/guest/guest_service.gd") || + !static_cast(runtime->call(n.k__guest_access_batch_can_select))) return unsupported; + Object *guest = guests->call(n.k_get_guest,guest_id); + Array candidates; + if (!guest) { + Dictionary result; result[n.k_supported] = true; + result[n.k_candidates] = candidates; return result; + } + if (!builtin(n,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported; + const Array initial = facilities->call(n.k_get_instances); + // Preflight is read-only: default registry/get_instances have no public + // error/counter effects. Custom resources retain the original whole loop. + for (int64_t i=0;icall(n.k_get_facility,facility->get(n.k_definition_id)); + if (definition && !builtin(n,definition,"res://scripts/data/facility_definition.gd")) return unsupported; + } + Array goals; + for (int64_t i=0;iget(n.k_current_cell); + path->call(n.k_begin_guest_path_query_batch,start,goals); + const Array ordered = facilities->call(n.k_get_instances); + TypedArray layers; layers.push_back(0); layers.push_back(1); + TypedArray access_ids; + for (int64_t i=0;icall(n.k_get_facility,facility->get(n.k_definition_id)); + if (!definition) continue; + const Array tags = definition->get(n.k_tags); + if (tags.has(n.k_staff_only)) continue; + if (tags.has(n.k_entrance) && static_cast(runtime->call(n.k__guest_has_checked_in,guest))) continue; + bool has_inputs = true; + const Dictionary inputs = definition->get(n.k_inventory_inputs); + const Array items = runtime->call(n.k__sorted_name_keys,inputs); + for (int64_t j=0;jcall(n.k_available_quantity,facility->get(n.k_local_inventory_id),items[j]); + if (quantity < static_cast(inputs[items[j]])) {has_inputs=false;break;} + } + if (!has_inputs) { + Dictionary row;row[n.k_facility_id]=facility->get(n.k_instance_id); + row[n.k_inputs_available]=false;candidates.push_back(row);continue; + } + const Array destinations = facility_access_cells(n,path,facility); + Dictionary route = nearest_guest_access_impl(n,path,start,destinations,facility->get(n.k_origin),layers,access_ids,ticks); + if (static_cast(route.get(n.k_supported,false))) route.erase(n.k_supported); + else route = Dictionary(runtime->call(n.k__find_facility_access_path,start,facility)); + const Array walk = route.get(n.k_path,Array()); + const bool plain_tag_relief = builtin(n,runtime,"res://autoload/simulation_runtime.gd") && + tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME; + const Dictionary relief = plain_tag_relief ? builtin_tag_relief(n,tags) : + Dictionary(runtime->call(n.k__need_relief_for_facility_tags,tags)); + Dictionary row; + row[n.k_facility_id]=facility->get(n.k_instance_id); + row[n.k_facility_tags]=tags.duplicate(); + const int64_t state = facility->get(n.k_state); + row[n.k_is_open]=(state==open_state || state==degraded_state); + row[n.k_reachable]=route.get(n.k_reachable,false); + row[n.k_travel_minutes]=guest_path_minutes(n,path,elevators,walk,movement_scale,stair_credit,orthogonal_cost); + const Array queue = facility->get(n.k_queue_entries); + const int64_t capacity = facility->get(n.k_capacity); + row[n.k_expected_wait]=signed_product(queue.size(),facility->get(n.k_base_service_minutes))/std::max(capacity,1); + row[n.k_estimated_total_gold]=runtime->call(n.k_get_facility_business_price,facility); + const int64_t quality = facility->get(n.k_base_quality); + row[n.k_expected_quality]=std::max(0,std::min(quality,100)); + row[n.k_need_relief]=relief; + row[n.k_risk_level]=int64_t(0);row[n.k_illegal_level]=int64_t(0); + row[n.k_group_fit]=signed_product(std::min(capacity,4),5); + // Recheck at the original call position: preceding price/observer + // callbacks must retain a replaced/custom runtime's original call. + const bool plain_tag_category = builtin(n,runtime,"res://autoload/simulation_runtime.gd") && + tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME; + row[n.k_service_category]=plain_tag_category ? Variant(builtin_tag_category(n,tags)) : + runtime->call(n.k__service_category_for_tags,tags); + Dictionary handle;handle[n.k_target_cell]=route.get(n.k_target_cell,guest->get(n.k_current_cell)); + handle[n.k_graph_revision]=path->get(n.k_graph_revision); + row[n.k_path_handle]=handle;candidates.push_back(row); + } + path->call(n.k_end_guest_path_query_batch); + Dictionary result;result[n.k_supported]=true;result[n.k_candidates]=candidates;return result; + } +private: + // Direct translation of the two pure builtin tag methods. Fresh result, + // original insertion/branch order, no retained definition/tag memo. + static Dictionary builtin_tag_relief(const ProjectionNames &n,const Array &tags) { + Dictionary relief; + relief[n.k_tagproj_hunger]=int64_t(0);relief[n.k_tagproj_sleep]=int64_t(0); + relief[n.k_tagproj_hygiene]=int64_t(0);relief[n.k_tagproj_medical]=int64_t(0); + relief[n.k_tagproj_leisure]=int64_t(0);relief[n.k_tagproj_intimacy]=int64_t(0); + if(tags.has(n.k_tagproj_dining)) {relief[n.k_tagproj_hunger]=int64_t(80);relief[n.k_tagproj_leisure]=int64_t(10);} + if(tags.has(n.k_tagproj_lodging)) {relief[n.k_tagproj_sleep]=int64_t(90);relief[n.k_tagproj_hygiene]=std::max(int64_t(relief[n.k_tagproj_hygiene]),10);} + if(tags.has(n.k_tagproj_social)||tags.has(n.k_tagproj_leisure)) relief[n.k_tagproj_leisure]=std::max(int64_t(relief[n.k_tagproj_leisure]),40); + if(tags.has(n.k_tagproj_hygiene)||tags.has(n.k_tagproj_bath)) relief[n.k_tagproj_hygiene]=std::max(int64_t(relief[n.k_tagproj_hygiene]),80); + if(tags.has(n.k_tagproj_medical)) relief[n.k_tagproj_medical]=int64_t(90); + else if(tags.has(n.k_tagproj_wellness)) relief[n.k_tagproj_medical]=std::max(int64_t(relief[n.k_tagproj_medical]),20); + if(tags.has(n.k_tagproj_adult_only)||tags.has(n.k_tagproj_restricted_service)) relief[n.k_tagproj_intimacy]=int64_t(80); + return relief; + } + static StringName builtin_tag_category(const ProjectionNames &n,const Array &tags) { + if(tags.has(n.k_tagproj_dining))return n.k_tagproj_food; + if(tags.has(n.k_tagproj_lodging))return n.k_tagproj_lodging; + if(tags.has(n.k_tagproj_social))return n.k_tagproj_leisure; + return n.k_tagproj_service; + } + static bool builtin(const ProjectionNames &n,Object *object,const char *resource) { + if (!object) return false;Object *script=object->get_script(); + return script && String(script->get(n.k_resource_path))==resource; + } + // Exact builtin cache-key spelling. No normalized/reordered profile and no + // persistent cache; String lengths count Unicode codepoints as GDScript does. + static String cache_key_suffix(const ProjectionNames &n,Object *path, const TypedArray &layers, + const TypedArray &access) { + String layer_text, access_text; + for (int64_t i=0; i(layers[i])); + } + for (int64_t i=0; i(access[i])); + access_text += String::num_int64(value.length()) + ":" + value; + } + return String("|L:") + layer_text + "|A:" + access_text + "|R:" + + String::num_int64(static_cast(path->get(n.k_graph_revision))); + } + static String cache_key_with_suffix(const Vector3i &start, const Vector3i &goal, + const String &suffix) { + return String::num_int64(start.x) + "," + String::num_int64(start.y) + "," + + String::num_int64(start.z) + ">" + String::num_int64(goal.x) + "," + + String::num_int64(goal.y) + "," + String::num_int64(goal.z) + suffix; + } + static int64_t signed_product(int64_t a,int64_t b) { + const uint64_t product=static_cast(a)*static_cast(b); + if (product<=static_cast(std::numeric_limits::max())) return static_cast(product); + return std::numeric_limits::min()+static_cast(product-(uint64_t(1)<<63)); + } + static Array facility_access_cells(const ProjectionNames &n,Object *path,Object *facility) { + const Dictionary passable=path->get(n.k__passable_cells); + Array occupied=Array(facility->get(n.k_occupied_cells)).duplicate(); + if (occupied.is_empty()) occupied.push_back(facility->get(n.k_origin)); + Dictionary unique; + for (int64_t i=0;iget(n.k_origin);if(passable.has(origin)) unique[origin]=true; + const Array keys=unique.keys();std::vector sorted;sorted.reserve(keys.size()); + for (int64_t i=0;iget(n.k__guest_step_connector_memo); + // Route-local only. Reuse an ownership result only after an actual + // BOOL return and a typed cached step; no script callback occurs on a + // repeated typed memo hit. A miss/conversion/custom script keeps calls. + const bool builtin_pair = builtin(n,path,"res://scripts/world/path_service.gd") && + builtin(n,elevators,"res://scripts/transport/elevator_service.gd"); + bool ownership_valid = false; + bool ownership_value = false; + StringName ownership_connector; + for(int64_t i=1;i access;connector=path->call(n.k_get_step_connector,from,to,access);} + bool special; + if (builtin_pair && typed_memo_hit && ownership_valid && connector == ownership_connector) { + special = ownership_value; + } else { + const Variant owned = elevators->call(n.k_owns_connector,connector); + special = static_cast(owned); + ownership_valid = builtin_pair && typed_memo_hit && owned.get_type() == Variant::BOOL; + ownership_value = special; + ownership_connector = connector; + } + if(!special && String(connector).begins_with("infra.connector:") && from.x==to.x && from.z==to.z && + std::abs(int64_t(from.y)-int64_t(to.y))==1) { + const Dictionary detail=path->call(n.k_get_connector,connector); + special=detail.get(n.k_movement_type,StringName())==Variant(n.k_CONNECTOR) && + static_cast(detail.get(n.k_cost,int64_t(0)))==150 && stair_credit>movement_scale; + } + if(special) { + const int64_t cost=path->call(n.k_calculate_guest_batch_path_cost,route[0],route[route.size()-1],route); + return static_cast(std::ceil(static_cast(cost)/static_cast(orthogonal_cost))); + } + } + return std::max(route.size()-1,0); + } +public: + + // Stateless translation of the builtin nearest access query. The caller + // supplies the existing typed default profile and the real Time callable. + // Public cache publication, failure diagnostics and fallback stay ordered. + Dictionary nearest_guest_access(Object *path, const Vector3i &start, + const Array &goals, const Vector3i &fallback_target, + const TypedArray &layers, const TypedArray &access, + const Callable &ticks) { + const ProjectionNames n; + return nearest_guest_access_impl(n,path,start,goals,fallback_target,layers,access,ticks); + } +private: + Dictionary nearest_guest_access_impl(const ProjectionNames &n,Object *path, const Vector3i &start, + const Array &goals, const Vector3i &fallback_target, + const TypedArray &layers, const TypedArray &access, + const Callable &ticks) { + Dictionary unsupported; + unsupported[n.k_supported] = false; + if (!path || !ticks.is_valid() || goals.is_empty()) return unsupported; + Object *script = path->get_script(); + if (!script || String(script->get(n.k_resource_path)) != "res://scripts/world/path_service.gd") return unsupported; + Dictionary batch = path->get(n.k__query_batch); + if (batch.is_empty() || start != static_cast(batch[n.k_start])) return unsupported; + const Dictionary passable = path->get(n.k__passable_cells); + if (!passable.has(start) || blocked(n,path, start) || !layers.has(start.z)) return unsupported; + const Dictionary targets = batch[n.k_targets]; + Dictionary cache = path->get(n.k__path_cache); + // Exact builtin validation loop has no callback before ticks.call(). + // Build the unchanged profile/revision suffix lazily at the first key. + String key_suffix; + bool key_suffix_ready = false; + for (int64_t j = 0; j < goals.size(); ++j) { + if (goals[j].get_type() != Variant::VECTOR3I) return unsupported; + const Vector3i cell = goals[j]; + if (!targets.has(cell)) { + const bool searchable = passable.has(cell) && layers.has(cell.z) && !blocked(n,path, cell); + if (searchable && (start.z == cell.z || static_cast(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, cell, layers, access)))) return unsupported; + } + if (!key_suffix_ready) { + key_suffix = cache_key_suffix(n,path, layers, access); + key_suffix_ready = true; + } + const String key = cache_key_with_suffix(start, cell, key_suffix); + if (cache.has(key)) return unsupported; + } + const int64_t started = ticks.call(); + if (!static_cast(batch[n.k_ready])) { + batch[n.k_tree] = path->call(n.k__build_guest_query_tree_compact, start, targets, layers, access); + batch[n.k_arithmetic_wrapped] = path->get(n.k__guest_tree_arithmetic_wrapped); + batch[n.k_ready] = true; + } + const Dictionary tree = batch[n.k_tree]; + if (!static_cast(tree.get(n.k_usable, false)) || static_cast(batch.get(n.k_arithmetic_wrapped, false))) return unsupported; + Vector3i best_cell = fallback_target; + bool found = false; + int64_t best_cost = 0; + const Dictionary settled = tree[n.k_settled]; + bool cost_view_ready=false,compact_cost_view=false; + Dictionary cost_indices,cost_dictionary; + PackedInt64Array cost_values; + for (int64_t j = 0; j < goals.size(); ++j) { + const Vector3i cell = goals[j]; + if (!targets.has(cell) || !settled.has(cell)) continue; + // No callback occurs between these original numeric cost reads. + // Initialize lazily at the first eligible goal, and retain nothing + // past this call or reuse after the subsequent route callbacks. + if (!cost_view_ready) { + compact_cost_view=tree.get(n.k_compact,false); + if(compact_cost_view) {cost_indices=tree[n.k_indices];cost_values=tree[n.k_cost_values];} + else cost_dictionary=tree[n.k_costs]; + cost_view_ready=true; + } + int64_t cost=0; + if(compact_cost_view) { + if(!cost_indices.has(cell)) return unsupported; + const int64_t index=cost_indices[cell]; + if(index<0 || index>=cost_values.size()) return unsupported; + cost=cost_values[index]; + } else { + if(!cost_dictionary.has(cell)) return unsupported; + cost=cost_dictionary[cell]; + } + if (!found || cost < best_cost) { + found = true; + best_cost = cost; + best_cell = cell; + } + } + TypedArray best_path; + if (found) { + best_path = resolve_ready_guest_point(n,path, start, best_cell, tree, layers, access); + if (best_path.is_empty()) return unsupported; + } + if (!goals.is_empty() && (!found || goals[goals.size() - 1] != Variant(best_cell))) { + resolve_ready_guest_point(n,path, start, goals[goals.size() - 1], tree, layers, access); + } + const int64_t elapsed = the_tree_native::signed_add(static_cast(ticks.call()), the_tree_native::signed_add(~started, 1)); + path->emit_signal(n.k_path_query_measured, std::max(elapsed, 0)); + Dictionary result; + result[n.k_supported] = true; + result[n.k_reachable] = found; + result[n.k_path] = best_path; + result[n.k_target_cell] = best_cell; + return result; + } +private: + static bool blocked(const ProjectionNames &n,Object *path, const Vector3i &cell) { + const Dictionary traffic_map = path->get(n.k__cell_traffic); + const Dictionary traffic = traffic_map.get(cell, Dictionary()); + return !traffic.is_empty() && static_cast(traffic[n.k_temporary_block]); + } + static bool tree_has_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) { + if (!static_cast(tree.get(n.k_compact, false))) { + const Dictionary values = tree[n.k_costs]; + return values.has(cell); + } + const Dictionary indices = tree[n.k_indices]; + if (!indices.has(cell)) return false; + const int64_t index = indices[cell]; + const PackedInt64Array values = tree[n.k_cost_values]; + return index >= 0 && index < values.size(); + } + static int64_t tree_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) { + if (!static_cast(tree.get(n.k_compact, false))) { + const Dictionary values = tree[n.k_costs]; + return static_cast(values[cell]); + } + const Dictionary indices = tree[n.k_indices]; + const PackedInt64Array values = tree[n.k_cost_values]; + return values[static_cast(indices[cell])]; + } + static TypedArray resolve_ready_guest_point(const ProjectionNames &n,Object *path, + const Vector3i &start, const Vector3i &goal, const Dictionary &tree, + const TypedArray &layers, const TypedArray &access) { + const Dictionary passable = path->get(n.k__passable_cells); + if (!passable.has(start)) return path->call(n.k__route_failure, n.k_START_NOT_PASSABLE); + if (!passable.has(goal)) return path->call(n.k__route_failure, n.k_GOAL_NOT_PASSABLE); + if (!layers.has(start.z) || !layers.has(goal.z)) return path->call(n.k__route_failure, n.k_ACCESS_LAYER_DENIED); + if (blocked(n,path, start)) return path->call(n.k__route_failure, n.k_START_TEMPORARILY_BLOCKED); + if (blocked(n,path, goal)) return path->call(n.k__route_failure, n.k_GOAL_TEMPORARILY_BLOCKED); + // ticks/tree callbacks may have changed the script or revision. Recheck + // at this original call position and never reuse the pre-tick suffix. + const String key = builtin(n,path,"res://scripts/world/path_service.gd") ? + cache_key_with_suffix(start, goal, cache_key_suffix(n,path, layers, access)) : + String(path->call(n.k__cache_key, start, goal, layers, access)); + Dictionary cache = path->get(n.k__path_cache); + const Dictionary batch = path->get(n.k__query_batch); + const Dictionary targets = batch[n.k_targets]; + if (cache.has(key) || !targets.has(goal)) return path->call(n.k__find_path_internal, start, goal); + path->set(n.k_cache_misses, the_tree_native::signed_add(static_cast(path->get(n.k_cache_misses)), 1)); + if (start.z != goal.z && !static_cast(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, goal, layers, access))) return path->call(n.k__route_failure, n.k_GOAL_UNREACHABLE); + TypedArray route; + const Dictionary settled = tree[n.k_settled]; + if (start == goal) route.push_back(start); + else if (settled.has(goal)) route = Array(path->call(n.k__guest_tree_reconstruct_path, tree, goal)); + if (route.is_empty()) return path->call(n.k__route_failure, path->call(n.k__diagnose_no_route_reason, start, goal, layers, access)); + cache[key] = path->call(n.k__copy_path, route); + path->set(n.k_last_no_route_reason, n.k_OK); + path->set(n.k_last_path_cost, tree_cost(n,tree, goal)); + path->set(n.k_last_error, String("")); + return route; + } +public: +private: + // One existing builtin provider operation, with no new value cache. Only + // connector-free WALK rows qualify; unsupported cases call the old provider. + // All work stays private until the original final shared[current] assignment. + struct WalkEdgeNames { + const StringName resource_path{"resource_path",false}, constants_method{"get_script_constant_map",false}; + const StringName front{"FRONT",false}, back{"BACK",false}, walk{"MOVEMENT_WALK",false}; + const StringName base{"ORTHOGONAL_MOVE_COST",false}, congestion{"CONGESTION_COST_PER_EXCESS",false}; + const StringName workspace{"_guest_tree_workspace",false}, edges{"edges",false}, indices{"indices",false}; + const StringName adjacency{"_adjacency",false}, traffic{"_cell_traffic",false}, vertical{"_vertical_walk_requires_connector",false}; + const StringName to{"to",false}, connector{"connector_id",false}, access{"access_id",false}, movement{"movement_type",false}; + const StringName base_cost{"base_cost",false}, cost{"cost",false}, temporary{"temporary_block",false}; + const StringName dynamic{"dynamic_cost",false}, density{"current_density",false}, capacity{"base_capacity",false}; + const StringName provider{"_guest_tree_shared_edges",false}; + }; + struct WalkEdgeContext { + Object *path=nullptr; + int64_t front=0, back=0, base=0, congestion=0; + StringName walk; + }; + static bool walk_edge_context(const WalkEdgeNames &n,Object *path,const Array &layers, + const Array &access,WalkEdgeContext &context) { + if (!path || layers.size()!=2 || !access.is_empty() || + layers[0].get_type()!=Variant::INT || layers[1].get_type()!=Variant::INT) return false; + Object *script=path->get_script(); + if (!script || String(script->get(n.resource_path))!="res://scripts/world/path_service.gd" || + !script->has_method(n.constants_method)) return false; + const Variant value=script->call(n.constants_method); + if (value.get_type()!=Variant::DICTIONARY) return false; + const Dictionary constants=value; + for (const StringName &key : {n.front,n.back,n.base,n.congestion}) + if (constants.get(key,Variant()).get_type()!=Variant::INT) return false; + if (constants.get(n.walk,Variant()).get_type()!=Variant::STRING_NAME || + int64_t(layers[0])!=int64_t(constants[n.front]) || + int64_t(layers[1])!=int64_t(constants[n.back])) return false; + context.path=path;context.front=constants[n.front];context.back=constants[n.back]; + context.base=constants[n.base];context.congestion=constants[n.congestion];context.walk=constants[n.walk]; + return true; + } + static bool builtin_walk_edge_rows(const WalkEdgeNames &n,const WalkEdgeContext &context, + const Vector3i ¤t,Array &rows) { + if (!context.path) return false; + const Variant workspace_value=context.path->get(n.workspace); + if (workspace_value.get_type()!=Variant::DICTIONARY) return false; + const Dictionary workspace=workspace_value; + const Variant shared_value=workspace.get(n.edges,Variant()); + if (shared_value.get_type()!=Variant::DICTIONARY) return false; + Dictionary shared=shared_value; + // Original cached-row branch precedes readonly and all other state reads. + if (shared.has(current)) { + const Variant cached=shared[current]; + if (cached.get_type()!=Variant::ARRAY) return false; + rows=cached;return true; + } + if (shared.is_read_only()) return false; + const Variant indices_value=workspace.get(n.indices,Variant()), adjacency_value=context.path->get(n.adjacency); + const Variant traffic_value=context.path->get(n.traffic), vertical_value=context.path->get(n.vertical); + if (indices_value.get_type()!=Variant::DICTIONARY || adjacency_value.get_type()!=Variant::DICTIONARY || + traffic_value.get_type()!=Variant::DICTIONARY || vertical_value.get_type()!=Variant::BOOL) return false; + const Dictionary indices=indices_value, adjacency=adjacency_value, traffic=traffic_value; + const Variant raw_value=adjacency.get(current,Array()); + if (raw_value.get_type()!=Variant::ARRAY) return false; + const Array raw=raw_value;Array result; + for (int64_t i=0;i0?excess:0,context.congestion)); + } + const int64_t cost=the_tree_native::signed_add(int64_t(base),dynamic); + Array pair;pair.push_back(neighbor);pair.push_back(cost);result.push_back(pair); + // Same short circuit and first invalid prefix as the original method. + if (cost<=0 || !indices.has(neighbor)) break; + } + shared[current]=result;rows=result;return true; + } +public: + Dictionary guest_tree_edge_rows(Object *path,const Vector3i ¤t,const Array &layers,const Array &access) { + const WalkEdgeNames names;WalkEdgeContext context;Array rows; + Dictionary result;const StringName supported{"supported",false}, row_key{"rows",false}; + result[supported]=false; + if (!walk_edge_context(names,path,layers,access,context) || + !builtin_walk_edge_rows(names,context,current,rows)) return result; + result[supported]=true;result[row_key]=rows;return result; + } +private: + Dictionary search_impl(const Array &cells, const Dictionary &indices, I start_index, + const Dictionary &goals, const Callable &edge_provider, bool use_edge_cache) { + Dictionary output; + output[StringName("status")] = String("unusable"); + if (start_index < 0 || start_index >= cells.size() || !edge_provider.is_valid()) return output; + try { + std::vector goal_indices; + const Array goal_keys = goals.keys(); + for (I j = 0; j < goal_keys.size(); ++j) + goal_indices.push_back(static_cast(indices.get(goal_keys[j], I(-1)))); + Array arguments; + arguments.resize(1); + const WalkEdgeNames walk_names;WalkEdgeContext walk_context; + if (edge_provider.get_method()==walk_names.provider && edge_provider.get_argument_count()==1 && + edge_provider.get_bound_arguments_count()==2 && edge_provider.get_unbound_arguments_count()==0) { + const Array bound=edge_provider.get_bound_arguments(); + if (bound.size()==2 && bound[0].get_type()==Variant::ARRAY && bound[1].get_type()==Variant::ARRAY) + walk_edge_context(walk_names,edge_provider.get_object(),bound[0],bound[1],walk_context); + } + // Call the original bound Godot edge method only when the search expands a node. + // Preserve its lazy cache population, filter ordering and first invalid row. + auto original_edges = [&](I current) { + arguments[0] = cells[current]; + Array fused;bool fused_supported=false; + if (cells[current].get_type()==Variant::VECTOR3I) { + const Vector3i cell=cells[current]; + fused_supported=builtin_walk_edge_rows(walk_names,walk_context,cell,fused); + } + const Variant value = fused_supported ? Variant(fused) : edge_provider.callv(arguments); + if (value.get_type() != Variant::ARRAY) return std::vector{{-1, 0}}; + const Array rows = value; + std::vector result; + result.reserve(rows.size()); + for (I j = 0; j < rows.size(); ++j) { + if (rows[j].get_type() != Variant::ARRAY) { result.push_back({-1, 0}); break; } + const Array row = rows[j]; + if (row.size() != 2 || row[1].get_type() != Variant::INT) { + result.push_back({-1, 0}); break; + } + const I cost = static_cast(row[1]); + // Nonpositive cost is rejected before requesting the neighbor index. + if (cost <= 0) { result.push_back({-1, cost}); break; } + const I neighbor = static_cast(indices.get(row[0], I(-1))); + result.push_back({neighbor, cost}); + if (neighbor < 0) break; + } + return result; + }; + // Borrow cached rows only during the pure numeric edge loop. + // No engine callback runs while that borrowed vector is traversed. + std::vector converted; + auto edges = [&](I current) -> const std::vector& { + if (use_edge_cache) { + const auto found = cached_edges.find(current); + if (found != cached_edges.end()) return found->second; + } + converted = original_edges(current); + // Preserve the returned conversion even if a reentrant provider + // populated this cache key first. Never substitute its row here. + if (use_edge_cache) cached_edges.emplace(current, converted); + return converted; + }; + const auto result = the_tree_native::search(cells.size(), start_index, goal_indices, edges); + output[StringName("status")] = String(result.status.c_str()); + if (result.status != "usable") return output; + PackedInt64Array costs, parents; + if (costs.resize(result.costs.size()) != OK || parents.resize(result.parents.size()) != OK) { + output[StringName("status")] = String("unusable"); + return output; + } + // Newly resized, private packed arrays own their writable storage. + // A provider may shrink caller cells. Preserve the old written + // prefix and resize-created zero tail, not the whole native vector. + const I written_count=cells.size(); + if(written_count<=static_cast(result.costs.size())) { + std::copy_n(result.costs.begin(),written_count,costs.ptrw()); + std::copy_n(result.parents.begin(),written_count,parents.ptrw()); + } else { + // Keep the original unsupported-growth path unchanged. + for (I j=0;j discovered, parent_discovered; + for (I j : result.discovered) discovered.push_back(j); + for (I j : result.parent_discovered) parent_discovered.push_back(j); + Dictionary settled; + for (I j : result.settled) settled[cells[j]] = true; + output[StringName("cost_values")] = costs; + output[StringName("parent_indices")] = parents; + output[StringName("discovered")] = discovered; + output[StringName("parent_discovered")] = parent_discovered; + output[StringName("settled")] = settled; + return output; + } catch (const std::exception &) { + output = Dictionary(); + output[StringName("status")] = String("unusable"); + return output; + } + } +}; + +void initialize_tree_numeric_core(ModuleInitializationLevel level) { + if (level == MODULE_INITIALIZATION_LEVEL_SCENE) GDREGISTER_CLASS(TheTreeNumericCore); +} +void uninitialize_tree_numeric_core(ModuleInitializationLevel) {} + +extern "C" { +GDExtensionBool GDE_EXPORT tree_numeric_core_init(GDExtensionInterfaceGetProcAddress get_proc, + GDExtensionClassLibraryPtr library, GDExtensionInitialization *initialization) { + GDExtensionBinding::InitObject init(get_proc, library, initialization); + init.register_initializer(initialize_tree_numeric_core); + init.register_terminator(uninitialize_tree_numeric_core); + init.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE); + return init.init(); +} +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/026-p23-02-native-hot-loop-local-actual-independent-review-r329.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/026-p23-02-native-hot-loop-local-actual-independent-review-r329.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..7031a5988ea7065e60cae3e5cd37e29bf59f46e4 GIT binary patch literal 8877 zcmZXZWl&sQv$himmH@#51Pu@%ID@+l5(bCC2@Zo3W^fM>+}&LV9W*#e7~I_hX_&6kEs%q$x;P_3Mt5)@&AvF|b`2q;e;ZXX z({kka=-O&A98t8Jqw;uk#RY+RSOXL-Crts_4|kv$a!0=w9VLzuSh|nJsFmU9g3YO1 znitGohvMx13|}- z)}saH$6{&{%9{iGsN%Zvq>IXJ&&kG4k|vCh$XQ_r$}3Bw?u@K9cf(>>8OZ{uc@DF3 ze|^i_t&|Gun!Q84pu(mzpy~PqbYQRlXxVytIP}TLP<+`tbaBO#eJG~cKvw&J6neM`1?LC8ZKUj)lD{#$6nP2g`! z(c3GPr?VsR$6m*$3!~15Nx!? z3RNTTyAC57)+=+digiDxqUm9g(bL4CYHN%?M4p*@_501e3b8G@&A?p1_4hozLbc*+ zor|KTtW{{JplXlP7FIc0a)xxTxYQY*BkKo1)q)w7)uNt0;_aI4ehZh;DfOPdupj4J z+m~**EpKx?zg$}S@G}&jH&-|VJ9xL(ZR(Z@9Gfm8u7St%mhIzet%y40mfnW_ZR9qI zHY|JmqL~j;Mfc=On9L&6MESmPPw|hN&=a&n)b_G1&^AQi@<}#Cw|zJG&~hcMX737e zJ=*?!jGV+SZqqZT%~MwUfXd6YqZFFAk)l<-N)hhvwX0XSkE0c?6tUAJCy?;-s3EzI zNo6(C_&N){zHDfJIj@p0e|S3U_pXu6Hv+c3JlJj58_aNSH#DeB zoT=DEf(@yX(m1@XL^!nT9IIgQhEjAlf0X@mPSPuJpFLf?K0tb}Uhox5{!H114Knd# z+Y$8SZYQe8A7Oov*5~1ud^r|i9(d>z+2~P9P_~eH=<{=s#ePX<^bBbId*oO+yBdIo zu#33qVydlsrsQ)%Kf9LsXrg{mL^=sI4+m)WsVdmUgD_Qs;}eSOE%>jKeO+~yWpntt z+qZU)G4+(Dok`qXi(8-$r=0>nZgo;P)4e5w6AkTHE^SExJowIz<|xfVI&b(p)zE>Oj=6IcM81`WcaVk9;WU(E zkKSK(pGvdrzo=-bINIF_)AzO>`nU!zdXnILn?9&p4DtbfYXaXNroYXa{#wy=tvdLj zUTJo8B#~LE!Nc?TtC0SjJwJ%T%OyA9kpd!E^H{cJZ#UO_v^hK9l?R4HHI}XPSkz65?FLH zD-##Ke<0~xF$6}rxs=F6)TN9Pb7Qe9PmM05F0)OCF4XP)fz}>18rYOGtcVz?bPV~P zDR6=)c@N*Mo6FJrUQchX9(Lz(SJwryL@ zewuQc28LtXTtHVfIl4bm{Llu2lmstsSK&5a^{gMG?ShydmvKNLJl7)}9EHkmkX7`G zi_*P-Q`c^zCg-yV{sJ4(`TR=_N~?rU11n6MyR1LSI#G4YfY4rQ*rOPQXAP+3ImWv< zI_{KYz2^|5ki}jlddxcp5=pHQs;q4~qX_w82|j#*x|lm*K+}Ef%|^)%ls9YI%@QZF zwZbX!aQ$b7_}UiU5Z+>qd>bi1zVHiU1Opcwk|ER#5wS*m7`IhZ976CmCaYTx%rp({ z35ZtcGzw~GW;7m{oC=8CS6QBT5PjbgSR4QN{TWczNC;eP)lXtR>rabur5wU7)CbNw zlVj{a-%7>CSNuGMLRls^jpu`6R}gl#9!(HiGAjRdVKVCFo^Fb)=D_sUkAzj*TE z`=xi6`MI~??OmF8Wt8t^o*2OSIJXpcT=k`~!Qhu~e9prrFC}jgiVnyFVefO%rENLx zdBE^OJ7B<~oqj=1d{$s-|2YMPDZ4xr@fJ3244~l|9k7v<>a$~!)DRCQWhK?fP-6EQ zc44lOvWVS<2@*Iu(D&Y+fhm*Qc%d*-c=hi z+?}DdznJcP8H2~|NfKvHv|FUY!z ze>-5uzJMzQ#=Un`*2J&{&jvwq7GxvhirkI{J-Zs|FQ_Q?uCpn<-Fg~_#0SSCJ5 zcY5r3_s6D@B#z|U@L!B-CF~faOQ{qihIdgq1=yC!q6v(S- z+8_ol+E0~u4ORG0weB zJ}r^q!0OjMv~M4^e4ULZ3?5Jo=Q4P(#^crx9Ye~z9Pb(V`YHSe!b8ht+#-W0XL_{% z3d0M2{2MT2k?mL#Qz#ZJpYUDwL?xG0xUeHG!zoQ@kKPJPFGuQ2c>Y)hcY3LGssZo5 z*w2AN+Iub9(y9uklHY5DlNmDAY+Cs>l~;>4%_W1gs|o599kY)Dn5iL_*sby(f{56N zXZ65;)S1#?%2Q*eVA0)qGggotG<4*B!JXPsRz8ZEQ!oFuGoj{MCx3ysGu?Gq;UKW| zjb1|>EQgTEj-t4tf)<__lG-+`{Bpj~8a>QepDSOGsW}CB z9x$9+gdGtbvooCqF~_H^)wQ$BiAQ7po3fRHkhaH-aG%DG+aCcE^T>&KX*zJ1e#yK- z3?F_QAXa9}Eb_{odlG@u+r;A}&OXTrB`dmvFGzlLF}R$@&*vT|D+)6AJcUcELWnhA zA)Tfo>BJ&F;K^A~P;-$&c%Gi2`mU9s(sNkX6!$m3gsYX0FYVdIS=wpYhXV)&zh)U8 zsP`pyf45fQ;ju54)~rZhpmKVl>|pfSouRI%f(n(J%<4>x6%zS}r}m8CSjR;pH-piW*eJOAZH zF1#ih0(1efdDQapO-Yy3O3UTaDwog86}1TJ4r5{F1urq{%1}9S30SYXyPaNa==YBeiHSJ7p}0aVK(4Jh)$5fAs@Ah#hQ&T@8ZS?5es>jk^LJ~8 z)rgmnK=jX>Wi|7p<8wP-{7Nd~wK(Y@qxRm&HGQS?#5=;PT`+e@JuY(M>Ul9wm$}+* zfAcuzY=Rl$^9sRWG^L^{+FOVn15#qx+J2dED$g%y1bmS+NHb41ua9P`FoRE_P?UIe zZ(ztqQa(I<3SD8V?GQA5^QTaG589#Q=&3f5m7>$cNN$#WoNeM@Xdhjky8q?AQGCVZ zBMOle;yr^pC_4!+Li5*3PP0CZexmW$!pw4s_fD1b<`+YWeHM^F)VG@EOKl_~6KmgQ z+rQk9f-pdfEeE1orYOYkc9=>pB9bIDn#Swmr*^rSM_+-}hdvzIU8b)kY~Uj?B1r|; zf+#R_9jE%9Gj0kD`3snCcE!lycH7bNn<*VAATiVSIo}Xr1r12a)Ah4Iq{<0w5@w%Q|#! zVb{vik@|ZC_;W!NazX*=!DvnbQlkQUve$fd_yY#y_tIcgp`y3NH)~nixq0hs zg=#WArEx!f37|KzpD;lpboeY%oT-mmfl?pCWD*0_^9?>-;LV{zFtFpF+u%=qW~K{& z&2PH-nXv&Hdnp@5aa^c{%biONfZqJ|G~tgIHx!T!Hx0e^Nh&r(Z1nf0e>#ndaKew8 zo?1un_U45msBkv^HT6pzOAwq{ir$}{WRt&5q(nT$%o`cTDTqn%jz;p3<#jA!_!n43 zIPDOciDD+*Uy47%U=-%rI#=CW5?`D>qzr{HH5mKNT7lyLHk&u~Wa^FJL`W?QuINiL)#A9?hKFH8dF)2!@v+og zI}HxPpq}_rD=q6DVe$MMQYRdywf_>q$QI}|L8tf|nTyHU$sIGrX26UXEK4>h;3kT) znWycyHdloMOywh+t3R144v+yVwN8MF1>uoubRnWN|4q%b`S`kSr8I5>4D`%>E@uFI z`PeOpTl+WiGbeU~^IuQOyoDkE46+lPMs&>oAK%wgvAC6)yLfD9wFLL^<0ItSP@_;b zPTtZ!(^p9bJnW&R0--e4-|RYhdab~}{%!pKPyP=yUg$s4JZqu0A8B&7|07BFSMnX| z`rpv$-*Qqfdm<^^|DPt(Z8mm&E#+W}>@BT!e>CAoC4zSDm)Mng{K{#vrNQz|L|scM zTy9^X;^A|A6q@FdWP)Oq!Sy^vnQYSdMmACewEYGOugWYfM*|q<#!^v=d!qBwh}4

_%>Lgj!gJJt;iLs~edrl^#P*6>0dvL?Ukw7SNAjB_nL%~D5=V~8WF&2s z$x)R53a;n_g>H}o<}l2cZ-(E}iJ1~H&IxYEK?8EVFSLL z);8W#s5jRSrIQKJiel6+Pna;k9Ot>vmAz=Mb^S*(i?`6Ebc~U?{h1R&S0Qwhjf6JA zr;;ssESDFwPESi>q{o&TOWvbOzO~;T$;>H>Lvg}FqXZljd&69`tq#>t{LOA@t4ILJ zh+!AfI?I!rA;2caDVPf&a+Zhktu%<_b4d!Xqo^OK)HsEn%Hohez93)r&UiCCJ2`w? zYosvRX)tz3*Fk>*5HaxRVn3D%qh^+>ZhSt4Em)ekl?fbXvmMH1p~9|JrJ*kyVVF?i z3nGYc^91AYg38UX6Xd?ozg`?{H+BNDs6x9pJ*Pd+6^#{L?>gOZ)rrtZ-Uz_IeEJcI zA7DcXw2P=jCX;@0u=f6rve8R)W2N}~qu@%S_HKnxW9YnSZPlnN$U5l6A(VB@5n%4~da!8*D$GX>ii) zm}hdONnj3JU(}mMr9QJ7BK^4u>mm{{833k^M^kGY%HNCl(J+7|hI5PbaNbgIZu!LcoJmy7#e0VzzVc#4m(Pu@1ME^a@L|%+9GHa<$3iZo z*6nFHM5~w?$c!q2PJsi$DR>CicZ#(y!p6a2g2ADNb*iQ5J^~upg6R&7cEFqc-1LJymb;5r35X1V&J=D(?_jRzMF`6V^PFt_egFH?(Vn~p}`L;?Fu z%B@|z%^b<0cXp#jpQE}(6L}+;3lhs40M6m}7|Fld-cY00>91nSG)HmZGXb|pG5eRJ z;I!_y)lEfI2I2?C^2$b5D{rZ(-fAq9ZftT(ym3ESp!eOiSHr==wS!_Kr=`@eEePp} zlSChqpg38(JfHxV?0)nk`8OHw)kgs9H=A6Moyo*&LCmjBx<{XD{@WqwFPn2zr z5H1pgFOC65seA^X*;f`kKZ< zXQzbZ08j%`>Hj$#DV3PNsbL@mXV=vSH*OLLzDe-<+72srXK#M_yhSGqPH881xXvcf zft2#o;nH!es-ZGO^V`co8M9)NYi^ra6xCE7v7`BsfubQRWTyH19;OXR<`>w z7!ed76tg@U(^uel{fW!c>Medr+MHfk80*esV!=mVus08@d8Q+8QfdHidr$AY>T_L! z-B`;4(76s3(#Wu1@8_+})o_FS1%dXRtx$C>(F0)B%DFRjK!KO|X5)O9(Z#rPfrCLj zsJrNP2|9p-nh^vb0)J!|!UjZ~)yF@hL9>#qmAn#@T@(R_fq8is%`Tz*$iJuL>;UUY zZSsdU-@5=U{$fE>ZNJYPSA^AAq`?$aL4k#-SmmTs-TRR(0{8i5%leXpcN_3yA1iuk zjK2rtC4rx=xd%=KGp!9vlK3WuEk?CH4?Ue4Ow%s5oY{p)eD3U;MYL4>tj@1Pc((Iu zhiKW~$0)UdSm}FFn0CaDQfO&|4YRHDG(XILrAV^=(m!XwJ1)Itvg$LrOES1+H!#&& zm;DFB5bOaO+}h+IIgbin_dHYZps7QuYb8{ZM7$L**c*20OqA8G8=ll|Yo6zB)~jZa z@jH*)P7#0D%T?)E6~+z4s~IPA4*a31$Jf9>`C83B1tp+p*VN2N54DJ;!NRsYT(>Md zn)j}wFg|snJM|>_8+(#ic>!a_&S3xF|H`NA(dz6$(AK1>jK~4Nf6pGYMyI^$$Hew6 z&%-1L&*x&qqqn2Dr*LDboLxg~wxSqS8iL%mi?ae^EWCZBFIfNFQ zwvpIInv8uOQ&XT9;H1$ehw*A+b-46a6uMHUj9Rh9{6u)+tQfhE&e1UD6WI1LT|y9= zA(l$rl~w_+=}PJ*rpH^r>eeosj^Cr}OMN9uKdBVghg!~x9a`)9(m+%S}q!&~rU{79>a?S;GyP){8au2&7n zylH8C(g3zRCdH~#!bz`Qx@$|psvKq+C-X{J7j7)?wBb!+VwdJd`o`4J%P|R;#RE2% z&W+!^DGb{d*F>pt+nHz^NnLU4;C3N_1|ptv%t(lC zHFW~r39rY~X`~8p)POu$=Svcnrg=zoL1Aj*FFlLaP~1L}`Y=-~{KN%4G;N#d=@~fS z_C~JIbc!v_>cO*a_Ae<%`^Sz$Y+z{lR6{Jm!iXb6P-+LTaWyEE8NYz1#6+K#iuR5? zCF$84O}-+ll^|!H@~-wz5vx9+=6FNkRjMVy%FNxDhF43!3#NOfld&7+^Xvqg4eJ?@ z0KNCDhFmsU4c7PjxmJ2n^T9`M4zXSaE1KSmtnL6|za#GpZTB05;f1F}bhD zk>f3o5)7DWaJbe~ryBI*2jW&Mw)AjdY*+DuA^v@-i0@JZVa`IxXcg4-=5*uAI@qHn z0Y7HVY4736H<>&5`tW&bgKH*@4L@Jhi+A{y? zyqSFNaQHBIOEJ7Pmg~b0bkH;d^~ZiKp59O8pAWYR9c>RKDy7Kapm13toFeU`SEhVS zS0v#3O?)$r7}S(v=TsTH#=?SXX9CtW&=i{v6_)$o(J$?)Yr1}s-MWw=r}3VL^JfY- zZU^L-cV#f`EOAnaUPb8zJ$x{g4n10;UA7zD49d26*Ch)w!PH0FI6RFJayL&zTLI}F zjs@Y#!|_>DDq5s0EV>>m&sdAE)Vo#Rdxk01kCO=`LA)mS*W0?F0zwu6zdnINp#-}8(fs?0b8?UGv zJ(-I?N6=IIJIQ4w2YW3(4U55@MyP6{nU+45EiM_bCym-qsXB&p=5>;W-yAzO{jW!8 zpK4k1){I5oZcHH$pW0N-@8Ht;xXq{!#6#6bX&UPaiRNkE3>yQyMrU{FTIrxxd6kadwZfE%dO2e2h-pgk_=?9^*7ce0hzCR4X&&#CIXHIdQrNsEzF&-dJN1^A4n7EAxi9Xzu-Hz zidH?Um74VC-PBp?GUCTFww;`h8>FejbpEt~T{*QGyhdz#6Q$xe>ozTI8R|D*-q)=# z)i3Tehg{y?XRz1K7gJN;L#{o$Q-^)JJ57E>vT<%IXC3W0Oub9nzy6!0GAKYa0!<#*)`RBV*hS7-3_g%Yg)Dk~i0(6_} z{pGqqU4kK?U*5ZcZQTgy{OP^G*P~&})1t_RUl-8K=IP6$4cn-o%L4&wwXz)8&o}pb zN2$Nqb^VqQ-RG{>+9fZJ3E^ai0*GS1+mZ47kpoBFOBbcv!^aCzSl6!)fC; z1l^3bP>9kzow>zV9Ra z(5*dales}ue!E7*94x;+>|NiE7-rnb*=+RB#zS10Y$;y$+nuuJ46E5|&!I|WnfOlR zJ8xGWIfC-Ldd}89cj~}?Is5MJ)@Pm~3S7yrwra)mUhjeMd-h;W%S>>FGIPW8{cvb` z%iy8)d)1t4y}UMRE=^R^sS~Z8TE@WpGhoqXFk|Xl!wPfti@`;;3O$!+{QHAz^MgM( z_FZp>OH4UQqC7VD_m5iJqE)y zbe=D=bg;1_xbp(ST8ke}H3-XzFBbb%QzOXMz#3medgCGgr5)Y|ZfG|}3 zfK-r9tBx?z_Yke&!KXXRl*KmYw1v`ZYuwqZ>-TsJGhi56(?06LbTy3a7uIEVH4~0A&K3+dQ+&|uI z96sy{hCEO&-CaxEpDsPNJf2EC9zWh+7nC(FLMhJSZm&0sMTew;tDKV-tw>&$?(K3A zPSVk?M^lq(A5yHn8>@+RQi@oAp#8=`(G+O_wvRq(l$w}X&z(;%!b5vx+jaFKW-nrf(M`dP}TdG%?A4eM&a=XE6Wb1&l*RGx4+|{?4@cwkC z*Ge7X{SsC4M+0!lneyTG+NeU4ldEyw- z=-wN`QSFN14|-Rz)|Av$ra`suxLUgBdKT%ko*~=QiP`9@QZ4!x z-COfL`zV+zXc|uhzvJTQI?(rn#cq;E$bj*FBc5Q3$8$cisz$?K9T0P;4#uT+xG8Ed zL@$NZ2}kMvHmI?^^@USZ@6`zh+iW^Hs6e&0mTaO$ANatt^nsqKrz7moMd4i8&=3&X zG5lo*)iF2Egi7J?V8^@)_YGUC&^@b)+sE+yvha?cPkyJ~qW3(v+vcHJ&8`~JLihXn zGa;hpj`}S#)oeDknq@lryZ1Rkc0IN0?TYMW>*v}{f^SK3nt&-c;7?VGzHI*DQ||OX zBf>E*5)kAns5=|Wls!Ej3Ee%;7k76-)4`ENqANRnwJ8_k2i+%z_cq;l^|j6*Ctc54 z*Cf*0OrUV8hy-QOX8E*BX;&^BXFq39MZ&b!ZD7#n<{Dh%ljzWu|1g?vBpqaZLt!=G z@i;(p+BJH789f9f9?V3>sEDHD{gRP3oJYLdZvpv67dSo+HTSCC@pw`;U?zV0B!5ZwO#8t*PJ1$iS%Fr;^cHWT?p01mNPTqgZ= zZ>lWetGRmBcoQ89#aQxcuUIRqgzCDcG#>5d?)Pft4u7CZ64ZQKmIi@j89~|&hlWJo z)@j@DJD4q=J1R%b2`P8ebf6OnfAtl~os!a{MQ0H`22-=~$Z&nreBoV8qD#|GvfwbA z4UhO_h*z3eKv3J9=v!RAXQ+_w8Fby+JsYI{bM|niAV7S1)_E95NXq?N3HY~59%{jP zs>@nXsN5WulE8r95}S{ztFA7(zUCvr1`&3!Iq-B<;j=kMs8H<9KRVF~Zn{(kt2$eN7ct?(yGA@Ygb?BvX0Aa?$+ zl5*4bQ5>s=!3VIPbcTxB_X4m$gpq;ftbm?e}U1vR_%9rj^8Z_t|LbuJz&Af`6ts63smZC4vjU$Cs6A z`+PQVGQ)RDFDtVf*KG$j3=$n|&d484@NsMAx!T0aJX8(dc z$J5@W&i)(~z=c0O8BrA3&Fm-(mi-<==+=g1FSib6G*T!9I%JE4^XpnQiR+~AWJ=Q8 z5q2u|X$zhOV+I04z@K2dc;Cm}c6!Bl1Jc6)dW_zza^%f@!WCV^8KF~X8Cqz%$a)!> zZ!A7EsSnANzshndwbD!Hy!ih0WLT8{T*T`hC?o=ez&6dxAkR_fl8DzWVI8sf`Sj^ldf9qveaJ27hwvfJ& zoe%L{ZelNddi_d?bX#v=G`7w7MNFhDG87#oJ}g*68-@+B`OS*QhWokB<_j}>xDpX< zW3l&V$+LKt(>7nHP#I`^m~Z7=2jA}$e<@_J55huYjnQ%&w=c%B^qi}>#)hQC>=}P9 z^nb4^9EnkoiKy0#b>S@AA}(zR;($Ru2Is1HTp3*sN%g+tvtFPr!q;jvFmcknR@NTQ z^(y{E0@?`A7aJ_@V~pBT;mMX@MX<1PllTI?)LYEZ9^_H)izxif724nR8x`qN2ww^( z_YGQ(fLV*nPViG(78Pl8_{M0GU6tkd7#UzGwl|BG6>bKNKTQ?&C8D&dprR-@W=!o% z4h0s`V4RCSc0%t=QVbgaG?~e9eM+1>=W4vku2{x*86qX zcwW1m7jU=H@O#&F#K&IJ6EvU8YxcMr6V%*&-S<&)abP+{hEAu~xO__aQs8ALcarSP z5ZV5=T$wgSLaoD!#_kw2b%8yKs#GXP!@3U&?FNkrax;J^mwEM9a-@^fi3SScxi z8RpUoGsFoC(iEkowE2UH(n`wTrSl`u?vK|aXGc3^XDAeItSZI$DY~2LQ0KjbbjoK_ zn4GKuINsSAThDa{9r$l6v;>(T+{m=ENyZG2u~k*{@|eP=F^!MHFL%?SouE3-nmdws zeOJoX1sPE>B02ND@*gebU;Mg#nGRBGZ0W;C&FUuhNxTaml44{W@dGfkV~}aJHgxMcM&8>$3)zw&c~R2H6O>wQrv`mYd^IuU0q3G+1Tv#v0Rd_ z8YXQb)S2L}>;q|~Dz>%t*#u6jj>GV!X4aFOKJyPtCebjmmKIgZ(cjJ+>Xl1 z+XQqBF}CD{;3dXMTwo3kHjKi=DgqrOVF+rn%t)so+#T-rv2hG0jc zrn|t;@;$kcUnHFp@twz}O9EP^Kq<3Zyx{Q{I$C4Qd(P+N%c-j`uQB2>g_p-D<%B zg0$Q0*q`ym5f7xBm%LFSz8f?jp1&Ms+p1)Z@;gK_s$DoEu%(RLd`xV?N<8wyVwtS(Jnc@f?r52THk zyz;?xUfAM&Ed9?=wsK^8O;k^t7A?qPwi7j!1>BX8aJYRg>}ja_uVWPEG0Qal2P?AZ zdg6umCi4OoQ86@YHPoXQW$He20Sg+w8+oZM^XkrT0n~E2cVx;2iCEiGj9*WI#o}5& z5smYg3>695ZiIT_Y$qcnJe?pwpZE%YzOH5&kJ@V(a=g8-;Qm@39MYYrDXqxhZ9%KiR@J&BzY46)&+c1n7NTG9J6o56U+eH!j=WKIVZ2p z@-okn)zJ_BE-O1VisO@~bRHV>)7oe z`81c#7NM?LXzM~1gUm_Bi{#<%c@ky&Npgl`g5+4vY7&(nIMx;Mp66zA>trCtgqHNA zvZ5hzV%E|PEl+K=BMw_96#~1QL=F+Xc;?t$mGkv`byn0s&~0J$}N_;w~5EaEt|s1%tZnd?~pU z?EG!mUx1QtS*ZDD0=;5{%H&0PCW^gCRV}?Z>94^pMrzdZ-Yjh@6gf(X@?}vkrLd8@ z=Kc{zC2|H$n~SN|6`sqSf{&QOOshJ>&!p|uy2^>2`kzT!|NC?KpP!<^YIU2xH<7vS z$b<&+h1Y2hfXajFC5dMRpwEuEAkdI=X3$&waya0QYW?$)S z$~CHDF#bq@(>5{;*+gnW;?MyRi#JE6;Aj%OTlZtS@JatacoW%p%{gEDH zTv!Qel&wc|%0?r88mzgK@#>dtu*OXopIjL-6d114O5Twf{IhY7IM$#3=1>#dtqy+~o-`*PSF1JyD%@88V11UF7^=HmJ;8Ad@Qnp4 zyIZ7MGuM#BSTW}?*V+G^abwYkeOBwDH`vT_p3K*&Q+%^dNteKB`so-pjgtExZM5;K z6B?m}o@^4tT^b=_)WPej(qxB4U1CVHN3>obXAfRBIwo0EP#cq9zh3xklI%^;&bKr+ zw1tEzb#Zh(|6N}7-xk?S{H<&*4X=~AKeCx+?n4UMttL*N5eO-8%a^8f*o(?-{`9H?yaJhG8niScc5 z&zN8$j8lCC4^e)9Nv)A|GC6DbmL}J#4!^YGis(xcSb3gA)!6fMZp?63A3|9B-4~Nc zB-1LjhS$za&MRWV-RMOU&ibRNEyu>9T#`48Z?IqX@N25h=O$VEVBX|6YsjuLlU0Oq z)9Tq3pJrm&6!2{;e5#8`iBN}+QzyxqyLH%%O&pc6rt49Ptro=c%j;cF+H6b)$OO}E5kVSz!;~XEKW$3>?51+4t!$c#N-=F z2#_SG7Wa4UMeHyhw}*pxORnelUPeo7wDgo%T)=9ey8*SOr|CZk%Ff5+yhHsv_BIUm3>$!s*C(Yl7NLvnXz@W#H8*Ig z?x4C5GpG%0Ol^cYC8e;|yKMnGeC1YvdlpLplCUzW$?$UdQ&qD7eVQW=$HJY(%!6b1 zQE9+TOKPwe=^(f8Gg!~{38%y@)XqHcejC>Fuus~+`FJwJNhMJ&k&u_@I(HAQzzzkZ zYf5IsF{+P;t4k`i~SE>0s|}aS|hp z>Q~xQqBM;b@#eFU5{FapR)5(f>1rK`0)wtAF2o4?7LfaAv!Nf@(5}O{G~TRiIgBr7}{#?R(xeEMwLG=cd2wJvrv}P z=6Y4Rl*rTg2Xf7e!xPoH_U-#<2l}3Is7~bmnkV2E&PO!wUz&H;npYN8_E2)XRem@q ziFCRZRsNw~CP!6yyqumk+%bvlrk6i67FUjxPX0yqx^eBdQBf#U$((In*-eA`ZYQdq zghT)Bs~eA{Eem#RINb_{Z049GVh&U5PsN@MKf!%`80WOB zV-r0GSGX4UI^5^w`+XYt^O+)imKJO+Rh=9+OqFq}M04z&w2sZ|dyzEWZvh2;=Qv(5 z#bqR`{G(qb9@!p6kaPMt1gHRuWGhtuFJAPNyz_R7dIDKm){QL!K>us{&rj&cCv51t9h=X%- z%s<^;9?%*=uf=g6$ZPhCw?qNzA>Nr5$s!>59&jiC>L31Y88-MZ9c2!DT<9>fKjned%H45jFcv6Vb$kjPyT_l3Kw4 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/028-actual-root-verification.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/028-actual-root-verification.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..197e576cf3802a421c12de9b2d3d6cc7db03e7d8 GIT binary patch literal 6582 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 Uv~u&~=#G!sH void: + if not Guard.activate(): quit(97); return + super._initialize() +func _run() -> void: + var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate.gdextension") + if loaded != GDExtensionManager.LOAD_STATUS_OK or not ClassDB.class_exists(&"TheTreeNumericCore"): + push_error("exact native Guest batch extension failed to load"); quit(96); return + print("NATIVE_ADAPTER_LIBRARY_REGISTERED") + super._run() diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/030-candidate.gdextension b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/030-candidate.gdextension new file mode 100644 index 0000000..d46e2a8 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/030-candidate.gdextension @@ -0,0 +1,7 @@ +[configuration] +entry_symbol="tree_numeric_core_init" +compatibility_minimum="4.7.2" +reloadable=false + +[libraries] +macos.arm64="/private/tmp/TheTree-hot-loop-r329-41b6a86c36104f96acdf24f428667ade/candidate.dylib" diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/031-driver-before-prepath-repair.py b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/031-driver-before-prepath-repair.py new file mode 100644 index 0000000..a6d1373 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/031-driver-before-prepath-repair.py @@ -0,0 +1,64 @@ +# coding: utf-8 +"""One owned Guest batch ABI/local/affected-S3 execution; no full regression or release acceptance.""" +from pathlib import Path +import hashlib,importlib.util,json,os,shutil,sys,uuid +sys.dont_write_bytecode=True +R=Path(__file__).resolve().parents[2];A=R/'artifacts/original-completion-2026-10-02';O=A/'p23-02-native-hot-loop-local-r329';D=R/'docs/plans/original-completion-2026-10-02' +NAMES=['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json'] +def mod(name,p): + s=importlib.util.spec_from_file_location(name,p);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m +def main(): + r=mod('guest_local_runner',R/'tools/run_all_tests.py');outer=mod('guest_local_owned',r.SUPPORT/'owned_outer.py');plan=r.read(O/'input.json');fixed=plan['pins'] + assert not (O/'execution.json').exists() + stage=Path(plan['stage']);parent=Path(plan['parent']);public=(stage/'project.godot').read_bytes();private=Path(fixed['private_library']['path']).parent + source=r.source_refs(R);player=r.default_player(R);docs={n:r.sha(D/n) for n in NAMES} + assert source==plan['source_before'] and player==plan['default_before'] and docs==plan['doc4_before'] + def protect(): + assert r.source_refs(R)==source and r.default_player(R)==player and {n:r.sha(D/n) for n in NAMES}==docs + assert r.inventory(parent,stage=True)==plan['parent_stage_inventory'] and r.inventory(stage,stage=True)==plan['expected_stage'] + assert r.inventory(r.SUPPORT)==plan['support_inventory'] and r.inventory(private)==plan['private_library_inventory'] + for k,q in fixed.items(): + p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'],k + def growth():return sum(p.stat().st_size for p in O.rglob('*') if p.is_file() and p.relative_to(O).parts[0]!='stage') + protect();host=r.read(fixed['host_review']['path']);assert host['host_build_accepted'] and not host['blockers'] + prepath=A/'p23-02-native-guest-bulk-local-preexecution-independent-review-r315.json';pre=r.read(prepath);assert pre['execution_allowed'] and not pre['blockers'] + for group in ['evidence_sha256','canonical_doc4_context_pins']: + for q in pre[group].values(): + p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'] + root=r.read(O/'preexecution-root-verification.json');assert root['passed'] and root['review_sha256']==r.sha(prepath) + phases=[];samples=[];error=None;cleanup=[];cleanup_errors=[];report=None + try: + protect();assert not outer.native.helper['live_engines']() and shutil.disk_usage(A).free>=plan['capacity_floor_bytes'] and growth()<=plan['maximum_measurement_growth_bytes'] + output=O/'local-measurement';output.mkdir();ident=uuid.uuid4().hex;startup='TheTree-PCK-tests-'+ident+'-guest-startup';profile='TheTree-PCK-tests-'+ident+'-guest-runtime' + assert not r.profile_path(startup).exists() and not r.profile_path(profile).exists() + env=r.fresh_environment(os.environ);env.update(THE_TREE_PACK_PROFILE_NAME=profile,THE_TREE_PACK_PROFILE_EXPECTED=str(r.profile_path(profile)),THE_TREE_PACK_PROFILE_REPORT=str(O/'local-profile.json'),THE_TREE_RUNTIME_MONITOR_OUTPUT=str(output)) + (stage/'project.godot').write_bytes(r.private_project(public,startup));phase=O/'local' + argv=[fixed['engine']['path'],'--headless','--path',str(stage),'--script',fixed['starter']['path'],'--verbose','--log-file',str(phase/'engine-native.log')] + result,capture=outer.run_phase(argv,phase,90,env,now_fn=r.now,dump_fn=r.write,sha_fn=r.sha,live_engines_fn=outer.native.helper['live_engines']) + phases.append(dict(name='local',result=result,capture=capture));r.write(O/'local-phase.json',phases[0]) + report=r.read(output/'report.json') if (output/'report.json').exists() else None + if report:samples.append(dict(name='local',report=report)) + assert result is not None and result['exit_code']==0 and not result['error_lines'] and not result['timed_out'] and capture['passed'] + logs=''.join((phase/n).read_text() for n in ['stdout.log','stderr.log','engine-native.log']) + assert 'Orphan StringName:' not in logs and 'unclaimed string names' not in logs + assert report and report['passed'] and report['failures']==0 and report['pid']==result['pid'] + count=plan['expected_case_counts'];assert report['pure_case_count']==count['pure'] and report['decision_case_count']==count['decision'] and report['custom_fallback_case_count']==count['custom_fallback'] and report['original_s3_invocations']==count['original_s3_invocations'] + stdout=(phase/'stdout.log').read_text();assert stdout.count('Guest bulk local: %d checks, 0 failures'%report['checks'])==1 and stdout.count('NATIVE_ADAPTER_LIBRARY_REGISTERED')==1 + fixture=output/'fixtures.varbytes';assert fixture.stat().st_size==report['fixture_bytes'] and r.sha(fixture)==report['fixture_sha256'] + protocol=r.read(output/'protocol-report.json');assert protocol['passed'] and not protocol['failures'] and len(protocol['cases'])==50 and len(protocol['cached_cases'])==50 and protocol['checks']==report['protocol_checks'] + assert fixture.read_bytes()==Path(plan['original_Guest_fixture']['path']).read_bytes(), 'Unchanged full Guest53 original fixture bytes' + r.profile_gate(r.profile_path(profile),O/'local-profile.json',profile) + assert growth()<=plan['maximum_measurement_growth_bytes'] + (stage/'project.godot').write_bytes(public);protect() + except BaseException as caught:error=type(caught).__name__+': '+str(caught) + finally: + cleanup,cleanup_errors=outer.finish_captured(outer.OWNED) + if all(q['engine_ended'] is True for q in cleanup):(stage/'project.godot').write_bytes(public) + else:cleanup_errors.append('Restoration refused while actual owned child remains live') + guard_errors=[] + try:protect() + except BaseException as caught:guard_errors.append(type(caught).__name__+': '+str(caught)) + passed=error is None and not guard_errors and not cleanup_errors and len(phases)==1 and len(samples)==1 + r.write(O/'execution.json',dict(passed=passed,error=error,guard_errors=guard_errors,phases=phases,samples=samples,cleanup=cleanup,cleanup_errors=cleanup_errors,input_source_default_doc4_parent_support_private_preserved=not guard_errors,compiler_processes=0,full_regression_runs=0,candidate_selected=False,candidate_adopted=False,unit_accepted=False,performance_accepted=False,normal_OS_accepted=False,Windows_accepted=False,limitations=['Finite Guest53 and18 affected original S3 methods plus frozen50 protocols/shrink/ownership/reentrant collision on same new bridge. Literal original Guest source oracle removes class_name line only. No Runtime cold646→647 whole state, ordinary OS/reentry domain, arbitrary conversion or memory failure, final full regression, performance budget/P95/D10, Windows or adoption/unit acceptance.'])) + print(json.dumps(dict(passed=passed,error=error,guard_errors=guard_errors)),flush=True);return 0 if passed else 1 +if __name__=='__main__':raise SystemExit(main()) diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/032-execution.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/032-execution.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ccbc457a44dd27d84da689e71430cc4830dc1f8 GIT binary patch literal 2205 zcmV;O2x9jiiwFP!00002|Ls~!kKDKszR#~9`kLu(y&ukL5j#eJWNhp>$RRKUiln-k zVT%GO&BKNdUIU9oE(`2Ahgnn$gJhJeo{OSI~U++Ks{=2XK{LjDr?%yB2onuw<3>$IS zW5IJQrbMm^!HnWl$8v(HZA~p_UN|oNH_hQj*KE3|m@cPjC9bBmfu_o}{kbmjg7vl5 zMDe2hNc3LH5)_ujMr$XY6P!~{acOP^5yI$fLHn1uW-66>?`}darWqIPBfeez>zw7V z3v11@v2)FPhe#8F0UVtX;p(##`K90yq%JDw9_=Gn{( zyf}?rk6(Lm%iHAEPRW}bE?mfhysIVuS&xlN-fLNN4+Eu====;29%#M6jfvtM|1!Dhp_-FoaC4U&;Z}`C=zc8|4Yu zz!;uuDFE;kQH~e6)FmgVwh|&sE_&!^*O0Kys%IC^e|GUKxqS86=dYeU-4$w&9|TbA z0=1nDoSj*~_6m|vk3;?&78&P}VJ7($xMYk?J~=)aWt4GF`Q%t-hgU%RmCR)+b54@n zSHAcF?BdDmmVad?@T z5o$71i_uj8O9SQy0TFGHhZ?A%j}cpF4JP!_qX%u^g0}cTpBfSD0J@ZtAM7DOr=0Wm3W7oR{2GWJ;!NztT6LjO(JX-3+}ng>q8}BAJW3 zAER6%c3Uz9;%K2{RiI|=R{wYVm8dC!f6zMg*~QbxD)ftFE_m=E`fv~8ga_l3pTi$Z>PM*mpF;h3=h5}Tc(9=Up$Y?CDo)Cz(LUKy zzV6oty>}Fw@f7EVz=^EtLcrdcyvl*zlM0d>B&5#n8}Z!?RppR8Tbn7K;7jWA;C6*Pk&~}Iu*?#CczL#Na zJFZI{Ok#)GmW9(ObYqwba6pL_2dV2jk;^>Sa>H)x6jNM)ib;DgTraPRzE8SZ5yec^ zHk59UCH|8c1Vch!6{X(G(Yw!dTgiSvG(o|INLqnfp*^x`yX~Nc;iS6xz3IC9!-6e_ z2QPRiej7fLpixt!_wT$tL9wz@wY>*Sv)u+~;5IY8Gy85lCv5c^uH4%|INpvRO>%`3+Bi;*`*vv6 z3g0H35OmLa)|wD7RaN`&?cSqLJ4elp7S>sSNtp5E#AX@gQk;0ub?4 zwOXT?=hw0=txXK~mb60aHO4+eV*PY5?$(L1KQQb;-aQ+#BmW{c3XyE&Uwx|FK~urE?5Pr(72ZHl(ABS;zH8vM2^(S5(4VJ^UTefwto*0{9c zI+zQrzzL!Ofo)Y5FcPpRjIl$R<)kt7tjKm^KXqN^yUeiyD|7A0iJ6_H0o*8vuxEQT zN@1Qj-A9ng`jH{gZVx$jH0FoyI8zW3E1VMsoNHotC|8br@cr{&_U9@85Qc{fyQE8MZ`G)1bh1Mxg&-GIA{AymmO3+JQ%oPJS zD4drF=0#042>t>0F_g0#lqyaaY=(Xg3Me>Zb6BkmYFrDW7(xIkwvyLOBO)NJCx#}G z=`PgmmKnN`=yS-Y5P9Y-8hF7!zWgTeLUgl~uvo*j**R=QVSjapUR<`y-61MhnCIsR ztCWMXFal9~4L7K@RdDN-gu#{x&rw!uXkr6xW8)lk9EZ{hu2s%o#{T@NZJndmDQ34i f8eqZPgaB&1WY)|~U+DGOyR-iQxSI&mvnl`pw?IMO literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/033-input-before-prepath-repair.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/033-input-before-prepath-repair.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..cca399e002316e296db26c92de65f918e738fcf8 GIT binary patch literal 230512 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%0DCpN6_&-bdR*Y7|-a7W7M0 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¹@;BoSq99IRS5nyuYHq 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 Iq`=78%L;cqF}4&KOXW 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%0AuV~Yn)mkVCxx(J7=sr{ojc9+RJUpS)KIkN)W8f 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 z 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

KOdV)LPYKM?5aHOmbFR zv-D*_0ku&<(kxe^y1e7WOkLjt`r@e!yZR)(vY3`7wYinq`KCe$T?PHZ@CjF1@M!~A zY<=aUetQ4q<2XbQUbY&?ZqieK+S;)-kKq8^P7}4kP@U|NHGt}-Y>4}m^pUztDY9k2 zVeOn89g<84{=-*<`9}Zrn@_*{;YPO{T?Jbd+!Ce{B>VvB?j@zW1gRyL zZjca`kVYCw>F&;@J0zCwl5P;`?xn%I-ajzUJacB=$upxX=!>?EyMwTB*iJ4csZgx< z`YgCl{^1*0^C>_hL-GVKGJ`bagTXaD1MIE(`a>2snb_Z)3|?x+^ukFt|4%J?@q&3e z3m<7fTCr_mO&qEnNlL%kcBKXHeMbBY&o` ziI0yedlWCK#N^udCogWaQR+%&DE`ZVT2^LY^I|gL&Y4rwetc^L7SEQM^fD|RAlKmS zHbYuD3G8 z*4n`~iivNeD1y9yL#A!*mixa13-&{LFA0~0Xn3~`Xgj6A_KbH4AQ zD|_bQ_oxj^GWnRgZ-*E}&u(3|nQv8iXikx8P(nW$wp>IwVcRxE6@ESmD7`d99kSqi zWDs<24#U%eft57B^!_LyAbV4wExfp7Yg)2bR#Id#JoMo=`Oa^?>2U+w(w3pw{5SG- ztF|r(pWWLC^-6}!mMsQB$)P6Tnrpm#W3Nh=_GRoeiwTC-OUZ9{DHpu4t|S*)__oPs z3Cfz@^B2V=i*39{qhHYQg!&RLHE!x4dw6bLh@E({H(@q!5)3vbkj|L=+*m2)#J{Ib9 z+HM%?>!`wfEpRM~^veAta1@gyG}AKs58kL~=yUB=0SijWEaW;X&1?Eq54T>w{J7n~ z%q2Q+lbTSTc;Ag(Nc7%13{508_yl_ zOVFdZv!Uovs>FOXSAmhmfn=qV%pMZS-Cs`wtK9Id;5wXO()HEb{Nc$s-0pqrLsZF- zZG+7mT|!e1c!ALqp!v+VC?5!#H#cTZ$;(cgBIfB; zoQ!=oPSvD}SG^&K^`Fw(aQ_sE;qR_9z#z&>6!#0bUmsAErtiO+S@QIoF_k~#B&;r2 zQ2cEq9r2fst5s`r#ekXCzOHb%c@az8%q|lrVk=hfV_9a~V)M3}G8h+oWDqrRqS=!|0F zEvv&YOXS1KrOS$DDF?2{Z+^*mdMeN;MkXq!qxgr`jm7w4A23dl^mm=EE#nsO`8ai( zVAtK9K(5&le^O3>9&S0rbeiV7#SBzAV$}#F+T)o9MIT`aZQ^XKhJjVG{2TP1Obj6R zv$fO3^5(^Y4&zI}A?Y(Lyr`|20wI8(Z%b@0FCkH@nIXM;N3jSDa1)YnXS0w0j}ohS zZRcSxY4?fE(8T4c>LlIONF}933z?&&MAW&wB92(`v|fYbrJHU5=Jwe>Vb0aRA!PiuX<4Rt&-!5%pNoh4< z>wBb~=W*^Mps8&kqp;tv&7aCWiDewKr6NtOcRcFGVUH71@c70Yw;n?1c{ zmt-a+yPx)$erM%rW+j*G@2#KTw8Nf6`qP8z1-9JeYA;F=~E~ z321Ip3=o7Z73WSEFCV7E?R>_nux9;KJCGy2kbE7Ku!~c+QTAS`=3xscJ)*cxUmuQ; z%7}p>@kZ6IqZuf)!CJ)|I=GW5`+do`*IlnZJ_OWNsLWnzU9l%Sw^^%tPBP>~rZ=US{hn%1@~YYaoY zFjyxUG;EQbRkBJ>N!v{ys?Vn2%$h@t(oF_kxokUk)v(DA!nS^ z%op&4b0tAw3f>wypuL!8U~kEPUEa;f$Pt`v!$N0o=2qSkJjCv8>xe-SF1@4~`@0em z_|ceKVz^P+z3~4C;+<4iX8-!ZVgvX}W3gzqP;PoKx6{b<7HjOatWP1)!^?)UXlvY$ zcWL#cEbDB>u4C$ls7+SMa%cU22dh(Y=$ZMzTof6+qRocEGaP+B+p$`)%>VPOpB^NK zogZ+wkU$&joFgj`EXYR3D%BVxmv<<3yxy=9BOa!jpOyT;QfrBdk5xym?0Dmqr z*^iiSz?zEFMAS!W?XU$@Nm1chN+_qt?FvVg%V~#K%6p#7umRR+r3~(4wne1P`g1^f zhBjNBtsg1%@i1oVUG4t=-w;bskwHT@kU zR)ML<&3I?HdWbU=^=KWui0doPN4(|L;&ccZjtsHpua-ajq|v4&o1(&*$QWYC?RJ#T zToc6nBhEt6=nOOvwx`e~H7o5zM5F0ml~e#x>N9VgtA3HxCwH^s8y|Gmr@HAc(gcZtXH<%VB5bIfaqDPf!;dhBLPc#THl z2K?^C!TTcbI5EDh?N#AII%U9n1^_V7>3CQnjNi5};(@rYfTJg;xCeYCzd}T);Th@om!^;+hnZ;Es z7D5gi+%(OitBK=-qPdxV|pKz9lV)G^2;jEF*U+GNYEjhK(UPdr%`6pKlb6Zg7+hX}KJs~z;5 z+#qvguMzfy0x#5E23SXIiQl@t!S!^Kp}sJOHZa=@W@-ELpExeuq>UMf4uP}BKRYBp zT3ug}MP!jgFggur><$nY0$D*`w#j*Og?GEJ{NBPa^s@Ft7ToTBM0LxSEk=zqWa$)B zij2iM?AGGYG~cuUaWOHQgo)Gtrvg3-rs_;OhZN`mMBPtK1U$uOtIF6t0eQ=!BWJQ+ui zv%PtkEQ|LB)zGZiS`fth0&gkTTY5KIR4E!;VaqdDXDK$0e-Aux|eHN;&Fz*;; zR$H^6b5Kw3>G3Yu&2P4!{@@q9q){y35CD>q`@e7Z(seCOIG*o<|NDZ z!X5%kwo%ruQQoVr2xTzSpWD^hvIkQ10ZMHepNo|v9CDlWt-Tb3n}Blax*;S)g<37Q z6b!56af@lGh&|_$$6l zr)QPkp}9HB$B~J11K&2?pWwG^Gz?tvg%~qPCI(d$S!E`Dt-{`(hU+w>A+uC+lGpoD zGLIohD!{2HrTX~6G9t*q$)sy#oyJRi4{*1%ul=7MVSA2nGWMb)3 zBKLTo=JghqYf3$#?8LiYJY*Atz1c81FXkrXG;E-k6Py?;NlZFp-F0y6_9)i4@SM*R`BexjDwDg6Ewt*cfKobjQz1V!3qIi;fd_g z6ik21vdxp*KJBaJ-C$IO^m%go7jDV<$}L1<5#V=m7hC-PJdY|9pYgC|;!b7|HA#Nw ze-<}03fBp-WTd5$Y=_Y^{c6WLPdvaIMY8vmy%L)B3(jWt%OiHsB0db{1t=B!{UyJr z@O;elFi_F&2?eUV%HZE|JW(hIDkmFbmq=JOW&9eY+2LZau9FHaiiW$X?~K-bfu^afYcy*yZB}iN-+WD2Y?MZk_rDpASo`J0scg5DXIuj-2-EIZmnA$2Q~c@^lry;fX|tk6x;lg_Adq(R)Y~`uRXwJedXPo)i#FQ1^dWKMcxL1g~AQIjLmu7t9v5T>mYIQ8TPs`k3N_ z4!D-S$?18dY4~(QsMU6SCGpFIRj=|hTddz-*QbexwZqSB?IMsiSpDFS^%A^~r=;%9 zpg=JFBn6+6_{VHYYQC$|GMAN%)qi+_mO;O>%aY&flTxLg(Yu%V_PH#VO>PSF8*K%V z&9VB-_iW9&rL{dcT!@MdTtmVRSl!?w=Q=AcpB5A~P9pD*OX>p;BCnARDM;=3&~VEV ztbWPI8mA5n4Qs%-GpzobFE9ee=rsuN98GA-x&w~3T?PeZ1EjZ0wZbS9`J5mR2k|V6 z8ww?LRz$Zf7vZFHVtkN;y=KWvB5Ez|GJZ{oyhUxHaUjHGsXY2*0uDpy>Ung~^|~Km z-(_$Zh!a;{hGK{Me6#(l1}NSF5m#7kcFz&?vGQ=50os?N!s!+%>+rl8=Mk`;);VSn z?^=$JcCvr3221QHvvTmgeww4w6Y-gtGw4v}@_v7a)XIE)WIVAN~rQ4ccG7pkK0^T2-xj0SF8G!TeMdH~?Z+5<& zE_G;}e>vLP_YiFEw*Zp8UwhnivuT5;5Kw6$v5cDaBG*N{vLv^YwmPa#HiN+wx_DMC zRlmL`w5t7g#g)g_tCaKlO0jiJgf{Fy;&AD66l9HiT7fJ^YzM^W)A)D_utb$1MLp zC05HYNGQQcbRz{vUJ!Ul=$eQL{AB;|bN8pIG6{Qo#`i)M^V)`V^vviPc;@P$w*>7U zc{-aZ(<7Z+r8Kr!sa*er5sGxZMl(dXTf^m(B(vlSPG5S3mwA4tmJiiceWt$gNw&hz zoGqpiz-{`}5ClLFUr1v%(O{vSAn>b484Da2*T4KKAvWJ&h}jueP1-$4O4a{qCtYgT z7GgiA$7^Ws?CzrPPTQmq?c!{q@3sIBF(xmWAbK@<{FUE+CXTJnxLC*=6=LMcuYFPB zF0;+9Qbgsuw7xeT68{0z=)B!CoS$EdI6*Ihw0Y55=xDHm^jZ7=bE)!_{FG%Tkd%WZ z6L-^PG5DgH6uSeuwM^D?i<`^Q1vh2F;3*ilmKj3SM-a-dvEo{m)4V};B;$+7yi zmNa3M>O`{Ue@wf(2+livOCm?~VBq!PAZvORO^Dr*_3wOmimD{vn?La2a~l+HfN->i zhL3I}2ATG$Z=1C-WohptK9Xo8U1yz2dykb4c0Ld^#@$GTh?uJ$-Y_c0hKX3Mdc{J4 zWc*|Ec#H``+TD-M4Ah{td<#@EJv$Yn%0M%!>}h$pUa-v0uo`DWVfE_=bCW-<@`gj> ziZFzEWXhe}kRVuoCi<$}(bzki=u(>ei#UEt_Ig4{O`kDG{F<@Wn8g&S1yfQ|cpoCj z+4fGrA5f$qqG2vlI!XVu+1uu;y)8wMUT5MsuyP|=%Ivp7Fp12&iug|`Zc2crI~h`V z3GtEg`E_|?qZneYYHU0y6l(>@qL|#tbfDo2GMFotwn{z=jVC=%y2oLtc!TIzc~bb< z>Y;8B3jSV@ZZ!1Q>gd}drEYet2vJmc1Pb8@`^l1A1ih+rB>|CdZCGc2P*0mJOK8Kt0%A=Q<)-+#JvEg(Jq_Bs`@|IFIuTeT5!Mm__nO&>>XMnd$Ju! z=%!dYCo6}@(vgfB@k8;MBK(-w0)JeY;c#u=^TAyg9OR%zP%oZ@GCQ@?`K482JowkS zZ(P2(>+15C0jeL>X(?ROtA+F^K+4l2ziAtu9+x78N~$-3{}550;fOF>qASU!+%XEJkai zjP*ic6<4dF!3>K0WVE8*_u_b@Pm{j~1&to=8HtFS2_B5Waqkx8)iFCYyWHKmM1>Vn z#-v+$DWV0D8|!9wE*f;--WMJJ5Dh$$%$oaI(AY~u-?|G$JER7GXck>*P33%>qA_8q zfZD^;=lSL;qCH`2zjWew?dMhx^~~qDJ`a2)s)Lz=f?9O&;v8&D%!r-HIWG7&eRo5) zM3P%V5Pv)rz7Brxr-0C0CIELpH!8l@x#mxgzW#UW=x^=fiJ;5R?D^PW6_dePMusfe;3A5TsO$w#;818p{bpqrIvZQ5xx$(Rx|hU ztv$^9X}iv7Dqs{yr6RN{JET)%poo~H>9)^=SNdzlh{YEeGjEUGNxt-+GUZ6C1zXb15F7Q>wW z+v2yA&ZDGrx#qc1n)!6W=RNx!cwadW^*lcpy44VQ!bsXM6_c^cc9)jQ3XLqvz$~T9 z`?4vilhJbmk@nvekN#yF15_tN_1Yp1gm2@hjjA8wa|Ljb7+3(uDMNeJ@y7G*{RHGbp_4AR|s$6=GlZ54e&0 zm+l9<60EZ^1NHT+4zbx5h-r&hlpf*&vt?^nci*(XC5^k*^RTj4&!bd+{@3q2=D#F2 zwqd{zCyfN8b*t#gGg!XYE4$nBVXB-NDRsm*`J!lUBdpEY2}c#6pq?DMjOQ9l8yqq zX=yNdjiT>S9I`-Y4c9JuF0~@G#HL?SAzznbMK(5^UnmXwi>4Suw&0z@4-|3QDWt9n zng#7BHvmp^^FNp|np)pg%h2(#F`0K9&Ga(Spb{4p_{@@BAkkzFIp+(yktWjBVrjtT zu;E)&8fmthW_aF!NkI(PLKJrrv2zosNcvT)vWzAtg_Yluf}*pf694&QD(mPs#?_oS zx|#+^%UX3`=*YO&fe;If6|be->34qYti%&8U}IdvSJT>C(z%wbBW5q5c^WATJ-UpO z35Dz|{70rL*qcTc{Q{OyXZ1_dqI$a9=re;JpnV`HAfZSPJD)c>LS7be=H!M#~7sT zi&j@Klhpw*1j7EgwL%_XBdvUp48YPzo|2V$B%nSrha9r50gXHIjrJmJ@@Er&xAV$k{AARI3=A+@5>Uwtc@=~hJ z`qf3Ngd8<;slvcMn_twb=#QZ-wr^a;i%f>tFs!AZP5r^&k3i*5A&~SH_-&{L9&u2; zm_p8|SyAh?5R<+!Q_6oB4Q_ldnJlygR*UZxIUFGsDWRO(FAV?7@6Emc(?akEewGZs zg1V6tb$l;v=t+zLH*R6Y6fX5qVCX`LPEK7Lean-Ex^XTu;0hKjDwJ4HzLvsTrQhW8 z@ZMGz&^WE{R;TqN5zALW1;=g)YS=@G#cyQ0`3IP(?W-b9(b|uN$bffl2y&^Em!xpF z`dw6o&6*slMlITUG$8lFdsOJII<_QUY|>A~VbZ9LdZduw1fyQH5V7NsooNE0%_DHG zcDqmXNwAXP|52v~oUKjgb#AFOKpYZ?^i z`JO&Z`8Ayc^w#6N>rTtMi_@LnorfJn+Gg~IY|gU)@2XxCvyKYMyHeosTGfRp54Ye~ z$sZQa^UpICr%ARfo)sbg8H#9rmeeD77B6`CS>lvT1el>_r741bUHKpv{% zx5U^<1Ja*X=ZGKvm5vq}C4X^ADuzEVSJjFt=`9@WJcyx1evu3;0%P=Ab}OAp>b*(k zi9DdfS}?w*;$QJ>Gp|?Mi?=+jI^@|*Q3{IAWIXqFIp z5X;ao*iv=`9ko{mwH=G^n)fCgf@;)_{U>LkX`14eN&0;Kg35T|X!+!cINxg=CO*@h z*FqOfAIe>Bw4Uw1nAmPLU4|u7KkT5Oi{AQ4CX9m$$soDT$(xK?P+|9j%k?o#I{`nw zo+sxk0Z2oqtfyFN=!hO&yaR>T@}n&9J$H90YBSpPylG1^3Y&c9$tZ>`7sOJ&+;^j@ z_;95MmoMc{PtSzfqL9?2qLH#MS-wm-`cDLTEf*hNuA($1bO2@o;Ty&0c;=c02z?7F}%`*lYzY>9gnu$fTv&HdF7N?{H0Sjz8lx<;s^N1le2}^+R@Zh&l@BN zG{>mfm^CC>em@Z-Mhk9=jAGesb>>-Oa#4k}JhD+4e0CpBxb#9_)f_jM(WsxpYrKx< z{T1=?oZUOH?Gt8gg#q5eKc4qNlOP6w`dX?39kL+hnv7$QBebuR1!1=G?aLVg25t}*VArbIKT)OQ9coLK7rK-G2gm&nPb3bV%2 zPjJc-!erKJiFLs3A{0$pNN#o!swb&xmef+t8qQ6cBlwAe|_o>Qth#CC*+j3qmASs+>y{)7*kt5)(r@L2c; zfh3>~Da*2kdKHhQYjC6LZpMa$o|nZsu@ulf_B)vqHBPKEoCWgQXCAx46NTfbh?DCc zTLn1LAAEPMi;BhmHpnz{g=y!JmfEsV{xw#{Q~F0ADDd%sey|{Y@sCmbmKQO5>mL?P zgp5iDXwdc;2MN|`5i8wYSZ0s7pZ68ymuJOKwIUOl^>nMs_+j7`S+Y%gza628L~p*f zCE2RYCTnCzGDT){Cfr~`B@KltMZRDVJoWq~t58qiZzf;$CSe$j^AZYQmFMj4%|v7t z;$(kZr`xSjARnJ84%PxGy>3F$8HlEd9R&H-tSnWPh(R&2&67uE)iK)h1XHk`3>=ZY@g4; z&QL_lyk3p#%hR>Wy)>GWdWe?oU1y&HKfjj`4=w;aOX6#c!lmI`Ad@k=?A2L)(*A>0 zK~3F@33{J#ZP>61Xs1HhxHTZ0nsH=qwfnk0Vaf?UYdWmQmHoxX>e8%{;+aclL?X@) zTW6O%%!;9+PkgkzYyfM-rmqm}!3i6Em&5BOZFu{M@j#tYLA=3;;kIT3ddT#k&0p>& z%wrW(OrToUlz#4iw+XQYW}KKwG!ce$S$^oCBpZ?DB3t%}n#Ps(GT_~|8XGrQvC5cE z5%E=#z}tlxlDc!z!CowPmg{YWj0pmzLayQqC;y|xAU01-R&T0zlA3errh&Lj3yO44;1yK8bk&`F3LQ4a5rL1zV)(8V~87s+eu2espE`Q~h z*8fty9M^^jjjLJwFYByu-y~IbGrt8Z)V(^?-ooz{vVP}Fv~m*> z-5*b}JyV&i!!0BqUXMWTJ_)=nxBk5X82v8&dErd1pu_B9NqEGN2iw?Vb8f`iiu`T= zxg=BA!PyEm9y7mT+j*`1&K*!Z;dH`uy(t`T6QnXz`&peR*AKQSUpo5$)k&YS7Oz=u zE9I~DB-H!rsZi~8g;f4eD`i%;b z?L$Uh&U)?^>2Yq(YInDevpcICsB~w*ZF4V>oV4ZI9jx_JBvV87S%n?UXE`V47dXE$ zKxn?=#~>-Cr?}ckw>V6^td(@UdawLFLvk1G+2E;Z4C)m1yogk;o*P*-Aqgo5P&8#(R?E_X9kue_Dj98en$P)rJyg?Ov3{* z2|#?uTK`wM^n8Yo(<5zljzObzvRNc2t&!x zI~1|lS~fd+-2nUxo+zWm1Lc)8eIpisTk1~7pR?}@cw_!)@h?x{OR9p#M9R!C7*^1Z z{_&iYg;q9VPX*B4TYe>XVrJ98h)PB6!n5RTui%mGj?(#!UT2aoCAG$!wEGtxE#Qrv za8Xn8aJJAWWpBX4Fn;r6=MmiOpl??=M*@Ta4)q;?Uo1>p3a7lAAOXOm#$b*S%onl2 zQb*TyjMJzjlL)Wc*qf%QQVoG+p8P)MBEuf@c_g%)(E3{#7QpOrtir5ZVM_+dmjSu0 z2>TK4t#fIbu2LqrRWbYq7+SyTB`T~$HPU+{@qvemSd(kp_20PxcU{+4&o^WqnacmW z)MOg2p6Qsw5IQI85Y@_!?cT!@c~mF>!)K1V#@tQZLG|A#`XB<%^69OGtK zOE?Evf?C{8sSH)b<+26tkzRBy38cdxbg$Ubk4k{TJ16=r7yvHdaRd30q(~c}f{A3S zx-8{7!4=qJ#@z>uHFp{wHI`lcZ?Kpu;_C4|Z==OGl}IN)c_`yjRc4s-RhR@3cGPjY z5{Zq&$g$j}KL_w=I@R~RpTY5I&DX!Tw=WZI%|zB0fnaAlT}B%lRREiM;V78!L+(83 zmo-Xvq$k=Wt-eP9aN*)<`-zG(*LdUg>UYfVhvWT4k1sSinFYX}%zMf7f#^da0EC)jddTM3=U*@!4G;~;i?B^qzR_4ogK{r81?;Ysy)`YsyMd-#mKrAVX8szQnqq_c|V52%CEgsBf z%0;e(EQkjQB?TPeKs2V^#>KDT-VrOjd1x_dwBX^|O!41q*XdpC`GUCwm&e(RY#aZ3 z+0|wBnajDUlfX1o;`XnnkrM=K`4=^{(xv!mI993yb-}-Bj_)9wIn~C(P$~JaZq4s) zwLWFh+msqF;C_*4?))|#AsQDx=!6co&*(*r>nk)hZ z*p*B0L14CURXga#jLdwnxql{`EFldIi!Z>N7Xe=4<|=5V*lw5?ozG97At-UCe~|yF z-(%8Bn64{}_+t(eQMIZ364wa)4I#@w1@*`MdDR{#)$09f1}@QjRz}SeVUQhmSgrU=TdnpYGHV8C7qMpB7Iw`{?=d_8phv1;ElGaYKwVOTidse}y9vy6^m78T3 zSXy9lwWiH>f{wJ2aA+yQ;$d^k;}o^$fjyNa^Jt;=ie(}zzP6UR-R^CfypXi*9n;OA z@-3NE3glk&ZlHDku25tw-J7G`N><%9M6eZIZK75crp7OSv8ss-`!g5$Z!HU*^6qbUeQdu zSG?lAQ9q%`>ghX9PAk^hYGJ-MK)iH1$#SK`(tuzV_L>*+`3=B%Ms7QzwyL!E^aSRj+6RC>oxp0 zG^@fmLS_K9X0!IQX!=|00uiOYjyihTm_V1%m^C{7KhNqeJ4q;kv)w38E&=tSe_R0* zE$D&rS6M}8;q`i$`@D26Yui!R3zKY%9BdGAGedVK)yr#8%O2KPlBO1y)nS~f1jf><8VYMgVc;J9p zy`SWWeGR@k-KDgBd5TmlE8LfCiKIAF!;m3g)|&qpsJQEEcYe28x9r`t)>qyVS2*3N zAM@%GW>do@NmYhFDv8JCR$$eaB6(xPmUXSX*sJKwswMMyO1iH&XWv8zo&3h>tUovQ zt=6c&c7MuX;2~v?<2~4U+LxYH3)}-sPv(zdERZYu4sPIFdLbqhj9B@a5={%2$H_*Y zu+dOZr+@yMWg(D_-mSG-#4ga*_TDh(j&RmkWKTh-!_THREhwiMwL-%uD>KI}yA#;g zLnwCc{*VG*nF6dg94v1Li{4TqC*UMi6uC{YhxIB7N2yj%SO4%@n=splz(fP zjy^z4K*ece;&xYqInRCU;S}jwB~b-$BlGBl{kcqRXp`v!sE53HVwJ{tf6p9=@rs$0 zqNG+gfeyIO&opq#96!I@F9_b4KKu`=qJVROY_Ipc5zcGq`sy@eHcW2!J=Y;Lq1nSG zYC-|50Ge+g3V+>?&$nmCPb)63p%#mWlQmJ=Y_TS0DmrN5_5SwYXp0nhd)t0r_2A=J zo9K7B=5=K-70-3T-y->xC>4FA8vEe-oZXJtIPmS@s8N31N?@-x;@S@!{vApW$aRS+ zd*E)?l5S~to4%ybAl+*WDlDSLvz?31e2c(brXE{ta`Yj4B7S@<-?0JTrW=L-8fTVm zGLh4R7HWOc`mu?84ZzOI*NReBxujM^t=_UkAMoZCfhD8PK~XD_iI}8GY9bN(4~Z}& zu)3*%!rUKR+2a$6?VVw@VySsL$b3C^%@)DPtDe+&;mBcrtTel}gAI9D%Y5ET%EttB zoVCZg4WvEok28HZVg-s@CTSD!rseqVe~6=Se1jpOVCA&7Gsgd-<@AUaEzKs5!HB?> zRrV%jtm>C|eJ58nA}bEFz@$&^PC> zGE;UcL&=JhA1L~yV?TEIj5j#^cK#mltGHrxqgc5R2PviIE2PzS(~#Lt`Y4`BBfhYo z36Q+Iuv=TTXk|#RoH?>nzBau>V{B9NQMN-fM9ZU*~^7^ z#f}4xi}tU)Q1tfVacd=u%KT|`9{G<&H|7f)229xqrixiD(j6T;huYI z1-`mA##U&p#i3K<$Dbv}+^@Zd!p(K+9qcXtH#~0P@t%dP;w&X+C$69JoftdrB+&^% z8Xz5<03Md6F<~=dSl{?uFC5s;l|DRvuwgvPtEh#q_Ocs|Y;vwYqRC@+pb5}>qGv^= zYQB+b#GT1Ld9`@nx=9;Kk#&nCO{1=TskN==7$uipAKOS`PpsKsP6EM?$G@MGPmEby zyLJDON;Eq`auj1XME*SaDLM_myIHimFMVEc%GYguv|O2hnslzPwYcIl0<8xvY%%7+ zS!Mg>q{a8(QCP+G&njc9yjNzCJR=k5YNmTA0aX>pMwnsgKKs-wg$5BsP$L%bj)Kg} zCSI9Xm!7BVCoptb@d&|n7ewuBnR$!p`<3P?{rT2Iad$iZ?XfERJ5+01tcy=fxuIp+ zd+$;x?-Lenep@LW&ed~5k?jx;=k_yus&*INXSELn3>1a5m#;S{4I3M6!42B%|OrA+R0$du2L?kS5*= zi^MYcAfoi0Gi5u)9~h91&L<~|fSYDJ;e@HepbU}u{Us}-nxHRuOphhGMOJ|Y#IjT9 z%sMlKa-cbje~VuvE<37HC`EH~&r`H}>I1Ztg)MWy8f0fgAp`C#(;FZU6#Hs8Sagx) zj2z8?kVihT7*FNswXi4lwuYD1%mEP^pJp`Hvt@SI^uyBXTU*kIAhYHv^CfSaN7OA= zv25)UPV3njmigN9gbgFbgfiN&j+&C+bEQA*qj{l8=)IKQh)aS7 z0oY9HGEl7et?>3HCz1Z+fiXRORyHWPz*wzrzNbh}jBa z>rbT5>}8B2XN|#v2t*^7i+bGFCu;O+#WE;{c-KD9j2#*q^Iz{Q zW~nn-TgeB$!3jqK8h@gt`zm;vUfQIF=6yLx*yc9_Q^-9>Zb7K%em)vRS>c_pql)`OJ#Xb|rQ35apHhgx7c?$OS2 zi@Q}@36aTF{#UPird{a6YW1gKyfvMr;>z*P-D@1$Ytr3VaACX`?%$swJTFkDyxQhf z1tM_WU^y4`5KGG`b8c87uS5;u9B{_agfVo^s3>x>F8pIH`L2)!6?7*|1i^`xred5WdK&AGYt_oq=9Yzmv>s6{bL5?P8E%b%H^>n51*H;XV56j2 zw;Pd$#|-GyK$oLqv!vF8?xq_xdY0lTODjuu08)6x$=F~09dbl0p z^}FFbn>kz{A~0P8c85~vj3e&ZhAqu#{F(3GWvdN%me#SPW%h9udneMz49J~YL4Y_c zg$F|6b)mI_Ty!FsZuqS#6IsSU9Zjy0L4&-ChmMtm?1P)PL%h70!LH+>YLbyam{HxB zZ3d#4V9R#gEF@jN%Ly`iKaVF2d3{P}V%$kc;V}a`)i35yH0NOC2}qeTYZo=gkR%)c z>uum4Qxm0c z>bW>IZlxge@dS5`UYD=!PRToBc`&2dWZc8Hgcd8~3q z-&?9=sxc)?^{GNAmm-^<)U&*_cPVk8knB=87~5#Tk9!H}F#|fCls()fDLpcB=plH@ zkMl#e&bF`tj#jAB%UBQ}RVn_tK_Ml=<0BR7c8E7xjl4Q`G9(DdwzdW%^+GBNDHUZ{ znyX}=YG$Sgg*JU5&xSC7^lsh3nc=F-3w%d%9|4F2Pm_9)#%fF<#pnISTf9IdHKdj) zLb2#oAg66KBzUU_A>3m?u5%I^8K%no(pRXjh;P=VOoPV(GQ6qaxt68<8iqA{Lh7ih z8m+rSFG9XH)N7Or`JeGYWsyZ#Gr@%pmwN;Koy8ideY-s+pk7So$1p%nXt5qMZije% zXG$5fs8tq%GZl8sIx*7TVLfF%K=D+kRGsq7RpzJuBtL;mCfp&upGKiCG>VtC{SoKs;xBb1(UaxgwC*8YrU1c`$uoMiW+=7$%va3kh*=QKm z22tZQs>WN!A??84t#;fF@p?7S%Yq_`pE98V!&Pcg2emoSW*O43836hz-CPzuOR|t; z1<-VZ-Fv50MsrQ~O%sM@9W#cIbIEj+nw>O93ulK6FrY;qfM@j5mqxMMaf$$TTlWt6 zc8J&CfO1X|V5T>}V8}|qH613Xm`1o&LKj(o$s#dLJ(zzHMp(v^w{Bfy$0tp2`Luy2 zdGep(2q#^$Zdh%G@XFrt8s#a;_;mP)CvJ=#o_Bx>G8nyEyH)HoLIR-t^8l0=Sd2aSTl- z5Ih8F9v*&tZ%|&3bE>(Jbv07ei~e?qmlxA2n@_OD;LJo>u+_{73R0Y0wr(#Sx+>Qh zim5E7p_Bu5%wg&--kPb3{u<8oz}b*kE$}XX*VGO#i3#F0)Si@Mvus8+g=<$BvS*`` zX{^DIkg?zx!H%Q_9&m7RNNcE0-pkvyM#X3p3vkZi==LJn(jmz zEA#1!Bxqf*dKv9lFN+ZF7f?qG=0ISK93mukXwlq_0J_ zhVg2Iasi84g7-?q2!2+ix8i5!JW3Wd#C#g={_aD_})g!K+`9(P}6mc8=371 zx17nR%zraQ^m+vnYrUl+67MmfB*(zU`OVonHHVHh`{Xz!2LKVPv}ON=v>BQR9c(@gMA5ihi1! zQM^|pZwesQ32rZxhs!+AXc!t&zQ`2Mn`#!+S2CFu^Z%AIMy_~Z@f zR8^t`lXCNM7NDbMIZZzt?Lr`IP`jUtlP(P__@mW+q-I94k<}AMz8&KAF`&FthvqoR zno|k4)CSxh&PWnL5>_term^_+#ZOKe?a@%4s?-&4;f}`)=v?X1Y$J)-%JQk1Pyoq7 z$6J(OyxH3lN4G+6kT?xcN8KuIFrS>`^6e0>YedPdzUZ>QhNU|-3ykMOLmy?jw5OnN z2UZ$brYw#$@fS(@Ubd#;4(>?i+O%JvUNduIv`foc)tQylM7bo;UG-+QoZM`;krEtK zGw_pmkZFnEW4`w&#Ooa$O+)Xb$?hPHkRbv0s-vDa$BKhAq6@%GlN<@YdDuIk!*u@2 zIDhA}CwuLpgG1b0n)QM`98;RJH+cd zQ+n(UzP3EHJaBMyx0*md35wBy9&Q7>nq|G+oI}`IwN$pzJJvfnGr4Q_OJ+`WNh}g! znB5j9Cjl7*@y!7jF2uQEZJ?znt?t9#NbSX~$@C!j+aX?FOwUHE+HrjVnO)+W0zC?6 ziUUJNAB~Sbx{)&w+hfZ%I>0PiA9~ulb<7|8uh_Gl83DSMqXA0y6*y7!EFjYr$y`u6 z(@xnpllp>nj-)v%Sdg(Tb)ZS^w?n)!Z2>CZ*|s6&hPA3EShA41+`vrRP7yV(G7CV;cVnfk+QtCWIqKq;L=+^*97?}? z?^SPycpVxo<0&x(a#$(b!#JBKPuD)|e4|C&JUcx;^5QdwDmv`t?$}mNN^>icj*X*z8F=^nxEM zu&8*Q8vZlIV&DLy$c+l=NG14{W?&XiCCS;tUwGTRZ3YhBOeBqQJVA#>+lrP{l#(_p+;ja272 ze=d$&+&tx51t`_3F7TE~M5LR@kzx;wK#e4_)@yJj8oN1ZYNu!!jKcm1ht63Vw@PKX z_Btv1d5(ljTSYJr>$a~$(G;^mznV?eT@nR9HY@+HmD{1s-#2A--45~c&WzN(PQD4$ zzCNXU9AlZfOz65+P#?;YSvlu@%lC;;VV30f++m&WRspKlo-J(iP5rC6G`EN|B#4dA zp{sY@$dWvp9t~Jz^1q0hsY>#L+;#8=Z#`S2dkn}KDMv%SSDeiSAJ>wRE)-7EpM|q* zV>+^=t`p7Lb3oiDJQxt)+?}17%{9|6=tLf{Mre8YI-{`C8ZdJr(okvu6O&9wU62bW zd+e~)uU*KheU#fFUf!9Uj_H6$K?^m^8m@st4wd9+CV;7E(k4oAEf{B9ZG#lrC{fv( znD3mSY_GKxwzy=O*)yrk&7=`Y7>}Zb&qALOtKoGg$M0X zf`#|!NRVzh2OTjZMzs5fX@GaMKP2{O)8+N;&GUPOR;(tZ@WDY2v&YQ!y7jWH|T8r10u0~cRIS1*kL~4;$mvaQCYHoi{ks%+} z(u{Yw9pd$ycDCcFwFR%<<>rp={|rXvWGS7y?&K>CfU=|_of@(hNd8dc+xu1lddz@= zKNZ7ah(1x9iE-*Y8tg+Ay?l=YfmA5cT7_5eLKYKJCi7S2@Z^5 zCl!ZH8KY^(*@1Gb#y`4&uIH$6MA>1pk*n@w*cG=f3v;@bGs~3sI-h&WUMG{er9>wI zdFfd}DY|L$M%zI?={*_H8>RHM^*NnTZEji<;)NR5PH_~40CE;B5d_*Q9FNfl1kMw>mE zRHZ>kw~U_jIPzl~AX1P``;;!7S(Wf1?ta3N*g19awE=j>8+J*! zRe;L1oVk}tGPIUv>Xrb47XhCjUC^)_J~i*Pi z+L^i|k_n9NUK(lKJHB*_iHy*qD6*3mM$={c?GUfGVfR(?gk?9o!M|{`no4W6%Urrj zqq6J)XfCbr-PQHT&*Fr{V3Xk%h$~MR&}na(fiK#sev<;G)P&^Lw5gLtd|+dO(#?=c zp&i!CLB>MPGPEdD_UF7E;`M4?GplL$kgJLAusKDx7R^PgYlqxKBH}N7?NGF$ZZ7pz z42{!ucZ*JzCv!mNbas+7**L&{rr^bR21ElQIaVjSE@_rIRedN&l4^-+07;y-RE3~# zhj@JssD`M0*d@^IU=_Q7k4fL172DB_;v`9%WZIq}nS*jFIvLcY)Nf_?@|GCi0?GUeD4m&lET8%`)e2nrrxULT=ip3JhT^2^p*4rUo-kGzuLfX`HCv2hUUQo`|Bn^p)oqiDtCJfO#(B=AP?N^ zaW3(id}baEQkG;p*5!)WK|L0hUL^zeMfN5X0CJEdOH==Q>C;m^8|XRv`yt+#H}{ed z0bByui!_ZiZ|G-PD;YKffT;ECBS^F-wTBIg%W^K8COe6i8Rdj{5W|S%| z2fB#61N1o8eXC;_QnaJ2wQdavlzeS5qonM8ZL%zq@(NWvmN+>kiw~NcCb$W@?Kwpw zCa^Qg*jhKe`w!LkXOmm4tKAypVHY~qeLNB2nMsORpyGjifmSOmxr0#D;TCe3y7u0Pzv+B77 znvET4cz-mY=zegv>Wp-OG;M53wUO(hV z?J^Dc-hdk;$QjP-*86sd*Pkuwu0(abSxFrzMai&tFlP2}pG5g~wRbkEIyc2D)tAlY zkY@->eJ4_T4YW@ff>)BxQfOFwP$c14~x_I8MOjH={KB7vBo8^9QX zqp}mYglQqc@@B8WZ}}Q|pQ^ezOK);9A|>5nK-FK|nSsijSXIJqcjU-Ud3+;=wx}p%VY=JmFMq7`os<> zo+}|}M#+F8LTEc@*VW4&bFk`ymE?eE5aa?9#J{rKZ-ZJA_~yiTJH+dn!!|gQk{)z7 znJHD@^dcQ0=GKU~ll@8Ka_@9QbwF=GOEe?GNbDVYQPZ`HjsahgWm+q~<~i)l?9&=t zNNa)Dg`1X)r6C;>8j%7@11B$CGibK|c8J$|jWmlG^`^3*H{hWKyPReoUE_w254M{C zCyu!v+O11EGo;z6)SB+li<+->bX1Kna4dRcg+eIN$uC@Kv%0=vVSI5P8_>RUuvGHN zQ&#Ugc?~Z4 zCNB}U>h7HG;cSD--N~6>L%hy_4!f0Q;0vt=KKc&E%#bu6AW6zR_2}aG@8tBPM%NIB z5HwKKx@PV~`j`Rba60$Ja%MTKfO87pcCi^fiF}gVDV%JAmGq8ZW7g^6Pr5yNb6Y>e zom-=?Azp9X+GTH}Rx*mDKdw9Y;;VZ({mCya0fraJJSKTv$Z9mI)hu*BTD|iqZOvl_ zl;gSm69}zVstY_!FVQ9Y$$z$y>xv_X5x1>sK5-Vz$*J0zJg-UBWbdd_ehu+@f2JOR zmJTe5y#>yVm!W7gt?P=ghggeDFJ@EEt}p%2E3AH$WploRh^=|dfa+OKd)qqL+pDL< z>R~U8N!AX!q1jp8Sz&{jD3nE)G+EtpL6Vx)&5~QY9pa5+zA4k{{D(BEnMY{YXlAle zL4#>~cE>8iD17spXlgUo1^SHq1nJf>f5?DbILn#PpFI{VRu@|wp}3F!=6Q(RcLB@X zT$32SDH4C1GxgAxjMq3^x!ex%#_S~gET+~a_qgN~P^pHR3RsY`DG`>OHNY~|@3Z~n zPmP%Mz~4Ls<4&Yc7|_{8M*^%FJ^z?PQd}KGdVV%N2R`y1k_NL&*VsWaEM7JeRg%6_ zE@5fj4)MAgHd$MMvPwlnMq0%~#N@_osqbtp=9@EYF<)T6w>=4ULReND2rOKR-co7 zXRVcsn|!m9L{cT+F;|P~PAP-mpt$GGkI`IrYu<|V@f?tGr%%1P_{rJvCi?Dl$sfr! zSq7bZyW9;&Xv+S!uT*1)UlcVLJ2em6JI$_NL%cDF8l^Kpz5)7da%W&Ut5utcqgc<$ z0m^B(Lq23kurR8*LQ~&)kT~x|`j`PZcdDQ1wwjxyGR=`l9B?5nHfe<)fk zoUE$WGwSD^Nb4mFwF$`y5-)1NN+C1qv}>h9Y6(N_S<{*gQ3EkeX97rSgYzIsjgw@; z?FjFTP8u)8sxjbcbxc=^3B;u*$QYcmcuOVK)G@_2XxICM( z`MiUqw1OW{+SEANocJp3?w*#qo2@!1nK*F;_QcOtcqQ|4()`yqGW(vjGf8+_H_WP+(S2;Z|hQqoc{ zlq4RrZsSeWjUpHm>PFRScWemxTU}es)T{H(Xo5~A>7y&RO<=&{qMsM_yB*?n zYVM^@B%kPRAmnEBX-T0zhF)b@COszON##;NnIL$WCKyhJWfXyQDjwRGQx+Dp}N*weh35q)e$Uc#RI~77`ZUir9S(&-P5|^fy%wakS*Y#|~ zSk#p7C3drnF6(C3NJH1-rN15G^=h8+k*9oYqC&0J(7keXgDT$Bl1 z(km)Iwl%iif|>TB5CTN9!+rAROY&{FS==AY`+G&WY%jA{mYst1r zm7gRUw_Yxydb7ZxxmGE$9BmZ2dvLsUl9!eQ{p}EM7zl(_)VSQt^yJ4WO}Lyhbz9>> zD<@Kal`+FUY@ecVW*-!*2|T(5;+(tI>k2Zjnk$vnkI&wM+V+^L)710nc2z@h2s4F} z%~(gzp`kJzlM1I zqGR^pngyxJm5d5wHMnBo7(gaKMwN^2PMmiR5bQ#i&}0KwkMZevC%e0FO>)?4Tr*R_ zomDq(tR33eh9iTLohFps%FeH(#u@_L*rF-%1GVMg6=~fL@kXnW{8(Kby2qZo?x;Hx zHDY@?OGj@DCq5mI(bS|Ur7hDedBA`J)~%d*kpb;#O7H87X9la+eQ2@o!rCnfh~yd?3{ul7b@-?rI9H0E0Y(*Bceg{l{?a>b%c&A3G(4%5 zqx4L|hm3m;br+&ne=eJb#N?7>($?4-VWFtkJ2&mFT)Q=L#g%%vO)d$U71%jh)EiRf z(Ac(yE;!P%90V|tB$uRKp>f-}*j>3D;`JT`S(!`O&$D1@%gmUQ(hBS{NF$+X9zGA- zrT1urKdm_)0Cy!V+_BWMu3lSAU~TpbWD6d4b*F=dwV{#`^RrU=RycIRyT9y zJ0~wS6D4;w+x9T$Ic_cMH7@=$L@9it&xaK+SQO$NTruwCG!dy>52zXR_}fUnK(1aSZ3 z<`c?mF0VwJ|8rt~a^y*lr$Uu{ zZ8sqmE66@e-l%d>G~21sr*gDB2~$S7o`MzR;hvA%#V(xmKz-|C+^-*g|M>RT-{Ld zZ12~n_0w+e-`b~tJlZpQr?BTKZLq%=8=!O2l7)@3b1Fb4nsE%&%QwR%$#DV_+2@dc zH@bB3^wG@!rXS+zCOS1~)6E@>RT7*l)*wB(HsDuKgJIH)y(iZ>!p;Rdm&7}_NmAU9 zTR?OFd%niAUFA(W)yC`+25HtuL+s5)Qh4($v6ctsXk``0K{-WF?&_+$ zbsrDGw$y7_RMuivTeC_QR#tJAY+s5UaIhZ__vsSbQ!6AmR1fQT*RGMJ)wY!}d23z_ zPe4|ZA8hNmq__a)cHSE~RjfzT;ZI`@KfR0(?>{}B)B-n~Q_XS+Q-Y8#Ytz(NoC4&~zs4;XWbEYQYVmHj5)I7a5 zaHclpdn^emRSmh%D2B6PW<5L*dAbtr^SyhzA-oj5B3TvWp^4HR*uHM2O$O3D>?n$1d6kC-Nkfz-13snJ9U zQN zNq$929HmG*ZR>h)I$6)&5BbRkb~c_~we6}apwht#R0FT~$Qjt3L#;bzTGMOnc|#(7 z*6ePU5b-F|UYm2yAB**QemH%SlyO%MRN$;a)(MmsLnixirGq;h_mQ&ZLAE{U) ziNY=W-Up&KPvgx$efrzW`)8XMvQeEqrH*irq=&I(RLFwHyr{U%$<>jq%8?p*^e$C6 zGH^?PApo9?PJ)`se>B?Xd)GavY_RVTT<}RAgOpfsTNe&VYo!>%(tX{N?!h9kUWA%D&uGm69QSmhWmGq^f>oZw8=h~T!B_WW!< zKhn|s-cYYsHa()ltf^A7krVnH+paHD{?%GIMzyg5cl|mJWR!C4qWI|^#PRc;hRgr^ zxn4j03|?Qazr0%n_v`%fi)W$1C(pk5DtfSw-De5&dpI3y=R5g7u!ChIpRH5}a+%5_ zmeQ*(G_MPj+3eNG{`&dl{37Gr-5k2sfFje|z~Zz*9_mhN1Cpwu{7<>7Bu^5RQ$&lh zhS?G|bdZhn1JBp}eSP}*-x={QUm5Yw|IdH@zy8aA|E~|IB{};H0`N_hkl1|EhZt(G zUjanrSBZHQZ#?L)OwC#>@{oE6!L2QpvgHCcF9mp{P7uKB-&k8n{S%w27*Ewm)u}vW z=4SoO1R1g<{i@A1$L92cx-^G4YhVj*d2=r^|B~f7iQs`*@0D<$-MN=@eTnG2^uIQz zpiB|45v|ywF(SOc?RZ$HrCNsMqI#uDR5eq0`Dk8>n1uZD?&a+tUl7)l6(;c&~Ee5xr_!hpKy z#ce_lHDK#Q9xb_=yVOV2kuXVL8LBSzA-SV#?2@`59kELxfBMI#xAptC7nr=C;#pO- zQYPMUIdd!}hurU86O_?)et<(Rz4^4@UZI1~VP;0H-Y`%Y zFHMguSBxr+#HQvcXpQ0Dbo5}68#W;g2ocKFx_r@lyA&{mN>%FF6+LhzoZ3}}9;%Tf z3tv%FWe8)7mCK zxYT4JC56CZouPyR!BumuS-?Ry2;AFBoF9x8%(X=J^)BrAZ3PT8_;fxn$p7clhFNv^ zkoA|3!%3oglT{&AuBj)fEEPLl-Z zPUS*@{gkXcY*xeWI$(56-7eW_TR#GM&uy}Ba2YNJ=PmqfCOGLuKhQw??pU85uG0a+ z-u&pbZBp0lKEwtzU>R%g2aF}D&Se3Ha6_w^VNkX`x*wJrbkdD*kIT8IZ(up((|w@f z7q?^(NSf+><3jvmG|mQzu*AR!IX{yT)X~CZ9U>ggl5x7x2G~cMy>Wt5Z(f z$i>SH+qxYJ?OR&+q3aqASQn)V+G?Dwnr@>jx{K6YOH6#zB>$@XJ<(iSp1mB|!q(^~ zX(3F_?{X?BcN*g62(og9%6AwW$)&wPgpBkxD*z)t3+U5Zds`2d$H!AxHnv$}>iiuv zAsdv^V#%=E(dss252WtEVN4?MZ9W zlKMS$A@h-%-bHiTUf5BS=4}6w-2m8v86O1n>E-v&@7mkThxfmH<*pCbNq&&&46bO5 zL!!02+O6J7rBBW`d)m6zrPE7hvVqyzCZutVgBxDwc<6_W|YF+fneM(b(0*Fj*d^@$Hy2w{^(AOd5rl8iPW7cd39mA<1 zd|gX?M__Ml?_WlHKVSImXAv5I%0OV8VxC=^%J5_vwy!be00<{?Igs$xMAa6N76~w0 zN5ZAplTCB|b3@Bnh@aoT{Ljy%vj6ziXEB~$jqTz~c8!YM#+uM!Xh@NW2Ir-OEa6R0 zU>r^sPM0dpTG<4qAydP%5ZC)ZUMSDMQ-FRR?^b*N^8VLfK7M%jGXC*6x^soY={0OA zb4M1q%91@oMkG?8epu40QUQzEOb-K87=U&=a#XzuKC%4De>w5 z>6YZr@v*xXpY)|Y46B^l43HNh01>2+B_$;H^VsD22TC-??l2&cf$f!`lhfGAmzI>E zXU|c?+w-W_zX8ZTk?(%)?*O>J9QPn^k3&3tgC5S*2__`hg~H)v-worXDkVeiI8!5o zOgH3$GlzUc_LAZqwA}diXP3gqA#yH0u6K`vJ8hGz-IKybWKTMXYOi`rF4+LEjbEC% zTa8jCjyp@?kdTjiXH!Pl!XEv*gZuZh@pS9K>&`OEViS!m?T`(Pot<#tw_U9k?&yJx zPA}x1TBcE^K=id2mke;N{kae7S&T35U&fOScsiBp>)6ufFEh6ej{%j1E+uzZLIO7# zP1h|=d=|Y8@Kacc#r3q7S$~#DeiGb=catRj;kEs`9?dSiy!2b?HHt^z0b%SbUBtlpZ|! zO(S%%Na><;m>VIbq(bMVgHVeaJVAu4WBMl-s3$RgeqkNQ2jI(kef+8YX1n~8?ta|F-AL{$Y zw|@Wj`r+O4#8Xa7a)dGu=%+*&bag$qpGG^9WizeBd?@Sz&5oBihWKfX*Y)AOHFdejW?2Xvm*$YX z&95HbWn+dfl$;U^WvwAvJli6&Oh*mA?n1%H(8JhU0nf$7`eXrbMuP(O8~orat^e@)`oihCcy4CS z1CW-ohE<#%!A#@}%i2QXx9Y`(32tYB9d7FR*HKDm*vFsyR=xQW+IqM6!k0tS-v!jD ztE&;#tWX)sAuC95K!%_PTxw8|N0u?;5L;n~HqML7ZGYqAzP#VBeAU;_b-;r|pk9E*acKZNlBk^cJ+3x|w>!tVUPAA<3W5x@4`i;IkP69(!2t zmTy3ukDvRym+=kIaM}W01fqe5g;OBiO|_6)-G!@de%nfnU>*`lgYoAaddZn0?j~pv zxbqEM^SZ|RsC&#O-|_S{rLQSzf6@r6Q^;hMgUF8OOL1=OG?I&UyR_vZik51yEqUsV$J$=ih3T+A+ zU}a5%#xG$l!ujF*g8O!faN$&TWX9-(Mw6i!P^1()Xkakji=|nby!W%c&gYS(Q_5D3*6r)?STgQ*8N1)mEA!w~hx>fXwuz(s{7a9c&95@A< zD(=}zJS)_+|FoOH*#El5+h2eEFh86(pgwp$FKLq(GsQ0ocmbzNSW+DGUJZ;;JpfMV zK4*Co$hg$#!ALs7WZXYN>`!C8KfuGwmrI=okBrvGlFwVCXXgK;h7WLn23Jsl(V16? zjy6jXKnhr_gMPWgOLuJEPT34C|IKKwy)3R+jOMo35!(<-T9P`UGH2Lam_x5p6HcT- zQ~-kUAVbNP)?KV`-&&iuPviah=x#n0X5qjjupNjpTGF!3_V597-KxiZl|Ex7hu2|S zUzQWcZyVB5)7@8n9L&)XqD}nA%liAHXJOLZ=^ZPDq#MmaDo`JrvyxA5x)RyJ&F_!uQkMbgHn5xFIE(XSz)|EPA673igiz~G&Mrcq`12C1 z)1=!fy2y^8mVf?ouP-0pKKc;$cnw_m;%;s?tXZ90|xa))snX*#Kk$Ggoo z>aB12R;Ob|+_9)FMl+~vo3vz!vrC)MI4H)Q_^vfr*UZTat?DWo4hA~bc=d`akjJeb zV+G^AOc#bu1Jq+_61Dfe1tY!{AYXN^_m9^toZbZ$NPVA0MzBM@PY|8j2fUVV*puHN zhSa-D1HK4~l0yXfEl`95L@d+`QC&(Dx)beW(WGff{q5yYy~MM+IW7baNH9qmPBsda zh22{kep5q9DSa!h-&T8j+TCJF$EQ?mMUz8f6+i^)Nt*m;)|9Z<2syaQYgTw>7>JuN z45)RMwL;mBYU3^ic4>okz7#;D%$g&F9{QzmI5xK{a*-jwB|hcWeGl1g9##~MvUpf4 z{L}39KS%cRe&}1iJyM?$Ub7M8Z(z5`krZeIg1o%ZTtUNd$%pUj^kMOiEP*T zaJk3W>vG-f7wAz(vP}RDHvmcW)9){410*fY|L>j++m-}Uppjj(Dl?)gGeTq2E#}qX zic$ToveUa1*rhYc62Yrlt6>i(6%mf8@RrwOT2V_XLFJ)f(7|6`4@pgG`t?%AtU8r$&Lzs zWT#xBb0*FOFY@{|Ma24GoLMD+SDb^^@OxoUYN&4Z4MF}Gpm~7VJ^uH41srFW&bcO~ zUwVHD%mm_F@L%l!XC%-B?W6J+c;)~m@XyGO2a*<#_i0%C_^CKAIl4%G2`jQvQZ-?pB?mK zY%=Umd630Sr74{G5H?3EZusg7nKMI?Axvj2dA&IEQ(<1(p%mvb^g`6a_M+{iZm}>A zPwc}tU!BTRgF1}`t&>2h)DIt?#3%vy!d2*qjE+SW^a2 zn^?R&L?n~GD4J@aQ0^SkvEZZEc`L-{#lL<0*gnl$V+Qv0<_MfByR;sRq!HVS2?XmU z#WdAK#_4cs=+)$rb^L~d{IU-hXqF{wZ;I#A3X#^#0ObMSHHQzYNG5t}a+kXke7$?k z#}+`pAV@XMNa`a>#x)P)UXSSEzrL++H#tWL=F|wSc9L;&*6rrUvKn+HzoZ_?#GyGU z`?>Blh^c18GHO``BqTLDDtx>U)}Z&8lf6JR{~t5X0|o- zqX8UbRX)3B@!Kj_!n(A*W{|#amu^!%;3-5+LeOmJT21J2S6u^Y>V|KrNgzHYKMNTx zy0PyaK#IxZr^lD3|MklwN#plhiv}4zRi}26>DNUQs1JOSs?HniO;T{PSrIwYCm<%N zd7x8wgXAj|snj4Y2X`%Z4T;QWacD!18Wu_I~OhPrO;Gh&X{SeX|sVK%CLF(sZnUTZ8j;kELO`yHbI-ci3{2B z#;_jP{i}VvdAoT!&bVujGS((V__6a$S=Plis_pyuaGJmma%EMEaM5FX^M3UKCGs=Z z%duVCWl=9Hvg)#}HI_zH%jkh2P~CO0Gy2SjkbtfW5(}MO=*>IJ-){F-?(=%yPtPBZ zHrD=a{<6N_ysq=70a2dX%^g~_M6^dU`0DZ>+6-&wk!YR@(EA#`TS zs6#S1J{99B^to&~O%LB;pOdrMXQt%LWkIw!4%xfzzGR zKWMRxtp6+0PS+bUahSw!YAKE&p)Uz7bEfCpV*719e_9`IU5BJo8+6(4m{DY(TJ*-& z0Xu|eus@p`P4pt`Ss~GK{%ZlfP=Ww`~=h59XtrmKn!LY zUCk&^%@kW7X8HmW;!~1YrV@?%i~$Ava%|VGIsh19c6l7=+ReexH$;WiNuhTz8z-b} zwNMbQG%rcWMC;8;Cf8){MfbJ!59{G^KDl8|Og(hAb!s#6A@lices$98GYfnoy)YSen5IQfprzGP{UpfY6RBsHNb z`zMO3CI_GfGG{4Mu3Pt``??;!KDSR_+Pznu98PU40(FzjufBSA6etdsHC-1$NHT+m z{>^QJ#x~=De2po#WQr(1LmcyBWY=!dLsh=@hvu;h3ARZAfFuSD$?2)zIe@yv-f|za z)!aeI5`~hl&A5?8{@Pyj`@`U`K0N($6ZM{|c0WL;S|M<_>9ta^SXIZYw0B)LQg7g9XD(b-{o#nJ!sj^#ZvPF)w@=xfQofIRL7tU|a zuB@xEUE6YOp%jWu;L0W$UFbSR%PxT<(nbVbPLMCPGz30s(SWxcah4{X%)B4mAL-=V z=ik=){LsdD{?=}S;CR~M>|9Mz^T{mY~+0pwaXookGq;927g- zzS+^Qg6((N-B@{F6KvaX7?4!-9sF6yJz_m^L`_&s+ci13ymSnUyh1+MYHI>8PraXGa6Ijp}&nZo(uu;U2!to*2Zp;2lzl+AZ|^aei3ym-YN0 zv9xtu^*?=k9{077f;}B50uzM5UQAN-okPw3>TqvSQ`6unJz%Pp6hsI-_JBdo`78$7 zXe4z0Q*mA^%agMm%+Q-n9kLNoXQy7^MvH+I6#eQ@TQKvI5O`6~v{kPql_lMR&i@oC zU;5@1ls}(Wlpk(pCCXG+*wV3`yB`w6uyWX=Bq?j3K-3_UAWlxy(2Ck@_HyY`T$fVg z6f0Crl1p#$XYL^O7+zjXR`L8bp|>KHD}aA4!luyO6pYR7){6Z_spe0R`a_nZKR*)i zt^8liz$)lz;qdy(Ybtw*{y#(C|c z#kdfub>3^H$ayFx_*(wvUB-?Y=J&*EM}ey+QC|2`^&qnp^cee|NWY5!-AI$^^xazK zLS;&@31mGrh2GcUbTgsG*+uqatU2aDElO&gvXU5?Kt&70o$06IymqRa`nU#Xr~6%q zF~d10A35ws&E8UXsuotYMjd`sSrvxR8o)!oaPDfPA09ugFJE43Iy;{u@x@j0q76F+ zFR4!5B*>k_InNp|=ZB-tH_uWQz!duxYPkH8|CWvBr(?aevJ}TeZ6-L=)en`(;ca_B z5~n?`H~>alL$`7T+PV|$YLl}*c)v#vuSfg$)xQ2pa*}|XV!fF+-RUH-R83@xDTN8> zJ$Ot2$t7VpRqHj>Z~2H&~}rd1-+aqLdsm{1wct=f9Lw zhf{0LXm{r_Cq*N$uDl_z@$1ta{&H@&o=nb?S)b(TXw-J4Zm}t;KuaDON3%m$hrCZ3 zFp^NatE0)dHP4&L@HDJzS2TGU*lM@#P}TquK=|Oqy|dl6fia9l#UoE=Dqkic@>|=` zM1~kxdrM$XpXR*_n&eMS(mY73dTD@5?pseTu+16U+*xl^k{2K^Q@02C&v!dCCI%4F z+~L|YUX1KokGGKubp%Z-yeNU^0X@%I_2AfjR<_l`Tf{gl7>JadHO0J?65kNptM^*< z{3$myV&cff#UC3%FS>!FR=F^a`xg$Xb%SuS#xS=UezvvS^f;F0?yiP*t^>rh@eRQ}e$qVa&GQ+`Dg0Y615O4k zuSR&t1yFi)ud(wS-5#+6{?sZhQ8eS!BA9KmWL&uXtsd!HfnB_KE_!tI8Yb&Qjl9+- zb&$z-VkW)WyWTX#!nu&9V$dsy1Yde|5UDqW_6icwi8_b&19CIj?AB?}&Nygel3p&q z@+D?I2K56N{fUrX*=tU>dZ!QHsZo_YsHe)5VTsO46)dJMmO8*J)^@eCC(#(Q>c+qC$!q(`>esp zhbaLmvk8Ide?1}NWFUBL7e0kOU4VS z)hV6g;782YgS&QzI!Ld@`BjVP4FD4MyI<~mWp)=*Y_=)2P1XBZLXtHLM^|_8v_8Y@{UjOy&cH>IOr+O)rd9s>`!Rlgu z&ShDvv;lQN&Gd6*YL}zJkE3-w1}K@D%Q(u_m{$|tzs7bAlsL7bXtgAvA;p%WE7Cki zGIK$#RyW1~kJ=b9!LK2HEM%0Ql9}bkp*ZxZzN=Kd0n432U{hRclnF26Fp>pG%{1B0 z3tj@(x=twj(X}N)-K6AVC53v_J6kSBcI|SR1R))XGMufWuqIMk>Mo}$>>=gIX5{SR zoCL|n4j|Gdb?=&>JLdJ+?(4;K6i>VHq;Fm|N(OQ2QBF;QPwGOoRdU3(bt4Vao>!n= zEsaXCx?Kk~b1tsLbq&V>{hKjq!>zK}WLC-Pt_hnGTGJLQO;Y+2EXjOwApG=@t_ANm zeZL;q{hFW=z|-DOxkk9vp;xIDkoWR6PgtQOL7|7#3y`qmys8VeRn3&>p3!MuE7f%+ zu4_BY13o0pwq%~E+ai){w(`+jG9#ymkxIs)bYwJ5AzQ0S3du`yXg8S5<0m1@r{~}Q z{FNRB2(jHcpx&P%Io%6-pxcUVtJTz%;9LrN(Iss_k;f`~6*6xEcRJ0e%2y(DR7bO> zzc<8d!?e2ESVdkJa6V`%XedeQu8f*XBEywFN>!hi#5RibAV6`kXIU-8`t~4SyV0zt z@@QGl0Nv|mEBFFMs4(f6jTbE>Ce0>hiE3q?4-3RB6;|feDI_1j_r!N?fComXo2?E( zHhJlaeOBNA3`5hE90obf@J(k5Esqv$mCf=pu#8olc`d*XPrn?q3tt}Q z?O-u5{3Is5)XA6)U%lwaSQCLSfpZjxxP?e|P^a`QZIrVZ?}HTnuv2^|iEdy=kx4Fv zY$PX1B$@m6mL<`r_r|(q@0CrfUea4}hdtub_3?YcySRRvN}$4)^4=4=JzgFuLXiAu z7-Snjm3Ms|cCP&XLV}_W?=?!l!MCL={UR>?X?>Lj_G_&zGF?3#J>9mdW1vY^wx*;3 z=?NX$4eC0rU((G5C}?QpXvd-GL|JKr1KX`$uY1v5D<)ID+iHAYro|~m#;lGJvf*-r z!yTp49$OmI7eKMvzSX`4>#$|r>I(WZyw6X6U(XNU#jx(kS=3V{0cWThNo}dJ>GYv? z@E%J8n9n&9fn1%oqtx|Pr5i3o&uVN)dTzc|gYQOnRo1A@B@ZGQPgGbMupE+D`FUWu zZS2ZcEJtIS1jCbs?3zuAw2r-CUyJXhx=E4y!@avZAM)v=d`Ozb=M$6V$jBk34iczi z`%MCo1H`U!gR?Sl;cxKC-JE^)wZrS@;$MTic5LOH(7?w)(9&YkJ&J?9dat&}o=osb z%3}UdY91-5M~E*EF-v*e;@nT4*UM1IUw`>9o}QlPyP6*Z zi^qAU-k2U|=w|C8*6t<%ND?=x5F?A)IpepUmERKPwdQ4oHf0>6KBWxr&L&dj0w+QZ z{gV}DM~2BZTwXq$ZYRA~1#cpd;yg@F#xKuOiaylg|M>N5y=o*~e>!dxmJwWNJv5oN zaGvGRG7IV37u$=M{JJF*RXBMslulU;pCOvVCr6oRd~E$XwOHPpR%2 zn209DNrguv zERp^#d4BBVK$g00mDml*Vvy&rFXo*tHp=v=w0(%t@(s88L?+yL1>Zbar&|_N?@miv ze_rw>!TXWslK9g~nh^nYzBj~cTu`s$kl77OnbIZR&g%9z*8uCMFtr>w^_ibhhRa*i zvcM+0vmCr`&DI|RxBo#@`_=b1a`EZ3Gk~lwS!H(X%M3F8wWOt<$CT2aCjN)Ep+5Uten}&*zVDav>=ee9>|~G_c(g)UjD(DpZyvMJ(xP+351NIyrfT z?qnnhb~Nt^@8a!)RFX`Wbh2BcnI=b)1u9E14voDz9T}jlumT`VskC%UL9IsDUu!H!il*O*TrGo zQYFro)vrfLDhZS@YsWa`OGKdUsFL7cYnh;4uVrO5Jc+ZvVZmM**G=c1c|P)SqWa&q zx^%;ob*%3rxaz6EpnszgOXFqP?j(?reS}7rS*#@auf%n&Hn8<$ffDaoyXsY`dUDZ} zdRqjyJD-rf4xb9EndI!4CLOk_{DaZG9@y9R<(B)cb=IF=Loc=eCfCUJUJCY9u4Of{ z20Go6{crNz1O^yO6@$@nZktpCrMg$zn}fReI+;nTne7szCQ87mQ=L#UUzFKX3a+HJ zf?C02Oj~mvezDU$oUf(3OQm?;aDm0iIvqBhTLx4qkepaC)cnPr8+}5((+GMVmruyVl?2WaQSo2&hYeXx0LRwUc zxXE8#qP{ntbiaK2{Q1N0KRh_Z&F7oM2yH3(tb%R{8}&JCGrc)Ebq8zhQ3=%7-}Q>6 zlg%0MeyjN)3Y<0zS_X``_eXiHds(A>$=hg;QLq@A+6j_I#C?Vr56Q7-v3Y8|4Q&rg zIWUtgFrrK4ZkR9s@gR@ihtJ=h$FJ?ndH~gb`f~db$((C=I$Ikhi)}f8ZRO}%q_{@k zB?1fpmdb?NGt0`|R;QseSJc+7S+*8GTb(r8836mP3%* zF%RwOtaes612iu<@29nJ@W%aDCE1lDx9O@sK#FDS?ck~*cQ5k|Fo^_-ga$#02K*P6e)+;rS8 zHf)~LZ@ogBq)sdQdJ{_2y^&GV1PRcX-Dah*)VS5`3QgnCQ=$vlgMX&%yx$$n1kBt;ZV8*>YEON2@ zOR2dU=gwaGz|dw*S6W!|+8qo@!2L|OwrPAmFVTa@U$2??2PDuuW7Y!N_r!N?Vu4z`Dh$9wpV(Y8R#wb}=t+%` z(H$L`2OuMrm7oC?J^8>yGYI0Q2si=0G-^}zU|9F?j8CU#L>dtSOhrvq4G*pA?r?Ip z!wLop+;9rAl;}Cw(vMY_V}&O~=}wp{ab0WI+8T&AffXT^5M;>!#AkO^J-sK6iW^%- z5m0wc4#)vL$8rd~Mx3`hZOX*3XG(`@0(u9P7W{GUE;a%;%>VeLz z)!A`?8aw4w3WRlcg8Od6c*OP4ZtHfRBj;T_U+YkGSsHS0i%iGC-L_k$S_d@9dyOd} zqLip&Qj}_>V-ilgWomINuxoO`l+m;!<-P)(Y%_;YMAzkRA=)Gp%XG{pz}(%E$BJ34 zwYUqVuBAJneR_EMypF-*Ux?_o*h@O~z#$QU%L`emDZcHFA)YR*+*>MeOAsFAs>*w| zNrQ{E(|fT*XNT>V0=s!SPt8*(OkE{i{!cz1Ml!Nqm>Nakn~i2Qqm?1w5Kg&*?9}(5 zE_B~!yPb4jw*KR%uj^S8vkzZ>yJ^M7AA5Rl8p;38>25p1fI`%j{D>x~S3Qk7AY=xcH);?B3FEQ zKxx)9nz@}jsP5m|hldy0$`4OpzuYgT$)+2URvrS;D3MNX3N1)d&RHq~=}y0+0 z*|MXz8dGR}kZQW5+P8gAco%J5?5=5er%OEQemey7-f?=9gxeAlYDS5h^%bb4N+>z)HExucPd-i?R_EVp2d8kMo2_-&~95^@Qq zI0~7cYGj0;+j%{@Ya~oFkUM~CCG(ZohHU;Y64bQ|rW6?lN=dWA9Qm|qbHuBmhAmngClJ(e zdscjUTR_(?PXKLQ?+7OJsqyb6QzHPyI`r;rwKHwiiuGb<3{{X5a~`8+n9sT$(&InY zhlkJW>GOx1jVt`rr!Vf=l1M4*t;x7@m%fP5t8-;-S!8FG?!96K$VD|(^%3}Vo7~dP zcxy=4dQ*~bIpiK^*~Lz`#RVt^P8HpmP&Ex1JvpOVirbdWd@FK_p+1b#UkU2#(QbGf zWY}=tLLt=}2#Cz#dtt$12Ya)(K;6ZRtggo}cQhc$82D~|`6UaZ30dXS?h9dEJ9@Ar z>tu}G`*8NSTJ2sB#znpL!9+ECm>6T0tqv8+>h_~Jsglk7w&j}Z$s4%iN z6FWa-e+qxtF3pt?q46YyT3jnF5P#?Uy6k2cWHm~`YH3{w>ze3Kh5&2cB~z(WsJTTd zqI!XW*LE5;=M`rT9~C=HGisj*CF%)?uY8+39T@R&z5Vp{-na&-`s}hT?@@x&hhz67 z&>%rLABP79E-POeKiPG|9GdasQGLo^g`!_L1?5s)*H(%>jzEgA&OS&6*F_74@?w zA4|NQX#e%@{@#9*qs1vdA;sDpNDgZc-)aiBP{PfmX!{2K3Xa`hfUVoew;cevq@~=; zB+vQwj_|JCMyfN~2lYhz-qTPI(Xwj)Y7(8UtB{WM;pVY5AB=U(&e>J|69- zd{$2OrNAyFI4LaYF~jhYRvqw3K7Mm~ESa^#%cFB;6xd$}>2G<11&Rnu%L3RgzWUr4oLvfbHJQ%_gwfRSM+NzQXbEMIo(ImlDW;G!u?KBSUcV9-}X zyXwZx26LWbw34+p=z*X5dSYnhnKI{?OUnO4lb9?bV z{Pw(lOnBX#{>jOostS^L$suvpJ*0_aC?8$k4=^3McqFQ96H=+WItns;*2$Vm4Ied? zHGVeMYYPi1k*979ek3a`ohW&UW%IIOXeylgVGf!5DhYREWOp8yJhgKg@m{bW)-P@R zuHO2`*IuKont{*2K~nEO|1Pr;IW3!Hje3dT5Ls>78rvKcLcLY@*hxKPAQ*QY-VZn4 z5#BZK&xiC*vXCZ7|HG+G*GL=M&oKS!)lzBrl?!6D)pQS@o>q69Hr|>?dx`IJ`}*r^ z%LX2CXGKKr!(quzuT|Nx)wqidlik%_4aOC{1M&+Hev- z1bOilA3P$#;cTH`rWKpF6_kMnL6lN(J(il>Y^At8=7vmmQj-l;{P^xts=N15m(<_m zd~I}((sueBO@a)EPxhfP@8k}^!rACnZL;@nhtW8c4Hy%5x0*WTv^!35ZR>pzUc2KA z##Xh-7EJvxCYSbqeuv`^BCH>cE&rjveE6fyWqf%0LT$VG zP?+mk=9_FSuVzzQfTl(u&r!0biB`yd5{c`Lzug9~Mrv0Ji0>eBvxu#{E5K{b5Q$7| zdJB6=(q|hE@9q%uEa|$$0c}$*OocCO4+)mUdULpetuo8L5aFL=!Z+)#Kjm<7?pYw* zFvn_(8t_YLx?CYZ%S!e=G&~BK6ykTjnXrS6YstE={c{)C+he>`OgNOwgZ(6I;W(Pq zFo}wJ2p%+Ul%!Ei`OG(&qQP?C&IDC#E zm)(%vOfmr$pjrL!I6s8ci9LAY{%7~QHwJjEo30nNba9&H$PQ+ejV!nt zFlf}Ymfe!JSx98TmKR@^8e^lxb!(sh{NDc(;a?S-k0Ae06mRT~FJErnm-=%Dab>*@ zXD7dH4bP}?iCSi>(Zej|f?83NZ=)`|r>VMaZnEo>`&)QtgqJp=D(*KclBh;%y=t1N7CZTnrVs|R48(nBss#r zQTKYuvAC{DzX_T3sfVA4@*+@_NuC>~B%7iKE~YY@6=&|<=^}V|7Oqi~q}8+Cmccwc zke?|z(=NsNU84O~qCC%&(0U^AqU<}hFf>@BQ9mm6o-RmbQ@ZkM5R`W2mK z#%A6b;k8v{(GpwISs7IT+oa5sVFn~3&k>iGSU5&GIa2!cu6c<(NNk>@>fRLN4}tsV zHJ<*qZu_ZMd#WLvZ3k@kEnN}04L82JFBSk9f+TQ88oFr*d0S;v>WoI$!wPH3d*{6& zUKEHt41f3|VWO$*(4lu}=-h5S+^tcI6Fcy}=3sY@6l<_hbddVAt_At3k-_;bqIJ4V zkWg?ntl=V;_Z*jinoLXrXTuFnO4ki%o@N1qeVY8omK4c*L%dXT*!ddlZ!xVHpwK3H zH~p+6_`F8zeik8MALJ7VK`kUAep{fzn*|^~4e}pHi~bSc%dbHe-<#uZ>VMVKL4O!K zAUxKo=w0cSLvXG@HpOSVmLDda&6b zS2c9O{AXRpR6m9*P%cW5ykNXqgeJdeFn#{cS$zBPAG(YCLre8>9g1b`!{Z-p>yNAB zug^zpXRIcl!nA4JP8?Pf1-wY($uv9G3qN!upCQ?N3E~jFoOdd_kqo&dU!U%V`~4p5 z^Yi-n`0eBI40ZC5w1 zM)}>S?G+sgd#WIsj)+!~K)?vDNRtdiFQY|xLGi&S&85kmFD!ju(TV`}1>HJ(&bRId zchSJdl;tF#zY4)<8f99w!m}tJTxjH8v$Z zcxyGp=K1?J>B8Ab3thtrJr-f)P@1K5<^QGNzyA8|WB=41Km7Y=%GHmE|5Y&LG&QUp zNdZBpy}*75OpZy^2=s(_#Z6JL{&OLJUe8}1zW^csjUw^%y#DR+>GqnFu1}4q4tWrXQQMqG4c^H(#;qu{ z9lB@xWN-BZ7c>zvYI1(pJ*M23*fiIEfG_Lox6e17c+PE~OxA-bnAPynNyuyTsu#E< zBN;$Aj8)ft&3*BG0bbLCcA2uQSwGTkIr^+BI}|$DOx}mx9_Nft zuHH3W5P*`_cG5-av!~Msgla*J|%5#8w1ia^^sxHlBkXeV6plc2zTh z`K2>a*UNo#l%TX^ulTkYzpnOtryVTRQ$t!QCWozCJHwyIvK7`$j-}E>0tQuxB8ih! z1XO@Wu+*)aT`&S&w8jP^XMha_g?@LTUQU zL6}yKGtK)90WH1r)g?BQy>qbUWxU<5tlOvO$A|sl>FN0uGbk(BwlkpYWc}W4Ak0u9 zM3QHUvbY1@Z_e=~OMA)NCQ+wYgPVS_S+|DYyS*OWHStJti1gT#l=e%cDnpRSdw}&8 zqz77?sk%d+LvI^J%V=$3nFkak?)%|=J|N?K*y>dK_UZAzzQLHEpUEpX-%ew&?o_+S zP6>_pgU>|(dvV70p&ke+bLv(pI&nHz0Y+;6->`gLOTh3=|Cu2w$JOsLx1|F?)t}d^R3FACP58I z*<3g1&z1zLG6k5Jds~(R67^asy^6q&&B-4Qh)WVC(@t&G%Cg7Q<;M&=*v zxmU}#*40}wJ%M8@@cZ7Fw>`>S;u~<75a5)GCehe?G1kkr6kaE9 zt3A^@BfQ$W6cyB1CV&YREH`vGqn{cruNw5T8>E*tvrop>o6Zhdy3R!pDEC8re*A^7 zK0JJUoSz}g3 z@%|bAACHVT_F_6kHsF~G8ciArx9}z14#MN?GPTU8A!A1Zx0?8n(JomsB+EyiRPqkC zy%N^7x=f9=RdQC6S_U+Cif}WMv}&P+4STXh(r%$#9SzS>-BI2vYfAHxQ*S}IF>M|cxbkXVv@a zgWs0)s6KlrC^%)nrxku zm$_7;U^IY(rheId+6qdEx`=R_T2p&z>wN)UlwXtFr7uhV$lj;!j8XHr96P(3k``dL zSSuNetUVw`P*)OjmKWcfLi`J?RqO8Odu}PVo_7tj0%O^8utrHzadHJNy#QqE0$8^? z$UNjEmvn1h&4`7AQ%L$|tKsFR0=>4R#+78!XeF_5F|8KsBn?G)-&{ji`Ucz()vIp; za7f5V+9^wI==t)JO5p34=eyb<)tn;7Qj+9wQc*+k7R`rMNq15`esBVQ04W?5m7K1* zh9*&MNpP2=z4PZHy*5Q)^=jvxCc*q$`iZdrVIm$HTMy>m7O+c>fQClVtK_knfG!0jr=2?P-FQJE=tET21@R1A^fOgwvqlrm1 zC;eQY*D|P=1jHfrVf&gO;h6T4;wt=Ms9VEAX5Hv>s8f*b0SaDSVk$YzYTpv-_s-cL z*HpKrTg++4tX*Na?P}>;Htf=Z(8QPfuFWh$5r7qB&PHM&FLX;~q9jy#y1jB^aWlY+ z!{oWmp2f`Ea1@``QkzyXm@zssndN}3nvX}+u1zeF#jW>s2(jO93i0X77gGK6YQNp& zIw_voW0;j>ZQesOl`<)zh2%()e9*e3EE;`FAj;?^Hj`v%y2+=`11w)j>8HV6>*G~7 z&4RATuK{!;F;O+$BsSVi3uHbui5MV_=1|^R)d_7Z(p4SnG(6zg(J~0Kz2EmxPOm8_ za%L5%6ik&86ZF0!%coTLvK);*G$_!@h`T2RrUv*SbQ?UCCcPHYpB?3opH_Q*8NPp} z>^`sCq(RMdry4k-3L(b4YHhj*rOrqJOhUf}W&<#E!;i>%+5{G!d{ki!U0Os}emd4` zAG^m?z==xCH3>E9S+`3!R^pK!<};)2?!dfaXOk^$mW#3(;!MvsNBiaRB; zi+1YY?5j%*bhPI~fMB#*H<9n17QlR{V0-9-8GClKpu7_jVbh*Q&vPjm09}pI)C)`e zYS7o#I%=eU8Ve+i&>l$~Ta9_k#gFQ8zb&OXPCK%gI_s+oFr;Nh{PKPmGmmaBsAb5v3QMkib1Gzt1{dVe*>mtm*>VRSdv zr`v9}r%krUeDJIm%>n7FeNgXr%JV0pyw(!} zT=#KB8L{QqO_s8Cs%wGdjxl<1a$9y8eg;3Ml%{>?$D4o&_0@`c6#nlC>Mwu)rj;h? z{;cPR!j#<}awv{lm*~rx2wv}oOa(8QrOOyPgsI-vBCX)0d-j~=A+p~e<+X?AbvPKa zbdoa6N=He98eQ5?Y*3e^C^B9=QFR^D!Te6+5vexk+?&GuV^kdg1zqaLU)+2lt!G8b zbP1Anb+t-sx+TiIbhAt3fctG^L@oo|z#4~E;ctbUkXB2216tvy;=EXw90)ki<6$g{ zWp??qZO7TEhbdo^2QA?xQ8{PGqA6ONV=S|!w|)2z?Z1Ej{`GG%w{VJHTbCHoI`p?bk~}f3gcq5Au5CY)FEczsxO>Ag#2Grq?iC#lPTdQFZZ}qaX=hM>8YpxPxk3jx zQQX<<(ltmMJm?`6fRuYIMF2|PO7D#D>NH{OnZigoP+da^a|GLtk@P06(FbSQg*lS< zM++qhe$@`bcd^g6#rPMPar4RawBtb&-@}1vL$Sc|AWo#2sjUl-ATdcH&Xna@1xGJZ z2+vZBDv~jc{XOAb1Ce1zlAu>`(D0?67LXZu(x^!{5-%rd^|WMike5mP07m8+cIlnv zO#y!S)INXt_37)2WbK`e=>4e`8X?8$Bh)+?-4Qq0Sq~0tme{YUkhmuM88vLTqCq3Q zWi)5xXBpyre~{O12qhxIc`<=iwEWTAg2slpFuTtU@(pN=Gh%{z*^(w<$&N#w2rIVo zwlIJH@^yWDc>4VH@#Euv-+Ptv;Z);P^8nCZFBP1g8@aLhq^9fQXZMH7m7{C}i{`R6 z8EB>GF*qZEGS8=>-WcVzQcdkxHga?b7#2pJBwb2gZNVs8ZJo12oM~q8+vXSz7-fsi z>ZN7AEza*Ma6dl%y>g=jeU>DX1j0OkTqCC%BpP$d1EdAV`A{EzC~5m%tX?L24YTNJ z*GQML`kxB(TBeM$sxq5|Ih&+9VO%jMSXM|`*qb~md8q|qbW?3R?A>OZuIq-|r`N*I z-#$GYzq#a zR>oiM{V`tSe%7n37Q3?9CKp!*#g5}h&GowBmBQqN2Ur!Gz68YLfJVE#@;bk(`sXMQ z3)MF6q&@3xIUj(R655{X$L+x7Z8UWUI4I4LusOrMY1WOvjrc1iM^5c7P?KCdCsX&M zyEcR8Bwi`q-l;AX*nObnLOMc|g=;W!cxW1fTXhx9!IMy?17y3cKJI(r&9xstJsza~ zdC5!qrlt~X=UmBVdl-<06^NtO#?tgE59_H3IB-@H@8qcV3A-l&j}5w5l3gkL`1 z96LUpp@$OZ>5c<9q;KBfZa$hRu|AnLXxh>yr^%kCMv=W|&Pfl6W8~<}+k?6`YRt|r z!%|cuH3&)`G%;_Not7f&;7lYTc|6z&!3r*fF#s;cuRKpgFzKD&|!7&%|NDRFWP)JtNpf~KdlcBNBV7lyE)}lPZicR zHnNLP*=;Fquc2w|0K_Z+w*hCfN#`Q9O+oFe$O6c1J;F>+SFG_ma|4l!D7e z1|=?3gC5=-GL_Elb7lEVw!}0#m&7WonsT zdW6eGjfgEtF0z0EzcaQ`Cxw*S6+$NX96?X(dT`g?#4YG6T0$d39W4i|v6^L(U57^5 z!UT&92=^W`JA{Y%b&SVW4N~4cpI^SV{( zs%{wRzSRj7=DT+veAgQktIt0*_25e>3%$5=A(Q*TU0XYH>k1myT%g*-Qo01Kj!w#T zd|cVgOSB}&=e7j!(ROl(DFp9_JKuNqM~(kW%fl;D;4I#$smX#UWL6>wq0MZ~>Ru`z z2BJ8+CdR7#@{&980(Y`v%K9+izJ}}=Wa4jTqbXr?Od&l zpN;im3qP5eGNLxHR;oGF5K{&L=h8OpVb!=JaKQFmU>`CK1xE}>TLHV)HwF8=zC8Z- z`thKBQ&z^D-Z3ZdYuk;l&o@t+B~B2aIj5^E8x_Th$x@V4jX}9urrcoIU2W$t-xuIT zu|JkW+=g1AXZBU6Mzm#B#M$x3w0i=b>fCoAbJ6oxFA^}UBcF@?{|NDq@xMP}{Ua0I zyi>`ib{%s1D}B48a|ujJ#&d&A9?D8^S@4YC(|A9vOl8dTY-V!ayb5L(Wth=MPD>J0w;wNmD<_W+_XOTe3&>?(sR^5-5av+q%=O4`?|R zX*0F=RLnNyLnks8G}tQvo~X2%)djD4#ReNmGIawP28q|3?fv;v!tKbe_4vvDZ%A!| z5*!F7NCvDO@+h2;kZaK3sjG2Hl%9gT)ORXJUej;1)BKOn?iZC3PxV-Bo^?;iBCOT~ z4|m;q&GpJC?7;zsq4c^~7Q`)0U_{f^_llr=sc2k?>RQs1r3DmPR~5jl=C-ju=HR?h zUs7vrIYXH%qZl=Kc1oW!1O(#RtMu37`f*iu-1j_wefZ^Dd!9E1q0SY0ax&n~RjG7l z$OAYZ#1XC(?QT`=F;@HERG)UKIYE-b;@Ef%9GLe9dF^JU%3W6$tSVyc^(D{A$TRE5bw~3{B~j-d)r|m^CUL9pzIaVcZ@sifOF}JBh^m`Z zigaD(##8W{V!Tvo^hhaX<28ZYUX`y0J%DIzbdIm59$N{@!6H7>t0m0TNJvsByDbO*Kf6H&zL2PqU62I@Y^6$(9k(e; z>=+O$+hKr_UuDN9-K3seP0X-*KYN5u`6v+P0u>VEA)V2!4yknayu8Jf3>0yi7~`@@ z{wv!iOBM&=XGg|{;Eg%0Jk$Enc#7^}_sV-Z=kz=cOyXbpN?6z4F}LqIv%#!HeyZ+) zWi-$v_bxr^Jhql{JKgRBC|TI4w!8|VmT>23VD3A^C#5`n{Qb2R%jZ_UQa-M_J#W%M zoE6#uj38Z;|J0l8I4%9F3os)8u99@^Ot{OO~sYTbE z;F#tz7){WkOm!%C119h=WF7dLo&=m93V?B(RBS5(?X{qn7%8^L+m7~Ay zlYSqHYGXWqYaec*K9^4AM6x5=i&kyu9kBG0X#pA=8zpUp6D$j2(`19%8^SG_| z=Huz8O&Zc+A>XZK48dw$ z2Qb)hH7M>3sdpI+%?ttr?l}=7vUrm;6zfcWG;2|Zci(rn-=TN&X?+EZ{`N`{R%gvw zoimcdYblZ9B%?Mguxcy4ti89Ww=2O{4vDRy43K-*Js1paED6=UBf4w!tZE95#gosh zE4!!NG@S@_+&(%f3mQEn`xxaG9Vm)a!YK8+q`sI}GK8 zQ-)up(DuW``zWCmg1@@e+|)c`pceA&e@`EX~r%a_xcLz9K?UFqE_|lW2A&x=VrZf}Z5#6;LRo(T;56HrI_*^oZ)V;KB ztNWtL7ETL{5p2+OwaTfE(rie&Vaew1?)%q=n$PXIeN?m9O#%6GDr75fgc0T5TA{jS ztR}TpJ}m64OgWGmYREKHjJPCdJOYKy+0xvS-po%#d5wxB-A3g+%>WllBm_D{VwT$B zF-Bvo&5La~g;iaSeW|hBM-Kf?_p#QA!qWJC+?I_A_VkIf0;aa)&zDnQCp&JDp|ja5 zkcqb1O)clWXVUkSK8v5;N~l44Ez8GuhInxqNhX=#B=0mhFRg>9tM1TYDx8^4#+m%h zMj1@HHJyf~FLMDNcf7ldKLk0yd~MJC)rY6s?czC~UAbr&23SxVg=6rG0`?lf>e66T zVYX%Bc1zMWOP4Ib1=ci6SdmYMDygW)eBxex)#af({4RT-Ph1 zmut^R!9}WJDcXyAsyYqNzl8T9CHd49X8YbE`vvH_?sk!@%joPQw+_3ju9?g+DNe5< znyHz(4ysMF9~qY73|V?4O|!rO1<$;rVBdH}d~=}J9z4kaw4tY^1>5|RU>XkHk~A#IbL6M4G&2;v!C zvv3gMDX&6@npyj29(JiO*KBtwBCS*o)=nsHEMgZ&?jgsP;OPTgzu zoe^F{)lH)mMpTF-$WH?PtE098&QVllX!0^b-Zg}~Iz>gUeJyB4_*@_BpF=#JU%x)L zy&uO-A)<5h*y;wkne%Hw(+LQsAu@8bkAN7`-3A_VTvy^NJBpjPdK%uOy)iXx|Bmo3 zEnj0LG$jZ!po~Qa-1lMGIP#XF+n$tVJ!02>sN*MAFi2m}Pu)b^AWi=i--}pZ`|{=S zmrr-DwQM~f0@=wJc?2b+3safHmN{8IO;QifM@@PyjwQF5Da&?Cq*IOhYHqmUV)%v- zuW^%@YpKQd0L`?dWk^bA=lQkW;jA|$(G`=pOH7nxz<2K}Ncf?bbvF;b#P+%U{`~ae z!(SlRt!0D&pPuEYk@KFZxwZ{U2G*1R^qv)siKR{K;VwA^A7IUtWy{utnM8`xF5{gc zULz@9Qr%W#S&L*M{fVk8E*YJsBvmA`AQ_M~mF;&5yVfk13rS0+8DEd_mHMlP+p|YO zw`$X$4e4|wV5x~j*P8A%_LiYKM?1;fP5W?atU3(#X*0HfZS9q~uGQad?U+XkN6Wsm z=bP*$d!meuT8?iSYjb~pk_Vbw0^QNhBJ9^G$Rrl9a<{D~le9Sj)%rKMbU)subIW$zFtL4epw~DF#}|;# z_bWqp)NL+VKvy={Xqvc{vG$&FfbZ&>C;_%25zZ)dv(vpupVy1lmBzeZ=7L^p>31fb z_Dd|=IGWiejt1Xf%27oYw6V!~S-#rC??YP#_zxI!t8Js!;+*;J>)kp1luzS(H1GuJ9 zqcznJE)Hi`{;&ks`Nb}-`A*sejG*v5wTR-2=(fv+~U_g=&O;D#AZ zag9nMS&=Bm!m#zSA_BTIr#svWPTt&~zO2_Stie@h;7~(Cq%Pwnz)yHtT1q5x)nzb4 z1JTSvMcO_|w~`_xi}&TtmWa`f`RbdIUCV-jI$@XH*8Bgzxo_ExE7`J}->)DvE?vd@ zfjcr_w};*63&R7$Aa+FTkg|(nvXf*z40v$+P8y#02R!h^Km(q6U{7rLW6Ev7f8n)G zQj|({GLwhZg8~XAiKN8Mb0YR$D`M}pP=iYsqZyQq)8K<%y9Q4Y33?b5XAwND*|Omg zLy0AwXl;vMA^+z$dzRdln%9zx_mv$aF8aP`htuOKgSi1i;E96TQH9KiI$G0EzKG3j zz&+UPj)RM@i*Va$&TJi2gc`$z_8&gP$YuoIh*j`WV8vIk)JriOrK?xo>W(^+v9kzr}(i)8eY|U zqWh{zK95X?E%0=vWi_Uu*di5%0h~>h{Th(Gk)ZM5u-h#s*ixyRW82nzgj%Luvjd`! z9ZW7KkoE+2mj+-S%^ga|9|r&;o*t(uX=#h-`1np75T>ulyL_kDH@m6lHm}EfbE^$+ z6%VMCk$7tpM9Kg#rH4ZSgCEp}?K3F5w?PI9wn+*A{o)Hpw%2VvE(W-*>BF$O9f<>P z)O#dr0Yn`NfCs$K7J-ax=urh@E)Jn4iXU_Q#bMw36TA282tQ42050t0=DflaGTB-W z+@O%^tayDb^=>Q0CMpnfz-9;lfraN;;CHcsv7^pmNBJPsVL`ss5`I;j+qQFZ0~kJF zTl*&1Kos?wA=PGMr0>?4o&eTVV`pchst4=CE1(dVKhYEa6zTG=FCNkaXIDi83&0&d zgZG^iRXptEpiXC6%(b{+)wGms?3F%FP1qJ3P{J#FFm=vtk!@>%bES2PmK&4_H>@gF ze~)1D!Up|}_ZX@LBp4O|pH6!;tSg}Tqk4Zr_urD0V>BC z(u`(U8aoz_+F&*2S!UsJLI=KQJE)96Gtb;DNL}3&*v8{5pnIN~&TdO%_kw4k!{%jo z+cL%Co8{qPMo|Mr!kgwLyg?!|U|JU=J80j3rw4Y_>hl%YsW$1bDobG|#lxbS1X!Of z6}iCT63K=%GYUATO)Ys36w8l$EI;A<^p#eb`sx_BP1+bhlnfHyh7Q}M=^`{93a~uD zN=E*sX{-kq8P?=PcVkd^T0tu(!&al@!P_ULmcz&0(wg^qBLCy={0I|O64tPm$pBhN zg(g-yv4Z>>K&n!DrKB9A1ERq?&7PvpKJpB+QDU_$;%C1y(rr(b=bZ{9id9)hvM6_k z!r5_nl(rlj4-%~f{?cGT%z-cvhu%lJ7)?3(@v{CcC`oe@q+C9I(v00D%>w5JXGICqz9 zLuu)P7_vnHp`)$GiY#D&c}{F40n2kb>MSSZz0Sq9@kombn+Y^T>R^+Hv+SvG_^k*h zSirbY^|F8hK33YC?{Yh*s(ovIrnvJ&#B~OYsV^R_BPfYI6v>Kg7<=j@W_HXd*Tx1ZaeaAcBYvL z)CbHLQ{l<4r4nwLn`7J7G!3?^mF_sT8Vd6)a^QxDpcNFr40zWC@IKO|Xe6*;Fu4XW z?Kno-UliRjiJWfjsOuh_r5omlqYQnpJs}G_=^P~-sAZw}7z18n?ASIyDxJga4o?x! zJ8X<>8@uSedb}H?UdwKrh_xR$R67BaQRYD_v03@P@hF{C5ITaa60vQj@$IFdJ)D+- zS}UcK>eItfsMvtO0zFX*oIbGKq*j^+w)bMwB6rYIheKb3>bD6SBxv6f)<*R#DU=?x zDFTnPUkJ;K7OH>*0LepL5}VnVNd1%U!bpYs+NOFlN4r$xALRbq>!okI-|YKIBPp|L zY6f&}C%`5fim_@?3?e9a^5AK_+XXhV*c)CH^oM4kx(tKz&X=6Gw#~6^J6|3Z31cX6 z``}1wLqYFUek`F9hDNGAcLS5y(E3M7Z5T8pjKiFD1wDS&pYThuhWxYF|9 z_%(rUoH#^uAtj0fO0C_LwD>XbA`+mt%s~F_QC$>KYvQEC6qY|)e6JfMuS9zM(D`SH z{J%QqrPMP<2~EWzm!NdbZ0HoPsQ)nntz&CftWO&YRtL43v8|8*z$$qJ{kjOZfj!Fx z$&@*|k5sJ!@`yc>E17Sm;BoS8au|}JK!#>~luNhMd9j&GAwI?Sv)6sH3jsNAZR^Bn zo8_Dm&o&z3VFR11Mkn?#+njh=>3qO@^(KLq&A8mVI`FtL^_3xRtHw1JhaJ*TK`J;7 z)sFEjIU~=hS3@1T8G2b1xMW4-A z8xrabTOv5k)DyNpNS*ZQmR1knt4Nph6Xhhu z<0Exinyd+^Cox!?d4N8Jkmswy9ePO$1vO>W7Q?v;_&_U!PA5g)tXH6Jp|fwM?ys+l z$WVyA@FoC@xuw_x2WbWT;h!MfZN04kUOWd>N(128aczPD(+Mt10mub?2eAR?BHSKQ z8jICPhWAdO%`c4ic^vh+9d_gW>DxQMIy37A(S-x%LG|I(3)8zP$gjXemDU{;6hbLd zY(3U}8Z>gMhmCvD>FcB129|7ei;qVF0|2K79Sq*4Zt#DN!Z9l5*$5&JK=6sZh=mSO0jOEW zKoQ_XZH>Ps&TV})md6k@=Sd(iiLPoWnkb&Z040H&k>&&0(|bZtxH8qMQEmb4G6-XO zVW7()^2NhgzbZc}Ozb|#8i0kcHt`I-7C%g<0riMsV)0@%c!Lzmvqk)-#aSr)GL7hK zL)?@^lZ({zE`xKcCK}q#J1T3~!I`mQ=o}hTqYAEdrBesS;{o$T3T0vS-t6Jy-Iv2z zkGt!!lg+*Lz~yWm7<5bPhJFQp@u5UTD$95@o?xFm#LhhdBc)7>ktM9Q&L&siT%BwbNbY!A(X^|2it%UgqUorT*{}wa%_ol7 zFU7Yl&vYK^7vS+)YE(c@*ReG^^0&d;c0E=gP~ z1YR*OjlDY31hJsC>>B%>MmOu{qD^?% zUNasl1-B9<%KHRB!ThC)HUZ3HDiz^f?VO8=eD@ZwbS3$`(E*IpZX@(W*#sLV; z;Ca3a!UM2wP>m**16Kvgj&buvdHtVcWyVhbJi7>pb*hfd48)5?Sf;H56rIyQjRRm{ z=sYnrc>X+@#`-Pmshb)rqu4Bn2P^>UBZu5TY8`LEu;0b6 zb`(AC-gUWKgk2Z&ogw!h+WxdmGCOV7P0qokvQ9UPuxEP!3UPY0h~$~tj7X&cgoh&g zGO2cB10FB(6qO(P*3h=Cy9NRSWIialC*%s?SZw}8h^ez}*HPyUfp=HDn|&F<$jXZ{ zMBFX}cendNZ>}Gx)^bXK%)7N4Cf*};%Wlt!dS`%bI=hJhZ)agQFNhaP3qCDbX!?hG znFp|2rcoAZ(5ASyo$*r(by$lel51BGDBCHA#&&j}LujBhS(L4mRQ&>?q+H7g9z2^; zhbJPNyB`?Y{kx7@N9oZ^tIe(+prEz^Vpny!%`&hVb*NxTAqp^tt~Bbv<}Gv5hdH=N z+h||L>@=uI<2BK3>u@pPoV07?>#ZQrHdi(crA`QeN668ECQh2wU~2(Iq=_d7SOWEW zE(Hjt%F*xT_KPLopb5{Auy0AKjG_m**7my5ZXhMs=aQSltH*|}4m?wyjuPDvniomf5 zHVsY_;;ox?Pw3N;ZM>ahg9um`g2MY8!+^#YWk-9oCQ0w!(h+l1f~(9%;^92t6;0t~ zU0CxuwA;gu?TLrS-NTu=^t>()L!krCd?F!q9)VGRIm+!oljT`W~Qt$-a(8jt`@1(x!K4VxJS%_9S1vHCt}LRFKs6dIt2L=Q+igAO*;@z7>!;|NNM zbp&jJ#2Z-WgY>PjZPRcsol--*E#ssDNXEd*2W8;7u&Akk!fGdHRCph0**=5MI&bj$ z?Kqp7pFtEjx!mae8I5h)_pX{50>Bqel!3aUh5-(1aV3QSnv&_)EdJv7c>oJSq)?0+eg(F(=){H%bR2NikJ8TW zh)-jT7t9Eq%*K8l3Pp5>tw~Q$#t{-5kTT{qUg7gPx07Jf*om^{DReVl72mcir$W62U+@ak z(!>;Loej{WElrQLwj5IGY@u@O5qQ8i-uGk>CANN^i}3j-=i=(a`daG-9FtIeI%$-~FV z`2)OnF9Y~KQmof4Oo>&Zbhl7rfYP(!E#tE{`}e2UTwd>{uh^W6s*gjFZ!H$8*`kQy z!<`yPe3~vbq&7f-Hak#!sI~(ffQQH2Hbk|tziNVIVYL?^fXse0585ht#k8md40eJ3 zkV6_BaXsgbneLblV*$WF7uVb!C`)*}fJGr2a>n_5eRK?kJa*NflABFFn3C<_Nnhy7 zPWEEDIMDxQo8c%z7Dc@U-=$WtOWUK{M$01JTAaK;kc!$G=+y>@@(ZVv2FB>XYuzG?E!%XcccPD0b&On<~(*cRj4gXFa;WG zk(%-5@gs3S$DZffzfi+GIc&As?97)r{YVOupDD8C5nrdOK6K7 z9sZm~QveqYTSMFChdxT4sP3RtGU*#jPCXYJ#|aL`{yrL0#|FHtok#3}9K#GF0DGmJ z3l0!-QKr^=q?7YAe|EL63_x6{<(QD@0Xa%X@<;Baue{L31)N8LE;RwF_%dDOh^lLI zq@gN#b8OpWCdni4h@lRdXH@lykGl&N(db#gHmhDXxW_`~p8JUM#0ODnJy~w_wvnjA`2g3AR&!q{cK>>O^xRfT2 zEL$@bo03tWx?{oNU02UOI(ANu*rUdHHs5|au)e6eiPf}LL~ZcB0k=s2V2gBlnugQg zAP7D9fh}w3lu~J(8x{$EJ3LRnCa18)ZH{f5=@?cwA%@R!1dauzWQ$?rsdfd%>=}Xf zx+sn1nvw77T)Lbb&+Gizl=dtW-yU~248y_1OX*MRSI*U45m*K~Z zk5&AQ$%{s0$5@bWDy`gK_6VPq_WSGY%(JB((^i}XqzMkW+c2e3rC zEfzZ|EzS-xYscAleJ8tvj_daR(n{Hkl)X9CjdPB?~Tf{lQAIdgl`g3HUxR?w@oGbNUkeE4)MJ%-@x!5)pQ^%Gtf*sz` z0I>B&*oLTVM)DYyO3T61l3{Wk;yJpgUO4VW$G&+kxaWJ{WhmxM50f`_Rorak;izn6 zvjy>-89UT=BwOZK6#6KE3XoWgbdEt8!5&7|4Jc5k3N~(zZCgt%-kCw7brJL>HXo5E z@J@T;T<`?Dca)^8!Otynvtq91-G@H6)?(8n$w_ z)B%sPYhC(r5||7aHoZPKhPKhhE(Yag5T%?2=!}Yl&I%8b#%RVn8a8wk1Hj5AKzD}X zB@#KdD(BC5Um(Yj>bm}~L$W{-@{O~{D4^BxW{YB>L9p^@gH)`e$bf5E*=^DQN5BTD zyIgfcRNELqQvqXzUZf zQb)lCsF)790z{c=WWK~WEJz>XjdW_vwhhoMQvnfNB_F)B9e0PHHQwR_C%FJ>s9k$* zs5m^b#XCZQn#gEW@T>UM^6-O>y5I$AI)rPe-l#N;$}PCzm%f+RMYs)ukn)w5DGLo7b$sw zKX>uq2w<*>V*4>sgtJdNJtN7*=!(1`#EXT&`mjo0lr~UWnny9p^uH8P1CN}Rh2n@P z3TbGdE`Q^NX~Y*Gi`47^LpdV3HMVVYX4BOX!QKckJY9NXrk->Vn-gFsN_)r#w2C@| z6AN`<$7GjBj6B0UTNxgAFFU$)77%}R#IeT?9&b>COdKfjHRG98&lZE`Y(i?YwDzDm zU6<78J!08e9k_LMYi!&49YRo`4ncW99l-kH=^wxlU~r+HdEtF29@0d5?3Sbt4~?c@ zZLoKvTnO$COi7PAe!m%>WA=R+=L-WL-a5f z>ad$oDU$?d=;E&mbeoUbY!;;zgtdkUHq8@~j`Te|=uQOuMWLk~SMmW{rBtd}aRXIq z(7AB_eIFgD`_2Ad$C=yc^&WL3WNK}(PjghB@v@PS)>RJNl@6lFFcYheCYT%&M&=W0 z*s|fv;el?9Y}_w<45+m!f@A~4gv_(IUPcNM!LfPTIU5RyaMtJr zvF%Xcw4as{^y}8n%j6|0RO=ii0bJ)LZ%t+~{-ud?Z0daGa2fJ)UM|onb0}1Sm_BTb zY+KI_o>syhh)T03Jdw`a)=ijni{f>JfZ-NDQ^N~ngH_;(PGMgx`0Uxd_x=8GGk^xNNUY_3e-vhTL6MDoLa4cx^zolU+R?ZLBh@=+XCBY z8$=EDfp-|NsE}ecR)BH*AVUFwr=6|)%6q{!OF||zc$cUnb5H_wT~2ig>8oCrhyC6D zX8-v^1G=2_dWoZsVmZLrX|z_$p!pdza6{~ z-nJ9pNiF(W!{TJqT<*0d3b!B$TjDD}Oe=!i$7hyeLavVZS>oVfM(P*hyV3X3f4nfw z?ajKMLo5SeC~};o1B$k4x-?5^ATXew#3q^)mnbL@>@&n>p#ZGV_HHk7ROpI}dVH{&_r{l(k?_ z{;K8SK(4DTc#df1hILrkUyWy_q>*j(hVZj<%;M7(-#iuert3WVDX)ug+d&lQYxG)Y zqBD!hUQvYsT0EkyC~G|;Jr*+x4NNC>xe5A#7r^9@3ctPv*za%d-yJVBpKs>m{$3vt zCY$^yUV8WA>N*58Ut5O&a*bmerW78L0l!VHp~MlZ8GU57wc-!-c_@_kN4Bw1hKX37 zuGh8rK20J%Ul|f5pX^|^t8yD24+hYj3V2vrS&(N^!#`MtM|R}wGi5h|i8R4$CQD89 z=b5?5^kBxD;@Z{_iIQMYP_e?;g5Gi+g~qe3gFVtI(y$Xi=+qV_$I6R~|e~ zEwY2Y2diMO+`A*A(C>E0d|j{K%Y&YHqt&gV0#9#6K$4k(In%&X6u{6L>+m{(>457% zkE||x1=y+r=9jogdYNpSUWl*l_Yc?&a`*PWA9i;S_rL#}`~B^@Z1np0E5}y?U5TWO zqMeuLHiSMnHpC`ipf1lu*VRw9z4F!!JQB4oBrJvt@ln9%c25PYbI%S-YSlxv8(P^p z@NcSQI0t$Y8|NLcEt-j7z#hfej=(A>wpwcWAnT2kDA9Z&w*6sX$1WQG`~5r@UvhO_ z0~TczJ0Rg*0(ADotDVJPqR<(6fRORr-3iqmGN&|Lc5KrEjSL~yOYwbw%lX&OPY`i- zeC|Y$s9~#46Y4Fm^b;-XfC!RgEWe-=)RktwLU6;jm;~?#ZcaDs#>)X0YQ^r!FN$*i z$ji_5zyQ)#R~}$fKoZLd+?M>c1_~ogHu@U_>O(y%kNTQ}g2DkX#E}yPe+p+{FU56d z>h&=;y+vl$3r`PZdVM;aGON~gS8N13M-l-ZbQHvpULDAiVau+s_*B9|=mv!uG?;+L z8-FRtC(}=a_OS2!n^SKV^lSADh#fg#j;>^U<4Dn~h1DYS0Tm3q!ZK=b><^&3iFhJu zPLZd^>~kr%+&}If^z9Q`Ih9rbEmz;JAHkW1LObbf0@MXM3+}B#-!V{fsz(nzKf2VU z2tb`DSO!NbQ|hi>itX`s*Y`u;e%>8#pO1Y`h3cv=tNM!AsTKuJoAo@sL&dKpG{r|t z$?WH!0?rAX5c<;cX7Doz{VM^z$5@T@@%CD7Zmt&)bK0E==a^O})K5IFxO$1FuI0jpmWHZ@LY9$j zU6{%V;w~ehqGf6^6(Sgrx568|LdT6kVIw&e+0y~f$Jcr4 zX~lJ&23x%yQKLuIbYS`oRlnll;g7(!Akj9Au7(HiA;&D4@}aE(7a+eqcXIshDY!TN zgWSGHFj!IVfi8D9%Qycw$GD$R(z~Uz|M>qeMf{$AI$j6e>}9;W-+g>MdfU|3J$E#p)WL>- zKhG$i!+1jxLtu!*&pvhhJM$3`|1&8eMELy4=Lq}aNI^BL`_GT~?s0jxpR}~!d>YQ= z$DTgaAMYRb9|7BMZrC8eE4$~C^>o&F@40&S{V15cC=NeAp*{B6jb7j5;qg1+VIq6W z&DE#BeDyC0ey;BKkB6>T`a{>dhbt_d{dYicSN%rr@2_v=qh5UghS$R%uCT-pI==e* z|6J$pcE@l3Zu#?HA5qdDu5R~N&%5aP@4RJ$68^!PJ3Ui?bY4Q{D$B0`w#mYy?Tn_3h8*HkiWV5!VvhI ztH1o?H&_39cRTjq-+yx@V}Hls@y}f$Wj$O;=X2m!zIobxPd~#`_o#9eGj3>k%td_SnvK7(ChuXZ}Ij2P9FA;)`oX~ zb=dz6LcM?Y)1Us~r@#9TKmF;y{`9B+_>ceNzx?07|KC6T-GBS(&;RqMKmX@{{QLj@ zfBx5h`hS1^hj*Y|J5WP>`SV-ilD|2W3#bWzT-!9PkEnm#r zI|>wEqJH`^MM6Z?k0dJl!njuqdxy}Bgh!b0_DxiQ&wu3)S5M?+S<+Vz m*h7y8CR^|7)e&j@{_0;WnaceB&F}vG@BTkd@w8NeVGjV%R1{DE literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/035-adapter-owned-cleanup.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/035-adapter-owned-cleanup.json new file mode 100644 index 0000000..f44709a --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/035-adapter-owned-cleanup.json @@ -0,0 +1,18 @@ +{ + "owned_child_created": true, + "engine_ended": true, + "actual_process_exit_code": 0, + "attempts": [ + { + "attempt": 1, + "kill_attempted": false, + "wait_timeout_seconds": 5, + "wait_completed": true, + "errors": [], + "poll_before": 0, + "wait_returned_code": 0, + "poll_after": 0 + } + ], + "errors": [] +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/036-ended.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/036-ended.json new file mode 100644 index 0000000..d4103e4 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/036-ended.json @@ -0,0 +1,38 @@ +{ + "scope": "isolated diagnostic owned child", + "event": "ENGINE_ENDED", + "actual_pid": 36884, + "owner_pid": 36862, + "command": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "monotonic_ns": 4535962000, + "exit_code": 0, + "actual_process_exit_code": 0, + "engine_ended": true, + "timed_out": false, + "lifecycle_error": null, + "start_receipt_written": true, + "pid": 36884, + "argv": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "ended_utc": "2026-10-12T03:57:44.034797+00:00", + "signal_scope": "tracked Popen child only; no external group signal" +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/037-engine-native.log.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/037-engine-native.log.gz new file mode 100644 index 0000000000000000000000000000000000000000..36857bfcbb8fc6b23887d95f7fe0952b408abd7b GIT binary patch literal 6581 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

    *qjK&ZPwF_AX?RHK~gX4D+2`^}N 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/043-fixtures.varbytes.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/043-fixtures.varbytes.gz new file mode 100644 index 0000000000000000000000000000000000000000..c9dc755f503e7bc0e3639084895578f7821fdf67 GIT binary patch literal 9748 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%0D`l7<14ytI)h*xBHa$ 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
      9fm=6&vmyOM|!BNZ)u?}C~Opk2o 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�R$;}D#k*=w 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/053-execution.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/053-execution.json new file mode 100644 index 0000000..3baac9a --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/053-execution.json @@ -0,0 +1,40 @@ +{ + "passed": true, + "error": null, + "phases": [ + { + "pid": 34107, + "argv": [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-std=c++17", + "-O2", + "-o", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle.cpp" + ], + "exit_code": 0, + "seconds": 1.136918583, + "ended": true, + "foreign_signals": 0 + }, + { + "pid": 34122, + "argv": [ + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/corpus.tsv" + ], + "exit_code": 0, + "seconds": 0.557632916, + "ended": true, + "foreign_signals": 0 + } + ], + "all_inputs_preserved": true, + "corpus": { + "path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/corpus.tsv", + "bytes": 4556458, + "sha256": "51036394c19bd2c3212a80fb67f7406e6f0d049ec018910d36a8d3856a0b270c" + }, + "unit_accepted": false, + "performance_accepted": false +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/054-input.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/054-input.json new file mode 100644 index 0000000..f617cb6 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/054-input.json @@ -0,0 +1,48 @@ +{ + "pins": { + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-candidate-r313-r02/source/tree_core.hpp": { + "path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-candidate-r313-r02/source/tree_core.hpp", + "bytes": 3299, + "sha256": "be46852fe55aeee4e18996b4d87222662b031fd1b946977c81092f4d0707e480" + }, + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_core.hpp": { + "path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_core.hpp", + "bytes": 3467, + "sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1" + }, + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++": { + "path": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "bytes": 141373024, + "sha256": "7def90dd8829726686213a747fc5bff1583df933dae5edc55d755479e0bfe00a" + }, + "/private/tmp/thetree-numeric-oracle-r328.py": { + "path": "/private/tmp/thetree-numeric-oracle-r328.py", + "bytes": 5646, + "sha256": "21675754454c5d8fca8b35145217f32762243e39908e67bf2a1bdb783028c94c" + }, + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle.cpp": { + "path": "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle.cpp", + "bytes": 3291, + "sha256": "5d786e3c3be56c87c4311f80f5e9d64411f0875bb00f97ca778d191dbffe8b66" + } + }, + "argv": [ + [ + "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++", + "-std=c++17", + "-O2", + "-o", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle.cpp" + ], + [ + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle", + "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/corpus.tsv" + ] + ], + "case_count": 16388, + "timeout_seconds": 30, + "growth_cap_bytes": 16777216, + "Godot_runs": 0, + "unit_accepted": false +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/055-oracle.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/055-oracle.gz new file mode 100644 index 0000000000000000000000000000000000000000..afb7ea018f601cb6d4d185541af81eff9d36a845 GIT binary patch literal 16483 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 OLf+wx{^R1ym;VC;6q~~U literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/056-oracle.cpp b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/056-oracle.cpp new file mode 100644 index 0000000..8aa9f4f --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/056-oracle.cpp @@ -0,0 +1,54 @@ +#include +#include +#include +#define the_tree_native original_numeric +#include "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-candidate-r313-r02/source/tree_core.hpp" +#undef the_tree_native +#define the_tree_native candidate_numeric +#include "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_core.hpp" +#undef the_tree_native +using I=std::int64_t; +struct E {I neighbor,cost;}; +std::string vec(const std::vector& a) {std::ostringstream out;for(auto x:a)out< std::string result(const T &r,const std::vector& calls) { + return r.status+"|"+vec(r.costs)+"|"+vec(r.parents)+"|"+vec(r.discovered)+"|"+vec(r.parent_discovered)+"|"+vec(r.settled)+"|"+vec(calls); +} +int main(int argc,char **argv) { + if(argc!=2)return 98; std::ofstream corpus(argv[1]);if(!corpus)return 98; + std::uint64_t cases=0;bool passed=true; + auto run=[&](I n,I start,const std::vector& goals,const std::vector>& graph) { + std::vector old_calls,new_calls; + auto old_provider=[&](I current) {old_calls.push_back(current);std::vector r;for(auto e:graph[current])r.push_back({e.neighbor,e.cost});return r;}; + auto new_provider=[&](I current) {new_calls.push_back(current);std::vector r;for(auto e:graph[current])r.push_back({e.neighbor,e.cost});return r;}; + auto old=original_numeric::search(n,start,goals,old_provider); + auto now=candidate_numeric::search(n,start,goals,new_provider); + const auto a=result(old,old_calls),b=result(now,new_calls);passed=passed && a==b; + corpus<> g(3);for(I a=0;a<3;++a)for(I b=0;b<3;++b)if(mask&(I(1)<<(a*3+b)))g[a].push_back({b,1}); + for(I start=0;start<3;++start)for(I target=0;target<8;++target) {std::vector goals;for(I i=0;i<3;++i)if(target&(I(1)<> g(n); + for(I i=0;i::max(); + g[i].push_back({node,cost}); + } + std::vector goals;for(I i=0,count=rng()%8;i::max(); + run(3,0,{2},{{{1,maximum}},{{2,1}}, {}}); + run(4,0,{3,3,99},{{{2,1},{1,1},{1,1}},{{3,2}},{{3,2}}, {}}); + run(0,-1,{},{});run(1,1,{0},{{}}); + corpus.close();if(!corpus)return 98; + std::cout<<"NUMERIC_DIFFERENTIAL "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.mkdir() +def pin(p):return dict(path=str(p),bytes=p.stat().st_size,sha256=hashlib.sha256(p.read_bytes()).hexdigest()) +old=json.loads((A/'p23-02-native-bridge-build-r76/input.json').read_text());compiler=Path(old['compiler_pins']['clang++']['path']);assert pin(compiler)==old['compiler_pins']['clang++'] +cpp='''#include +#include +#include +#define the_tree_native original_numeric +#include "'''+str(P)+'''" +#undef the_tree_native +#define the_tree_native candidate_numeric +#include "'''+str(C)+'''" +#undef the_tree_native +using I=std::int64_t; +struct E {I neighbor,cost;}; +std::string vec(const std::vector& a) {std::ostringstream out;for(auto x:a)out< std::string result(const T &r,const std::vector& calls) { + return r.status+"|"+vec(r.costs)+"|"+vec(r.parents)+"|"+vec(r.discovered)+"|"+vec(r.parent_discovered)+"|"+vec(r.settled)+"|"+vec(calls); +} +int main(int argc,char **argv) { + if(argc!=2)return 98; std::ofstream corpus(argv[1]);if(!corpus)return 98; + std::uint64_t cases=0;bool passed=true; + auto run=[&](I n,I start,const std::vector& goals,const std::vector>& graph) { + std::vector old_calls,new_calls; + auto old_provider=[&](I current) {old_calls.push_back(current);std::vector r;for(auto e:graph[current])r.push_back({e.neighbor,e.cost});return r;}; + auto new_provider=[&](I current) {new_calls.push_back(current);std::vector r;for(auto e:graph[current])r.push_back({e.neighbor,e.cost});return r;}; + auto old=original_numeric::search(n,start,goals,old_provider); + auto now=candidate_numeric::search(n,start,goals,new_provider); + const auto a=result(old,old_calls),b=result(now,new_calls);passed=passed && a==b; + corpus<> g(3);for(I a=0;a<3;++a)for(I b=0;b<3;++b)if(mask&(I(1)<<(a*3+b)))g[a].push_back({b,1}); + for(I start=0;start<3;++start)for(I target=0;target<8;++target) {std::vector goals;for(I i=0;i<3;++i)if(target&(I(1)<> g(n); + for(I i=0;i::max(); + g[i].push_back({node,cost}); + } + std::vector goals;for(I i=0,count=rng()%8;i::max(); + run(3,0,{2},{{{1,maximum}},{{2,1}}, {}}); + run(4,0,{3,3,99},{{{2,1},{1,1},{1,1}},{{3,2}},{{3,2}}, {}}); + run(0,-1,{},{});run(1,1,{0},{{}}); + corpus.close();if(!corpus)return 98; + std::cout<<"NUMERIC_DIFFERENTIAL "<=528*1048576;start=time.monotonic() + process=subprocess.Popen(argv,stdout=subprocess.PIPE,stderr=subprocess.PIPE,start_new_session=True) + try:out,err=process.communicate(timeout=30) + except BaseException: + if process.poll() is None:process.terminate() + try:process.wait(timeout=3) + except subprocess.TimeoutExpired:process.kill();process.wait(timeout=3) + raise + (O/('phase%d.stdout'%i)).write_bytes(out);(O/('phase%d.stderr'%i)).write_bytes(err) + rows.append(dict(pid=process.pid,argv=argv,exit_code=process.returncode,seconds=time.monotonic()-start,ended=process.poll() is not None,foreign_signals=0)) + assert process.returncode==0 and not err + assert sum(p.stat().st_size for p in O.rglob('*') if p.is_file())<=16*1048576 + assert (O/'phase1.stdout').read_text()=='NUMERIC_DIFFERENTIAL 16388 PASS\n' + for path,p in protected.items():assert pin(Path(path))==p +except BaseException as ex:error=repr(ex) +(O/'execution.json').write_text(json.dumps(dict(passed=error is None,error=error,phases=rows,all_inputs_preserved=all(pin(Path(k))==v for k,v in protected.items()),corpus=pin(O/'corpus.tsv') if (O/'corpus.tsv').exists() else None,unit_accepted=False,performance_accepted=False),indent=2)+'\n') +print(json.dumps(dict(passed=error is None,error=error,phases=rows,corpus_bytes=(O/'corpus.tsv').stat().st_size if (O/'corpus.tsv').exists() else None))) diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/065-thetree-plan-local-r329.py b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/065-thetree-plan-local-r329.py new file mode 100644 index 0000000..ab93107 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/065-thetree-plan-local-r329.py @@ -0,0 +1,24 @@ +# coding: utf-8 +from pathlib import Path +import importlib.util,json,shutil,uuid +R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';O=A/'p23-02-native-hot-loop-local-r329';C=A/'p23-02-native-hot-loop-candidate-r326';B=A/'p23-02-native-hot-loop-build-r327' +s=importlib.util.spec_from_file_location('prepare329',R/'tools/run_all_tests.py');r=importlib.util.module_from_spec(s);s.loader.exec_module(r) +def pin(p):return dict(path=str(p),bytes=p.stat().st_size,sha256=r.sha(p)) +assert r.read(B/'execution.json')['passed'] and shutil.disk_usage(A).free>=528*1048576 +review=A/'p23-02-native-hot-loop-build-actual-independent-review-r327.json';assert r.read(review)['host_build_accepted'] +old=r.read(A/'p23-02-native-guest-bulk-local-r315/input.json');stage=A/'p23-02-native-guest-bulk-local-r315/stage';parent=Path(old['parent']);assert r.inventory(stage,stage=True)==old['expected_stage'];assert r.inventory(parent,stage=True)==old['parent_stage_inventory'] +private=Path('/private/tmp')/('TheTree-hot-loop-r329-'+uuid.uuid4().hex);private.mkdir();lib=private/'candidate.dylib' +with lib.open('xb') as f:f.write((B/'libtree_numeric_core.macos.template_debug.dylib').read_bytes()) +assert lib.read_bytes()==(B/'libtree_numeric_core.macos.template_debug.dylib').read_bytes() +with (O/'candidate.gdextension').open('x') as f:f.write('[configuration]\nentry_symbol="tree_numeric_core_init"\ncompatibility_minimum="4.7.2"\nreloadable=false\n\n[libraries]\nmacos.arm64="'+str(lib)+'"\n') +fixed=old['pins'].copy() +updates=dict(host_review=review,host_root=A/'p23-02-native-hot-loop-build-root-verification-r327.json',library=B/'libtree_numeric_core.macos.template_debug.dylib',private_library=lib,config=O/'candidate.gdextension',qa=O/'local.gd',candidate=C/'input.json',candidate_guest=C/'scripts/guest_service.gd',candidate_runtime=C/'scripts/simulation_runtime.gd',candidate_cpp=C/'source/tree_numeric_core.cpp',candidate_include=C/'source/guest_candidate_batch.inc',contract=A/'p23-02-native-hot-loop-work-contract-r325.json',starter=O/'candidate-guarded.gd',runner=A/'p23-02-native-hot-loop-local-r329.py',prepare=Path(__file__),protocol_helper=O/'protocol_helper.gd',protocol_original=A/'p23-02-native-lazy-edge-cache-protocol-r143.gd',protocol_manifest=A/'p23-02-native-bridge-Godot-protocol-preparation-r73/pinned-inputs.json',numeric_execution=A/'p23-02-native-hot-loop-numeric-r328/execution.json',header=C/'source/tree_core.hpp') +for k,p in updates.items():fixed[k]=pin(p) +# Pin all 50 frozen full inputs and expected outputs, once; never copy this corpus. +manifest=r.read(updates['protocol_manifest']) +for i,row in enumerate(manifest['cases']): + for kind in ['input','expected']: + p=Path(row[kind+'_path']);q=pin(p);assert q['sha256']==row[kind+'_sha256'];fixed['protocol_%d_%s'%(i,kind)]=q +v=old.copy();v.update(pins=fixed,stage=str(stage),source_before=r.source_refs(R),default_before=r.default_player(R),doc4_before={n:r.sha(R/'docs/plans/original-completion-2026-10-02'/n) for n in old['doc4_before']},support_inventory=r.inventory(r.SUPPORT),private_library_inventory=r.inventory(private),original_Guest_fixture=pin(A/'p23-02-native-guest-bulk-local-r315/local-measurement/fixtures.varbytes'),additional_protocol_cases=50,stage_clones=0,expected_duration_seconds=[2,30],capacity_floor_bytes=528*1048576) +with (O/'input.json').open('x') as f:json.dump(v,f,ensure_ascii=False,indent=2);f.write('\n') +print(json.dumps(dict(plan=str(O/'input.json'),pins=len(fixed),clone_count=0,free=shutil.disk_usage(A).free))) diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/066-thetree-prepare-local-r329.py b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/066-thetree-prepare-local-r329.py new file mode 100644 index 0000000..c5c8f3c --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/066-thetree-prepare-local-r329.py @@ -0,0 +1,88 @@ +# coding: utf-8 +from pathlib import Path +import json,re +R=Path('/Users/korizatou114/Projects/とりにく工房ゲーム制作部');A=R/'artifacts/original-completion-2026-10-02';O=A/'p23-02-native-hot-loop-local-r329';assert not O.exists();O.mkdir() +def write(p,s): + with p.open('x') as f:f.write(s) +old=A/'p23-02-native-lazy-edge-cache-protocol-r143.gd';s=old.read_text();s=s.replace('extends SceneTree','extends RefCounted',1) +s=re.sub(r'func _initialize\(\) -> void:\n.*?(?=\nfunc )','',s,count=1,flags=re.S) +s=s[:s.index('func _run() -> void:')] +s+='''class ReentrantProvider extends RefCounted: + var core: Object + var cells: Array[Vector3i] + var indices: Dictionary + var goals: Dictionary + var entered := false + var inner_result: Dictionary + func edges(cell: Vector3i) -> Array: + if cell.x != 0: return [] + if not entered: + entered = true + core.call("clear_edge_cache") + var inner := EdgeProvider.new() + inner.rows = [[[cells[1],9]], []] + inner_result = core.call("search_cached",cells,indices,0,goals,Callable(inner,"edges")) + return [[cells[1],7]] + +func _reentrant_collision(core) -> Dictionary: + core.call("clear_edge_cache") + var cells: Array[Vector3i] = [Vector3i.ZERO,Vector3i(1,0,0)] + var indices: Dictionary = {cells[0]:0,cells[1]:1} + var goals: Dictionary = {cells[1]:true} + var provider := ReentrantProvider.new() + provider.core=core;provider.cells=cells;provider.indices=indices;provider.goals=goals + var outer: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(outer[&"status"] == "usable" and outer[&"cost_values"][1] == 7, "reentrant collision returns original converted outer row") + _check(provider.inner_result[&"status"] == "usable" and provider.inner_result[&"cost_values"][1] == 9, "inner populated same cache key before outer insertion") + var warm: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(warm[&"status"] == "usable" and warm[&"cost_values"][1] == 9, "warm preserves inner first cache publication") + var result := {"outer":outer,"inner":provider.inner_result,"warm":warm} + var ref: WeakRef = weakref(provider) + provider = null + _check(ref.get_ref() == null, "borrowed native cache retains no reentrant provider") + core.call("clear_edge_cache") + return result + +func run_frozen(core, manifest_path: String) -> Dictionary: + var manifest: Dictionary = JSON.parse_string(FileAccess.get_file_as_string(manifest_path)) + _check(manifest["cases"].size() == 50, "same frozen fifty-input scope") + for row: Dictionary in manifest["cases"]: _case(core,row) + _prefix_wrap(core,true) + _prefix_wrap(core,[Vector3i(2,0,0),false]) + _shrink_transfer(core) + _cached_goals_and_reset(core) + _cached_prefix_wrap(core,true) + _cached_prefix_wrap(core,[Vector3i(2,0,0),false]) + var collision := _reentrant_collision(core) + _warm_for_teardown(core) + return {"passed":failures.is_empty(),"checks":checks,"failures":failures,"cases":cases,"cached_cases":cached_cases,"reentrant_collision":collision,"unit_accepted":false,"performance_accepted":false} +''' +write(O/'protocol_helper.gd',s) +qa=(A/'p23-02-native-guest-bulk-local-r315.gd').read_text() +qa=qa.replace('var _bulk_records: Array = []','const ProtocolHelper = preload('+json.dumps(str(O/'protocol_helper.gd'))+')\n\nvar _bulk_records: Array = []',1) +a='\t_test_bulk_candidates()\n\tvar output := OS.get_environment("THE_TREE_RUNTIME_MONITOR_OUTPUT")';b='''\t_test_bulk_candidates() + var output := OS.get_environment("THE_TREE_RUNTIME_MONITOR_OUTPUT") + var protocol = ProtocolHelper.new() + var protocol_core: Object = ClassDB.instantiate(&"TheTreeNumericCore") + var protocol_report: Dictionary = protocol.run_frozen(protocol_core,'''+json.dumps(str(A/'p23-02-native-bridge-Godot-protocol-preparation-r73/pinned-inputs.json'))+''') + var core_ref: WeakRef = weakref(protocol_core) + protocol_core = null + _expect(core_ref.get_ref() == null, "combined protocol core with populated cache releases") + _checks += int(protocol_report["checks"]) + _failures += protocol_report["failures"].size() + var protocol_file := FileAccess.open(output.path_join("protocol-report.json"),FileAccess.WRITE) + if protocol_file == null: quit(98); return + protocol_file.store_string(JSON.stringify(protocol_report,"\\t")+"\\n");protocol_file.close() + protocol = null''';assert a in qa;qa=qa.replace(a,b,1) +qa=qa.replace('"original_s3_invocations": 18,','"original_s3_invocations": 18, "protocol_cases": 50, "protocol_checks": int(protocol_report["checks"]),') +write(O/'local.gd',qa) +guard=(A/'p23-02-native-guest-bulk-local-r315/candidate-guarded.gd').read_text() +guard=guard.replace('p23-02-native-guest-bulk-local-r315.gd','p23-02-native-hot-loop-local-r329/local.gd').replace('p23-02-native-guest-bulk-local-r315/candidate.gdextension','p23-02-native-hot-loop-local-r329/candidate.gdextension') +write(O/'candidate-guarded.gd',guard) +runner=(A/'p23-02-native-guest-bulk-local-r315.py').read_text().replace('p23-02-native-guest-bulk-local-r315','p23-02-native-hot-loop-local-r329') +a=" fixture=output/'fixtures.varbytes';assert fixture.stat().st_size==report['fixture_bytes'] and r.sha(fixture)==report['fixture_sha256']" +b=a+"\n protocol=r.read(output/'protocol-report.json');assert protocol['passed'] and not protocol['failures'] and len(protocol['cases'])==50 and len(protocol['cached_cases'])==50 and protocol['checks']==report['protocol_checks']\n assert fixture.read_bytes()==Path(plan['original_Guest_fixture']['path']).read_bytes(), 'Unchanged full Guest53 original fixture bytes'" +assert a in runner;runner=runner.replace(a,b,1) +runner=runner.replace('Finite standalone Guest candidate ABI/local and18 affected original S3 methods only.','Finite Guest53 and18 affected original S3 methods plus frozen50 protocols/shrink/ownership/reentrant collision on same new bridge.') +write(A/'p23-02-native-hot-loop-local-r329.py',runner) +print('Prepared single-engine combined local/protocol QA. Engine0.') diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/067-thetree-prepare-r326.py.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/067-thetree-prepare-r326.py.gz new file mode 100644 index 0000000000000000000000000000000000000000..6fbfa8d77c0543298733d78f2e6f450aadfcfb76 GIT binary patch literal 4144 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/README.md b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/README.md new file mode 100644 index 0000000..586263a --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/README.md @@ -0,0 +1,3 @@ +# Native hot loop candidate r325–r329 + +The manifest preserves source, build, numeric corpus, local evidence, review receipts and root verification. Compressed copies were decompressed and compared against every original byte. Originals remain in the artifact area. Files are checkpoints, not a production deployment. Candidate r326/library327 remains unselected and unadopted. Whole-state comparison, final regression and unit acceptance are pending. See the current execution note for scope. diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/manifest.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/manifest.json new file mode 100644 index 0000000..1883612 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/manifest.json @@ -0,0 +1,1027 @@ +{ + "plan_id": "P23-02", + "candidate": "r326/library327", + "scope": "Finite local and numeric evidence; whole comparison pending; unselected and unadopted", + "copies": [ + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-actual-independent-review-r327.json", + "bytes": 35660, + "sha256": "538e5e0e08eef15a3207c22c2f21eb812ef7b549f7e0797ffc33a89ca935f9c8" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/000-p23-02-native-hot-loop-build-actual-independent-review-r327.json.gz", + "bytes": 5773, + "sha256": "cd75345961ca3c077d9ac8feba3f733484b76fd67ba7a0c40df5ca6cfd71f314" + }, + "gzip": true, + "raw_bytes": 35660, + "raw_sha256": "538e5e0e08eef15a3207c22c2f21eb812ef7b549f7e0797ffc33a89ca935f9c8" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-preexecution-independent-review-r327.json", + "bytes": 27596, + "sha256": "531567cb26853a119012d01482335d04cd00b7f589df16e8c936b9dcd3227914" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/001-p23-02-native-hot-loop-build-preexecution-independent-review-r327.json.gz", + "bytes": 5193, + "sha256": "8edc082feeac551314a66c7b391389dd74916bb0f88d8dada35ceac232f2261a" + }, + "gzip": true, + "raw_bytes": 27596, + "raw_sha256": "531567cb26853a119012d01482335d04cd00b7f589df16e8c936b9dcd3227914" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-preexecution-root-verification-r327.json", + "bytes": 16724, + "sha256": "1e03d6d0ff7b36de010be5dbc54757c63728bce43c239ad4d6f4cae07057a551" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/002-p23-02-native-hot-loop-build-preexecution-root-verification-r327.json.gz", + "bytes": 3818, + "sha256": "16f88a2c5713eda8ebe1557160632570011b842cfbf2ac16a0378618a740065e" + }, + "gzip": true, + "raw_bytes": 16724, + "raw_sha256": "1e03d6d0ff7b36de010be5dbc54757c63728bce43c239ad4d6f4cae07057a551" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-preview-r327.json", + "bytes": 2911, + "sha256": "951b8c7fc6d76bde01126d31058039a914e4f1f768a11b839b94496dce6fa882" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/003-p23-02-native-hot-loop-build-preview-r327.json", + "bytes": 2911, + "sha256": "951b8c7fc6d76bde01126d31058039a914e4f1f768a11b839b94496dce6fa882" + }, + "gzip": false, + "raw_bytes": 2911, + "raw_sha256": "951b8c7fc6d76bde01126d31058039a914e4f1f768a11b839b94496dce6fa882" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/compile-062/ended.json", + "bytes": 1836, + "sha256": "7a359215f2274f31c0e00e9771a645bf2592228ec2953e2956cd199d0f3343b9" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/004-ended.json", + "bytes": 1836, + "sha256": "7a359215f2274f31c0e00e9771a645bf2592228ec2953e2956cd199d0f3343b9" + }, + "gzip": false, + "raw_bytes": 1836, + "raw_sha256": "7a359215f2274f31c0e00e9771a645bf2592228ec2953e2956cd199d0f3343b9" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/compile-062/started.json", + "bytes": 2926, + "sha256": "66d6bfd1a8b32476d4b58a9e3ecab176d135bcb118acb3e3afa1c803964c04d8" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/005-started.json", + "bytes": 2926, + "sha256": "66d6bfd1a8b32476d4b58a9e3ecab176d135bcb118acb3e3afa1c803964c04d8" + }, + "gzip": false, + "raw_bytes": 2926, + "raw_sha256": "66d6bfd1a8b32476d4b58a9e3ecab176d135bcb118acb3e3afa1c803964c04d8" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/compile-062/stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/006-stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/compile-062/stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/007-stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/compile-062-phase.json", + "bytes": 621, + "sha256": "16eb2c00f6de1c474cba136713c6d2b66be99aee094e4c23c7058c0ed33b940e" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/008-compile-062-phase.json", + "bytes": 621, + "sha256": "16eb2c00f6de1c474cba136713c6d2b66be99aee094e4c23c7058c0ed33b940e" + }, + "gzip": false, + "raw_bytes": 621, + "raw_sha256": "16eb2c00f6de1c474cba136713c6d2b66be99aee094e4c23c7058c0ed33b940e" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/execution.json", + "bytes": 7069, + "sha256": "b7343875926c9c8f2811eeead25537e826ea2c449f84892d8c5bef95d768d66d" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/009-execution.json", + "bytes": 7069, + "sha256": "b7343875926c9c8f2811eeead25537e826ea2c449f84892d8c5bef95d768d66d" + }, + "gzip": false, + "raw_bytes": 7069, + "raw_sha256": "b7343875926c9c8f2811eeead25537e826ea2c449f84892d8c5bef95d768d66d" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/input.json", + "bytes": 658598, + "sha256": "df8280ec808ad50a6c1c2e5d02d3371ff203b08f6b383079018793f8834cb450" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/010-input.json.gz", + "bytes": 137961, + "sha256": "c9810db4df668724ebd36d285db97f853271849253308b16a8e4a5545b34d31a" + }, + "gzip": true, + "raw_bytes": 658598, + "raw_sha256": "df8280ec808ad50a6c1c2e5d02d3371ff203b08f6b383079018793f8834cb450" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/libtree_numeric_core.macos.template_debug.dylib", + "bytes": 417184, + "sha256": "64608dccb3441594603fa5561fad3e2e90b055f32e4823c4864d2486a298602c" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/011-libtree_numeric_core.macos.template_debug.dylib.gz", + "bytes": 153480, + "sha256": "4f99da375141435b649a0dbf12625f45b3fdf56b74f61f84ded013fceaae03b3" + }, + "gzip": true, + "raw_bytes": 417184, + "raw_sha256": "64608dccb3441594603fa5561fad3e2e90b055f32e4823c4864d2486a298602c" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/link/ended.json", + "bytes": 1334, + "sha256": "3f101696a2982d2e6ca3a80ea956fefccd057eec7e48949918140d1c07c06b5f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/012-ended.json", + "bytes": 1334, + "sha256": "3f101696a2982d2e6ca3a80ea956fefccd057eec7e48949918140d1c07c06b5f" + }, + "gzip": false, + "raw_bytes": 1334, + "raw_sha256": "3f101696a2982d2e6ca3a80ea956fefccd057eec7e48949918140d1c07c06b5f" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/link/started.json", + "bytes": 2018, + "sha256": "95b8659fec4d142f76cc8fbf50863e3caaa087cea4890fa9333816eeca34900a" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/013-started.json", + "bytes": 2018, + "sha256": "95b8659fec4d142f76cc8fbf50863e3caaa087cea4890fa9333816eeca34900a" + }, + "gzip": false, + "raw_bytes": 2018, + "raw_sha256": "95b8659fec4d142f76cc8fbf50863e3caaa087cea4890fa9333816eeca34900a" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/link/stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/014-stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/link/stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/015-stdout.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/link-phase.json", + "bytes": 604, + "sha256": "deb61213f6da65f7ae457f708761a7974773503ac5b0935a1d315fbbd7ee9714" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/016-link-phase.json", + "bytes": 604, + "sha256": "deb61213f6da65f7ae457f708761a7974773503ac5b0935a1d315fbbd7ee9714" + }, + "gzip": false, + "raw_bytes": 604, + "raw_sha256": "deb61213f6da65f7ae457f708761a7974773503ac5b0935a1d315fbbd7ee9714" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327/objects/062-tree_numeric_core.os", + "bytes": 368776, + "sha256": "4ac5a21e47a4441374131310c44474497b5fb5b28f6c6e75a5ed17243616687d" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/017-062-tree_numeric_core.os.gz", + "bytes": 118411, + "sha256": "34140e075125f4134eb80bf9a62d2c75c3f0ebe5b564e02e5937dff1d724cd0e" + }, + "gzip": true, + "raw_bytes": 368776, + "raw_sha256": "4ac5a21e47a4441374131310c44474497b5fb5b28f6c6e75a5ed17243616687d" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-r327.py", + "bytes": 16335, + "sha256": "6e4d1d423e54038236b3b2c87f3ee48b807c161a156734087128dc9e7d3b8fa7" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/018-p23-02-native-hot-loop-build-r327.py.gz", + "bytes": 5091, + "sha256": "6e12d689be11ff7ec2a269c4bf05146f77c48875fbea5db387a6ad2b5d64eed5" + }, + "gzip": true, + "raw_bytes": 16335, + "raw_sha256": "6e4d1d423e54038236b3b2c87f3ee48b807c161a156734087128dc9e7d3b8fa7" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-build-root-verification-r327.json", + "bytes": 21497, + "sha256": "7a601c165a342d043a5b2c4f1a7c6c54bf82419ad41894e5d6c32c171064af6a" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/019-p23-02-native-hot-loop-build-root-verification-r327.json.gz", + "bytes": 4534, + "sha256": "2fafe48ec3f2cfbccd35a26e78c1370d68f31961599f527d5ac5b72c0971690f" + }, + "gzip": true, + "raw_bytes": 21497, + "raw_sha256": "7a601c165a342d043a5b2c4f1a7c6c54bf82419ad41894e5d6c32c171064af6a" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/input.json", + "bytes": 3185, + "sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/020-input.json", + "bytes": 3185, + "sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254" + }, + "gzip": false, + "raw_bytes": 3185, + "raw_sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/scripts/guest_service.gd", + "bytes": 62505, + "sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/021-guest_service.gd", + "bytes": 62505, + "sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e" + }, + "gzip": false, + "raw_bytes": 62505, + "raw_sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/scripts/simulation_runtime.gd", + "bytes": 612068, + "sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/022-simulation_runtime.gd", + "bytes": 612068, + "sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86" + }, + "gzip": false, + "raw_bytes": 612068, + "raw_sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/guest_candidate_batch.inc", + "bytes": 28222, + "sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/023-guest_candidate_batch.inc", + "bytes": 28222, + "sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9" + }, + "gzip": false, + "raw_bytes": 28222, + "raw_sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_core.hpp", + "bytes": 3467, + "sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/024-tree_core.hpp", + "bytes": 3467, + "sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1" + }, + "gzip": false, + "raw_bytes": 3467, + "raw_sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/source/tree_numeric_core.cpp", + "bytes": 56138, + "sha256": "a2434ef2fbc9624aa3b62746cebde2cacdce78712d4d866774df54fbd291bee3" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/025-tree_numeric_core.cpp", + "bytes": 56138, + "sha256": "a2434ef2fbc9624aa3b62746cebde2cacdce78712d4d866774df54fbd291bee3" + }, + "gzip": false, + "raw_bytes": 56138, + "raw_sha256": "a2434ef2fbc9624aa3b62746cebde2cacdce78712d4d866774df54fbd291bee3" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-actual-independent-review-r329.json", + "bytes": 88603, + "sha256": "56fab0fb4c8b9218dcfdf22b914f12843dad0b8fbadcfd96d81f0ef8ea8fa895" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/026-p23-02-native-hot-loop-local-actual-independent-review-r329.json.gz", + "bytes": 8877, + "sha256": "b8cb022743a13e6ffac99e823d635c3659e50dcdc9cb2a750e8bb2eac7ef9582" + }, + "gzip": true, + "raw_bytes": 88603, + "raw_sha256": "56fab0fb4c8b9218dcfdf22b914f12843dad0b8fbadcfd96d81f0ef8ea8fa895" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-preexecution-independent-review-r329.json", + "bytes": 75701, + "sha256": "97170206d613635be3e234270fbd9e83de7044674bb8d3305d31eceb676a0e6e" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/027-p23-02-native-hot-loop-local-preexecution-independent-review-r329.json.gz", + "bytes": 7215, + "sha256": "f15899fecc4ac8d59d62fce026320c12095398c3e64548b3e086a5f10a17a369" + }, + "gzip": true, + "raw_bytes": 75701, + "raw_sha256": "97170206d613635be3e234270fbd9e83de7044674bb8d3305d31eceb676a0e6e" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/actual-root-verification.json", + "bytes": 53507, + "sha256": "3be337d874c4e6f88bd0a1f4a7a58d46bbe0d3df3e76666e6606653b27d8d4bc" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/028-actual-root-verification.json.gz", + "bytes": 6582, + "sha256": "53760d41d593e40f8e0b042e992742e6280278bd0710c6b68d4cbed3b753a4b3" + }, + "gzip": true, + "raw_bytes": 53507, + "raw_sha256": "3be337d874c4e6f88bd0a1f4a7a58d46bbe0d3df3e76666e6606653b27d8d4bc" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "bytes": 1030, + "sha256": "2cf049a15dfa1f81f6b3b1d2e46c99207254a4d08320c7da7c5fb719a9d8986c" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/029-candidate-guarded.gd", + "bytes": 1030, + "sha256": "2cf049a15dfa1f81f6b3b1d2e46c99207254a4d08320c7da7c5fb719a9d8986c" + }, + "gzip": false, + "raw_bytes": 1030, + "raw_sha256": "2cf049a15dfa1f81f6b3b1d2e46c99207254a4d08320c7da7c5fb719a9d8986c" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate.gdextension", + "bytes": 212, + "sha256": "8e9b3929b86c066f5ced41e669c3da1ff326763100df38495b814116dc1e759b" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/030-candidate.gdextension", + "bytes": 212, + "sha256": "8e9b3929b86c066f5ced41e669c3da1ff326763100df38495b814116dc1e759b" + }, + "gzip": false, + "raw_bytes": 212, + "raw_sha256": "8e9b3929b86c066f5ced41e669c3da1ff326763100df38495b814116dc1e759b" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/driver-before-prepath-repair.py", + "bytes": 6898, + "sha256": "fb1ec87b317eb506e482ad4833b5439b7c8b095438440b5cb9dea1247d4a1c2f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/031-driver-before-prepath-repair.py", + "bytes": 6898, + "sha256": "fb1ec87b317eb506e482ad4833b5439b7c8b095438440b5cb9dea1247d4a1c2f" + }, + "gzip": false, + "raw_bytes": 6898, + "raw_sha256": "fb1ec87b317eb506e482ad4833b5439b7c8b095438440b5cb9dea1247d4a1c2f" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/execution.json", + "bytes": 10931, + "sha256": "2762ca36c104c65afe92f093ce79aee04b7a6f3cf229dbc4399984268c9bff72" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/032-execution.json.gz", + "bytes": 2205, + "sha256": "91a227c2def9efe6b3b61bc88e43669b8b7fa804bfb18a433f5ab033367c81f8" + }, + "gzip": true, + "raw_bytes": 10931, + "raw_sha256": "2762ca36c104c65afe92f093ce79aee04b7a6f3cf229dbc4399984268c9bff72" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/input-before-prepath-repair.json", + "bytes": 1007217, + "sha256": "3077d4f4ea4cc48110073bad204a601d6c2822d4074528b195838e80c2b6b8ec" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/033-input-before-prepath-repair.json.gz", + "bytes": 230512, + "sha256": "3cfa0bd25847e50171fc1d155af826540c61319bba1352d112ca876e339eaea3" + }, + "gzip": true, + "raw_bytes": 1007217, + "raw_sha256": "3077d4f4ea4cc48110073bad204a601d6c2822d4074528b195838e80c2b6b8ec" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/input.json", + "bytes": 1008002, + "sha256": "46ed33e78a3c98855bed0ab570cea045fd8b786305787436d12ce81317c0c099" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/034-input.json.gz", + "bytes": 230748, + "sha256": "b71945eb8aa284a952c3e08e2a3c31683cae651b4546fba3717f9a76c6b419be" + }, + "gzip": true, + "raw_bytes": 1008002, + "raw_sha256": "46ed33e78a3c98855bed0ab570cea045fd8b786305787436d12ce81317c0c099" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/adapter-owned-cleanup.json", + "bytes": 351, + "sha256": "c1f3d289b362cc61b9be169a3994be27df39f35e6221881b4a9678ce3c72ba54" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/035-adapter-owned-cleanup.json", + "bytes": 351, + "sha256": "c1f3d289b362cc61b9be169a3994be27df39f35e6221881b4a9678ce3c72ba54" + }, + "gzip": false, + "raw_bytes": 351, + "raw_sha256": "c1f3d289b362cc61b9be169a3994be27df39f35e6221881b4a9678ce3c72ba54" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/ended.json", + "bytes": 1746, + "sha256": "dd938bec0af0d85db308c70ee60b328e9af5831dfefbd7c0b8f89561423ac981" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/036-ended.json", + "bytes": 1746, + "sha256": "dd938bec0af0d85db308c70ee60b328e9af5831dfefbd7c0b8f89561423ac981" + }, + "gzip": false, + "raw_bytes": 1746, + "raw_sha256": "dd938bec0af0d85db308c70ee60b328e9af5831dfefbd7c0b8f89561423ac981" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log", + "bytes": 50284, + "sha256": "38f33e0c67420fae498c9011a11c7a0a086003b6ccb0aaac2695adf275764bfb" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/037-engine-native.log.gz", + "bytes": 6581, + "sha256": "552012c3d07f6696c655c97ece0645b2269bacebf4c3cc854d0db0f55c6fb167" + }, + "gzip": true, + "raw_bytes": 50284, + "raw_sha256": "38f33e0c67420fae498c9011a11c7a0a086003b6ccb0aaac2695adf275764bfb" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/outer-owned-finally.json", + "bytes": 964, + "sha256": "561ba831e60b2f4a2452921e47f4142670bbb8079e1190492bab49abb5761800" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/038-outer-owned-finally.json", + "bytes": 964, + "sha256": "561ba831e60b2f4a2452921e47f4142670bbb8079e1190492bab49abb5761800" + }, + "gzip": false, + "raw_bytes": 964, + "raw_sha256": "561ba831e60b2f4a2452921e47f4142670bbb8079e1190492bab49abb5761800" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/process.json", + "bytes": 6582, + "sha256": "f2b7d1c85dd2c424c7e8788fc33b02241a5b238a76f714643aaaafd4dffd009f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/039-process.json", + "bytes": 6582, + "sha256": "f2b7d1c85dd2c424c7e8788fc33b02241a5b238a76f714643aaaafd4dffd009f" + }, + "gzip": false, + "raw_bytes": 6582, + "raw_sha256": "f2b7d1c85dd2c424c7e8788fc33b02241a5b238a76f714643aaaafd4dffd009f" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/started.json", + "bytes": 2353, + "sha256": "5cf80945887a0480217a70844007e5ffc93e6170567dce2916506513179c9a47" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/040-started.json", + "bytes": 2353, + "sha256": "5cf80945887a0480217a70844007e5ffc93e6170567dce2916506513179c9a47" + }, + "gzip": false, + "raw_bytes": 2353, + "raw_sha256": "5cf80945887a0480217a70844007e5ffc93e6170567dce2916506513179c9a47" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/041-stderr.log", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/stdout.log", + "bytes": 50434, + "sha256": "0d80fd887d3ae60d97ac91ec360387c6dd4aa06b0417cc000f2567e5b401735f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/042-stdout.log.gz", + "bytes": 6669, + "sha256": "4685420d1d3c251e281eb19a098c1936b13bd3be16eed159b6fbd26cbe9b0e39" + }, + "gzip": true, + "raw_bytes": 50434, + "raw_sha256": "0d80fd887d3ae60d97ac91ec360387c6dd4aa06b0417cc000f2567e5b401735f" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local-measurement/fixtures.varbytes", + "bytes": 606268, + "sha256": "6ec6e879a2de02b9d4081295b33e53e2060f31829e1fb674168a414d8b3e5c2e" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/043-fixtures.varbytes.gz", + "bytes": 9748, + "sha256": "be91546209959f47557bb71ed4e371b67f794f2ad6bc6519781638acd27882ae" + }, + "gzip": true, + "raw_bytes": 606268, + "raw_sha256": "6ec6e879a2de02b9d4081295b33e53e2060f31829e1fb674168a414d8b3e5c2e" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local-measurement/protocol-report.json", + "bytes": 47951, + "sha256": "ce2f9c68597f2b927346e3c6ea0dec0e7c77e9682e321423bfc966e6c0d3fa0f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/044-protocol-report.json.gz", + "bytes": 2507, + "sha256": "f2137a0f131b89a27513bbe551b242c6eb19e282218056fdb775d4774c1a7a33" + }, + "gzip": true, + "raw_bytes": 47951, + "raw_sha256": "ce2f9c68597f2b927346e3c6ea0dec0e7c77e9682e321423bfc966e6c0d3fa0f" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local-measurement/report.json", + "bytes": 404, + "sha256": "6ecfcd3b913feba90c841f8beb4c232a2b5e92dd4380b493e17c7936c6312a40" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/045-report.json", + "bytes": 404, + "sha256": "6ecfcd3b913feba90c841f8beb4c232a2b5e92dd4380b493e17c7936c6312a40" + }, + "gzip": false, + "raw_bytes": 404, + "raw_sha256": "6ecfcd3b913feba90c841f8beb4c232a2b5e92dd4380b493e17c7936c6312a40" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local-phase.json", + "bytes": 8037, + "sha256": "2bb84c884270d087d8acfbe1845bf8bcacccbac5cf3f6b7923cc3fa4fcbc53cc" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/046-local-phase.json", + "bytes": 8037, + "sha256": "2bb84c884270d087d8acfbe1845bf8bcacccbac5cf3f6b7923cc3fa4fcbc53cc" + }, + "gzip": false, + "raw_bytes": 8037, + "raw_sha256": "2bb84c884270d087d8acfbe1845bf8bcacccbac5cf3f6b7923cc3fa4fcbc53cc" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local-profile.json", + "bytes": 907, + "sha256": "e1def3043186b68cdcb2e154b6f44da34eacc352f05f0b619ff8bc2565df6c56" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/047-local-profile.json", + "bytes": 907, + "sha256": "e1def3043186b68cdcb2e154b6f44da34eacc352f05f0b619ff8bc2565df6c56" + }, + "gzip": false, + "raw_bytes": 907, + "raw_sha256": "e1def3043186b68cdcb2e154b6f44da34eacc352f05f0b619ff8bc2565df6c56" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local.gd", + "bytes": 17804, + "sha256": "1008bfcd3db6e86b3b8e2e4bec8331be62d158610516877a3e4438c0d996821a" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/048-local.gd", + "bytes": 17804, + "sha256": "1008bfcd3db6e86b3b8e2e4bec8331be62d158610516877a3e4438c0d996821a" + }, + "gzip": false, + "raw_bytes": 17804, + "raw_sha256": "1008bfcd3db6e86b3b8e2e4bec8331be62d158610516877a3e4438c0d996821a" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/preexecution-root-verification.json", + "bytes": 45677, + "sha256": "ba7aba3067fd05e656d059499ab055e3000c17867f3ab641069d379d0d00834c" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/049-preexecution-root-verification.json.gz", + "bytes": 5171, + "sha256": "a63e264269708cd9f67fe17cacf5e9f7f7e174a9b52d84cf9cebdf21cd80c86b" + }, + "gzip": true, + "raw_bytes": 45677, + "raw_sha256": "ba7aba3067fd05e656d059499ab055e3000c17867f3ab641069d379d0d00834c" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/protocol_helper.gd", + "bytes": 15690, + "sha256": "198a16aa04d63bc46ad6ccadaaca8074b8d881db14148fa06b20dc51b2e8569b" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/050-protocol_helper.gd", + "bytes": 15690, + "sha256": "198a16aa04d63bc46ad6ccadaaca8074b8d881db14148fa06b20dc51b2e8569b" + }, + "gzip": false, + "raw_bytes": 15690, + "raw_sha256": "198a16aa04d63bc46ad6ccadaaca8074b8d881db14148fa06b20dc51b2e8569b" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329.py", + "bytes": 6896, + "sha256": "30ef2a891eaddad5d4a2240730a03a06458e71affb138b4c7719e59ee2967317" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/051-p23-02-native-hot-loop-local-r329.py", + "bytes": 6896, + "sha256": "30ef2a891eaddad5d4a2240730a03a06458e71affb138b4c7719e59ee2967317" + }, + "gzip": false, + "raw_bytes": 6896, + "raw_sha256": "30ef2a891eaddad5d4a2240730a03a06458e71affb138b4c7719e59ee2967317" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/corpus.tsv", + "bytes": 4556458, + "sha256": "51036394c19bd2c3212a80fb67f7406e6f0d049ec018910d36a8d3856a0b270c" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/052-corpus.tsv.gz", + "bytes": 452756, + "sha256": "efc84fee8f38e4a1c11a0732159062da97da9fc73e26fb304babc4737ae8b15a" + }, + "gzip": true, + "raw_bytes": 4556458, + "raw_sha256": "51036394c19bd2c3212a80fb67f7406e6f0d049ec018910d36a8d3856a0b270c" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/execution.json", + "bytes": 1741, + "sha256": "aa28610e43ff59d7b1daae8151de5500f7c95d0565fc6f721ccccfc9d9d0ad65" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/053-execution.json", + "bytes": 1741, + "sha256": "aa28610e43ff59d7b1daae8151de5500f7c95d0565fc6f721ccccfc9d9d0ad65" + }, + "gzip": false, + "raw_bytes": 1741, + "raw_sha256": "aa28610e43ff59d7b1daae8151de5500f7c95d0565fc6f721ccccfc9d9d0ad65" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/input.json", + "bytes": 3289, + "sha256": "70e8a4e422ae229087454320fac2f5641cbfa24cee393a34cb79e1e14b7e392b" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/054-input.json", + "bytes": 3289, + "sha256": "70e8a4e422ae229087454320fac2f5641cbfa24cee393a34cb79e1e14b7e392b" + }, + "gzip": false, + "raw_bytes": 3289, + "raw_sha256": "70e8a4e422ae229087454320fac2f5641cbfa24cee393a34cb79e1e14b7e392b" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle", + "bytes": 59928, + "sha256": "f45dd0a7cdf79c632d29a276fbcc726c71a79d036009db72226fa182a2fd1043" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/055-oracle.gz", + "bytes": 16483, + "sha256": "a12db6181cea2b152647c9400e904daf2f77bbb8e4f08b22618668f600f8dc75" + }, + "gzip": true, + "raw_bytes": 59928, + "raw_sha256": "f45dd0a7cdf79c632d29a276fbcc726c71a79d036009db72226fa182a2fd1043" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/oracle.cpp", + "bytes": 3291, + "sha256": "5d786e3c3be56c87c4311f80f5e9d64411f0875bb00f97ca778d191dbffe8b66" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/056-oracle.cpp", + "bytes": 3291, + "sha256": "5d786e3c3be56c87c4311f80f5e9d64411f0875bb00f97ca778d191dbffe8b66" + }, + "gzip": false, + "raw_bytes": 3291, + "raw_sha256": "5d786e3c3be56c87c4311f80f5e9d64411f0875bb00f97ca778d191dbffe8b66" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/phase0.stderr", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/057-phase0.stderr", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/phase0.stdout", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/058-phase0.stdout", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/phase1.stderr", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/059-phase1.stderr", + "bytes": 0, + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "gzip": false, + "raw_bytes": 0, + "raw_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-numeric-r328/phase1.stdout", + "bytes": 32, + "sha256": "ae8d713cb96e313f625a63ce0d86216be75e7f4063a8ec2ce66abd8da181ec91" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/060-phase1.stdout", + "bytes": 32, + "sha256": "ae8d713cb96e313f625a63ce0d86216be75e7f4063a8ec2ce66abd8da181ec91" + }, + "gzip": false, + "raw_bytes": 32, + "raw_sha256": "ae8d713cb96e313f625a63ce0d86216be75e7f4063a8ec2ce66abd8da181ec91" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-static-independent-review-r326.json", + "bytes": 12687, + "sha256": "717f8aa9a1b12425b79f7dbbb81b4e0526de32ddd836114525b53d4fd7bc05e1" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/061-p23-02-native-hot-loop-static-independent-review-r326.json.gz", + "bytes": 3058, + "sha256": "2febf674f923e6dbd3b9e68134bc9a6fc4f32717a165b5071aa13f5653f7cf10" + }, + "gzip": true, + "raw_bytes": 12687, + "raw_sha256": "717f8aa9a1b12425b79f7dbbb81b4e0526de32ddd836114525b53d4fd7bc05e1" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-static-root-verification-r326.json", + "bytes": 6482, + "sha256": "4b3e08a9b9982f818c2eea96e0d4d6b927d32c9ddf76a4338cb71810d81486d6" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/062-p23-02-native-hot-loop-static-root-verification-r326.json", + "bytes": 6482, + "sha256": "4b3e08a9b9982f818c2eea96e0d4d6b927d32c9ddf76a4338cb71810d81486d6" + }, + "gzip": false, + "raw_bytes": 6482, + "raw_sha256": "4b3e08a9b9982f818c2eea96e0d4d6b927d32c9ddf76a4338cb71810d81486d6" + }, + { + "original": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-work-contract-r325.json", + "bytes": 2313, + "sha256": "bbb488bbb0229c31711982867375f41487ec7f5c9343eb6eb5903b8321e05602" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/063-p23-02-native-hot-loop-work-contract-r325.json", + "bytes": 2313, + "sha256": "bbb488bbb0229c31711982867375f41487ec7f5c9343eb6eb5903b8321e05602" + }, + "gzip": false, + "raw_bytes": 2313, + "raw_sha256": "bbb488bbb0229c31711982867375f41487ec7f5c9343eb6eb5903b8321e05602" + }, + { + "original": { + "path": "/private/tmp/thetree-numeric-oracle-r328.py", + "bytes": 5646, + "sha256": "21675754454c5d8fca8b35145217f32762243e39908e67bf2a1bdb783028c94c" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/064-thetree-numeric-oracle-r328.py", + "bytes": 5646, + "sha256": "21675754454c5d8fca8b35145217f32762243e39908e67bf2a1bdb783028c94c" + }, + "gzip": false, + "raw_bytes": 5646, + "raw_sha256": "21675754454c5d8fca8b35145217f32762243e39908e67bf2a1bdb783028c94c" + }, + { + "original": { + "path": "/private/tmp/thetree-plan-local-r329.py", + "bytes": 3582, + "sha256": "c44d13cdd092043bef03930d279aa40429f7eba0b8c64731e2139a8ade302633" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/065-thetree-plan-local-r329.py", + "bytes": 3582, + "sha256": "c44d13cdd092043bef03930d279aa40429f7eba0b8c64731e2139a8ade302633" + }, + "gzip": false, + "raw_bytes": 3582, + "raw_sha256": "c44d13cdd092043bef03930d279aa40429f7eba0b8c64731e2139a8ade302633" + }, + { + "original": { + "path": "/private/tmp/thetree-prepare-local-r329.py", + "bytes": 5951, + "sha256": "cd26cab2abf22c6f0f5eb70dc5de5fd2df1df473bf65c1c0efa93657bd16e86f" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/066-thetree-prepare-local-r329.py", + "bytes": 5951, + "sha256": "cd26cab2abf22c6f0f5eb70dc5de5fd2df1df473bf65c1c0efa93657bd16e86f" + }, + "gzip": false, + "raw_bytes": 5951, + "raw_sha256": "cd26cab2abf22c6f0f5eb70dc5de5fd2df1df473bf65c1c0efa93657bd16e86f" + }, + { + "original": { + "path": "/private/tmp/thetree-prepare-r326.py", + "bytes": 11548, + "sha256": "b75b738a0f4a785445b86e6d6ab99d6908337158b359c03f2cba049f18f7045a" + }, + "stored": { + "path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/067-thetree-prepare-r326.py.gz", + "bytes": 4144, + "sha256": "850ba11eb3861c73454dd85cf040e0d572d0e4d24edd9a0e93ec0d1a9d05bca1" + }, + "gzip": true, + "raw_bytes": 11548, + "raw_sha256": "b75b738a0f4a785445b86e6d6ab99d6908337158b359c03f2cba049f18f7045a" + } + ] +} diff --git a/docs/plans/original-completion-2026-10-02/execution/CURRENT_NATIVE_HOT_LOOP_R325_R329.md b/docs/plans/original-completion-2026-10-02/execution/CURRENT_NATIVE_HOT_LOOP_R325_R329.md new file mode 100644 index 0000000..b83bc95 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/execution/CURRENT_NATIVE_HOT_LOOP_R325_R329.md @@ -0,0 +1,17 @@ +# P23-02 native修正候補 r325–r329 + +ユーザーの現在成果をコミット・pushする指示に従い、r326/library327のソース、ビルド、局所証拠と独立レビューを保存する。制作r32、選定済み実装親r274/library275は変更していない。新候補は未選定・未採用であり、正式完了追加0。30パッケージ/88成果単位、部分点なし、正式9/着手19/予定60を維持する。 + +修正はnumeric frontierのheap化、cached edge参照、PackedInt64Array書込、nearest goal読取、性能記録の固定長配列、Guest99キーの呼出内保持にまとめた。callback順・算術・保存値・公開出力を保つ範囲で実装した。生成初期版から縮小入力互換性を修正した最終CPPはSHA256 a2434ef2fbc9624aa3b62746cebde2cacdce78712d4d866774df54fbd291bee3。Guest/Runtimeは親r313-r02とbyte不変。 + +r327はbridge compile1/link1、SDK compile0で正常終了し、libraryは417,184 bytes/SHA256 64608dccb3441594603fa5561fad3e2e90b055f32e4823c4864d2486a298602c。r328の16,388入力で原版・候補の7出力fieldsが全文一致した。実statusはusable13,549/unusable2,839/wrapped0であり、numeric corpus単独のwrap到達を認定しない。 + +r329はPID36884正常終了、7,415チェック/失敗0。Guest53記録606,268 bytesが原315と全文一致し、その固定rawに対応する既存codec証拠を再利用した。既存50protocolの原/cold/warm/clear、縮小入力、解放、同じcacheへの再入inner9/outer7/warm9を確認した。実wrap-prefixはこの局所protocol検査が支える。試験件数を成果単位の完了数に換算しない。 + +静的r326、build実r327、局所実r329は読取専用の独立レビューで有限scopeのみ支持された。r329 receiptは88,603 bytes/SHA256 56fab0fb4c8b9218dcfdf22b914f12843dad0b8fbadcfd96d81f0ef8ea8fa895、blockers=[]。rootがdirect161/current D4 4/archive4の169pinsを再照合し全一致した。ビルド、stage、source/default、canonical D4保持の証拠を保存している。 + +次に閉じる1件はP23-02、依存P08/P22。全受入条件・対象版はcurrent r320 dispositionと前記CURRENT_NATIVE_DIAGNOSTIC_R321_R323.mdを継承する。C01〜C09/X1〜X8の17条件は未受入。C08/X8だけWindows実機block。Ctrl+ホイールと左ボタン保持ドラッグはユーザー指示で延期し、未達・非免除のまま残す。 + +次の必要な検証は同じ保存入力によるS6とwhole647の比較(準備中r330、未実行)。代表負荷性能、安定利益、50ms/P95/D10、通常OS操作、小画面、x3、同一Windows、正確な最終版の必須全回帰・独立受入は未達。未確定の環境・数値は設定しない。今回の有限証拠を全状態一致・性能改善・正式単位受入へ拡張しない。 + +保存入口はcheckpoints/native-hot-loop-r325-r329/manifest.json。ソースと全証拠を内容保持圧縮し、全保存コピーの復元byte一致を検証した。既存成果や未実行検証を削除せず、今回のpushのために追加回帰や別の実装を起動していない。 diff --git a/docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-independent-review-r331.json.gz b/docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-independent-review-r331.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..1512496399cc3f7e99ab3e5c3d79ef52cc9d051f GIT binary patch literal 7902 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 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-root-verification-r331.json.gz b/docs/plans/original-completion-2026-10-02/execution/native-hot-loop-r331-review/p23-02-native-hot-loop-checkpoint-root-verification-r331.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..038a47ecfd30a4ed99dddea801bea49615f58089 GIT binary patch literal 6033 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 LppN}z8>|2Tyzbn< literal 0 HcmV?d00001

    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 M;y}FiWzIwY3qMe@00000 literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/044-protocol-report.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/044-protocol-report.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..08c7640c64a24ccb7fa8e858e5558901f3314273 GIT binary patch literal 2507 zcmV;+2{iT}iwFP!00002|LtAdZsRx-eNMhY@Y62P26(^BuWSz*MY5PN#<4xJoSDX; z|9vT6(n%~kl9Jd`nurrilpq!BoGMjP^{ z1rxuVhsl>+QN5XpHfwNm{JNlo6r`Xm{gT};OWQ1cTgEuojBsV7&{`Uz)9J;O7P}u- zh_q7|rSl7(_EaIiE}rew$Lbxn+kIj~vUWZ{SbK9rw?}Ts?u+lf#O{mjzSQnZ)_;HB zT?qf$z&u@}DmS<<`DcZ`O3qmS0Zgj8riyE-0VP;R6mt}W1jVV=0jN+wD5VC2mbR|0 z0%x>k=mifF12@9&jlL_Fn^k?i72{LFrVFTM4>HFVP*^e(rd|AUiPS+KbRk5`>QzuiWC3V6qMl5krz0My_b{6ww zIp5bpu)1C+>L9iiP|2(*-PS>Ei*}|bJD=?wj`37*mOttlV;b4Sdh*9Bv^H2D14Akk zUu^Ki2uV%iQ4EAfWFjb~X>$#1>D9 z*J+zjryWL~m;*KlEvfR7dMl`>XekX28PniCjz!n-eLEI?U%>s$7s)-Tdb$0|?N?Xk zK&-HAMI0`7#tYfUcv(~X+0J9)d@bdiZK~dua#A~$njCa*0lTqX2Myp}_yAITC8aFA7G8nG3B^uM9ifJjW z6)Xg64V4yxM-Hj8BM70)lAw(WAe@asT#7)~#Gn|uiqZ=wm}JNZP3gy2&O;y;ji)@M>?6>E-t^>6PB)o0-CC)6PBxh}eOQxIO(spp=br1-BhC-7GIRPer+vy%d*k&d z`WJ{m0~5qsW&%X21NYRZAOrPid?1!P@ESDG7>EQOf+7%_?z`0k)%iZDkg>Zs5$ zVbEG4MYJCvZS%6Stvpwsls(tSbGzoP_-likQ;pnXg8jOf*6b$RqJnLeU>>*M-@{%r zBkIZCC_SXxTai9e2x>GYSEmF+Pzb{;(^REgL%?&#gX2zXVWVm9;i`nidR9$WP*yXT zPw$p6Z;?nkIi?jFTNpyd;o3O3C6oa}u{S6Ka&15kIWWh@)uDj0Ot;KHTpftjGMSNX zTHMdp>)GP&B_fN%tj6zc%3Bh z)eea3zMpZtTGPnhv{;qPhgrb#jc=JePYS~Vr+I0lj8hX%S6Sfa^>v6wwsg-4u(~c= z^cq-KSx2YsqCX>BC+7rYUDpU2avp44VJD}-*I~NQaxrI?vl-b6FkMhO^9JIOgQf-m#i?^RWtc7qQ{$>A8K&1^y6O@iXBH+I*%}^wTCBkbRpZJYIjCNT=|am?oLNR= zWGhen0v*1_H7jy34Hc%`-5WAWO{+0vlm?1Y4y7T3baI`64AqdK%0V@3q>dHzGfD$R zDTmUaCtw@2;WJ9@P`ZH9`Dr2ck!hFr2T6`)3Zhx{JO|TxoUWsvdrob9WYV~;5F7P# zr!q&>XdXMg2tG|#-`YGIq@N8s$v06FWKar37hqUnloHmks>|op&T8d0xhIoI;YPJk-xMr{y_+ zCGYeS&1@^pIZh$XV@LLL-v~4XTL^oOQ(`b<*jXCkb6_}hCA$`~kmHoIdt>u6R@}Nq z*(b(rIKpZzvgnc5gxP#k;-le~a%H+W>HeIiL1W^2EEz;b(+lPhZ^x1`&CYdE>#tl1*W{FA#*57X~YPF-VF&9|4? zT6;735BXBmpZ`APL@K7wi|f)K`%6?%ZPq`dVR8tT`d`o5IYNJON9>gwe`P}4ZjVkj Vi&=FPPq#mA{}0tkY;aGz008#J&qe?M literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/045-report.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/045-report.json new file mode 100644 index 0000000..7a231c1 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/045-report.json @@ -0,0 +1,16 @@ +{ + "checks": 7415, + "custom_fallback_case_count": 7, + "decision_case_count": 4, + "failures": 0, + "fixture_bytes": 606268, + "fixture_sha256": "6ec6e879a2de02b9d4081295b33e53e2060f31829e1fb674168a414d8b3e5c2e", + "original_s3_invocations": 18, + "passed": true, + "performance_accepted": false, + "pid": 36884, + "protocol_cases": 50, + "protocol_checks": 6722, + "pure_case_count": 42, + "unit_accepted": false +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/046-local-phase.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/046-local-phase.json new file mode 100644 index 0000000..fa80ed4 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/046-local-phase.json @@ -0,0 +1,185 @@ +{ + "name": "local", + "result": { + "argv": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "pid": 36884, + "started_utc": "2026-10-12T03:57:42.177687+00:00", + "ended_utc": "2026-10-12T03:57:44.040127+00:00", + "wall_seconds": 1.86218475, + "exit_code": 0, + "helper_exit_code": 0, + "timed_out": false, + "stdout_sha256": "0d80fd887d3ae60d97ac91ec360387c6dd4aa06b0417cc000f2567e5b401735f", + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "error_lines": [], + "owned_popen_ended": true, + "old_helper_engine_ended": true, + "start_receipt_written": true, + "end_receipt_written": true, + "lifecycle_error": null, + "old_helper_lifecycle_error": null, + "actual_start_binding": { + "scope": "isolated diagnostic owned child", + "event": "ENGINE_STARTED", + "actual_pid": 36884, + "owner_pid": 36862, + "command": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "monotonic_ns": 2683606125, + "pid": 36884, + "argv": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "started_utc": "2026-10-12T03:57:42.177687+00:00", + "current_process_identity": { + "pid": 36884, + "ppid": 36862, + "pgid": 36884, + "args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + }, + "live_identity_exact": true, + "tracked_child_ended_before_initial_probe": false, + "signal_scope": "tracked Popen child only; no external group signal" + }, + "actual_end_binding": { + "scope": "isolated diagnostic owned child", + "event": "ENGINE_ENDED", + "actual_pid": 36884, + "owner_pid": 36862, + "command": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "monotonic_ns": 4535962000, + "exit_code": 0, + "actual_process_exit_code": 0, + "engine_ended": true, + "timed_out": false, + "lifecycle_error": null, + "start_receipt_written": true, + "pid": 36884, + "argv": [ + "/Applications/Godot.app/Contents/MacOS/Godot", + "--headless", + "--path", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage", + "--script", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/candidate-guarded.gd", + "--verbose", + "--log-file", + "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/local/engine-native.log" + ], + "ended_utc": "2026-10-12T03:57:44.034797+00:00", + "signal_scope": "tracked Popen child only; no external group signal" + }, + "strict_native_diagnostics": { + "errors": [], + "banner_count": 1, + "known_unicode_diagnostic_count": 0, + "unrecognized_unicode_diagnostic_count": 0, + "exit_leak_diagnostic_lines": [] + }, + "external_process_or_group_signals": 0, + "owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037", + "adapter_owned_cleanup": { + "owned_child_created": true, + "engine_ended": true, + "actual_process_exit_code": 0, + "attempts": [ + { + "attempt": 1, + "kill_attempted": false, + "wait_timeout_seconds": 5, + "wait_completed": true, + "errors": [], + "poll_before": 0, + "wait_returned_code": 0, + "poll_after": 0 + } + ], + "errors": [] + }, + "adapter_error": null, + "old_helper_bytes_preserved": true, + "helper_wait_None_maps_to_actual_timeout_seconds": 5, + "explicit_helper_wait_timeouts_preserved": true, + "additional_cleanup_wait_timeout_seconds": 5, + "additional_cleanup_max_attempts": 3 + }, + "capture": { + "actual_captured_pids": [ + 36884 + ], + "cleanup": [ + { + "pid": 36884, + "cleanup": { + "owned_child_created": true, + "engine_ended": true, + "actual_process_exit_code": 0, + "attempts": [ + { + "attempt": 1, + "kill_attempted": false, + "wait_timeout_seconds": 5, + "wait_completed": true, + "errors": [], + "poll_before": 0, + "wait_returned_code": 0, + "poll_after": 0 + } + ], + "errors": [] + }, + "outer_cleanup_errors": [], + "engine_ended": true, + "outer_maximum_helper_invocations": 3, + "helper_maximum_waits": 3, + "per_wait_timeout_seconds": 5, + "foreign_process_or_group_signals": 0 + } + ], + "adapter_exception": null, + "all_captured_ended": true, + "outer_cleanup_errors": [], + "foreign_process_or_group_signals": 0, + "all_cleanup_before_outer_receipt": true, + "outer_receipt_written": true, + "outer_receipt_error": null, + "passed": true + } +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/047-local-profile.json b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/047-local-profile.json new file mode 100644 index 0000000..b0dff9f --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/047-local-profile.json @@ -0,0 +1,20 @@ +{ + "actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-8457ef5c03f34d3e873fd1f43b7716fd-guest-runtime", + "before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-8457ef5c03f34d3e873fd1f43b7716fd-guest-startup", + "conditions": [ + true, + true, + true, + true, + true + ], + "conditions_checked": 5, + "custom_user_dir_name": "TheTree-PCK-tests-8457ef5c03f34d3e873fd1f43b7716fd-guest-runtime", + "expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-8457ef5c03f34d3e873fd1f43b7716fd-guest-runtime", + "fresh_before_parent_initialize": true, + "globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-8457ef5c03f34d3e873fd1f43b7716fd-guest-runtime/guard-probe", + "profile_writes_before_guard": 0, + "project_settings_persisted": false, + "runtime_settings_only": true, + "verified": true +} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/048-local.gd b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/048-local.gd new file mode 100644 index 0000000..cb727c8 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/048-local.gd @@ -0,0 +1,285 @@ +extends "res://tests/s3/test_guest_service.gd" + +const OriginalGuestScript = preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-original-oracle-r315.gd") + +class CustomGuest: + extends GuestRuntime +class CustomDefinition: + extends GuestDefinition +class CustomService: + extends GuestService +class FakeCore: + extends RefCounted + var calls := 0 + func guest_candidate_batch(_owner, _id, _facilities, _context) -> Dictionary: + calls += 1 + return {&"supported": false} + +const ProtocolHelper = preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-local-r329/protocol_helper.gd") + +var _bulk_records: Array = [] +var _bulk_core: Object +var _bulk_cases := 0 + +func _bulk_state(service) -> Array: + var order: Array[StringName] = service._sorted_guest_ids_cache.duplicate() + var dirty: bool = service._guest_order_dirty + return [service.create_snapshot(), service.last_error, service._decision_rejections.duplicate(true), service._diagnostics.duplicate(true), order, dirty, service._pending_spawn_notifications.duplicate(true), service._external_mutation_blocked, service.current_minute] + +func _bulk_prime(service) -> void: + service.get_guests() + +func _bulk_original(service): + var oracle = OriginalGuestScript.new() + _expect(oracle.restore_snapshot(service.create_snapshot()), "literal original Guest independent state restored") + _bulk_prime(oracle) + return oracle + +func _bulk_array_shape(rows: Array) -> Array: + var shapes: Array = [rows.is_typed(), rows.get_typed_builtin(), rows.is_read_only()] + for row: Dictionary in rows: + shapes.append([row.is_typed(), row.is_read_only()]) + return shapes + +func _bulk_service() -> GuestService: + var service := _service_with_definitions() + service.spawn_guest(&"bulk", &"adventurer", 0, { + &"wallet_gold": 500, &"planned_exit_at": 1000, + &"state": GuestRuntimeType.State.DECIDING, + &"needs": {&"hunger": 80, &"sleep": 30, &"hygiene": 40, &"medical": 20, &"leisure": 60, &"intimacy": 50}, + }) + _bulk_prime(service) + return service + +func _bulk_compare(label: String, rows: Array, patch: Dictionary = {}, context: Dictionary = {}) -> void: + _bulk_cases += 1 + var service := _bulk_service() + var oracle = _bulk_original(service) + var guest := service.get_guest(&"bulk") + for key: Variant in patch: + guest.set(key, patch[key]) + oracle.get_guest(&"bulk").set(key, patch[key]) + service.last_error = "retained-before-pure-call" + var before := var_to_bytes(_bulk_state(service)) + var input_before := var_to_bytes(rows) + var batch: Dictionary = _bulk_core.call(&"guest_candidate_batch", service, &"bulk", rows, context) + _expect(bool(batch.get(&"supported", false)), label + " supported fixed pure input") + _expect(var_to_bytes(_bulk_state(service)) == before, label + " pure call preserves full Guest snapshot/errors/rejections") + _expect(var_to_bytes(rows) == input_before, label + " input ownership preserved") + if not bool(batch.get(&"supported", false)): return + var accepted: Array[Dictionary] = oracle.extract_candidates(&"bulk", rows, context) + var rejected: Array[Dictionary] = oracle.get_last_candidate_rejections(&"bulk") + var ranked: Array[Dictionary] = oracle.rank_candidates(&"bulk", accepted) + _expect(_bulk_array_shape(batch[&"accepted"]) == _bulk_array_shape(accepted), label + " accepted type/readonly shape original equality") + _expect(_bulk_array_shape(batch[&"ranked"]) == _bulk_array_shape(ranked), label + " ranked type/readonly shape original equality") + _expect(var_to_bytes(batch[&"accepted"]) == var_to_bytes(accepted), label + " entire ordered typed accepted original equality") + _expect(var_to_bytes(batch[&"rejected"]) == var_to_bytes(rejected), label + " entire ordered typed rejection original equality") + _expect(var_to_bytes(batch[&"ranked"]) == var_to_bytes(ranked), label + " entire ordered typed scoring/ranking original equality") + _bulk_records.append({&"case": label, &"input": rows.duplicate(true), &"context": context.duplicate(true), &"patch": patch.duplicate(true), &"actual": batch.duplicate(true), &"accepted_original": accepted, &"rejected_original": rejected, &"ranked_original": ranked}) + if not (batch[&"ranked"] as Array).is_empty(): + var accepted_before := var_to_bytes(batch[&"accepted"]) + var actual: Dictionary = batch[&"ranked"][0] + actual[&"ownership_probe"] = true + if actual.get(&"path_handle") is Dictionary: actual[&"path_handle"][&"ownership_probe"] = true + _expect(var_to_bytes(rows) == input_before, label + " ranked mutation is isolated from caller input") + _expect(var_to_bytes(batch[&"accepted"]) == accepted_before, label + " ranked deep copy is isolated from accepted candidates") + +func _test_bulk_candidates() -> void: + _bulk_core = ClassDB.instantiate(&"TheTreeNumericCore") + _expect(_bulk_core != null and _bulk_core.has_method(&"guest_candidate_batch"), "exact new batch binding exists") + if _bulk_core == null or not _bulk_core.has_method(&"guest_candidate_batch"): return + var base := _candidate(&"a", {&"need_relief": {&"hunger": 80, &"leisure": 20}, &"facility_tags": [&"meal", &"leisure", &"meal"], &"path_handle": {&"path": [Vector3i.ZERO, Vector3i(1, 0, 0)], &"target_cell": Vector3i(1, 0, 0)}}) + _bulk_compare("ordinary", [base]) + _bulk_compare("empty", []) + _bulk_compare("skip-nondictionary-and-empty-id", [null, 4, "ignored", {}, {&"facility_id": &""}, base]) + var duplicates: Array = [] + for i in range(64): + var row := base.duplicate(true) + row[&"facility_id"] = StringName("b" if i % 3 == 0 else "a") + row[&"probe_index"] = i + duplicates.append(row) + _bulk_compare("equal-sort-keys64", duplicates) + var branches := [ + {&"need_relief": {&"rest": 1}, &"inputs_available": false}, + {&"need_effects": {&"hunger": 1.0}}, + {&"need_relief": null}, {&"need_relief": true}, + {&"inputs_available": false, &"adult_only": true}, + {&"adult_only": true}, {&"required_guest_tags": [&"missing"]}, + {&"forbidden_guest_tags": [&"general"]}, {&"allowed_guest_types": [&"other"]}, + {&"is_open": false, &"reachable": false}, {&"reachable": false}, + {&"travel_minutes": 1001}, {&"price_gold": 10000}, + {&"wait_minutes": 120}, {&"risk_level": 100}, {&"illegal_level": 100}, + {&"expected_quality": 0}, {&"is_open": false, &"open_at_arrival": true}, + {&"credit_allowed": true, &"price_gold": 550}, + {&"discretionary": true, &"price_gold": 400}, + {&"respect_survival_reserve": false, &"discretionary": true, &"price_gold": 400}, + {&"risk": 90, &"risk_level": 0, &"risk_sensitivity": 3}, + {&"legal_permission_override": true, &"illegal_level": 100}, + {&"need_relief": -100, &"travel_minutes": -2, &"wait_minutes": -3}, + {&"ok": false}, {&"ok": 0}, + {&"preference": 9223372036854775807, &"group_fit": -9223372036854775808, &"repetition_penalty": -9223372036854775808}, + {&"price_gold": 9223372036854775807, &"credit_allowed": true}, + {&"risk": 9223372036854775807, &"risk_level": 0, &"risk_sensitivity": 9223372036854775807}, + {&"need_relief": {"hunger": 9223372036854775807, "medical": -9223372036854775808}}, + {&"novelty": -10, &"urgency": 77, &"price_burden": 100}, + ] + for i in range(branches.size()): + var row := base.duplicate(true) + for key: Variant in branches[i]: row[key] = branches[i][key] + _bulk_compare("branch-%02d" % i, [row, base]) + var string_keys := {} + for key: Variant in base: string_keys[String(key)] = base[key] + _bulk_compare("string-keys", [string_keys]) + _bulk_compare("visited-defaults", [base], {&"visited_facility_ids": [&"a"]}) + _bulk_compare("addiction-removes-reserve", [_candidate(&"a", {&"discretionary": true, &"price_gold": 500})], {&"addiction_by_tag": {&"gambling": 75}}) + _bulk_compare("wallet-wrap", [base], {&"wallet_gold": 9223372036854775807, &"credit_limit_gold": 9223372036854775807, &"debt_gold": -9223372036854775808}) + _bulk_compare("context-gates", [base], {}, {&"absolute_minute": 999, &"wait_hard_limit": 1}) + var readonly := base.duplicate(true) + readonly.make_read_only() + var readonly_rows: Array = [readonly] + readonly_rows.make_read_only() + _bulk_compare("readonly-input", readonly_rows) + var rank_rows: Array = [ + _candidate(&"priority", {&"need_relief": {&"hunger": 1}, &"novelty": 0}), + _candidate(&"medical", {&"need_relief": {&"medical": 100}, &"preference": 100}), + _candidate(&"utility", {&"need_relief": {&"hunger": 1}, &"novelty": 10}), + _candidate(&"urgency-a", {&"need_relief": {&"hunger": 1}, &"urgency": 90}), + _candidate(&"urgency-b", {&"need_relief": {&"hunger": 1}, &"urgency": 10}), + _candidate(&"travel-a", {&"need_relief": {&"hunger": 1}, &"travel_minutes": 1, &"group_fit": 1}), + _candidate(&"travel-b", {&"need_relief": {&"hunger": 1}, &"travel_minutes": 2, &"group_fit": 2}), + ] + _bulk_compare("all-rank-tuple-components", rank_rows) + _test_bulk_fallback_and_decision(base) + _test_bulk_custom_and_typed(base) + +func _test_bulk_fallback_and_decision(base: Dictionary) -> void: + for label in ["ordinary", "float-conversion", "reach-callback", "reserve-callback"]: + var actual := _bulk_service() + var oracle = _bulk_original(actual) + var a_signals: Array = [] + var b_signals: Array = [] + actual.guest_state_changed.connect(func(id: StringName, old: int, new_state: int, reason: StringName) -> void: a_signals.append([id, old, new_state, reason])) + oracle.guest_state_changed.connect(func(id: StringName, old: int, new_state: int, reason: StringName) -> void: b_signals.append([id, old, new_state, reason])) + var a_calls: Array = [] + var b_calls: Array = [] + var a_context := {&"absolute_minute": 10} + var b_context := {&"absolute_minute": 10} + if label == "reach-callback": + a_context[&"reachability_callback"] = func(_guest: GuestRuntime, candidate: Dictionary, _context: Dictionary) -> bool: + a_calls.append(candidate[&"facility_id"]); candidate[&"callback_probe"] = true; return true + b_context[&"reachability_callback"] = func(_guest: GuestRuntime, candidate: Dictionary, _context: Dictionary) -> bool: + b_calls.append(candidate[&"facility_id"]); candidate[&"callback_probe"] = true; return true + if label == "reserve-callback": + a_context[&"reserve_callback"] = func(_guest_id: StringName, facility_id: StringName, candidate: Dictionary) -> bool: + a_calls.append(facility_id); candidate[&"callback_probe"] = true; return true + b_context[&"reserve_callback"] = func(_guest_id: StringName, facility_id: StringName, candidate: Dictionary) -> bool: + b_calls.append(facility_id); candidate[&"callback_probe"] = true; return true + var row := base.duplicate(true) + if label == "float-conversion": row[&"travel_minutes"] = 1.75 + var input_before := var_to_bytes([row]) + var state_before := var_to_bytes(_bulk_state(actual)) + var batch: Dictionary = _bulk_core.call(&"guest_candidate_batch", actual, &"bulk", [row], a_context) + _expect(bool(batch[&"supported"]) == (label == "ordinary"), label + " supported or whole original fallback domain") + _expect(var_to_bytes(_bulk_state(actual)) == state_before and a_calls.is_empty(), label + " probe causes no observable state/callback effects") + var got := actual.decide_with_native_candidates(_bulk_core, &"bulk", [row], 10, a_context) + var expected: Dictionary = oracle.decide(&"bulk", [row], 10, b_context) + _expect(var_to_bytes(got) == var_to_bytes(expected), label + " entire typed decision result matches original") + _expect(var_to_bytes(_bulk_state(actual)) == var_to_bytes(_bulk_state(oracle)), label + " entire Guest state/errors/rejection matches original") + _expect(a_calls == b_calls, label + " callback count/order preserves original single dispatch") + _expect(a_signals == b_signals, label + " state notification content/order original equality") + _expect(var_to_bytes([row]) == input_before, label + " decision input ownership preserved") + _bulk_records.append({&"decision_case": label, &"actual_result": got, &"original_result": expected, &"actual_state": _bulk_state(actual), &"original_state": _bulk_state(oracle), &"actual_calls": a_calls, &"original_calls": b_calls, &"actual_signals": a_signals, &"original_signals": b_signals}) + +func _test_bulk_custom_and_typed(base: Dictionary) -> void: + for label in ["typed-dictionary", "custom-guest", "custom-definition", "custom-service", "fake-core", "unknown-guest", "missing-definition"]: + var actual = _bulk_service() + var oracle = _bulk_original(actual) + var row: Dictionary = base.duplicate(true) + if label == "typed-dictionary": + var typed: Dictionary[StringName, Variant] = {} + for key: Variant in row: typed[StringName(key)] = row[key] + row = typed + if label == "custom-guest": + var custom := CustomGuest.new() + custom.configure(&"bulk", &"adventurer", actual.get_guest(&"bulk").create_snapshot()) + actual._guests[&"bulk"] = custom + if label == "custom-definition": + var custom := CustomDefinition.new() + custom.configure(&"adventurer", actual.get_definition(&"adventurer").create_snapshot()) + actual._definitions[&"adventurer"] = custom + if label == "custom-service": + var custom := CustomService.new() + _expect(custom.restore_snapshot(actual.create_snapshot()), label + " custom owner independent restore") + actual = custom + _bulk_prime(actual) + if label == "unknown-guest": + actual._guests.clear(); actual._guest_order_dirty = true + oracle._guests.clear(); oracle._guest_order_dirty = true + if label == "missing-definition": + actual._definitions.erase(&"adventurer") + oracle._definitions.erase(&"adventurer") + _bulk_prime(actual); _bulk_prime(oracle) + var before := var_to_bytes(_bulk_state(actual)) + var input_before := var_to_bytes([row]) + var selected_core: Object = FakeCore.new() if label == "fake-core" else _bulk_core + var probe: Dictionary = _bulk_core.call(&"guest_candidate_batch", actual, &"bulk", [row], {}) + _expect(bool(probe[&"supported"]) == (label == "fake-core"), label + " unsupported domain gate") + _expect(var_to_bytes(_bulk_state(actual)) == before, label + " unsupported returns before error/state changes") + var got: Dictionary = actual.decide_with_native_candidates(selected_core, &"bulk", [row], 10, {}) + var expected: Dictionary = oracle.decide(&"bulk", [row], 10, {}) + _expect(var_to_bytes(got) == var_to_bytes(expected), label + " literal original decision equality") + _expect(var_to_bytes(_bulk_state(actual)) == var_to_bytes(_bulk_state(oracle)), label + " literal original state/error/rejection equality") + _expect(var_to_bytes([row]) == input_before, label + " original fallback input ownership") + if label == "fake-core": _expect(int(selected_core.get("calls")) == 0, "non-native core does not receive public wrapper call") + _bulk_records.append({&"fallback_case": label, &"actual_result": got, &"original_result": expected, &"actual_state": _bulk_state(actual), &"original_state": _bulk_state(oracle)}) + _bulk_core = null + +func _bulk_sha256(bytes: PackedByteArray) -> String: + var digest := HashingContext.new() + if digest.start(HashingContext.HASH_SHA256) != OK: return "" + if digest.update(bytes) != OK: return "" + return digest.finish().hex_encode() + +func _run() -> void: + _test_definition_and_runtime_contract() + _test_need_updates_and_single_clamp() + _test_need_context_and_adult_gate() + _test_shared_need_context_fast_paths() + _test_batched_need_updates_match_individual_api() + _test_candidate_filtering() + _test_integer_utility_and_stable_tie_break() + _test_primary_need_priority() + _test_state_machine_and_loop_guard() + _test_atomic_queue_abandonment() + _test_service_interruption_is_idempotent() + _test_service_need_effect_schema() + _test_path_failure_safe_recovery() + _test_exit_persistence_boundary() + _test_overdue_departure_snapshot() + _test_snapshot_round_trip_and_atomic_rejection() + _test_v1_need_migration_and_schema_rejection() + _test_deterministic_decision_snapshot() + _test_bulk_candidates() + var output := OS.get_environment("THE_TREE_RUNTIME_MONITOR_OUTPUT") + var protocol = ProtocolHelper.new() + var protocol_core: Object = ClassDB.instantiate(&"TheTreeNumericCore") + var protocol_report: Dictionary = protocol.run_frozen(protocol_core,"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-bridge-Godot-protocol-preparation-r73/pinned-inputs.json") + var core_ref: WeakRef = weakref(protocol_core) + protocol_core = null + _expect(core_ref.get_ref() == null, "combined protocol core with populated cache releases") + _checks += int(protocol_report["checks"]) + _failures += protocol_report["failures"].size() + var protocol_file := FileAccess.open(output.path_join("protocol-report.json"),FileAccess.WRITE) + if protocol_file == null: quit(98); return + protocol_file.store_string(JSON.stringify(protocol_report,"\t")+"\n");protocol_file.close() + protocol = null + var bytes := var_to_bytes(_bulk_records) + var file := FileAccess.open(output.path_join("fixtures.varbytes"), FileAccess.WRITE) + if file == null: quit(98); return + file.store_buffer(bytes); file.close() + var report := {"passed": _failures == 0, "checks": _checks, "failures": _failures, "pure_case_count": _bulk_cases, "decision_case_count": 4, "custom_fallback_case_count": 7, "original_s3_invocations": 18, "protocol_cases": 50, "protocol_checks": int(protocol_report["checks"]), "pid": OS.get_process_id(), "fixture_bytes": bytes.size(), "fixture_sha256": _bulk_sha256(bytes), "performance_accepted": false, "unit_accepted": false} + file = FileAccess.open(output.path_join("report.json"), FileAccess.WRITE) + if file == null: quit(98); return + file.store_string(JSON.stringify(report, "\t") + "\n"); file.close() + print("Guest bulk local: %d checks, %d failures" % [_checks, _failures]) + quit(0 if _failures == 0 else 1) diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/049-preexecution-root-verification.json.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/049-preexecution-root-verification.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..cd21d65c06e755937912400d940f687c73d21119 GIT binary patch literal 5171 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 NU8n7?x;Nap^FN6sUpW8( literal 0 HcmV?d00001 diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/050-protocol_helper.gd b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/050-protocol_helper.gd new file mode 100644 index 0000000..71cba2b --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/050-protocol_helper.gd @@ -0,0 +1,292 @@ +extends RefCounted +# Isolated protocol/marshalling QA only. No production PathService or performance claim. + +class EdgeProvider extends RefCounted: + var rows: Array = [] + var calls: Array[int] = [] + func edges(cell: Vector3i) -> Array: + calls.append(cell.x) + return rows[cell.x] + +class ShrinkingProvider extends RefCounted: + var cells: Array[Vector3i] = [] + var calls: Array[Vector3i] = [] + func edges(cell: Vector3i) -> Array: + calls.append(cell) + cells.resize(2) + return [[Vector3i(1, 0, 0), 7]] + +var failures: Array[String] = [] +var checks: int = 0 +var cases: Array = [] +var cached_cases: Array = [] + + +func _check(condition: bool, label: String) -> void: + checks += 1 + if not condition: + failures.append(label) + +func _ints(text: String) -> Array[int]: + var result: Array[int] = [] + for token in text.replace("\n", " ").split(" ", false): + _check(token.is_valid_int() and str(token.to_int()) == token, "canonical signed integer " + token) + result.append(token.to_int()) + return result + +func _line(values) -> String: + var text: PackedStringArray = [] + for value in values: + text.append(str(value)) + return " ".join(text) + "\n" + +func _serialized(output: Dictionary) -> String: + var status = output.get(&"status", "missing") + _check(typeof(status) == TYPE_STRING, "status String") + var text: String = str(status) + "\n" + for key in output: + _check(typeof(key) == TYPE_STRING_NAME, "output StringName key") + if status != "usable": + _check(output.size() == 1, "unusable/wrapped status only") + return text + _check(output.size() == 6, "usable six output fields") + _check(typeof(output.get(&"cost_values")) == TYPE_PACKED_INT64_ARRAY, "cost PackedInt64Array") + _check(typeof(output.get(&"parent_indices")) == TYPE_PACKED_INT64_ARRAY, "parents PackedInt64Array") + for name in [&"discovered", &"parent_discovered"]: + var values = output.get(name) + _check(typeof(values) == TYPE_ARRAY and values.is_typed() and values.get_typed_builtin() == TYPE_INT, "typed Array[int] " + str(name)) + for name in [&"cost_values", &"parent_indices", &"discovered", &"parent_discovered"]: + text += _line(output.get(name, [])) + var settled: Dictionary = output.get(&"settled", {}) + var indices: Array[int] = [] + for cell in settled: + _check(typeof(cell) == TYPE_VECTOR3I and typeof(settled[cell]) == TYPE_BOOL and settled[cell], "settled Vector3i -> true") + indices.append(cell.x) + text += _line(indices) + return text + +func _case(core, row: Dictionary) -> void: + var tokens := _ints(FileAccess.get_file_as_string(row["input_path"])) + var count: int = tokens[0] + var start: int = tokens[1] + var goal_count: int = tokens[2] + var cursor: int = 3 + var cells: Array[Vector3i] = [] + var indices: Dictionary = {} + for i in count: + var cell := Vector3i(i, 0, 0) + cells.append(cell) + indices[cell] = i + var goals: Dictionary = {} + for i in goal_count: + goals[Vector3i(tokens[cursor], 0, 0)] = true + cursor += 1 + var provider := EdgeProvider.new() + for i in count: + var edge_count: int = tokens[cursor] + cursor += 1 + var edges: Array = [] + for j in edge_count: + edges.append([Vector3i(tokens[cursor], 0, 0), tokens[cursor + 1]]) + cursor += 2 + provider.rows.append(edges) + _check(cursor == tokens.size(), "complete input consumption") + var before := var_to_bytes([cells, indices, goals, provider.rows]) + var output = core.call("search", cells, indices, start, goals, Callable(provider, "edges")) + _check(typeof(output) == TYPE_DICTIONARY, "result Dictionary") + var actual := _serialized(output) + var expected := FileAccess.get_file_as_string(row["expected_path"]) + _check(actual == expected, "whole protocol bytes: " + str(row["group"]) + " / " + str(row["case"])) + _check(var_to_bytes([cells, indices, goals, provider.rows]) == before, "caller input ownership") + cases.append({"group": row["group"], "case": row["case"], "actual": actual, "expected_sha256": row["expected_sha256"], "equal": actual == expected, "provider_calls": provider.calls.duplicate()}) + # Separate cached API: one immutable caller graph until explicit clear. + core.call("clear_edge_cache") + provider.calls.clear() + var cold: Dictionary = core.call("search_cached", cells, indices, start, goals, Callable(provider, "edges")) + var cold_bytes := var_to_bytes(cold) + var cold_calls := provider.calls.duplicate() + _check(_serialized(cold) == expected and cold_bytes == var_to_bytes(output), "cached cold full typed output equals original") + provider.calls.clear() + var warm: Dictionary = core.call("search_cached", cells, indices, start, goals, Callable(provider, "edges")) + _check(_serialized(warm) == expected and var_to_bytes(warm) == cold_bytes, "cached warm full typed output equals original") + var warm_calls := provider.calls.duplicate() + _check(provider.calls.is_empty(), "warm search makes no already-cached provider calls") + # The original API remains uncached even on an instance with a warm cache. + provider.calls.clear() + var uncached: Dictionary = core.call("search", cells, indices, start, goals, Callable(provider, "edges")) + _check(var_to_bytes(uncached) == cold_bytes and provider.calls == cold_calls, "original API ignores warm native cache") + if cold.get(&"status") == "usable": + cold[&"cost_values"][0] = 12345 + cold[&"parent_indices"][0] = 12345 + cold[&"discovered"].clear() + cold[&"parent_discovered"].clear() + cold[&"settled"].clear() + var owned: Dictionary = core.call("search_cached", cells, indices, start, goals, Callable(provider, "edges")) + _check(var_to_bytes(owned) == cold_bytes, "external result mutations do not alter cached edge vectors or fresh output") + core.call("clear_edge_cache") + provider.calls.clear() + var cleared: Dictionary = core.call("search_cached", cells, indices, start, goals, Callable(provider, "edges")) + _check(var_to_bytes(cleared) == cold_bytes and provider.calls == cold_calls, "clear repeats original lazy calls and full output") + _check(var_to_bytes([cells, indices, goals, provider.rows]) == before, "cached APIs preserve all caller inputs") + cached_cases.append({"group":row["group"], "case":row["case"], "cold":_serialized(cleared), "warm":_serialized(warm), "expected_sha256":row["expected_sha256"], "cold_calls":cold_calls, "warm_calls":warm_calls, "equal":var_to_bytes(cleared)==cold_bytes and var_to_bytes(warm)==cold_bytes}) + var provider_weak: WeakRef = weakref(provider) + provider = null + _check(provider_weak.get_ref() == null, "native cache does not retain the provider Callable") + output = null + cold = {}; warm = {}; uncached = {}; cleared = {} + +func _prefix_wrap(core, malformed) -> void: + var cells: Array[Vector3i] = [Vector3i.ZERO, Vector3i(1, 0, 0), Vector3i(2, 0, 0)] + var indices: Dictionary = {cells[0]: 0, cells[1]: 1, cells[2]: 2} + var provider := EdgeProvider.new() + provider.rows = [[[cells[1], 9223372036854775802]], [[cells[2], 10], malformed], []] + var goals: Dictionary = {cells[2]: true} + var before := var_to_bytes([cells, indices, goals, provider.rows]) + var output = core.call("search", cells, indices, 0, goals, Callable(provider, "edges")) + _check(_serialized(output) == "wrapped\n", "wrap before later malformed row") + _check(var_to_bytes([cells, indices, goals, provider.rows]) == before, "prefix-wrap caller ownership") + provider = null + output = null + +func _shrink_transfer(core) -> void: + var cells: Array[Vector3i] = [Vector3i.ZERO, Vector3i(1, 0, 0), Vector3i(2, 0, 0)] + var indices: Dictionary = {cells[0]: 0, cells[1]: 1, cells[2]: 2} + var goals: Dictionary = {cells[1]: true} + var fixed_before := var_to_bytes([indices, goals]) + var provider := ShrinkingProvider.new() + provider.cells = cells + var output = core.call("search", cells, indices, 0, goals, Callable(provider, "edges")) + # Old bridge transfers only the post-search prefix: the allocated third slots stay zero. + var expected := "usable\n0 7 0\n-1 0 0\n0 1\n1\n0 1\n" + _check(_serialized(output) == expected, "provider shrink preserves original transferred prefix and zero tail") + _check(cells.size() == 2 and provider.calls == [Vector3i.ZERO], "single lazy callback shrinks shared cells") + _check(var_to_bytes([indices, goals]) == fixed_before, "shrink fixture maps unchanged") + var costs: PackedInt64Array = output[&"cost_values"].duplicate() + var parents: PackedInt64Array = output[&"parent_indices"].duplicate() + costs[0] = 12345 + parents[0] = 12345 + _check(_serialized(output) == expected, "PackedInt64Array explicit duplicates do not mutate retained result") + var shared_costs: PackedInt64Array = output[&"cost_values"] + var shared_parents: PackedInt64Array = output[&"parent_indices"] + shared_costs[0] = 12345 + shared_parents[0] = 12345 + _check(_serialized(output) == "usable\n12345 7 0\n12345 0 0\n0 1\n1\n0 1\n", "PackedInt64Array aliases retain documented shared mutation") + # A new search allocates new outputs; external result mutations cannot poison it. + output[&"cost_values"] = PackedInt64Array([12345]) + output[&"parent_indices"] = PackedInt64Array([12345]) + cells.append(Vector3i(2, 0, 0)) + provider.calls.clear() + var repeated = core.call("search", cells, indices, 0, goals, Callable(provider, "edges")) + _check(_serialized(repeated) == expected, "fresh result ownership after caller mutation") + _check(provider.calls == [Vector3i.ZERO] and cells.size() == 2, "repeat shrink lazy callback") + provider = null + output = null + repeated = null + +func _cached_goals_and_reset(core) -> void: + core.call("clear_edge_cache") + var cells: Array[Vector3i] = [Vector3i.ZERO, Vector3i(1, 0, 0), Vector3i(2, 0, 0)] + var indices: Dictionary = {cells[0]:0, cells[1]:1, cells[2]:2} + var provider := EdgeProvider.new() + provider.rows = [[[cells[1],7],[cells[2],20]], [[cells[2],3]], []] + var goals: Dictionary = {cells[1]:true} + var first: Dictionary = core.call("search_cached", cells, indices, 0, goals, Callable(provider,"edges")) + _check(first[&"status"] == "usable" and first[&"cost_values"][1] == 7 and provider.calls == [0], "first goal stops before requesting goal edges or unseen node") + provider.calls.clear(); goals = {cells[2]:true} + var later: Dictionary = core.call("search_cached", cells, indices, 0, goals, Callable(provider,"edges")) + _check(provider.calls == [1], "changed goals lazily request only the newly expanded node") + var oracle: Dictionary = core.call("search", cells, indices, 0, goals, Callable(provider,"edges")) + _check(var_to_bytes(later)==var_to_bytes(oracle), "changed goals full typed equivalence") + provider.calls.clear() + var shifted: Dictionary = core.call("search_cached", cells, indices, 1, goals, Callable(provider,"edges")) + _check(provider.calls.is_empty(), "changed start reuses previously expanded node only") + oracle = core.call("search", cells, indices, 1, goals, Callable(provider,"edges")) + _check(var_to_bytes(shifted)==var_to_bytes(oracle), "changed start full typed equivalence") + # Graph mutation obeys the explicit API contract: clear before reuse. + provider.rows[0][0][1] = 2 + core.call("clear_edge_cache"); provider.calls.clear() + var changed: Dictionary = core.call("search_cached", cells, indices, 0, goals, Callable(provider,"edges")) + _check(provider.calls == [0,1], "clear after edge mutation repopulates exact lazy nodes") + oracle = core.call("search", cells, indices, 0, goals, Callable(provider,"edges")) + _check(var_to_bytes(changed)==var_to_bytes(oracle) and changed[&"cost_values"][2]==5, "mutated graph after clear has complete correct output") + core.call("clear_edge_cache") + provider = null + +func _cached_prefix_wrap(core, malformed) -> void: + core.call("clear_edge_cache") + var cells: Array[Vector3i] = [Vector3i.ZERO,Vector3i(1,0,0),Vector3i(2,0,0)] + var indices: Dictionary = {cells[0]:0,cells[1]:1,cells[2]:2} + var goals: Dictionary = {cells[2]:true} + var provider := EdgeProvider.new() + provider.rows = [[[cells[1],9223372036854775802]], [[cells[2],10],malformed], []] + var before := var_to_bytes([cells,indices,goals,provider.rows]) + var cold: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(_serialized(cold)=="wrapped\n" and provider.calls==[0,1], "cached prefix real wrap before later malformed row") + provider.calls.clear() + var warm: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(var_to_bytes(warm)==var_to_bytes(cold) and provider.calls.is_empty(), "cached invalid-prefix wrap repeat unchanged") + _check(var_to_bytes([cells,indices,goals,provider.rows])==before, "cached prefix all caller inputs unchanged") + core.call("clear_edge_cache"); provider = null + +func _warm_for_teardown(core) -> void: + core.call("clear_edge_cache") + var cells: Array[Vector3i] = [Vector3i.ZERO,Vector3i(1,0,0)] + var indices: Dictionary = {cells[0]:0,cells[1]:1} + var goals: Dictionary = {cells[1]:true} + var provider := EdgeProvider.new() + provider.rows = [[[cells[1],7]], []] + var output: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(output[&"status"]=="usable" and output[&"cost_values"][1]==7 and provider.calls==[0],"populate native cache before actual core teardown") + var provider_weak: WeakRef = weakref(provider) + provider = null + _check(provider_weak.get_ref()==null,"warm native cache retains no Callable or caller objects") + +class ReentrantProvider extends RefCounted: + var core: Object + var cells: Array[Vector3i] + var indices: Dictionary + var goals: Dictionary + var entered := false + var inner_result: Dictionary + func edges(cell: Vector3i) -> Array: + if cell.x != 0: return [] + if not entered: + entered = true + core.call("clear_edge_cache") + var inner := EdgeProvider.new() + inner.rows = [[[cells[1],9]], []] + inner_result = core.call("search_cached",cells,indices,0,goals,Callable(inner,"edges")) + return [[cells[1],7]] + +func _reentrant_collision(core) -> Dictionary: + core.call("clear_edge_cache") + var cells: Array[Vector3i] = [Vector3i.ZERO,Vector3i(1,0,0)] + var indices: Dictionary = {cells[0]:0,cells[1]:1} + var goals: Dictionary = {cells[1]:true} + var provider := ReentrantProvider.new() + provider.core=core;provider.cells=cells;provider.indices=indices;provider.goals=goals + var outer: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(outer[&"status"] == "usable" and outer[&"cost_values"][1] == 7, "reentrant collision returns original converted outer row") + _check(provider.inner_result[&"status"] == "usable" and provider.inner_result[&"cost_values"][1] == 9, "inner populated same cache key before outer insertion") + var warm: Dictionary = core.call("search_cached",cells,indices,0,goals,Callable(provider,"edges")) + _check(warm[&"status"] == "usable" and warm[&"cost_values"][1] == 9, "warm preserves inner first cache publication") + var result := {"outer":outer,"inner":provider.inner_result,"warm":warm} + var ref: WeakRef = weakref(provider) + provider = null + _check(ref.get_ref() == null, "borrowed native cache retains no reentrant provider") + core.call("clear_edge_cache") + return result + +func run_frozen(core, manifest_path: String) -> Dictionary: + var manifest: Dictionary = JSON.parse_string(FileAccess.get_file_as_string(manifest_path)) + _check(manifest["cases"].size() == 50, "same frozen fifty-input scope") + for row: Dictionary in manifest["cases"]: _case(core,row) + _prefix_wrap(core,true) + _prefix_wrap(core,[Vector3i(2,0,0),false]) + _shrink_transfer(core) + _cached_goals_and_reset(core) + _cached_prefix_wrap(core,true) + _cached_prefix_wrap(core,[Vector3i(2,0,0),false]) + var collision := _reentrant_collision(core) + _warm_for_teardown(core) + return {"passed":failures.is_empty(),"checks":checks,"failures":failures,"cases":cases,"cached_cases":cached_cases,"reentrant_collision":collision,"unit_accepted":false,"performance_accepted":false} diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/051-p23-02-native-hot-loop-local-r329.py b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/051-p23-02-native-hot-loop-local-r329.py new file mode 100644 index 0000000..08abfe8 --- /dev/null +++ b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/051-p23-02-native-hot-loop-local-r329.py @@ -0,0 +1,64 @@ +# coding: utf-8 +"""One owned Guest batch ABI/local/affected-S3 execution; no full regression or release acceptance.""" +from pathlib import Path +import hashlib,importlib.util,json,os,shutil,sys,uuid +sys.dont_write_bytecode=True +R=Path(__file__).resolve().parents[2];A=R/'artifacts/original-completion-2026-10-02';O=A/'p23-02-native-hot-loop-local-r329';D=R/'docs/plans/original-completion-2026-10-02' +NAMES=['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json'] +def mod(name,p): + s=importlib.util.spec_from_file_location(name,p);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m +def main(): + r=mod('guest_local_runner',R/'tools/run_all_tests.py');outer=mod('guest_local_owned',r.SUPPORT/'owned_outer.py');plan=r.read(O/'input.json');fixed=plan['pins'] + assert not (O/'execution.json').exists() + stage=Path(plan['stage']);parent=Path(plan['parent']);public=(stage/'project.godot').read_bytes();private=Path(fixed['private_library']['path']).parent + source=r.source_refs(R);player=r.default_player(R);docs={n:r.sha(D/n) for n in NAMES} + assert source==plan['source_before'] and player==plan['default_before'] and docs==plan['doc4_before'] + def protect(): + assert r.source_refs(R)==source and r.default_player(R)==player and {n:r.sha(D/n) for n in NAMES}==docs + assert r.inventory(parent,stage=True)==plan['parent_stage_inventory'] and r.inventory(stage,stage=True)==plan['expected_stage'] + assert r.inventory(r.SUPPORT)==plan['support_inventory'] and r.inventory(private)==plan['private_library_inventory'] + for k,q in fixed.items(): + p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'],k + def growth():return sum(p.stat().st_size for p in O.rglob('*') if p.is_file() and p.relative_to(O).parts[0]!='stage') + protect();host=r.read(fixed['host_review']['path']);assert host['host_build_accepted'] and not host['blockers'] + prepath=A/'p23-02-native-hot-loop-local-preexecution-independent-review-r329.json';pre=r.read(prepath);assert pre['execution_allowed'] and not pre['blockers'] + for group in ['evidence_sha256','canonical_doc4_context_pins']: + for q in pre[group].values(): + p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'] + root=r.read(O/'preexecution-root-verification.json');assert root['passed'] and root['review_sha256']==r.sha(prepath) + phases=[];samples=[];error=None;cleanup=[];cleanup_errors=[];report=None + try: + protect();assert not outer.native.helper['live_engines']() and shutil.disk_usage(A).free>=plan['capacity_floor_bytes'] and growth()<=plan['maximum_measurement_growth_bytes'] + output=O/'local-measurement';output.mkdir();ident=uuid.uuid4().hex;startup='TheTree-PCK-tests-'+ident+'-guest-startup';profile='TheTree-PCK-tests-'+ident+'-guest-runtime' + assert not r.profile_path(startup).exists() and not r.profile_path(profile).exists() + env=r.fresh_environment(os.environ);env.update(THE_TREE_PACK_PROFILE_NAME=profile,THE_TREE_PACK_PROFILE_EXPECTED=str(r.profile_path(profile)),THE_TREE_PACK_PROFILE_REPORT=str(O/'local-profile.json'),THE_TREE_RUNTIME_MONITOR_OUTPUT=str(output)) + (stage/'project.godot').write_bytes(r.private_project(public,startup));phase=O/'local' + argv=[fixed['engine']['path'],'--headless','--path',str(stage),'--script',fixed['starter']['path'],'--verbose','--log-file',str(phase/'engine-native.log')] + result,capture=outer.run_phase(argv,phase,90,env,now_fn=r.now,dump_fn=r.write,sha_fn=r.sha,live_engines_fn=outer.native.helper['live_engines']) + phases.append(dict(name='local',result=result,capture=capture));r.write(O/'local-phase.json',phases[0]) + report=r.read(output/'report.json') if (output/'report.json').exists() else None + if report:samples.append(dict(name='local',report=report)) + assert result is not None and result['exit_code']==0 and not result['error_lines'] and not result['timed_out'] and capture['passed'] + logs=''.join((phase/n).read_text() for n in ['stdout.log','stderr.log','engine-native.log']) + assert 'Orphan StringName:' not in logs and 'unclaimed string names' not in logs + assert report and report['passed'] and report['failures']==0 and report['pid']==result['pid'] + count=plan['expected_case_counts'];assert report['pure_case_count']==count['pure'] and report['decision_case_count']==count['decision'] and report['custom_fallback_case_count']==count['custom_fallback'] and report['original_s3_invocations']==count['original_s3_invocations'] + stdout=(phase/'stdout.log').read_text();assert stdout.count('Guest bulk local: %d checks, 0 failures'%report['checks'])==1 and stdout.count('NATIVE_ADAPTER_LIBRARY_REGISTERED')==1 + fixture=output/'fixtures.varbytes';assert fixture.stat().st_size==report['fixture_bytes'] and r.sha(fixture)==report['fixture_sha256'] + protocol=r.read(output/'protocol-report.json');assert protocol['passed'] and not protocol['failures'] and len(protocol['cases'])==50 and len(protocol['cached_cases'])==50 and protocol['checks']==report['protocol_checks'] + assert fixture.read_bytes()==Path(plan['original_Guest_fixture']['path']).read_bytes(), 'Unchanged full Guest53 original fixture bytes' + r.profile_gate(r.profile_path(profile),O/'local-profile.json',profile) + assert growth()<=plan['maximum_measurement_growth_bytes'] + (stage/'project.godot').write_bytes(public);protect() + except BaseException as caught:error=type(caught).__name__+': '+str(caught) + finally: + cleanup,cleanup_errors=outer.finish_captured(outer.OWNED) + if all(q['engine_ended'] is True for q in cleanup):(stage/'project.godot').write_bytes(public) + else:cleanup_errors.append('Restoration refused while actual owned child remains live') + guard_errors=[] + try:protect() + except BaseException as caught:guard_errors.append(type(caught).__name__+': '+str(caught)) + passed=error is None and not guard_errors and not cleanup_errors and len(phases)==1 and len(samples)==1 + r.write(O/'execution.json',dict(passed=passed,error=error,guard_errors=guard_errors,phases=phases,samples=samples,cleanup=cleanup,cleanup_errors=cleanup_errors,input_source_default_doc4_parent_support_private_preserved=not guard_errors,compiler_processes=0,full_regression_runs=0,candidate_selected=False,candidate_adopted=False,unit_accepted=False,performance_accepted=False,normal_OS_accepted=False,Windows_accepted=False,limitations=['Finite Guest53 and18 affected original S3 methods plus frozen50 protocols/shrink/ownership/reentrant collision on same new bridge. Literal original Guest source oracle removes class_name line only. No Runtime cold646→647 whole state, ordinary OS/reentry domain, arbitrary conversion or memory failure, final full regression, performance budget/P95/D10, Windows or adoption/unit acceptance.'])) + print(json.dumps(dict(passed=passed,error=error,guard_errors=guard_errors)),flush=True);return 0 if passed else 1 +if __name__=='__main__':raise SystemExit(main()) diff --git a/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/052-corpus.tsv.gz b/docs/plans/original-completion-2026-10-02/checkpoints/native-hot-loop-r325-r329/052-corpus.tsv.gz new file mode 100644 index 0000000000000000000000000000000000000000..75f3e564c7396f4612f7760324bb337eab869dde GIT binary patch literal 452756 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ಋ_Hx3Xp+^JFV1F5 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