capsules: prune init.4th to Hera alone

Punch list §25 item 0.1 complete.

Verified: all three architectures build clean and boot to the ok> prompt with
Hera alone. Blocks executed are exactly 2057 -> 2049 (-> lib.4th/4050) -> 2050.
Zero occurrences of "Hermes" or "Tripod" in any of the three serial logs, and
the only parity record is MAMA_INIT -- no baby VM is born. mkcapsule --lint
passes 26 files, 0 failing, 0 violations.

Deleted blocks 2051, 2052, 2053, 2054, 2055, 2056, 2058, 2059 -- readiness
handshake, broadcast test, TRIPOD-TEST, HERMES-E2E and the fleet-DoE
scaffolding. Edited 2057 (banner), 2049 (dropped both births with their
CD-INIT calls and the common:msg.4th / process.4th loads, which are wholly
Hermes-dependent; kept lib.4th; VM-TREE and VM-CHILDREN no longer name absent
children) and 2050 (kept the BOOT-BANNER call, dropped the two calls to the
deleted words). capsules/hermes/ and capsules/artemis/ untouched on disk.

New Hera-alone parity baseline, identical across all three ISAs:
  dict_hash=0x3d4e1daf289da94f  capsule_hash=0xb4c4b5559146a3bd
This supersedes the pre-prune baselines in logs/ and is what item 0.10's
double-boot reproducibility check compares against.

Commit contents beyond the item's own edit, noted rather than slipped in:
capsules/BLOCK_MAP.md is regenerated by any build; the three serial logs are
this item's acceptance evidence and CLAUDE.md requires committing them; the
DoE CSVs are auto-extracted by the qemu target on every run. Leaving generated
output from this item's acceptance run for a later item to sweep up would be
worse than including it here.

