Commit eedc16a
feat: vendor/scan/apply overhaul — lockfile-driven discovery, verified auto-fetch, mismatch-tolerant apply (#115)
* fix(purl): percent-decode purl components from the API
The patches API serves scoped purls percent-encoded
(pkg:npm/%40scope/name@1.0.0) and scan stores them verbatim as manifest
keys, but neither the npm crawler nor the vendor coordinate parser
decoded them — so apply/vendor reported scoped packages as 'package not
installed', and detect_prunable saw every encoded entry as prunable.
- utils/purl.rs: percent_decode_purl_component (strict, all-or-nothing,
fail-safe passthrough), normalize_purl + purl_eq (compare/display
only, never path construction)
- npm_crawler parse_purl_components, vendor parse_npm_purl (NpmCoords
now owns decoded name/version; base_purl stays verbatim for ledger/
manifest key parity), parse_jsr_purl: decode AFTER /-and-@ splits,
BEFORE the is_safe_* guards — %2e%2e/%2f cannot smuggle traversal
- detect_prunable + purl_matches_identifier compare normalized forms
- human output shows the decoded purl; JSON keeps verbatim keys
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): auto-force staging on content mismatch + correct already-applied events
The vendor stage is a private copy and every apply write path is
hash-gated to exactly afterHash, so a beforeHash mismatch (a patch built
against different bytes than the installed artifact, or a package
already patched in place by apply) no longer fails the vendor: the
stage is overwritten with the verified patched content and the
overwrite surfaces as a vendor_content_mismatch_overwritten warning
event. Missing patch-target files still fail closed without --force
(force's silent NotFound skip would pack an artifact without the fix).
- shared force_apply_staged / missing_existing_patch_files /
mismatch_overwrite_warnings policy helpers in vendor/mod.rs, used by
all npm flavors (via stage_patch_pack) + cargo/composer/gem/pypi/
golang backends; dry runs predict the same outcome
- vendor.rs: gate the already_vendored rewrite on entry.is_none() — the
first vendor of an in-place-applied package now emits Applied (it
packed + rewired this run) instead of a miscounted skip
- scan --vendor: pre-prompt baseline check annotates mismatched
packages before the confirm prompt (best-effort, read-only)
- --force narrowed to missing-file tolerance + variant-probe bypass;
CLI_CONTRACT.md documents the new warning code
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): take over exact-version override pins (pnpm + yarn berry)
A user-authored override/resolution that pins the package to exactly
the version being vendored (Flowise: pnpm.overrides 'tar-fs': '3.1.0')
no longer refuses with vendor_override_conflict. The pin's key is kept
(its spelling and quoting preserved on both pnpm surfaces — pnpm
hard-requires the package.json and lock override maps to agree), its
VALUE is rewritten to the file:.socket/vendor/... spec, and the pinned
value is recorded as the wiring original so every revert path (--revert,
reconcile, remove) restores the user's pin verbatim.
- pnpm: classify_pkg_override (Insert / Ours / Takeover) replaces the
boolean conflict checks; effective key threads through EditCtx,
apply_pkg_override and edit_overrides; revert restores originals in
place instead of deleting. Ranges, different versions, parent>child
selector chains, and duplicate same-name keys still refuse, now with
a hint that exact pins are taken over.
- yarn berry: bare-name resolutions pin equal to the version is taken
over symmetrically (KIND_RESOLUTION records the original).
- npm/yarn-classic/bun wire the lock only (no override surface), so
no conflict exists there to take over.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(scan): prune lifecycle for vendored packages
scan --prune previously blanket-exempted vendored purls, so nothing
ever cleaned unused vendored state: dropped patches kept their
artifacts and overrides forever, removed dependencies stayed redirected,
and orphan uuid dirs were only swept by vendor --revert.
The prune pass now runs a vendored-state GC first (under the apply
lock; contention degrades to a skip, never a scan failure):
(a) entries whose patch is gone from the manifest are reverted
(same stale test as the vendor flows' reconcile_dropped);
(b) entries whose dependency left the lockfile graph are reverted and
their manifest entries dropped, feeding the same pass's blob sweep.
Per-flavor in-use probes: pnpm scans packages:/snapshots: blocks
for the artifact (the mirrored overrides: declaration alone is not
usage); package-lock/yarn/bun probe the lock text for the uuid dir
(those flavors wire resolutions into the lock itself). None =
cannot determine = keep, fail-safe; detached entries are exempt
(lockfile-invisible by design);
(c) orphan .socket/vendor/<eco>/<uuid> dirs are swept (extracted from
run_revert into a shared sweep_orphan_vendor_dirs).
JSON gc gains revertedVendoredEntries/removedVendorOrphanDirs (wet)
and revertableVendoredEntries/vendorOrphanDirs (preview, which also
mirrors the wet pass's manifest drops so blob counts agree); human
output gains a GC summary line. CLI_CONTRACT.md updated.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* test: e2e coverage for encoded scoped purls, mismatch annotation, prune lifecycle
- scan_vendor_e2e: full pipeline with the API's percent-encoded scoped
purl form (download -> vendor lookup against node_modules/@scope ->
lock rewiring -> prune exemption); interactive pre-prompt baseline
annotation + auto-force warning; scan --prune reverting an unused
vendored entry (ledger + manifest + artifact + lock all reconciled)
- clippy: too_many_arguments allow on stage_patch_pack, JsrPurlParts
type alias
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): lockfile inventory module for npm-family locks
Read-only inventories of the dependency set a lockfile resolves,
independent of what is installed: name/version/purl plus the lock's
artifact URL and content verifier (typed LockIntegrity: SRI, yarn sha1
fragment, berry cache-zip checksum, sha256 hex, go.sum h1 — the latter
two for the ecosystems that follow). Powers scan's lockfile supplement
and vendor's missing-package fetch.
Covers all five npm flavors via detect_npm_lock_flavor (package-lock/
shrinkwrap, pnpm v9, yarn classic, yarn berry, bun). Fail-soft per
entry, fail-closed per value (names/versions path-guarded; git/file/
link/workspace specs and our own vendored entries excluded; duplicate
instances dedup preferring a verifier). lookup() bridges percent-
encoded manifest purls. Reuses the wiring backends' parsers via
pub(super) visibility bumps.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): registry_fetch — verified pristine-artifact fetching
Downloads the artifact a lockfile entry resolves (lock-recorded URL,
else the conventional npm registry URL; SOCKET_NPM_REGISTRY override),
verifies it against the lock-recorded integrity FAIL-CLOSED before any
disk write (strongest hash of a multi-hash SRI; yarn sha1 fragment;
sha256 hex), and extracts to a private tempdir the vendor pipeline can
stage from. Entries with no verifier are refused without any network
I/O (Unverifiable).
Hardening: http(s)-only, download/decompression/entry-count/entry-size
caps, regular-files-only extraction with first-component strip +
is_safe_relative_subpath (fail-closed on traversal-bearing tarballs,
nothing half-extracts), exec bits preserved so the deterministic
re-pack keeps bin scripts executable.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor,scan): auto-fetch missing packages + lockfile/ledger discovery
vendor: a manifest patch whose package has no installed copy is now
satisfied automatically (no flag) instead of failing with
package_not_installed:
- already-vendored purls stage from their own committed artifact,
sha256-verified against the vendor ledger (fresh-clone re-vendor and
in-sync runs work offline, no registry traffic);
- otherwise the lockfile-resolved pristine artifact is fetched
(lock-recorded URL else conventional registry URL), verified against
the lock's integrity FAIL-CLOSED, and staged from a private tempdir —
the project tree is never touched.
Reason codes: vendor_fetched_missing (skip-warning beside the Applied
event), vendor_fetch_failed (distinct Failed, suppresses the duplicate
not-installed skip), vendor_fetch_unverifiable (no lock integrity →
calm skip). --offline keeps the calm skip and names the lockfile as
the would-be source.
scan: discovery now supplements the installed-tree crawl with
(a) lockfile-only dependencies — warned '[NOT INSTALLED]' in the table
+ a stderr note, JSON lockfileOnlyPackages + packages[].notInstalled,
counted as scanned so a wiped node_modules no longer prunes
lockfile-listed entries, partitioned out of --apply BEFORE download
(calm skipped/package_not_installed records, exit 0, no manifest
writes) while --vendor passes them to the auto-fetch; and
(b) vendored-ledger entries — the committed artifact IS the dependency,
so updates[] detection and scan --vendor keep working on a fresh
clone before any install.
scan --json --vendor now vendors a completely fresh clone end-to-end
(e2e-proven, second run already_vendored).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): yarn berry checksum-verified fetch + ledger artifact staging tests
Berry locks never hash the tarball — the checksum is sha512 of the
deterministic cache zip. The fetch rebuilds that zip from the fetched
bytes via the same spike-pinned berry_zip recipe the wiring uses and
compares the 10c0/<hex> value fail-closed (foreign cacheKeys are
Unverifiable). Plus unit coverage for stage_local_artifact's
ledger-sha256 gate.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): cargo + golang lockfile inventory and verified fetch
- Cargo.lock [[package]] inventory: crates.io-sourced entries carry
their sha256 .crate checksum (Sha256Hex); workspace members skipped,
git/custom-registry sources discovery-only. Fetch from
static.crates.io (SOCKET_CRATES_REGISTRY override), verify, extract
({name}-{version}/ top dir) — feeds vendor_cargo_crate's pristine_src.
- go.sum inventory: module-zip h1: lines (the /go.mod manifests-only
lines skipped). Fetch from the module proxy (SOCKET_GOPROXY, else the
standard GOPROXY's first non-direct element, else proxy.golang.org)
with Go's !uppercase path escaping; verify the dirhash Hash1/HashZip
in memory BEFORE extraction (algorithm validated against a live
sum.golang.org lookup for golang.org/x/text@v0.14.0); extract with
the explicit module@version/ prefix (module paths contain slashes, so
a first-component strip would be wrong) — feeds vendor_go_module.
- lookup() generalized across ecosystems; inventory_project() returns
the union the scan supplement and vendor auto-fetch consume.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): composer + gem + pypi lockfile inventory and verified fetch
- composer.lock packages[]/packages-dev[]: zip dists with their sha1
shasum (frequently empty → discovery-only); names lowercased to the
packagist form, pretty leading v dropped; path dists (ours) excluded.
Fetch verifies sha1 and strips the variable zipball top dir.
- Gemfile.lock GEM/specs + bundler 2.6 CHECKSUMS sha256 (older locks
discovery-only); the GEM remote drives the /downloads/<gem> URL.
Platform-suffixed specs skipped (unsupported for vendoring). The
fetched .gem (plain tar) is sha256-verified whole, then data.tar.gz
extracts at the root (no prefix strip).
- pypi: uv.lock registry packages with a pure py3-none-any wheel carry
a fetchable URL + sha256; poetry.lock and ==-pinned requirements.txt
contribute discovery-only entries (PEP 503-normalized names). The
unzipped wheel is a site-packages-shaped stage for the pypi backend.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(scan): all-ecosystem lockfile supplement + docs
scan's lockfile supplement now consumes inventory_project (npm-family,
Cargo.lock, go.sum, composer.lock, Gemfile.lock, uv/poetry/requirements)
with per-ecosystem counts; the vendor auto-fetch pass likewise serves
every inventoried ecosystem. CLI_CONTRACT.md gains the lockfile-
supplement and vendor-auto-fetch sections + the three reason codes;
README notes the fresh-clone flow; the exact-shape empty-scan contract
test pins the additive lockfileOnlyPackages field; the cargo build e2e
scrubs ambient CARGO_TARGET_DIR from child builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(apply): beforeHash mismatch warns and applies the full blob by default; --strict restores the hard error
A file whose on-disk content matches NEITHER the patch's beforeHash nor
its afterHash previously hard-failed the in-place apply (the flatted
case: a patch built against non-registry bytes made plain apply
unusable). The default now overwrites such files with the FULL verified
patched content and continues:
- core: apply_package_patch's force bool becomes MismatchPolicy
{Warn (default) | Strict | Force}. Warn promotes HashMismatch to
Ready keeping the warning signature (expected/current hashes); the
diff strategy self-disables on a wrong base (partial patches are
skipped, as they must be) and the archive/blob writes stay hash-gated
to exactly afterHash — a tolerated mismatch lands verified patched
bytes or fails, never silent corruption. Missing pre-existing files
still fail closed (only Force skips them).
- CLI: global --strict (env SOCKET_STRICT) restores the fail-closed
behavior across apply/get/scan --apply/the hook/go redirects
(--force overrides it); plumbed through DownloadParams into the
nested applies. Vendor staging is unaffected (already auto-forces
into its private stage).
- Each overwrite logs a content_mismatch_overwritten warning to stderr
and rides the JSON envelope as a Skipped warning event beside the
package's Applied event.
- Since the full content lives in the afterHash blob and the default
--download-mode diff may not have staged it, a pre-apply pass probes
for mismatches and downloads the missing blobs by hash (offline runs
warn and let those files fail).
Live-verified: pristine flatted@3.3.1 + its bad-baseline patch now
applies 6/6 files via blob with per-file warnings (exit 0);
apply --strict exits 1 with the old error and leaves files untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* polish(apply): decode percent-encoded purls in human output
The 'Patched packages' summary and the no-matching-installed-package
warning printed manifest keys verbatim (pkg:npm/%40scope/...); show the
decoded form like the scan/vendor output does. JSON keeps verbatim keys.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(vendor): hold patch blobs in memory — vendoring writes no .socket/blobs or temp files
Vendor flows (vendor, scan --vendor, --detached) no longer persist patch
content anywhere on disk: a vendored project's .socket holds only
manifest.json and vendor/.
- core: PatchSources.mem_blobs overlay, checked before the on-disk blob
read in the apply pipeline's blob strategy.
- core: harvest_artifact_blobs — re-stage afterHash blobs from the
committed vendor artifact itself (uuid-matched against the ledger,
every blob self-verified by its own git-sha256), so in-sync re-runs
and fresh clones of vendored projects stage with no network.
- cli: stage_vendor_sources_in_memory replaces the disk stager in all
vendor flows; missing content is fetched per patch via the proxy-aware
patch-view endpoint straight into memory.
- cli: DownloadParams.persist_blobs — scan passes !args.vendor so the
scan --vendor download phase writes only the manifest.
- e2e: .socket-stays-lean assertions (manifest mode, detached, fresh
clone) + no-blobs detached idempotency; core harvest unit tests
(tgz, dir-shaped, stale-uuid, escaping-path fail-closed).
- docs: CLI contract "Patch sources stay in memory" section.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(repair): rebuild missing/corrupt vendored artifacts + no-ledger reconstruction
repair now owns the vendored-artifact lifecycle: artifacts referenced by
the ledger and/or rewired lockfiles but missing or corrupt on disk are
rebuilt fail-closed, and a wholesale-deleted .socket/vendor (state.json
included) is reconstructed from the lockfile references alone.
Core:
- ArtifactHealth + check_vendored_artifact (vendor/verify.rs): per-file
afterHashes plus a whole-file sha256 cross-check against the ledger for
file-shaped artifacts.
- recover_lock_entry (lock_inventory): the pre-vendor registry fragment
recovered from the wiring originals (npm/pnpm/yarn/berry/bun fragments,
composer dist, gem checksum line, uv wheel, cargo entry.lock); golang
rides the unrewired go.sum.
- wired_vendor_integrity + fetch_npm_unverified + artifact_matches_integrity:
the REWIRED lock's recorded integrity of our packed tarball is the trust
anchor — reconstruction can fetch pristine unverified and still land only
bytes that reproduce the wired integrity (tamper => removed, fail).
- Artifact-only rebuild branches in the composer/cargo/gem/golang/pypi
backends: wired-but-broken artifacts rebuild in place with NO lock write
and NO ledger re-record (fixes the latent original-clobbering full-path
re-run); golang in-sync re-runs now record nothing; uv same-uuid re-runs
are an InSync hot path instead of a refusal.
- pnpm: fail-closed duplicate-mapping-key guard for half-edited locks in
edit_packages/edit_snapshot_rekey.
- Memory stager: a diff archive alone is no longer a sufficient vendor
source (auto-force can need full after-blobs a diff cannot produce).
CLI:
- repair_vendor.rs: ledger health pass, lockfile-reference reconstruction
(uuid recovered from the contract's path rule; manifest record else the
patch view API => detached entry with the record embedded), rebuilds via
the normal vendor dispatch + the pristine-source ladder, post-verified
against the recorded fingerprint. Offline rebuilds run when fully local.
- repair: manifest_not_found softened when vendor traces exist; step 1
skips vendored/lockfile-referenced entries (a vendored project's repair
never re-litters .socket/blobs|diffs).
- vendor auto-fetch: a MISSING committed artifact falls through to the
ledger-recovered registry fetch instead of failing; corrupt stays loud.
- Envelope: PatchAction::Rebuilt + summary.rebuilt (omitted while zero).
Tests: repair_vendor_e2e (12 scenarios incl. tampered-pristine rejection,
offline both ways, detached, no-ledger and no-manifest reconstruction),
per-backend wired-missing-copy rebuilds, health matrix, fragment recovery
per wiring kind, pnpm colon-key scanner unit, half-drifted lock guard.
Live-verified on Flowise: 19/19 fresh vendor with a lean .socket, deleted
artifact rebuilt byte-identically, and a 14/14 full reconstruction from
nothing but the rewired pnpm lockfile.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(pnpm): bind vendor edits to name@VERSION — multi-version vendoring corrupted the lock
Every "ours" probe in the pnpm backend matched ANY same-name
.socket/vendor path, so a project vendoring the same package at several
versions (Flowise: three fast-xml-parser, five minimatch patches) had
each version's edit treat its siblings' entries as its own stale wiring:
override values were clobbered to the wrong tarball and packages/
snapshots rekeys spliced duplicated mapping keys — which pnpm
hard-rejects (ERR_PNPM_BROKEN_LOCKFILE), discovered live when repair's
reconstruction re-dispatched all versions in sequence.
- EditCtx::is_ours / both is_ours_key block probes / the override
classification + lock-side mirror check now require the vendor path's
leaf to be THIS name-version.tgz (any uuid — stale-uuid refresh
unchanged); sibling-version vendored entries are skipped as coexisting.
- edit_packages/edit_snapshot_rekey fail closed when BOTH the
registry-keyed and our file:-keyed entry exist (a half-edited lock):
refusing beats splicing a duplicate key.
- Regression tests: multi-version vendor coexistence (per-section
duplicate-key audit), integrity-drift refresh stays single-keyed,
half-drifted duplicate guard.
Live-verified on Flowise end to end: scan --vendor (16/16) →
pnpm install --frozen-lockfile → rm -rf .socket → repair (16/16
reconstructed from the lockfile alone) → frozen install again, exit 0.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* test(docker): pin scan --sync to --strict where apply --force must stay the writer
The cargo/composer/golang/maven/nuget docker chains use an all-zeros
beforeHash fixture and assert that the dedicated `apply --force` step is
the one that patches (exactly one applied, skipped:0, marker written by
apply). The new mismatch-warn default makes `scan --sync` overwrite the
mismatched file with the verified blob during the scan itself, so the
later apply reported already_patched and every gate failed. `--strict`
restores the hard-error scan these scripts encode; the warn-overwrite
default keeps its coverage in the wiremock apply/scan suites and the
deno/gem/pypi docker chains (real beforeHashes).
The remaining red CI (3-OS test, test-release, coverage, deno/pypi
docker baselines) was the live patches API returning 503 "Service
temporarily over capacity" during the run — transient, recovered.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* test(docker): pin the content_mismatch_overwritten warning in the force-apply gates
With scan pinned to --strict, the dedicated `apply --force` step is the
writer again — but force-overwriting the all-zeros-baseline fixture now
also surfaces the content_mismatch_overwritten warning as a Skipped
event, so the old `skipped:0` gates fail. Assert the new contract
instead: exactly one skip AND the warning's errorCode present
(cargo/golang/maven/nuget×2; composer has no skipped gate).
All five suites verified locally against freshly built images.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent ac1fdd6 commit eedc16a
52 files changed
Lines changed: 11988 additions & 710 deletions
File tree
- crates
- socket-patch-cli
- src
- commands
- tests
- socket-patch-core
- src
- crawlers
- patch
- vendor
- utils
- tests
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
233 | 233 | | |
234 | 234 | | |
235 | 235 | | |
236 | | - | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
237 | 240 | | |
238 | 241 | | |
239 | 242 | | |
| |||
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
62 | 65 | | |
63 | 66 | | |
64 | 67 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
147 | 160 | | |
148 | 161 | | |
149 | 162 | | |
| |||
378 | 391 | | |
379 | 392 | | |
380 | 393 | | |
| 394 | + | |
381 | 395 | | |
382 | 396 | | |
383 | 397 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 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 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 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 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
11 | 114 | | |
12 | 115 | | |
13 | 116 | | |
| |||
102 | 205 | | |
103 | 206 | | |
104 | 207 | | |
105 | | - | |
| 208 | + | |
106 | 209 | | |
107 | 210 | | |
108 | 211 | | |
| |||
126 | 229 | | |
127 | 230 | | |
128 | 231 | | |
129 | | - | |
| 232 | + | |
130 | 233 | | |
131 | 234 | | |
132 | 235 | | |
| |||
139 | 242 | | |
140 | 243 | | |
141 | 244 | | |
142 | | - | |
| 245 | + | |
143 | 246 | | |
144 | 247 | | |
145 | 248 | | |
| |||
538 | 641 | | |
539 | 642 | | |
540 | 643 | | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
541 | 659 | | |
542 | 660 | | |
543 | 661 | | |
| |||
609 | 727 | | |
610 | 728 | | |
611 | 729 | | |
612 | | - | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
613 | 735 | | |
614 | | - | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
615 | 740 | | |
616 | 741 | | |
617 | 742 | | |
| |||
888 | 1013 | | |
889 | 1014 | | |
890 | 1015 | | |
| 1016 | + | |
891 | 1017 | | |
892 | 1018 | | |
893 | 1019 | | |
| |||
969 | 1095 | | |
970 | 1096 | | |
971 | 1097 | | |
| 1098 | + | |
972 | 1099 | | |
973 | 1100 | | |
974 | 1101 | | |
| |||
977 | 1104 | | |
978 | 1105 | | |
979 | 1106 | | |
980 | | - | |
| 1107 | + | |
981 | 1108 | | |
982 | 1109 | | |
983 | 1110 | | |
| 1111 | + | |
984 | 1112 | | |
985 | 1113 | | |
986 | 1114 | | |
| |||
1052 | 1180 | | |
1053 | 1181 | | |
1054 | 1182 | | |
| 1183 | + | |
1055 | 1184 | | |
1056 | 1185 | | |
1057 | 1186 | | |
1058 | 1187 | | |
1059 | 1188 | | |
1060 | 1189 | | |
1061 | 1190 | | |
1062 | | - | |
1063 | | - | |
| 1191 | + | |
| 1192 | + | |
| 1193 | + | |
| 1194 | + | |
| 1195 | + | |
| 1196 | + | |
| 1197 | + | |
| 1198 | + | |
| 1199 | + | |
| 1200 | + | |
| 1201 | + | |
| 1202 | + | |
| 1203 | + | |
| 1204 | + | |
| 1205 | + | |
| 1206 | + | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
1064 | 1212 | | |
1065 | | - | |
1066 | | - | |
1067 | | - | |
1068 | | - | |
1069 | | - | |
1070 | | - | |
1071 | | - | |
1072 | | - | |
1073 | | - | |
1074 | | - | |
1075 | | - | |
1076 | | - | |
1077 | | - | |
1078 | | - | |
1079 | | - | |
| 1213 | + | |
| 1214 | + | |
1080 | 1215 | | |
| 1216 | + | |
1081 | 1217 | | |
1082 | 1218 | | |
1083 | 1219 | | |
| |||
1111 | 1247 | | |
1112 | 1248 | | |
1113 | 1249 | | |
1114 | | - | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
1115 | 1254 | | |
1116 | 1255 | | |
1117 | 1256 | | |
| |||
1289 | 1428 | | |
1290 | 1429 | | |
1291 | 1430 | | |
1292 | | - | |
| 1431 | + | |
1293 | 1432 | | |
1294 | 1433 | | |
1295 | 1434 | | |
| |||
0 commit comments