Repository navigation
Commit 18c2ddc
Fixes #21761
Clause-②: no (narrowing)
## What changes
An item's ADR-0010 lock is now selected from the item's **address**
(type, name, organization scope, `packageId`) by one function,
`resolveOverlayLockLayer` in
`packages/metadata-protocol/src/item-lock.ts`. The write doors' `_lock`
gate, `getMetaItem`, `getMetaItemLayered` and the list all call it. No
caller pre-selects a row for the lock any more.
- **The rows in scope.** ADR-0005 precedence, as before: the
organization's rows when it holds any row of the item, else the env-wide
rows. Within that scope, every row of the item counts, whichever package
it is bound to.
- **The lock is the strictest among them.** A write is refused when any
row in scope refuses it, and a delete likewise (`strictestLock`, read
off the lock algebra). Two rows that refuse different verbs
(`no-overlay`, `no-delete`) join to `full`.
- **Content stays prefer-local** (ADR-0048). `findServedOverlayRow` is
unchanged in what it serves; it now decides the content only. A read
naming package A is still served A's row. When the binding lock comes
from another row, the served body carries the binding row's lock family
(`withOverlayLockFamily`), so the body never states a lock the envelope
does not report.
- **Prose.** Among rows that declare the strictest lock, the reported
`lockReason` / `lockDocsUrl` / `lockSource` are the address's own
package row's, then the package-less row's, then other packages' by id.
So the prose does not depend on row order either.
Landing points, as the claim's file surface said: `item-lock.ts`, and
the row selection in `protocol.ts` (`overlayLockLayerAt`; the gate's
`readLockGateOverlayLayer`; the lock source of both reads; the list item
and the `getMetaDiagnostics` tile through the list body). One test file
outside that surface: `packages/objectql/src/protocol-meta.test.ts`,
whose outage double now fails `find` as well as `findOne`, because the
gate's first read is a `find`. The rest of the diff is tests, the
changeset, and the engine-double ledger row
`check:engine-double-contract --write` added.
## Rulings honoured, and one place they meet
- Strictest-wins, content prefer-local, no prefer-local lock: as ruled
in 5982313964 and restated in 5982824254.
- **Rows in scope for a request naming package A.** The ruling names A's
row and the package-less row. This PR keeps both and also keeps **other
packages' rows of the same name** in scope (pin 7). Measured reason:
before this change the gate asked with no package, so `findOne` could
return package B's row. In arrangement `A none + B full` with B returned
first, a save naming A was **refused** at the merge base. With A and the
package-less row only, it would be **admitted**. That is a widening,
which the ruling itself excludes ("never more permissive than either row
the door could pick today"). The delete door also carries no package at
all (`DeleteMetaItemRequest` declares none), so a package-scoped
`deletable` can report that door only from a package-agnostic row set.
Narrowing the set to A's row and the package-less row is a widening and
stays the maintainer's to rule; it is raised in the report, not taken
here.
- **Rows in scope for a request naming no package.** Every row of the
item in scope: exactly the set the gate's `findOne` could have returned.
So the lock is never more permissive than any row the door could pick
before.
## H1: the package axis, before and after
**Before** (merge base `ebfe658c72`):
- The gate went through `readLockGateOverlayLayer` →
`findServedOverlayRow`, with no `packageId`, canonical spelling only,
and bound the row `findOne` returned first. A save with `?package=`
reached the gate **without** its package (measured: the gate's address
was package-less for every request), and a delete carries none.
- `getMetaItem` and `getMetaItemLayered` handed `findServedOverlayRow`
the request's `packageId` (present or absent) and took that row's lock.
- The list item and the diagnostics tile never called
`findServedOverlayRow`. They read the lock off the body the list's
per-slot merge picked (the *latest* of the package's row and the
package-less row).
**After** (this branch's sources at `05b41c9449`; the later merges of
`origin/main` touch no file of `metadata-protocol`): every caller hands
`resolveOverlayLockLayer` its address. The gate's address carries
`packageId` for save and publish and none for delete and rollback; the
reads carry the request's. Measured over an engine double, 30 requests,
both `findOne` orders. `b→h` = merge base → this head; the door columns
are the `_lock` gate's verdict; reads are store reads per call.
| arrangement · row order · request | getMetaItem lock | layered lock |
list item `_lock` | tile locked | door save | door delete | gate reads |
getMetaItem reads |
|---|---|---|---|---|---|---|---|---|
| arr1 pkgless none + A full [as] · package A | full→full | full→full |
full→full | 1→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| arr1 pkgless none + A full [as] · no package | none→full | none→full |
full→full | 1→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| arr1 pkgless none + A full [rev] · package A | full→full | full→full |
full→full | 1→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| arr1 pkgless none + A full [rev] · no package | full→full | full→full
| none→full | 0→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| arr2 A none + pkgless full [as] · package A | none→full | none→full |
none→full | 0→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| arr2 A none + pkgless full [as] · no package | none→full | none→full |
full→full | 1→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| arr2 A none + pkgless full [rev] · package A | none→full | none→full |
none→full | 0→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| arr2 A none + pkgless full [rev] · no package | full→full | full→full
| none→full | 0→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| arr3a pkgless no-overlay + A no-delete [as] · package A |
no-delete→full | no-delete→full | no-delete→full | 1→1 | refused→refused
| admitted→refused | 1→1 | 1→2 |
| arr3a pkgless no-overlay + A no-delete [as] · no package |
no-overlay→full | no-overlay→full | no-delete→full | 1→1 |
refused→refused | admitted→refused | 1→1 | 1→2 |
| arr3a pkgless no-overlay + A no-delete [rev] · package A |
no-delete→full | no-delete→full | no-delete→full | 1→1 |
admitted→refused | refused→refused | 1→1 | 1→2 |
| arr3a pkgless no-overlay + A no-delete [rev] · no package |
no-delete→full | no-delete→full | no-overlay→full | 1→1 |
admitted→refused | refused→refused | 1→1 | 1→2 |
| arr3b pkgless full + A no-overlay [as] · package A | no-overlay→full |
no-overlay→full | no-overlay→full | 1→1 | refused→refused |
refused→refused | 1→1 | 1→2 |
| arr3b pkgless full + A no-overlay [as] · no package | full→full |
full→full | no-overlay→full | 1→1 | refused→refused | refused→refused |
1→1 | 1→2 |
| arr3b pkgless full + A no-overlay [rev] · package A | no-overlay→full
| no-overlay→full | no-overlay→full | 1→1 | refused→refused |
admitted→refused | 1→1 | 1→2 |
| arr3b pkgless full + A no-overlay [rev] · no package | no-overlay→full
| no-overlay→full | full→full | 1→1 | refused→refused | admitted→refused
| 1→1 | 1→2 |
| arr3c pkgless no-delete + A full [as] · package A | full→full |
full→full | full→full | 1→1 | admitted→refused | refused→refused | 1→1 |
1→2 |
| arr3c pkgless no-delete + A full [as] · no package | no-delete→full |
no-delete→full | full→full | 1→1 | admitted→refused | refused→refused |
1→1 | 1→2 |
| arr3c pkgless no-delete + A full [rev] · package A | full→full |
full→full | full→full | 1→1 | refused→refused | refused→refused | 1→1 |
1→2 |
| arr3c pkgless no-delete + A full [rev] · no package | full→full |
full→full | no-delete→full | 1→1 | refused→refused | refused→refused |
1→1 | 1→2 |
| xB1 A none + B full [as] · package A | none→full | none→full |
none→full | 0→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| xB1 A none + B full [as] · no package | none→full | none→full |
full→full | 1→1 | admitted→refused | admitted→refused | 1→1 | 1→2 |
| xB1 A none + B full [rev] · package A | none→full | none→full |
none→full | 0→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| xB1 A none + B full [rev] · no package | full→full | full→full |
none→full | 0→1 | refused→refused | refused→refused | 1→1 | 1→2 |
| xB2 pkgless none + A none + B full [as] · package A | none→full |
none→full | none→full | 0→1 | admitted→refused | admitted→refused | 1→1
| 1→2 |
| xB2 pkgless none + A none + B full [as] · no package | none→full |
none→full | full→full | 1→1 | admitted→refused | admitted→refused | 1→1
| 1→2 |
| xB2 pkgless none + A none + B full [rev] · package A | none→full |
none→full | none→full | 0→1 | refused→refused | refused→refused | 1→1 |
1→2 |
| xB2 pkgless none + A none + B full [rev] · no package | full→full |
full→full | none→full | 0→1 | refused→refused | refused→refused | 1→1 |
1→2 |
| xOrg org B full + env A none · org + package A | none→full | none→full
| none→full | 0→1 | refused→refused | refused→refused | 1→1 | 5→6 |
| xOrg org B full + env A none · org, no package | full→full | full→full
| full→full | 1→1 | refused→refused | refused→refused | 1→1 | 1→2 |
Summary over the 30 requests and 60 door verdicts:
- 0 widenings (no write refused at the base is admitted at head).
- 24 narrowings, all where the base verdict depended on row order.
- 36 unchanged.
- Order-dependent groups: 14 of 14 at the base, 0 of 14 at head.
- Requests where `getMetaItem`, `getMetaItemLayered` and the door
disagree: 8 of 30 at the base, 0 of 30 at head.
## H2, H3, H4, H5
- **H2 (what the door carries).** Measured: the save door had
`request.packageId` in hand, but `assertLockAllowsWrite` never received
it, so the gate saw no package; the delete request declares none. It now
carries it for save and publish. Rows in scope are package-agnostic for
every address (above), so carrying the package picks only the prose,
never the rows. Widening check: 0 of 60 door verdicts.
- **H3 (content stays prefer-local).** Both reads' full envelopes and
bodies (layered: `code`, `overlay`, `effective`) and the list items were
dumped for all 30 requests at the base sources and at `05b41c9449`. With
the lock family masked (`lock`, `lockReason`, `lockSource`,
`lockDocsUrl`, `editable`, `deletable`, and `_lock` / `_lockReason` /
`_lockSource` / `_lockDocsUrl` anywhere), the dumps are byte-identical:
0 diffs in 90.
- **H4 (one address, one selection).** `resolveOverlayLockLayer(address,
rowsIn, { otherSpelling })`. The address fields are `ITEM_ADDRESS_FIELDS
= ['type', 'name', 'organizationId', 'packageId']`.
`rowsIn(organizationId, spelling)` returns every stored row of the item
in one scope under one spelling; the function applies the precedence and
the strictest join itself. Callers:
- the protocol's `overlayLockLayerAt`, an engine `find` per scope, used
by the gate, `getMetaItem` and `getMetaItemLayered`;
- the list, a filter over the package-agnostic rows it read.
The one declared difference is unchanged: the gate passes
`otherSpelling: false`, the reads `true` (#4432).
- **H5 (fail-closed, store reads).** A failing read in scope still
refuses with 503 (pin 6, with and without a package; the #5706 pin's
double now fails the gate's `find`). The gate's store reads per check
are unchanged in count: one read per scope, stopping at the first scope
that holds a row. Before that was `findOne`; now it is `find`, because
the strictest lock needs every row of the item, and `findOne` cannot
enumerate them. Measured: 1→1 on all 30 requests. The reads pay one
extra `find` per active read (1→2; 5→6 in the org-plus-package case),
because the content row (prefer-local) and the lock rows (all in scope)
are different sets. A package-scoped list pays one extra
package-agnostic row read, which the overlay cache answers on a hit.
## Pins
In `protocol.lock-one-resolution.test.ts`:
1. **The generated pin** gains the address as input columns:
`requestPackage` (`packageId` absent / present) and `packageRow` (the
package's row: none, or each lock level), beside the existing
package-less `storedRow`.
- Its completeness check names every field of `ITEM_ADDRESS_FIELDS`
against an axis (`ADDRESS_AXES`, keyed by `ItemAddressField`, so a new
field fails typecheck and the run).
- Every row runs under both orders the store can return the two rows in.
- Every row asserts `getMetaItem` = `getMetaItemLayered` = the door, for
save and delete, against an oracle written from the rule.
- 16 320 rows, plus the subset check that PR #21737's 64 rows are still
in the table.
2. Pin 4: arrangement 1 (package-less `none`, package `full`), both
orders, package named and not. The reads and the door agree on `full`,
the body says `full`, and content is the package's own row.
3. Pin 5: arrangement 2 (package `none`, package-less `full`), both
orders. `full`, never `none`; the refusal carries the binding row's
prose.
4. Pin 6: the #5706 outage. Every `sys_metadata` read fails, and save
(with and without a package) and delete answer 503 from the gate.
5. Pin 7: a third package's row binds a save naming A, under both
orders. An organization holding only another package's row is the scope
for reads and door alike. The list item and the tile report the item's
lock.
(The dispatch order's pins 2 and 3 are this file's pins 4 and 5: the
file already had #21738's pins 2 and 3.)
## Reverse verification
Committed first (`68567308d1`). The gate's pre-change selection was
restored through `scripts/ablation-replace.mjs`: one row,
package-agnostic, canonical, `findOne` org then env.
- The anchor hit 1 → 0 and the marker 0 → 1; blob `388e091cb01e` →
`cf3701af4ce0`.
- The tests resolve `./protocol.js` from `src`, so no `dist` was
involved.
- Predicted, then measured, on `-t '#21761. pin (4|5)'`: **5 red / 4
green**.
- Red: pin 4 "package-less row returned first" (package named and not);
pin 5 "package row returned first" (package named and not); pin 5's
refusal-prose case. Each failed with `expected 'admitted' to deeply
equal { refused: … }`, or a non-lock error where `ITEM_LOCKED` was
expected.
- Green: the four cases where the old gate's first row happened to be
the binding one.
- Restored with `git checkout HEAD -- PATH` (absolute path, under trap).
Blob after = blob at HEAD = `388e091cb01e`; `git diff HEAD` empty.
## Tests
At `7fe49587a0` (after merging `origin/main` at `e83c9f6154`). The final
head `273ead3408` adds only a second merge of `origin/main`
(`e27a7c0c9e`), which touches `cloud-connection`, `service-storage`, a
pm reference doc and two ratchet baselines and no file of `spec`,
`metadata-core`, `metadata-protocol` or `objectql`, so these readings
carry:
- `pnpm --filter @objectstack/metadata-protocol exec vitest run
--maxWorkers=2`: 213 files passed, 3 skipped; 19 952 tests passed, 19
skipped.
- `pnpm --filter @objectstack/metadata-protocol typecheck`: exit 0. `tsc
--listFiles` includes all four edited test files.
- objectql, against the rebuilt `metadata-protocol` dist: the 8
lock-touching protocol files pass (160 tests). The full objectql suite
passed at `632a00751d`: 373 files, 7463 tests.
## Gates
All at head `273ead3408`, after the final commit.
- `node scripts/pm/dispatch-gates.mjs --commands` (no paths) derived
**74** commands. All 74 ran, plus the **54**-row artifact-roster block
it prints outside its total and the four symbol-anchor sweeps
(`check:adr-symbol-anchors`, `check:scripts-symbol-anchors`,
`check:spec-docblock-symbol-anchors`, `check:adr-anchors`): **132
commands, 129 exit 0**.
- `dispatch-gates --ran` over the recorded `cmd :: exit N` list: "74
derived famil(ies) accounted for — 74 run, 0 NOT-MEASURED (a DERIVED
zero — all 74 recorded an exit code and none of them is 3)".
- The three non-zero results are roster gates that read a pull request,
and locally have none (exit 2, NOT WIRED):
- `check-partof-closing-keyword`: re-run with this body as `PR_BODY`,
exit 0;
- `check-closing-target-claim` and `check-single-claim-paths`: **NOT
MEASURED**. Each needs a PR number and an API token; this session's
`GH_TOKEN` is invalid, and their guard workflows run on the PR.
- `check-closing-keyword-parity --body`: only `#21761` binds.
- Named readings:
- `check:engine-double-contract`: OK, after recording the one new pinned
row through its own `--write`.
- `check:durability-log-level`: green, read-seam invention included.
- `check:lean-entry-closure`: green, after building objectql.
- `check:dual-build-cjs-loads`: green.
- `check:nul-bytes`: OK.
- `check:changeset-no-major`: the level axis was measured with a
simulated PR body carrying this `Clause-②` line (`minor` passes; `patch`
exits 1).
- `check:adr-0087-registration`: one declared-breaking changeset,
carrying its disposition.
- **Lint, a proven narrowing.**
- Command: `eslint --no-inline-config --format json` over the 7 touched
`.ts` files, at `273ead3408`: 7 files, 0 errors, 0 warnings.
- Population, read from eslint's own `calculateConfigForFile` /
`isPathIgnored`: every one of the 7 is linted (none ignored).
- Invariance: `eslint.config.mjs` enables no type-aware linting (no
`parserOptions.project`, which reads null for each file), so this diff
cannot move any untouched file's verdict.
- The repo-wide `pnpm lint` is CI's.
- **NOT MEASURED here, CI's:**
- Test Core shards beyond the two packages above;
- Temporal Conformance, Dogfood, Build Core;
- the workspace type-check lane.
## Acceptance notes
- **Changeset grade.** The dispatch order asked for `patch`.
`check-changeset-no-major.mjs` refuses `patch` on a moved package under
`Clause-②: no (narrowing)` during the launch window. It was measured on
a throwaway local commit: exit 1, "it grades NO package whose
`packages/**/src/**` it moves" at the level a narrowing owes. So the
changeset is `minor`, with the `!` title and an ADR-0087 `not-required
(no-migration-prescription)` disposition; `check:adr-0087-registration`
reads it.
- **Artifact layer, same family, not changed here.** The reads look the
artifact up package-scoped (`lookupArtifactItem(type, name,
packageId)`); the gate looks it up package-agnostically. Measured on a
registry double that mirrors `getArtifactItem`'s
prefer-local-then-first-composite order, with packages B (`full`,
registered first) and A (no lock) shipping one view name:
- `getMetaItem` naming A reads `lock: none, editable: true`;
- a save naming A is refused `ITEM_LOCKED` with `source=artifact` and
B's reason.
Reported in the PR's report as a finding for the seat.
- **The list serves the latest of a slot's rows.**
`mergePackageAwareOverlay` picks, per package slot, the latest of that
package's row and the package-less row. With both present, the list's
body for package A is the package-less row when it comes back later,
while `getMetaItem` naming A serves A's row (H1 table, list column at
the base). The lock family on the list body now follows the binding
rows; the content selection is unchanged and is reported as a finding.
- `getMetaItemLayered`'s `effective` body now carries the binding
overlay lock family as `getMetaItem`'s body does. `code` and `overlay`
stay raw. On the artifact axis `effective` still never carried the
artifact's family, as before.
---
_Generated by [Claude
Code](https://claude.ai/code/session_017ErfyP2Rx7XWHJA27QjyUi)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1354e7b commit 18c2ddc
9 files changed
Lines changed: 923 additions & 194 deletions
File tree
- .changeset
- packages
- metadata-protocol/src
- objectql/src
- scripts
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
Lines changed: 33 additions & 23 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
108 | 108 | | |
109 | 109 | | |
110 | 110 | | |
111 | | - | |
112 | | - | |
| 111 | + | |
| 112 | + | |
113 | 113 | | |
114 | | - | |
115 | | - | |
116 | | - | |
117 | | - | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
118 | 119 | | |
119 | 120 | | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
120 | 140 | | |
121 | 141 | | |
| 142 | + | |
| 143 | + | |
122 | 144 | | |
123 | | - | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
135 | | - | |
136 | | - | |
137 | | - | |
138 | | - | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
139 | 149 | | |
140 | 150 | | |
141 | 151 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
45 | 45 | | |
46 | 46 | | |
47 | 47 | | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
52 | 81 | | |
53 | | - | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
54 | 90 | | |
55 | 91 | | |
56 | 92 | | |
57 | 93 | | |
58 | 94 | | |
59 | 95 | | |
60 | | - | |
61 | | - | |
| 96 | + | |
| 97 | + | |
62 | 98 | | |
63 | 99 | | |
64 | 100 | | |
| |||
131 | 167 | | |
132 | 168 | | |
133 | 169 | | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
0 commit comments