Commit df79914
Xls 68 sponsored fees reserves updated (#720)
* initial commit
* add tests for IssueType
* add NumberType tests
* add tests
* add DomainID to permission domain
* add fixtures
* rename NumberAmount to AssetAmount
* add IssueType tests
* import IT
* add more tests
* fix checkstyle warnings
* add transactions, ledger objects and tests
* address code review comments
* add migration guide
* remove unnecessary checks
* small refactor
* update migration guide
* xrpl-ai suggestions
* add helper methods for counterparty signing
* add sorting support for multi-sign in CounterpartySignature
* add tests for signing/multi-sign
* add isNegative and isZero on AssetAmount
* add LoanBrokerSetTest
* add LoanBrokerDeleteTest
* add computeLoanSetNetworkFees
* add LoanBrokerCoverDepositTest
* add LoanBrokerCoverWithdrawTest
* add LoanBrokerCoverClawbackTest
* add LoanSet test
* add more tests
* add Meta object tests
* disable SingleAssetVaultIT on Testnet
* refactor IT
* fix checkstyle warnings
* restore XrplEnvironment
* add checks on AssetAmount
* add signers length checks
* increase coverage
* fix checkstyle
* initial commit XLS-0068
* added changes based on 2 agent reviews
* remove superfluous files
* remove config file
* fix linting errors
* fixed @beta tag
* added wrappers for single signed and multi signed transactions
* resolve error related to merge
* enhanced test coverage
* added test coverage
* addressed PR comments
* added validation checks
* use xrpld:sponsor
* fix combatibility issues
* addressed PR comments
* test fix: Enable SponsorshipIT and align with rippled XLS-68 sponsor branch
* test fix: update SponsorshipFlagsTest to match lsf* flag values (0x10000/0x20000)
* fix: restore legleux/xrpld:sponsor as RippledContainer image for CI
* chore(test): use local xrpld:sponsor-local image for RippledContainer
Swap the RippledContainer image from legleux/xrpld:sponsor (pulled
from Docker Hub) to a locally-built xrpld:sponsor-local tag with
PullPolicy.defaultPolicy(), so integration tests run against the
locally-built rippled sponsor-branch image.
* style: fix VariableDeclarationUsageDistance on charlieAddress in SponsorshipIT
Move the charlieAddress declaration in testSponsorshipTransferReassign
from the top of the method to immediately before its first use in
Step 3, satisfying the checkstyle VariableDeclarationUsageDistance rule
(distance was 6, max allowed 3).
* style: fix VariableDeclarationUsageDistance on charlieKeyPair in SponsorshipIT
Move the charlieKeyPair declaration in testSponsorshipTransferReassign
from the top of the method to immediately before its first use in
Step 3 (alongside charlieAddress), satisfying the checkstyle
VariableDeclarationUsageDistance rule.
* fix(test): revert RippledContainer to legleux/xrpld:sponsor for CI
Restore the publicly-pullable legleux/xrpld:sponsor image and
PullPolicy.alwaysPull() so integration tests run on GitHub Actions,
which has no access to the locally-built xrpld:sponsor-local tag
introduced in 2773b22.
* fix(codec): add missing SponseeNode field to definitions.json
Per XLS-0068, the Sponsorship ledger object carries a SponseeNode
field (UInt64, nth=32). SponsorshipObject.java already serializes it
via @JsonProperty("SponseeNode"), but the field was absent from
definitions.json, so any binary-codec round-trip of a Sponsorship
object emitted by rippled would fail to decode.
Matches rippled source: sfields.macro line 155
TYPED_SFIELD(sfSponseeNode, UINT64, 32)
* fix: remove direct docker-java-api import to fix undeclared dependency check
Replaced explicit (Consumer<CreateContainerCmd>) cast with an inferred
lambda so that the docker-java-api transitive dependency is no longer
directly referenced in source, fixing the dependency:analyze-only failure.
* fix: declare docker-java-api dependency and disable SponsorshipIT on devnet/testnet
- Add docker-java-api as explicit test dependency in integration-tests pom.xml
to satisfy dependency:analyze-only (RippledContainer directly uses CreateContainerCmd
bytecode regardless of the source-level cast)
- Annotate SponsorshipIT with @DisabledIf to skip on devnet/testnet/clio environments
where the featureSponsorship amendment is not yet enabled, matching the pattern
used by BatchTransactionIT, LendingProtocolIT, SingleAssetVaultIT, and XChainIT
* fix: rebase Sponsor model onto current rippled#7350 wire format
rippled's Sponsor implementation moved on significantly since this PR
was written against #5887. Realigns the Java model with the current
xrplf/sponsor branch:
- SponsorshipSet/SponsorshipTransfer tx type codes: 86/85 -> 91/90
- ReserveCount renamed to RemainingOwnerCount and renumbered (72->73);
SponsorFlags nth 73->74; ObjectID nth 39->41
- SponsorshipTransfer gains a Sponsee field for ending a third party's
sponsorship, validated to only be set with tfSponsorshipEnd
- SponsorshipSetFlags gains the missing Clear variants
(tfSponsorshipClearRequireSignForFee/Reserve)
- Sponsor field removed from OfferObject/NfTokenOfferObject/
TicketObject (excluded from rippled's current scope) and added to
MpTokenObject/MpTokenIssuanceObject/SignerListObject (now in scope)
- SponsorshipTransfer requires a SponsorSignature for account-level
tfSponsorshipReassign, matching rippled's fix for the
forced-transfer-without-consent vulnerability
* fix: use fully-qualified Beta reference in Sponsor field javadoc
The short {@link Beta} reference doesn't resolve in the Immutables-generated
classes, which don't import com.google.common.annotations.Beta, breaking the
javadoc:jar build (attach-javadocs).
* fix: revert SponsorshipSet/SponsorshipTransfer type codes to 86/85
The CI-pinned rippled test image (legleux/xrpld:sponsor) is a snapshot
that predates rippled's transaction-type renumbering on the
xrplf/sponsor branch. It still expects SponsorshipSet=86 and
SponsorshipTransfer=85, and rejects the current upstream values
(91/90) with "Invalid transaction type". Reverting just the type
codes restores compatibility with what CI can actually exercise today;
the rest of the rebase (field renames, new flags, ledger-object scope,
consent check) is unaffected since none of it is gated by tx type.
* Address PR #720 review comments: signing, validation, and CI fixes
- Move SponsorSignature to crypto.signing package (sappenin)
- Move sponsorship field validation from SignatureUtils into a
Transaction @Value.Check, and remove the now-redundant
toSponsorSignableBytes/sponsorSign special-casing (sappenin)
- Add missing @OverRide annotations on SponsorshipSetFlags (code quality bot)
- Add missing unit test coverage for PaymentFlags.tfSponsorCreatedAccount
and the new sponsor fields on PayChannelObject/EscrowObject/
RippleStateObject (sappenin)
- Fix SponsorshipSet.flags() to return SponsorshipSetFlags instead of
the generic TransactionFlags, and add field-level temMALFORMED-style
validation to SponsorshipSet and SponsorshipTransfer matching rippled's
merged preflight logic (Patel-Raj11)
- Replace the personal legleux/xrpld:sponsor Docker image in
RippledContainer with the official rippleci/xrpld:develop image, now
that rippled#7350 has merged sponsor support into develop (sappenin,
depthfirst-app)
* Remove now-unused docker-java-api dependency
The direct dependency was only needed for withCreateContainerCmdModifier's
CreateContainerCmd type, which was removed along with the personal
legleux/xrpld:sponsor image in the prior commit.
* Fix stale Sponsor field wire-format numbers (nth) and naming
Cross-checked every Sponsor-related SField against rippled's
authoritative sfields.macro (XRPLF/rippled develop). Found and fixed:
- ObjectID (SponsorshipTransfer): was nth 39, collided with main's new
ReferenceHolding field during the recent merge; real value is 41
- SponsoredOwnerCount: 69 -> 70
- SponsoringOwnerCount: 70 -> 71
- SponsoringAccountCount: 71 -> 72
- ReserveCount: 72 -> 73, and renamed to RemainingOwnerCount (its real
wire name) on both the SponsorshipSet transaction and the
Sponsorship ledger object
- SponsorFlags: 73 -> 74
These five UInt32 fields were each off by one because rippled has an
unrelated sfConfidentialBalanceVersion field at nth 69 (from a
separate, unimplemented-in-xrpl4j feature) that our numbering didn't
account for. Without this fix, any binary-encoded transaction using
these fields would carry the wrong field code and be rejected or
misinterpreted by a real rippled node.
* Remove stale Granular Permission TODO
Rippled removed its SponsorFee/SponsorReserve GranularPermission
implementation before merging Sponsor support into develop, so
sponsorship no longer uses granular permissions.
* Fix broken javadoc reference in SponsorSignature after package move
The generated ImmutableSponsorSignature.java doesn't inherit
SponsorSignature's imports, so the unqualified {@link Signer}
reference (valid in the source file via its own import) failed to
resolve in the generated class, breaking the javadoc build in CI.
Fully-qualifying the reference fixes it regardless of imports.
* Fix IT container startup: rename Batch amendment to BatchV1_1
The rippleci/xrpld:develop image renamed the Batch amendment to
BatchV1_1, so rippled aborted on startup with 'Unknown feature: Batch',
causing every integration test to fail with ExceptionInInitializerError
in AbstractIT. Update xrpld.cfg to the current amendment name.
* Align Sponsor definitions with rippleci/xrpld:develop
The develop image assigns SponsorshipSet=91 and SponsorshipTransfer=90,
but xrpl4j's definitions.json used 86/85 (which now map to
ConfidentialMPTMergeInbox/ConfidentialMPTConvert in develop). This caused
rippled to reject SponsorshipIT transactions with 'Field MPTokenIssuanceID
is required but missing'. Also fix SponseeNode UInt64 nth (32->33) to match.
* Correct SponsorshipTransfer flag bit values to match rippled develop
rippled develop (commit 530e09d) defines the SponsorshipTransfer tf flags
in the 0x0001xxxx range, but xrpl4j used 0x00000001/2/4. This caused
develop to reject SponsorshipTransfer transactions with temINVALID_FLAG,
failing 4 SponsorshipIT tests. Align the values:
tfSponsorshipEnd 0x00000001 -> 0x00010000
tfSponsorshipCreate 0x00000002 -> 0x00020000
tfSponsorshipReassign 0x00000004 -> 0x00040000
Update the corresponding unit-test and JSON-fixture expectations.
* Address PR #720 review comments: OwnerNode/SponseeNode types, SponsorshipSet tests, fee helper
* Address remaining PR #720 review comments: inline SponsorshipValidations, regenerate definitions.json from server_definitions, add sponsored filter and ledger_entry lookup, relax SponsorSignature for inner-Batch txns
* Move SponsorSignature to model.transactions, remove fabricated AccountRoot.Sponsor field, fix javadoc build failure
* Fix SponsorshipLedgerEntryParams field name to match rippled's ledger_entry handler (sponsor, not owner)
* Address PR #720 review comments: typed SponsorFlags, Sponsor on remaining ledger/Meta objects
- Change Transaction.sponsorFlags() to return Optional<SponsorFlags> instead of
Optional<UnsignedInteger>; simplify checkSponsorshipFields() and SponsorshipTransfer
to use the typed flags directly, and update all call sites and tests.
- Add Sponsor to AccountRootObject, CredentialObject, DelegateObject, SponsorshipObject
and the corresponding Meta* objects; add HighSponsor/LowSponsor to MetaRippleStateObject
to match RippleStateObject. Sponsor is a common ledger-entry field per the regenerated
definitions.json, and only RippleState carries HighSponsor/LowSponsor.
- Add testJsonWithSponsor round-trip coverage for each new ledger-object field.
* Improve patch coverage for XLS-68 sponsorship code
- Add unit tests for FeeUtils.computeSponsorshipTransferNetworkFees (null/limit
guards and fee-multiplier math) — previously only exercised by integration tests.
- Cover the multi-signer sort path in SponsorSignature.checkAndNormalize().
- Add SponsorshipTransfer/SponsorshipSet validation cases covering previously
uncovered branches (end-with-sponsor, reserve-flag rules, delete-object field/flag
restrictions, single require-sign-for flags).
* Address PR #720 review round: spec-compliance fixes and broader Sponsor coverage
Correctness (XLS-0068 section 8.3.1):
- SponsorFlags.isValid() now rejects unknown flag bits (only {1,2,3} valid); add negative tests.
- Transaction.checkSponsorshipFields() rejects a real SponsorSignature without Sponsor+SponsorFlags
(all-or-nothing), and the invalid-flags message notes 'no other flags'.
- Refactor sponsorSign() to reuse signatureHelper() instead of rebuilding via sign().
Ledger model:
- Remove Sponsor from SponsorshipObject (not an allowed Sponsor-carrying type per spec).
- Add Sponsor to the remaining spec section 4.3.1 allowed types: Ticket, Offer, NfTokenPage,
NfTokenOffer, Amm, Bridge, XChainOwnedClaimId, XChainOwnedCreateAccountClaimId, Did, plus their
Meta* counterparts (fixes TicketObject unused import).
- Add SponsoredOwnerCount/SponsoringOwnerCount/SponsoringAccountCount to MetaAccountRootObject.
- Expand JSON round-trip tests to cover the new Sponsor fields and AccountRoot counters.
* Address remaining PR #720 IT/signing review comments (verified against live rippled develop)
- SponsorshipIT: extend testPreFundedFeeSponsorshipNoCosign, testSponsorshipTransferSingleSigneeSingleSponsor,
and testSponsorshipTransferMultiSponseeMultiSponsor to verify on-ledger state (balances, Sponsorship.feeAmount,
AccountRoot.sponsor/sponsoringAccountCount) instead of only asserting tesSUCCESS.
- SponsorshipIT: add testSponsorCreatedAccountPayment covering Payment.tfSponsorCreatedAccount, verified end-to-end
against rippleci/xrpld:develop in standalone mode.
- BcDerivedKeySignatureServiceTest: add known-good signature byte assertions to sponsorSignEd/Ec and
sponsorMultiSignEd/Ec, matching the existing sibling multiSignEc pattern.
All changes verified locally: 10/10 SponsorshipIT tests pass against rippleci/xrpld:develop (standalone),
36/36 BcDerivedKeySignatureServiceTest pass, full core suite (73473 tests) passes, checkstyle clean on
both modules.
* Remove Sponsor from ledger objects excluded by updated XLS-0068 v1 scope
Per XRPL-Standards PR #564, spec section 4.3.1 now hard-scopes the common Sponsor
field to a fixed v1 allow-list (AccountRoot, Check, Escrow, PayChannel, DepositPreauth,
MPToken, MPTokenIssuance, Delegate, SignerList, Credential), with RippleState using its
own HighSponsor/LowSponsor fields. All other ledger entry types, including the nine
added in an earlier round (Offer, Ticket, NFTokenPage, NFTokenOffer, AMM, Bridge,
XChainOwnedClaimID, XChainOwnedCreateAccountClaimID, DID), must not carry Sponsor.
Removes sponsor() from these nine ledger objects and their Meta* counterparts, the
corresponding JSON test coverage, and now-orphaned Beta/Address/Optional imports left
behind by the removal.
* fix: rename SponsorshipSet FeeAmount to FeeAmountDelta per rippled PR #335
rippled changed the SponsorshipSet transaction's fee field from an
absolute sfFeeAmount to a signed sfFeeAmountDelta, letting sponsors
top up or draw down a sponsorship's fee budget incrementally instead
of overwriting it. Update the transaction model, validation (deltas
may be negative but not zero), and tests to match; the Sponsorship
ledger object's FeeAmount field is unaffected and remains absolute.
* Fix FeeAmount JsonProperty mismatch in SponsorshipSet
The JsonProperty annotation used "FeeAmountDelta" which does not match
definitions.json, causing the field to be silently dropped from signed
transaction bytes by the binary codec.
* Align sponsorship validation with rippled PR #7350
Requires SponsorSignature for account-level tfSponsorshipCreate (not
just tfSponsorshipReassign), restricts spfSponsorReserve to rippled's
allow-listed transaction types, and disallows spfSponsorReserve
combined with Delegate, matching the merged rippled implementation.
* Align SponsorshipSet with rippled PR #335 (FeeAmountDelta/RemainingOwnerCountDelta)
rippled introduced sfFeeAmountDelta and sfRemainingOwnerCountDelta as new,
distinct SFields on SponsorshipSet, separate from the Sponsorship ledger
entry's sfFeeAmount/sfRemainingOwnerCount. This SDK still serialized
SponsorshipSet using the old field names/types, which definitions.json
also never got the new field entries for, so signed transactions
wouldn't wire-match a rippled node running the amendment. Also add the
temINVALID/temREDUNDANT-equivalent preflight checks rippled added
alongside the field rename.
* ci: bump XRPLD_PRIVATE_VERSION to 3.3.0-rc7
* codec: add Int32 serialized type support
RemainingOwnerCountDelta's Int32 sfield type had no codec implementation,
so signing any SponsorshipSet carrying it threw
"Unknown serialized type 'Int32'" (per kuan121's PR #720 review comment).
Add Int32Type (signed 32-bit two's complement, same wire width as
UInt32Type) and register it in SerializedType's type map.
* fix: allow building an account-level SponsorshipTransfer without a SponsorSignature
The co-signing flow for an account-level tfSponsorshipCreate/tfSponsorshipReassign
is inherently two-phase: build the transaction without a SponsorSignature, have
the new sponsor sign over that unsigned form, then rebuild with the resulting
SponsorSignature attached. The model's check() previously required
sponsorSignature() to already be present, which made it impossible to construct
that necessary unsigned intermediate object at all. Drop the precondition;
rippled is what rejects a final submission still missing the signature, same as
how transactionSignature() itself is never required at construction elsewhere
in this codebase.
* fix: catch NumberFormatException in Int32Type#toJson()
Wraps hex parsing in a try/catch and rethrows as IllegalStateException with the offending hex value, per code-quality bot suggestion.
* docs: Sponsor amendment is now supported on public rippled develop, not just a private dev build
* Add MetaSponsorshipObject and dedupe FeeAmount/MaxFee in definitions.json
Every ledger entry has a Meta*Object counterpart except UnknownLedgerObject
(intentional) and Sponsorship, which was missing one; add it, mirroring the
ledger entry's fields, and register it in MetaLedgerEntryType.
Also remove a byte-for-byte duplicate FeeAmount/MaxFee FIELDS entry in
definitions.json (same nth/type), keeping the copy correctly grouped in
ascending nth order alongside FeeAmountDelta.
---------
Co-authored-by: Raj Patel <rajp@ripple.com>
Co-authored-by: David Fuelling <sappenin@gmail.com>1 parent ebce35d commit df79914
103 files changed
Lines changed: 8379 additions & 40 deletions
File tree
- xrpl4j-client/src
- main/java/org/xrpl/xrpl4j/client
- test/java/org/xrpl/xrpl4j/client
- xrpl4j-core/src
- main
- java/org/xrpl/xrpl4j
- codec/binary/types
- crypto/signing
- bc
- model
- client
- accounts
- fees
- ledger
- flags
- ledger
- transactions
- metadata
- resources
- test/java/org/xrpl/xrpl4j
- codec/binary/types
- crypto/signing
- bc
- model
- client
- accounts
- fees
- ledger
- flags
- ledger
- transactions
- json
- metadata
- xrpl4j-integration-tests/src/test
- java/org/xrpl/xrpl4j/tests
- environment
- resources/xrpld
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
330 | 330 | | |
331 | 331 | | |
332 | 332 | | |
| 333 | + | |
| 334 | + | |
333 | 335 | | |
334 | 336 | | |
335 | 337 | | |
| |||
Lines changed: 27 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| 56 | + | |
| 57 | + | |
56 | 58 | | |
57 | 59 | | |
58 | 60 | | |
| |||
620 | 622 | | |
621 | 623 | | |
622 | 624 | | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
623 | 650 | | |
624 | 651 | | |
625 | 652 | | |
| |||
Lines changed: 16 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
| 68 | + | |
| 69 | + | |
68 | 70 | | |
69 | 71 | | |
70 | 72 | | |
| |||
993 | 995 | | |
994 | 996 | | |
995 | 997 | | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
996 | 1012 | | |
997 | 1013 | | |
998 | 1014 | | |
| |||
Lines changed: 81 additions & 0 deletions
| 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 | + | |
| 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 | + | |
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
| 55 | + | |
55 | 56 | | |
56 | 57 | | |
57 | 58 | | |
| |||
Lines changed: 10 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
138 | 138 | | |
139 | 139 | | |
140 | 140 | | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
141 | 151 | | |
142 | 152 | | |
143 | 153 | | |
| |||
Lines changed: 27 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
146 | 173 | | |
147 | 174 | | |
148 | 175 | | |
| |||
Lines changed: 34 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
| 80 | + | |
80 | 81 | | |
81 | 82 | | |
82 | 83 | | |
| |||
217 | 218 | | |
218 | 219 | | |
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 | + | |
220 | 253 | | |
| 254 | + | |
Lines changed: 44 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
179 | 179 | | |
180 | 180 | | |
181 | 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 | + | |
182 | 226 | | |
183 | 227 | | |
184 | 228 | | |
| |||
Lines changed: 26 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
178 | 178 | | |
179 | 179 | | |
180 | 180 | | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
181 | 199 | | |
182 | 200 | | |
183 | 201 | | |
| |||
372 | 390 | | |
373 | 391 | | |
374 | 392 | | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
375 | 401 | | |
376 | 402 | | |
377 | 403 | | |
| |||
0 commit comments