Reported, not fixed: tools/mkcapsule.c emits two -Wstringop-truncation warnings
on the host build (:404, :562), pre-existing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Robert Allan James
2026-08-03 12:47:21 -04:00
co-authored by Claude Opus 5
parent 39aa54b9a4
commit c3e4fc282c
12 changed files with 31349 additions and 109315 deletions
+47 -61
View File
@@ -1,5 +1,5 @@
# Capsule Block Manifest — Auto-generated
<!-- Generated by mkcapsule --manifest 2026-08-03T00:19:59Z -->
<!-- Generated by mkcapsule --manifest 2026-08-03T16:45:12Z -->
<!-- DO NOT EDIT — re-run mkcapsule --manifest to refresh. -->
<!-- Hand-written justifications and immutability notes live -->
<!-- in MANIFEST.md alongside this auto-generated index. -->
@@ -9,7 +9,7 @@
| Capsule | Blocks claimed | xxHash64 |
|---------|----------------|----------|
| `ACL.4th` | 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4015 | `0xd781d22148ff171d` |
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4175, 4176, 4851, 4852 | `0x289044d7bc1de308` |
| `artemis:init.4th` | 4110, 4111, 4112, 4113, 4122, 4123, 4124, 4125, 4126, 4127, 4128, 4129, 4130, 4131, 4132, 4133, 4134, 4135, 4136, 4137, 4138, 4139, 4140, 4141, 4160, 4161, 4162, 4163, 4164, 4165, 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4173, 4174, 4851, 4852 | `0xc9e92cd18f4c7b49` |
| `common:msg.4th` | 4055 | `0xa99c5bcd3877f80e` |
| `doe-campaign.4th` | 4060, 4061, 4062, 4063, 4064, 4065 | `0x3d4549142d91ec20` |
| `doe.4th` | 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107 | `0xb6ecf5374e8ee77c` |
@@ -30,7 +30,7 @@
| `init-l8-temporal.4th` | 4830, 4831 | `0x51abd4c138246651` |
| `init-l8-transition.4th` | 4840, 4841, 4842 | `0xbcc1a81976f0a4c9` |
| `init-l8-volatile.4th` | 4810, 4811, 4812, 4813 | `0x98caabbbd92abac4` |
| `init.4th` | 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063 | `0x2f5b3bfa012e52c4` |
| `init.4th` | 2049, 2050, 2057 | `0xb4c4b5559146a3bd` |
| `lib.4th` | 4050 | `0x20625ebf1276c239` |
| `process.4th` | 4300, 4301 | `0x781afc1dbd0294f7` |
| `zuse.4th` | 4016, 4017, 4018 | `0x12f38ec782434a77` |
@@ -39,21 +39,9 @@
| LBN | Capsule | xxHash64 | Status |
|-----|---------|----------|--------|
| 2049 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2050 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2051 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2052 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2053 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2054 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2055 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2056 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2057 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2058 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2059 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2060 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2061 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2062 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2063 | `init.4th` | `0x2f5b3bfa012e52c4` | ok |
| 2049 | `init.4th` | `0xb4c4b5559146a3bd` | ok |
| 2050 | `init.4th` | `0xb4c4b5559146a3bd` | ok |
| 2057 | `init.4th` | `0xb4c4b5559146a3bd` | ok |
| 2064 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2065 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
| 2066 | `init-l8-omni.4th` | `0x5979e314d6452045` | ok |
@@ -131,10 +119,10 @@
| 4107 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4108 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4109 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4110 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4111 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4112 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4113 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4110 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4111 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4112 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4113 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4114 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4115 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4116 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
@@ -143,26 +131,26 @@
| 4119 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4120 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4121 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4122 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4123 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4124 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4125 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4126 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4127 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4128 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4129 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4130 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4131 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4132 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4133 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4134 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4135 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4136 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4137 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4138 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4139 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4140 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4141 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4122 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4123 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4124 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4125 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4126 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4127 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4128 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4129 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4130 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4131 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4132 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4133 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4134 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4135 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4136 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4137 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4138 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4139 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4140 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4141 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4142 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4143 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4144 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
@@ -175,23 +163,21 @@
| 4151 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4152 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4153 | `hermes:init.4th` | `0xbb77f3ac463f507f` | ok |
| 4160 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4161 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4162 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4163 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4164 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4165 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4166 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4167 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4168 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4169 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4170 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4171 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4172 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4173 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4174 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4175 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4176 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4160 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4161 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4162 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4163 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4164 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4165 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4166 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4167 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4168 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4169 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4170 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4171 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4172 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4173 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4174 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4300 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4301 | `process.4th` | `0x781afc1dbd0294f7` | ok |
| 4406 | `init-1.4th` | `0x63e251adb0a03613` | ok |
@@ -228,8 +214,8 @@
| 4840 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4841 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4842 | `init-l8-transition.4th` | `0xbcc1a81976f0a4c9` | ok |
| 4851 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4852 | `artemis:init.4th` | `0x289044d7bc1de308` | ok |
| 4851 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
| 4852 | `artemis:init.4th` | `0xc9e92cd18f4c7b49` | ok |
## Conflicts
+4 -132
View File
@@ -4,145 +4,17 @@ Block 2057
: BOOT-BANNER
CR .SEP
." LithosAnanke — FORTH-79 bare-metal kernel" CR
." Tripod v1: K=1.0 + Hermes events + Artemis storage" CR
." Stadium step one: Hera alone" CR
.SEP
." Tripod: Hera Hermes Artemis [live]" CR
." Hera [live]" CR
.SEP CR ;
Block 2049
( Hera init — Mama VM personality )
: VM-TREE ( -- ) ." Hera[0]>Hermes[1] Artemis[2]" CR ;
: VM-TREE ( -- ) ." Hera[0]" CR ;
: VM-PARENT ( -- id ) 0 ;
: VM-CHILDREN ( -- ) ." Hermes[1] Artemis[2]" CR ;
: VM-CHILDREN ( -- ) ." (none)" CR ;
\ S" ACL.4th" EXEC
S" lib.4th" EXEC
S" common:msg.4th" USE
S" process.4th" EXEC
\ Tripod boot: Artemis -> Hermes -> Hera
S" Artemis" BIRTH
S" CD-INIT" S" Artemis" VM-EXEC
S" Hermes" BIRTH
S" CD-INIT" S" Hermes" VM-EXEC
Block 2053
( Phase 1: readiness handshake -- VM-FLEET-ATTRACTOR-DESIGN )
: READINESS-HANDSHAKE ( -- )
S" HERMES-ANNOUNCE-READY" S" Hermes" VM-EXEC
S" ARTEMIS-ANNOUNCE-READY" S" Artemis" VM-EXEC
S" 0 ENQUEUE-READY" S" Hermes" VM-EXEC
S" HERMES-TICK" S" Hermes" VM-EXEC
S" READY-ALL?" S" Hermes" VM-CALL IF
S" READY-ACK" S" Hermes" VM-EXEC
S" ARTEMIS-READY-ACK" S" Artemis" VM-EXEC
LOG-TEST" PASS: readiness handshake"
VM-PHYSICS-STATUS
ELSE
LOG-ERROR" FAIL: readiness handshake"
THEN ;
Block 2054
( Phase 2: real broadcast -- VM-FLEET-ATTRACTOR-DESIGN )
VARIABLE BCAST-GOT
: BCAST-RECV ( -- ) 1 BCAST-GOT +! ;
: BROADCAST-TEST ( -- )
S" REGISTER-COMMON-MEMBERS" S" Hermes" VM-EXEC
S" SEND-BROADCAST-TEST" S" Hermes" VM-EXEC
S" HERMES-TICK" S" Hermes" VM-EXEC
BCAST-GOT @ 0>
S" BCAST-GOT @" S" Hermes" VM-CALL 0> AND
S" BCAST-GOT @" S" Artemis" VM-CALL 0> AND
IF LOG-TEST" PASS: broadcast reached all 3"
VM-PHYSICS-STATUS
ELSE LOG-ERROR" FAIL: broadcast reached all 3" THEN ;
Block 2050
( Hera boot — banner )
BOOT-BANNER
READINESS-HANDSHAKE
BROADCAST-TEST
Block 2051
( TRIPOD-TEST: 6 criteria per TRIPOD.md )
( K holds continuously by construction; no tick-pump )
: TRIPOD-TEST ( -- )
LOG-INFO" === TRIPOD Acceptance ==="
VM-CONSERVED? IF LOG-TEST" PASS: fleet K"
ELSE LOG-ERROR" FAIL: K drift" THEN
S" HERMES-TICK" S" Hermes" VM-EXEC
LOG-TEST" PASS: Hermes liveness"
S" ART-STATUS" S" Artemis" VM-EXEC
LOG-TEST" PASS: Artemis ready"
S" Hermes" KILL-VM
LOG-TEST" PASS: reap"
S" Hermes" BIRTH S" CD-INIT" S" Hermes" VM-EXEC
VM-CONSERVED? IF LOG-TEST" K soak"
ELSE LOG-ERROR" K soak" THEN
LOG-INFO" === TRIPOD DONE ===" ;
Block 2052
( Run TRIPOD acceptance test + E2E msg flow )
TRIPOD-TEST
: HERMES-E2E ( -- )
S" HERMES-MSG-TEST" S" Hermes" VM-CALL
IF LOG-TEST" PASS: msg queued"
ELSE LOG-ERROR" FAIL: msg queued" THEN
S" HERMES-TICK" S" Hermes" VM-EXEC
S" MSG-USED" S" Hermes" VM-CALL
0 > IF LOG-TEST" PASS: E2E msg flow"
ELSE LOG-ERROR" FAIL: E2E msg flow" THEN ;
HERMES-E2E
Block 2055
( Phase 3: fleet DoE -- one config per VM per run )
( VM-FLEET-ATTRACTOR-DESIGN-20260705.md rev h. Not run at )
( boot -- invoked via serial injection: )
( SEED N-RUNS EXEC-FLEET-DOE )
VARIABLE FDOE-RUN-ID
VARIABLE FDOE-HERA VARIABLE FDOE-HERMES VARIABLE FDOE-ARTEMIS
: FLEET-DOE-HDR ( -- )
." FLEETDOE,run_id,hera_cfg,hermes_cfg,artemis_cfg" CRLF ;
: FLEET-DOE-ROW ( -- )
." FLEETDOE," FDOE-RUN-ID @ CSV-COL
FDOE-HERA @ CSV-COL FDOE-HERMES @ CSV-COL
FDOE-ARTEMIS @ CSV-LAST ;
Block 2056
( FDOE-REMOTE-FORCE-CMD: cfg -> "N L8-TABLE-FORCE" command )
( string for VM-EXEC, targeting the same 128-config table )
( the remote VM's own heartbeat drives (ssm_l8_force_config, )
( ssm_jacquard.c) -- no CASE lookup needed for a raw index. )
VARIABLE FDOE-CMD-POS VARIABLE FDOE-APPEND-LEN
: FDOE-CMD-APPEND ( src-addr src-len -- )
DUP FDOE-APPEND-LEN !
FDOE-CMD-POS @ SWAP MOVE
FDOE-APPEND-LEN @ FDOE-CMD-POS +! ;
: FDOE-REMOTE-FORCE-CMD ( cfg -- addr len )
PAD FDOE-CMD-POS !
0 SWAP <# #S #> FDOE-CMD-APPEND
S" L8-TABLE-FORCE" FDOE-CMD-APPEND
PAD FDOE-CMD-POS @ PAD - ;
Block 2058
( Per-run apply + workload. Workload is HERMES-TICK/ART-PING, )
( not BROADCAST-TEST -- that would exhaust Hermes's fixed )
( member/message arenas after ~20 runs by re-registering )
( members and allocating message slots faster than heat-decay )
( reap can free them. VM-EXEC/VM-CALL themselves are what )
( trigger vm_physics_touch -- the workload just needs to reach )
( Hermes and Artemis each run, not do anything expensive. )
: FDOE-APPLY-ALL ( hera-cfg hermes-cfg artemis-cfg -- )
FDOE-ARTEMIS ! FDOE-HERMES ! FDOE-HERA !
FDOE-HERA @ L8-TABLE-FORCE
FDOE-HERMES @ FDOE-REMOTE-FORCE-CMD S" Hermes" VM-EXEC
FDOE-ARTEMIS @ FDOE-REMOTE-FORCE-CMD S" Artemis" VM-EXEC ;
: FLEET-DOE-WORKLOAD ( -- )
S" HERMES-TICK" S" Hermes" VM-EXEC
S" ART-PING" S" Artemis" VM-EXEC ;
Block 2059
( Run loop: draws (hera,hermes,artemis) cfg independently and )
( uniformly from 0-127 each, with replacement, for n-runs. )
: FLEET-DOE-RUN-ONE ( hera-cfg hermes-cfg artemis-cfg -- )
FDOE-APPLY-ALL
FLEET-DOE-WORKLOAD
FLEET-DOE-ROW
1 FDOE-RUN-ID +! ;
: EXEC-FLEET-DOE ( seed n-runs -- )
SWAP SEED 0 FDOE-RUN-ID ! 1 LOG-LEVEL!
FLEET-DOE-HDR
0 DO
0 127 RANDOM 0 127 RANDOM 0 127 RANDOM
FLEET-DOE-RUN-ONE
LOOP
3 LOG-LEVEL!
." FLEET-DOE: complete" CRLF ;