Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

> **Stable line (2026)** — First maintained **stable** release **[v1.0.0](https://github.com/PurHur/php-compiler/releases/tag/v1.0.0)**; **v1.1.0** prep adds M5 fast-path stability, enum/property-hook parity, `preg_match` JIT, `spl_autoload*`, and php-in-PHP JIT helpers. Demo-ready VM + AOT for a **web-capable PHP subset**, reference examples **000–009**, and an experimental **self-host** path. Not full Zend PHP compatibility — see [what’s missing](https://purhur.github.io/php-compiler/docs/pages/missing-implementation.html).

**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **7959** / **7959** · **1555** builtins · M5 fast ✅ / strict 🚧 · M3/M4 emit = blob copy ([#21860](https://github.com/PurHur/php-compiler/issues/21860)) · VM probe ~**20ms**
**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **7962** / **7962** · **1555** builtins · M5 fast ✅ / strict 🚧 · M3/M4 emit = blob copy ([#21860](https://github.com/PurHur/php-compiler/issues/21860)) · VM probe ~**20ms**

---

Expand All @@ -23,7 +23,7 @@
| **AOT (`phpc build`)** | ✅ For curated subset | Standalone binaries for examples **000–009** and small CGI apps; not arbitrary Composer stacks |
| **JIT (`bin/jit.php`)** | 🚧 Partial | LLVM IR for many constructs; **MCJIT execute** still flaky ([#98](https://github.com/PurHur/php-compiler/issues/98)); EH scripts VM-fallback ([#2114](https://github.com/PurHur/php-compiler/issues/2114)) |
| **Language wave 3** | ✅ Closed batch | **7410/7412** language + **7410/7412** stdlib tracker items ([#1380](https://github.com/PurHur/php-compiler/issues/1380)); closures, try/catch, generators (VM), `parent::class`, backed enums (VM), intersection AOT checks |
| **Self-host north star** | 🚧 ~65% | M3/M4 emit paths are blob copies ([#21860](https://github.com/PurHur/php-compiler/issues/21860)); `--strict` red; spine **7959** / **7959**; vendor prelink **7410/7412** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
| **Self-host north star** | 🚧 ~65% | M3/M4 emit paths are blob copies ([#21860](https://github.com/PurHur/php-compiler/issues/21860)); `--strict` red; spine **7962** / **7962**; vendor prelink **7410/7412** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |

### What you can rely on today

Expand All @@ -40,7 +40,7 @@ Counts from `php script/bootstrap-spine-count.php` (literal `require_once` in `c
| Milestone | Status | What it means |
|-----------|--------|----------------|
| **M0–M1** | ✅ | `compiler_minimal` + compile-smoke bundles link and run natively |
| **M2** | ✅ **7959** / **7959** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M2** | ✅ **7962** / **7962** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M3** | 🚧 | HelloWorld probe output is a prelinked blob **COPY**, not a native emit ([#21860](https://github.com/PurHur/php-compiler/issues/21860)) |
| **M4** | 🚧 | ladder runs, but gen-1→gen-2 is a sidecar **COPY** ([#21860](https://github.com/PurHur/php-compiler/issues/21860)) — gen-0/gen-2/gen-3 being byte-identical follows from that, and is not fixpoint evidence |
| **M5** | 🚧 | `make north-star5-verify-fast` (daily) ✅; vendor **7410/7412** ✅; gen-0 sidecars refreshed; **`--strict` red at step 4a2** ([#21417](https://github.com/PurHur/php-compiler/issues/21417)) |
Expand Down Expand Up @@ -259,7 +259,7 @@ Full matrices (auto-generated): [`docs/capabilities.md`](docs/capabilities.md) (

**Self-host (experimental, not “stable app” scope)**

See [Current implementation status](#current-implementation-status-july-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **7959** / **7959**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) ✅ — **`--strict` red at step 4a2** ([#21417](https://github.com/PurHur/php-compiler/issues/21417)) ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).
See [Current implementation status](#current-implementation-status-july-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **7962** / **7962**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) ✅ — **`--strict` red at step 4a2** ([#21417](https://github.com/PurHur/php-compiler/issues/21417)) ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).

**What we do not target in v1.x**

Expand Down
78 changes: 48 additions & 30 deletions docs/bootstrap-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ Regenerate: `php script/bootstrap-inventory.php`

| Metric | Count |
|--------|------:|
| PHP files on vm.php path | 7959 |
| Phase A inventory files (M2 ratio SSOT) | 7959 |
| PHP files on vm.php path | 7962 |
| Phase A inventory files (M2 ratio SSOT) | 7962 |
| Phase A ratio-deferred paths | 0 |
| Source constructs flagged (blockers) | 0 |
| Source constructs flagged (warnings) | 25330 |
| Source constructs flagged (warnings) | 25333 |

## Compiler CFG gaps (`lib/Compiler.php`)

Expand Down Expand Up @@ -1559,6 +1559,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `ext/mbstring/JitMbEncodingRegistry.php` | 0 | 3 |
| `ext/mbstring/JitMbEreg.php` | 0 | 1 |
| `ext/mbstring/JitMbEregSearch.php` | 0 | 10 |
| `ext/mbstring/JitMbGetInfo.php` | 0 | 2 |
| `ext/mbstring/JitMbHttpInput.php` | 0 | 2 |
| `ext/mbstring/JitMbHttpOutput.php` | 0 | 2 |
| `ext/mbstring/JitMbInternalEncoding.php` | 0 | 2 |
Expand Down Expand Up @@ -1591,6 +1592,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `ext/mbstring/MbDetectOrderJitHelper.php` | 0 | 1 |
| `ext/mbstring/MbEncodingAliasesJitHelper.php` | 0 | 1 |
| `ext/mbstring/MbEregJitHelper.php` | 0 | 2 |
| `ext/mbstring/MbGetInfoJitHelper.php` | 0 | 1 |
| `ext/mbstring/MbHttpInputJitHelper.php` | 0 | 1 |
| `ext/mbstring/MbHttpOutputJitHelper.php` | 0 | 1 |
| `ext/mbstring/MbInternalEncodingJitHelper.php` | 0 | 1 |
Expand Down Expand Up @@ -1648,7 +1650,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `ext/mbstring/mb_ereg_search_setpos.php` | 0 | 3 |
| `ext/mbstring/mb_eregi.php` | 0 | 3 |
| `ext/mbstring/mb_eregi_replace.php` | 0 | 3 |
| `ext/mbstring/mb_get_info.php` | 0 | 3 |
| `ext/mbstring/mb_get_info.php` | 0 | 2 |
| `ext/mbstring/mb_http_input.php` | 0 | 2 |
| `ext/mbstring/mb_http_output.php` | 0 | 2 |
| `ext/mbstring/mb_internal_encoding.php` | 0 | 2 |
Expand Down Expand Up @@ -5885,6 +5887,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
| `lib/JIT/Builtin/MbDetectOrderRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbEncodingAliasesRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbEregRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbGetInfoRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbHttpInputRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbHttpOutputRuntime.php` | 0 | 1 |
| `lib/JIT/Builtin/MbInternalEncodingRuntime.php` | 0 | 1 |
Expand Down Expand Up @@ -10288,7 +10291,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/dom/DomUserScriptAttributeCacheLlvm.php`

**Warnings** (review for bootstrap subset):
- 19 class method(s)
- 22 class method(s)

### `ext/dom/DomUserScriptDoctypeLlvm.php`

Expand Down Expand Up @@ -10949,8 +10952,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/dom/JitDomImportNode.php`

**Warnings** (review for bootstrap subset):
- new JITVariable (line 845)
- 18 class method(s)
- new JITVariable (line 849)
- 19 class method(s)

### `ext/dom/JitDomImportSimpleXmlUserScript.php`

Expand Down Expand Up @@ -11038,13 +11041,13 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/dom/JitDomLoadHTMLUserScript.php`

**Warnings** (review for bootstrap subset):
- new JITVariable (line 311)
- new JITVariable (line 312)
- new JITVariable (line 313)
- new JITVariable (line 315)
- new JITVariable (line 316)
- new JITVariable (line 321)
- new JITVariable (line 434)
- new JITVariable (line 451)
- new JITVariable (line 317)
- new JITVariable (line 320)
- new JITVariable (line 325)
- new JITVariable (line 438)
- new JITVariable (line 455)
- 21 class method(s)

### `ext/dom/JitDomLoadUserScript.php`
Expand Down Expand Up @@ -20071,6 +20074,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- new ArgumentCountError (line 384)
- 18 class method(s)

### `ext/mbstring/JitMbGetInfo.php`

**Warnings** (review for bootstrap subset):
- new ArgumentCountError (line 36)
- 4 class method(s)

### `ext/mbstring/JitMbHttpInput.php`

**Warnings** (review for bootstrap subset):
Expand Down Expand Up @@ -20239,6 +20248,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- new HashTable (line 42)
- 8 class method(s)

### `ext/mbstring/MbGetInfoJitHelper.php`

**Warnings** (review for bootstrap subset):
- 5 class method(s)

### `ext/mbstring/MbHttpInputJitHelper.php`

**Warnings** (review for bootstrap subset):
Expand Down Expand Up @@ -20660,9 +20674,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/mbstring/mb_get_info.php`

**Warnings** (review for bootstrap subset):
- new ArgumentCountError (line 28)
- new ArgumentCountError (line 46)
- 3 class method(s)
- new ArgumentCountError (line 29)
- 2 class method(s)

### `ext/mbstring/mb_http_input.php`

Expand Down Expand Up @@ -51277,6 +51290,11 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
**Warnings** (review for bootstrap subset):
- 9 class method(s)

### `lib/JIT/Builtin/MbGetInfoRuntime.php`

**Warnings** (review for bootstrap subset):
- 5 class method(s)

### `lib/JIT/Builtin/MbHttpInputRuntime.php`

**Warnings** (review for bootstrap subset):
Expand Down Expand Up @@ -51861,12 +51879,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/JIT/Builtin/RecursiveLeavesFlattenRuntime.php`

**Warnings** (review for bootstrap subset):
- new Variable (line 146)
- new Variable (line 186)
- new Variable (line 194)
- new Variable (line 238)
- new Variable (line 241)
- 6 class method(s)
- new Variable (line 155)
- new Variable (line 196)
- new Variable (line 204)
- new Variable (line 276)
- new Variable (line 279)
- 7 class method(s)
- 2 closure(s)

### `lib/JIT/Builtin/RecursiveTreeIteratorBuildRuntime.php`
Expand Down Expand Up @@ -55603,12 +55621,12 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `lib/JIT/Call/RecursiveIteratorIteratorConstruct.php`

**Warnings** (review for bootstrap subset):
- new ArgumentCountError (line 33)
- new Variable (line 51)
- new Variable (line 57)
- new Variable (line 104)
- new Variable (line 118)
- 5 class method(s)
- new ArgumentCountError (line 36)
- new Variable (line 56)
- new Variable (line 62)
- new Variable (line 109)
- new Variable (line 123)
- 6 class method(s)

### `lib/JIT/Call/RecursiveTreeIteratorConstruct.php`

Expand Down Expand Up @@ -63547,8 +63565,8 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
**Warnings** (review for bootstrap subset):
- new HashTable (line 32)
- new HashTable (line 33)
- new Variable (line 54)
- new Variable (line 57)
- new Variable (line 60)
- new Variable (line 63)
- 3 class method(s)

### `lib/VM/RedundantIterableUnionCheck.php`
Expand Down
12 changes: 10 additions & 2 deletions docs/bootstrap-profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@
"ext/dom/DomCreateElementJitHelper.php",
"ext/dom/DomCreateElementNSJitHelper.php",
"ext/dom/DomDocumentPropertySupport.php",
"ext/dom/DomDocumentValidateJitHelper.php",
"ext/dom/DomElementTextContentJitHelper.php",
"ext/dom/DomExceptionConstants.php",
"ext/dom/DomGetElementByIdJitHelper.php",
Expand Down Expand Up @@ -507,6 +508,7 @@
"ext/dom/JitDomReplaceChildLiveSlots.php",
"ext/dom/JitDomReplaceData.php",
"ext/dom/JitDomRequireDomNodeArg.php",
"ext/dom/JitDomSave.php",
"ext/dom/JitDomSaveHTML.php",
"ext/dom/JitDomSaveHTMLFile.php",
"ext/dom/JitDomSaveHTMLUserScript.php",
Expand Down Expand Up @@ -1563,6 +1565,7 @@
"ext/mbstring/JitMbEncodingRegistry.php",
"ext/mbstring/JitMbEreg.php",
"ext/mbstring/JitMbEregSearch.php",
"ext/mbstring/JitMbGetInfo.php",
"ext/mbstring/JitMbHttpInput.php",
"ext/mbstring/JitMbHttpOutput.php",
"ext/mbstring/JitMbInternalEncoding.php",
Expand Down Expand Up @@ -1595,6 +1598,7 @@
"ext/mbstring/MbDetectOrderJitHelper.php",
"ext/mbstring/MbEncodingAliasesJitHelper.php",
"ext/mbstring/MbEregJitHelper.php",
"ext/mbstring/MbGetInfoJitHelper.php",
"ext/mbstring/MbHttpInputJitHelper.php",
"ext/mbstring/MbHttpOutputJitHelper.php",
"ext/mbstring/MbInternalEncodingJitHelper.php",
Expand Down Expand Up @@ -5774,6 +5778,7 @@
"lib/JIT/Builtin/DomC14NRuntime.php",
"lib/JIT/Builtin/DomCreateElementNSRuntime.php",
"lib/JIT/Builtin/DomCreateElementRuntime.php",
"lib/JIT/Builtin/DomDocumentValidateRuntime.php",
"lib/JIT/Builtin/DomElementTextContentRuntime.php",
"lib/JIT/Builtin/DomGetElementByIdRuntime.php",
"lib/JIT/Builtin/DomGetElementsByTagNameRuntime.php",
Expand Down Expand Up @@ -5965,6 +5970,7 @@
"lib/JIT/Builtin/MbDetectOrderRuntime.php",
"lib/JIT/Builtin/MbEncodingAliasesRuntime.php",
"lib/JIT/Builtin/MbEregRuntime.php",
"lib/JIT/Builtin/MbGetInfoRuntime.php",
"lib/JIT/Builtin/MbHttpInputRuntime.php",
"lib/JIT/Builtin/MbHttpOutputRuntime.php",
"lib/JIT/Builtin/MbInternalEncodingRuntime.php",
Expand Down Expand Up @@ -6608,9 +6614,11 @@
"lib/JIT/Call/DomDocumentLoadHTMLFile.php",
"lib/JIT/Call/DomDocumentLoadXML.php",
"lib/JIT/Call/DomDocumentNormalizeDocument.php",
"lib/JIT/Call/DomDocumentSave.php",
"lib/JIT/Call/DomDocumentSaveHTML.php",
"lib/JIT/Call/DomDocumentSaveHTMLFile.php",
"lib/JIT/Call/DomDocumentSaveXML.php",
"lib/JIT/Call/DomDocumentValidateMethod.php",
"lib/JIT/Call/DomElementGetAttribute.php",
"lib/JIT/Call/DomElementGetAttributeNS.php",
"lib/JIT/Call/DomElementGetAttributeNode.php",
Expand Down Expand Up @@ -8188,9 +8196,9 @@
"test/bootstrap-aot/lib_opcode/main.php"
],
"totals": {
"inventory_files": 7954,
"inventory_files": 7962,
"excluded": 0,
"eligible": 7954,
"eligible": 7962,
"aot_lint_targets": 113,
"aot_link_targets": 100,
"aot_link_lib_targets": 1
Expand Down
2 changes: 1 addition & 1 deletion docs/bootstrap-selfhost.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Gen-0 without Zend:** `BOOTSTRAP_M5_NO_ZEND=1 make bootstrap-selfhost-link` installs `prelinked/bootstrap-gen0/bin-compile-aot` and links `compiler_minimal` without `php bin/compile.php` ([#3053](https://github.com/PurHur/php-compiler/issues/3053)). **M5 lib spine compile:** `BOOTSTRAP_NO_ZEND_FALLBACK=1 make bootstrap-selfhost-lib-spine-smoke` (default in link script) refuses host `php bin/compile.php` on the spine emit path ([#8716](https://github.com/PurHur/php-compiler/issues/8716)). **Contributor workflow:** [bootstrap-dev-workflow.md](bootstrap-dev-workflow.md) (tiered gen-1+ path, spine checklist, CI).

**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **7959** / **7959** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **7410/7412** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).
**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **7962** / **7962** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **7410/7412** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).

## Current gates

Expand Down
2 changes: 1 addition & 1 deletion docs/capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,7 @@ Auto-generated by `script/capability-matrix.php`. Do not edit by hand.
| `stream_context_set_option` | yes | yes | yes | standard | JIT PHPT; AOT PHPT |
| `stream_context_set_params` | yes | yes | yes | standard | AOT PHPT |
| `stream_copy_to_stream` | yes | yes | yes | standard | JIT PHPT |
| `stream_filter_append` | yes | yes | yes | standard | JIT PHPT |
| `stream_filter_append` | yes | yes | yes | standard | JIT PHPT; AOT PHPT |
| `stream_filter_prepend` | yes | yes | yes | standard | |
| `stream_filter_register` | yes | yes | yes | standard | |
| `stream_filter_remove` | yes | yes | yes | standard | |
Expand Down
2 changes: 1 addition & 1 deletion docs/pages/capability-comparison.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ <h1>PHP capability comparison</h1>
This is <em>not</em> a full php-src inventory — only items we measure in
<a href="https://github.com/PurHur/php-compiler/blob/master/docs/capabilities-syntax.md"><code>capabilities-syntax.md</code></a>
and <a href="https://github.com/PurHur/php-compiler/blob/master/docs/capabilities.md"><code>capabilities.md</code></a>.
Generated 2026-08-27 (matrix mtime).
Generated 2026-08-28 (matrix mtime).
</p>
</header>

Expand Down
Loading
Loading