Repository navigation
Commit f3a52d3
fix(spec)!:
<!-- claude-projects-attribution: {"github_login":"os-sales"} -->
_Requested by **Sales** · [project
thread](https://claude.ai/code/project/chan_01D5bWFY3rFzgJcytD5gD4Uu?thread=cmsg_01D5bWFY3rFzgJcytD5gD4UuV5cRafodM2YQHxeDkdiWJM)_
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
Fixes #30017
Clause-②: no (narrowing)
Metadata-protocol: narrowed
Skills-docs: none — no `skills/**` file teaches an `action:icon`, or an
`action:group` / `action:menu` member, carrying `confirmText` beside an
array `params` (`git grep` of `skills/` for
`action:icon|action:group|action:menu`: 0 hits). The one rule line about
the pair (`skills/objectstack-ui/rules/actions.md` L22, "A registered
action is refused it beside a non-empty `params` (put the question on
`description`)") stays true and names the remedy this refusal
prescribes. The generated `content/docs/references/ui/component.mdx`
rows that render the three `confirmText` describes are regenerated here.
**BREAKING** accept-set narrowing at `ActionIconPropsSchema` and the
`action:group` / `action:menu` member rows (`@objectstack/spec`), served
where a page's component `properties` are judged: the component-props
gate (`component-props-invalid`, `@objectstack/lint`) at every CLI
command and at the runtime `page` save door.
## 维护者速读
- 改了什么:页面上的 `action:icon`,以及 `action:group` / `action:menu` 里的每个成员,同时写
`confirmText` 和非空数组 `params` 时,现在和
`action:button`、已注册动作、内联动作一样被拒收,提示把这句话挪到 `description`、删掉 `confirmText`。
- 为什么改:您在「Discuss pending spec rulings」线程对本卡裁定
A(「以上同意」)。这两类块把两键都交给同一个执行器,先弹确认框、再弹参数框,一个决定两个对话框;五道门现在用同一条判据、同一句提示。
- 风险与回滚:仓内普查 0 处已发运的载体,唯一命中是 spec 自己的一个测试夹具,本 PR 已改;不带 `params`、`params:
[]`、对象形 `params`(图标的静态值;`type: 'api'`
成员的请求体,都不弹参数框)照常通过。已存页面照常加载,下次保存才被拒。回滚即 revert 本 PR。
- 先看:`packages/spec/src/ui/component.zod.ts`(`ActionIconPropsSchema` 链尾与
`buildActionGroupMember` / `buildActionMenuMember` 链尾新增的
`.refine`),`packages/spec/src/ui/action-confirm-params-guard.test.ts`
末尾新的 describe
组,`packages/spec/src/ui/component-report-items-action-members-typed.pin.test.ts`
改过的夹具。
- 两分钟验证:`pnpm --filter @objectstack/spec exec vitest run
src/ui/action-confirm-params-guard.test.ts`,预期 29 个测试全过,其中新组 8 条(5 条拒收、3
条对照)。
- 需要你做的:无,席位落地。
## What changes
- **One predicate, one refusal, five doors.** `ActionIconPropsSchema`
gains `.refine((data) => !declaresConfirmBesideParams(data),
CONFIRM_BESIDE_PARAMS_REFUSAL)` at the end of its chain, exactly as
`ActionButtonPropsSchema` carries it. The `action:group` and
`action:menu` members each gain the same refine at the end of their
builder's chain (`buildActionGroupMember`, `buildActionMenuMember`, the
two consumers of `actionContainerMemberShape()`), so the issue lands on
the member, at `actions.N.confirmText`. No second predicate or message:
both are imported from
`packages/spec/src/ui/action-confirm-beside-params.ts`, whose predicate
and message are unchanged (the shared message needed no member-path
variant: its remedy key, `description`, is declared on the icon and on
both members); only its docblock now counts the five doors that read it.
- **The shared predicate already fits the ruling.** Its
`Array.isArray(params) && params.length > 0` read refuses a non-empty
array and leaves `params: []` and an object `params` alone: on
`action:icon` an object is the static parameter values, on a member it
is a `type: 'api'` member's request payload (a non-`api` member's object
`params` stays refused by `actionContainerMemberParamsFitType`,
unchanged).
- **The `confirmText` describes** of `action:icon` and of the container
member shape now append the sentence `action:button`'s carries: refused
beside a non-empty array `params`, correct with no `params`, beside
`params: []` and beside an object `params` (the member's wording names
the `type: 'api'` payload). `content/docs/references/ui/component.mdx`
is regenerated from them (`check:generated --fix`, which proved only
`check:docs` stale).
- **Census carrier repaired.**
`component-report-items-action-members-typed.pin.test.ts` §1 "a member
with every forwarded scalar" (`action:menu`) carried `confirmText`
beside an array `params`; its `params` moves to a new byte-identical
case, "a member collecting params", which carries the question on
`description`.
- **Changeset**
`.changeset/30017-action-icon-members-confirm-beside-params-refused.md`:
`@objectstack/spec` minor, both declaration lines, the ADR-0087
disposition marker (`registered`), the narrowing banner, before / now /
unchanged / who, and the one-line fix naming the D3 entry.
- **Step-18 D3 entry**
`packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-confirm-text-beside-params-refused.ts`
(added in the patch round, head `9d69f747cd`): one `SemanticMigration`
naming all four page action rows (`properties.confirmText` beside a
non-empty array `properties.params` on an `action:button` /
`action:icon`, and `confirmText` beside a non-empty array `params` on
each `action:group` / `action:menu` member), replacement on
`description`, NOT mechanically convertible, acceptance as `os validate`
reporting no `component-props-invalid` at those paths. It also covers
the `action:button` refusal PR #29869 shipped without an entry.
### ADR-0087 disposition
The changeset body carries the ADR-0087 marker comment with the
disposition `adr-0087: registered
ui-page-action-row-confirm-text-beside-params-refused` (patch round,
after contract review 6666209629: the refusal prescribes a hand rewrite,
so ADR-0087 D3 owes an entry rather than an exemption). `node
scripts/check-adr-0087-registration.mjs --base origin/main` exits 0 and
reads it as `registered`, the id new in this diff. No `docs/adr/**` path
is touched. The first head carried `not-required
(no-migration-prescription)`; that marker is gone.
## Verification
All readings at head `0446795a12` (the branch merged with `origin/main`
`5b748dfede`) unless a line says otherwise; the patch-round readings at
head `9d69f747cd` are in the os-dev-report patch-round comment on the
card; the implementation commits are `0c6f39767c`, `73fb6b963e`
(regenerated reference), `34eb15a15d` (envelope pin).
### Census at the base (`origin/main` `2ffdb649`)
- **AST pass** over every tracked `*.ts` / `*.tsx` / `*.js` / `*.mjs` /
`*.cjs` / `*.mts` (no `dist/`, no `.d.ts`): 213 files contain
`confirmText`; every object literal carrying both `confirmText` and a
`params` that is not an empty array or an object literal was listed with
the nearest enclosing `type` / `actionType` and the nearest enclosing
array or call naming an `action:icon` / `action:group` / `action:menu`
literal (the tuple-shaped fixtures). 48 such literals; 4 inside an
action-block context, each read by hand:
-
`packages/spec/src/ui/component-report-items-action-members-typed.pin.test.ts`
L217: an `action:menu` member (`type: 'api'`) with `confirmText` beside
`params: [{ name: 'reason', … }]`. **The one carrier**; a test fixture,
repaired here (above).
- `packages/lint/src/validate-action-copy-templates.test.ts` L131: an
`action:button` fixture (the `action:group` literal is a later array
element); it feeds the copy-template rule, which does not parse these
rows; the lint suite runs it green.
- `packages/spec/src/ui/action.zod.ts` L1156 and `component.zod.ts`
L4138: schema declarations, not carriers.
- **Non-code pass** over tracked `*.json` / `*.yaml` / `*.yml` / `*.md`
/ `*.mdx` naming both `confirmText` and one of the three blocks
(`CHANGELOG.md`, generated references, `json-schema/`, `api-surface`,
`sdui.manifest.json` excluded): `content/docs/frontend/layout.mdx`,
`content/docs/protocol/objectui/actions.mdx`,
`content/docs/ui/components/action.mdx`,
`packages/spec/liveness/action.json`; each read by hand — prose and key
tables, no example carrying the pair.
- Cloud fixtures are not in this repository and were not read.
**Disposition: 0 shipped carriers, 1 test fixture (repaired).**
### Before / after at the authoring door
`validateComponentProps` (`@objectstack/lint` src against this branch's
spec `dist`), one page per case:
| case | findings |
|:---|:---|
| `action:icon` with `confirmText` + array `params` | 1 ·
`component-props-invalid` · `error` ·
`…components[0].properties.confirmText` · "confirmText: An action that
declares `confirmText` beside a non-empty `params` shows the u…" |
| `action:group` member, same pair | 1 · `component-props-invalid` ·
`error` · `…components[0].properties.actions.0.confirmText` |
| `action:menu` member, same pair | 1 · `component-props-invalid` ·
`error` · `…components[0].properties.actions.0.confirmText` |
| menu member, array `params` + `description` (the remedy) | 0 |
| menu member, `confirmText` + `params: []` | 0 |
| `type: 'api'` menu member, `confirmText` + object `params` | 0 |
| `action:icon`, `confirmText`, no `params` | 0 |
Before: the ablation below is the base's behaviour for these three rows
(the refine is the only change on them), and it parses the pair clean.
### Pins (`packages/spec/src/ui/action-confirm-params-guard.test.ts`,
new top-level describe)
- Refusals (5): `action:icon` — one issue, `code: 'custom'`, `path:
['confirmText']`, message `toBe` `action:button`'s issue for the same
pair, and contains `TWO dialogs`, `` `description` `` and `param-LESS`;
`action:group` and `action:menu` members — one issue, `code: 'custom'`,
`path: ['actions', 1, 'confirmText']` (the second member), message
`toBe` `action:button`'s; and each member on the template-envelope
`confirmText` form, `[['custom', 'actions.1.confirmText']]`.
- Preservation (3): `action:icon` and each container member accept
`confirmText` with no `params`, beside `params: []`, beside an object
`params` (`type: 'api'` on the members), and the remedy (array `params`
+ `description`), each a full `safeParse` success.
### Ablation (committed state, `node scripts/ablation-replace.mjs`, test
source read from `src/`)
<details><summary>three legs, each red then restored</summary>
| leg (refine removed) | on-disk proof | result | restore |
|:---|:---|:---|:---|
| `ActionIconPropsSchema` | anchor 1 → 0, blob `3eec6db7ac20` →
`ff6c2420ddbb` | 1 failed / 28 passed: the `action:icon` refusal | blob
== HEAD, `git diff HEAD` empty |
| `buildActionGroupMember` | anchor 1 → 0, blob → `e77714c1e61d` | 2
failed / 27 passed: the group refusal and its envelope pin | blob ==
HEAD, `git diff HEAD` empty |
| `buildActionMenuMember` | anchor 1 → 0, blob → `aeb719fd841f` | 2
failed / 27 passed: the menu refusal and its envelope pin | blob ==
HEAD, `git diff HEAD` empty |
After the three legs, from the committed state: 29 / 29 passed. A first
member run whose replacement text was a substring of its anchor was
refused by the tool before running (replacement count 1 → 1), restored,
and rerun with a distinct replacement; it is not counted above.
</details>
### Tests
| command | result |
|:---|:---|
| `pnpm --filter @objectstack/spec test` (merged head) | 816 files
passed · 25669 tests passed, 1 todo |
| `pnpm --filter @objectstack/spec typecheck` (merged head) | exit 0 |
| `pnpm --filter @objectstack/lint exec vitest run` (head `34eb15a15d`,
lint closure built) | 195 files · 8087 passed, 5 skipped |
| `pnpm --filter @object-ui/types test` (head `34eb15a15d`) | 387 files
· 10464 passed |
| `@object-ui/components`
`spec-symbol-action-renderer-props-11073.test.ts` +
`src/renderers/action/` (head `34eb15a15d`) | 38 files · 616 passed |
| `pnpm --filter @objectstack/dogfood test` (head `34eb15a15d`, closure
built) | 420 files passed, 3 skipped · 3496 passed, 36 skipped |
| `npx eslint --no-inline-config` on the three changed `.ts` files |
exit 0 |
### Gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives the same 102 families at
`34eb15a15d` and at `0446795a12`. Exit codes are captured before any
pipe.
<details><summary>gate table, head 0446795 (102 families, exit
codes)</summary>
| family | exit |
|:---|:---|
| `node scripts/check-adr-0087-registration.mjs --base origin/main` | 0
|
| `node scripts/check-adr-0087-registration.mjs --self-test` | 0 |
| `node scripts/check-adr-links.mjs` | 0 |
| `node scripts/check-adr-links.mjs --self-test` | 0 |
| `node scripts/check-changeset-no-major.mjs --base origin/main` | 0 |
| `node scripts/check-closing-keyword-parity.mjs` | 0 |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 |
| `node scripts/check-comment-mask-adoption.mjs` | 0 |
| `node scripts/check-comment-mask-adoption.mjs --self-test` | 0 |
| `node scripts/check-comment-mask-corpus.mjs` | 0 |
| `node scripts/check-dev-prereqs.mjs --self-test` | 0 |
| `node scripts/check-doc-route-spelling.mjs --advisory` | 0 |
| `node scripts/check-doc-route-spelling.mjs --self-test` | 0 |
| `node scripts/check-docs-section-name.mjs` | 0 |
| `node scripts/check-docs-section-name.mjs --self-test` | 0 |
| `node scripts/check-dts-emitted.mjs --self-test` | 0 |
| `node scripts/check-empty-changeset.mjs --base origin/main` | 0 |
| `node scripts/check-empty-changeset.mjs --self-test` | 0 |
| `node scripts/check-issue-citations.mjs` | 0 |
| `node scripts/check-plugin-teardown-shape.mjs` | 0 |
| `node scripts/check-plugin-teardown-shape.mjs --self-test` | 0 |
| `node scripts/check-section-landing-index.mjs` | 0 |
| `node scripts/check-section-landing-index.mjs --self-test` | 0 |
| `node scripts/ci/assert-turbo-remote-cache.mjs --self-test` | 0 |
| `node scripts/ci/plan-test-core-shards.mjs --self-test` | 0 |
| `node scripts/ci/prune-turbo-cache.mjs --self-test` | 0 |
| `node scripts/docs-audit/check-affected-docs.mjs` | 0 |
| `node scripts/docs-audit/check-drift-comment.mjs` | 0 |
| `node scripts/pm/release-rehearsal-clone.mjs --self-test` | 0 |
| `node scripts/release-pending-publish.mjs --self-test` | 0 |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 |
| `pnpm --filter @objectstack/lint run check:doc-security-posture` | 0 |
| `pnpm --filter @objectstack/spec run check:api-surface` | 0 |
| `pnpm --filter @objectstack/spec run check:authorable-surface` | 0 |
| `pnpm --filter @objectstack/spec run check:browser-reachable-entries`
| 0 |
| `pnpm --filter @objectstack/spec run check:docs` | 0 |
| `pnpm --filter @objectstack/spec run check:dual-source-exports` | 0 |
| `pnpm --filter @objectstack/spec run check:duration-unit-keys` | 0 |
| `pnpm --filter @objectstack/spec run check:empty-state` | 0 |
| `pnpm --filter @objectstack/spec run check:entry-nameability` | 0 |
| `pnpm --filter @objectstack/spec run check:export-origins` | 0 |
| `pnpm --filter @objectstack/spec run check:exported-any` | 0 |
| `pnpm --filter @objectstack/spec run check:generated` | 0 |
| `pnpm --filter @objectstack/spec run check:liveness` | 0 |
| `pnpm --filter @objectstack/spec run check:llms-txt` | 0 |
| `pnpm --filter @objectstack/spec run check:skill-examples` | 0 |
| `pnpm --filter @objectstack/spec run check:skill-refs` | 0 |
| `pnpm --filter @objectstack/spec run check:strictness-ledger` | 0 |
| `pnpm --filter @objectstack/spec run check:variant-docs` | 0 |
| `pnpm --filter @objectstack/spec run check:yaml-examples` | 0 |
| `pnpm check:changeset-gate-self-tests` | 0 |
| `pnpm check:ci-filter-parity` | 0 |
| `pnpm check:closed-ceremony-text` | 0 |
| `pnpm check:corpus-claim-drift` | 0 |
| `pnpm check:cross-package-test-inputs` | 0 |
| `pnpm check:dispatcher-error-vocabulary` | 0 |
| `pnpm check:doc-anchors` | 0 |
| `pnpm check:doc-authoring` | 0 |
| `pnpm check:doc-frontmatter` | 0 |
| `pnpm check:docs-audit-scope` | 0 |
| `pnpm check:docs-redirects` | 0 |
| `pnpm check:docs-single-h1` | 0 |
| `pnpm check:docs-spec-enumerations` | 0 |
| `pnpm check:docs-transcript-drift` | 0 |
| `pnpm check:driver-memory-census` | 0 |
| `pnpm check:dts-closure` | 0 |
| `pnpm check:dual-build-cjs-loads` | 0 |
| `pnpm check:engine-double-contract` | 0 |
| `pnpm check:gitlink-declared` | 0 |
| `pnpm check:issue-citations` | 0 |
| `pnpm check:keyed-text-bounds` | 0 |
| `pnpm check:lean-entry-closure` | 0 |
| `pnpm check:logger-receiver-detach` | 0 |
| `pnpm check:merge-driver` | 0 |
| `pnpm check:nul-bytes` | 0 |
| `pnpm check:objectql-double-limit` | 0 |
| `pnpm check:org-identifier` | 0 |
| `pnpm check:page-declaration-shape` | 0 |
| `pnpm check:platform-object-tenancy-census` | 0 |
| `pnpm check:pm-prior-rulings` | 0 |
| `pnpm check:published-files` | 0 |
| `pnpm check:published-readme-links` | 0 |
| `pnpm check:query-options-erasure` | 0 |
| `pnpm check:react-page-adapter-contract` | 0 |
| `pnpm check:refd-timer-probe` | 0 |
| `pnpm check:registry-log-declared` | 0 |
| `pnpm check:rest-log-spy-declared` | 0 |
| `pnpm check:role-word` | 0 |
| `pnpm check:skill-identifier-liveness` | 0 |
| `pnpm check:slot-lookup` | 0 |
| `pnpm check:sourcemap-no-sources-content` | 0 |
| `pnpm check:spec-docblock-symbol-anchors` | 0 |
| `pnpm check:spec-parsed-alias` | 0 |
| `pnpm check:system-context-census` | 0 |
| `pnpm check:test-source-alias` | 0 |
| `pnpm check:tier-file-adoption` | 0 |
| `pnpm check:type-check-coverage` | 0 |
| `pnpm check:type-check-debt` | 0 |
| `pnpm check:undeclared-dep-imports` | 0 |
| `pnpm check:vendor-version-stamps` | 0 |
| `pnpm check:watch-hint-literal` | 0 |
| `pnpm check:where-matcher` | 0 |
`node scripts/pm/dispatch-gates.mjs --ran` on this record: **102
derived, 102 run, 0 NOT-MEASURED, 0 UNRUN** (a derived zero: all 102
lines carry an exit code). Also run: `pnpm check:adr-0087-registration`
0, `pnpm check:doc-authoring` 0, `pnpm check:skill-frame-freshness` 0,
`pnpm check:dev-prereqs` 1 (see Acceptance notes).
</details>
## Acceptance notes
- **The predicate module's docblock** now counts the five doors that
read it (patch round, surface widened by amendment 6666273551); the
predicate and the message are unchanged.
- **The `description` remedy on an `action:icon`.** With no `label`, an
icon's `description` is also its tooltip text, so moving the confirm
sentence there changes the tooltip too. The changeset's remedy says so;
the shared message is unchanged.
- **`check:dev-prereqs`** (local-only family) exits 1 in this worktree:
35 `ui/` workspace packages have no `dist/` because no full `pnpm build`
ran here. It judges whether this checkout can boot a dev server, not
this diff.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01L6bhgVugtCCwBs98FeR27P
<!-- signed: domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
-->
---------
Co-authored-by: Claude <noreply@anthropic.com>action:icon and the action:group / action:menu members refuse confirmText beside a non-empty array params, as action:button does (#30624)1 parent af8aab1 commit f3a52d3
7 files changed
Lines changed: 234 additions & 19 deletions
File tree
- .changeset
- content/docs/references/ui
- packages/spec/src
- migrations/entries/semantic
- ui
| 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 | + | |
Large diffs are not rendered by default.
| 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 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | | - | |
8 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
15 | | - | |
16 | | - | |
17 | | - | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
18 | 21 | | |
19 | 22 | | |
20 | | - | |
21 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
22 | 27 | | |
23 | 28 | | |
24 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
| |||
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
38 | | - | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
39 | 46 | | |
40 | 47 | | |
41 | 48 | | |
| |||
378 | 385 | | |
379 | 386 | | |
380 | 387 | | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
224 | 233 | | |
225 | 234 | | |
226 | 235 | | |
| |||
0 commit comments