From d99fdbe2c0dd5268cde22eb56dcaba7d08b08663 Mon Sep 17 00:00:00 2001 From: bthomee Date: Wed, 23 Jul 2025 14:02:26 +0000 Subject: [PATCH] deploy: 433eeabfa561751f78873dafc3918f8d066c42a0 --- CreateOffer_8cpp_source.html | 1708 +++---- CreateOffer_8h_source.html | 197 +- Taker_8cpp_source.html | 1047 ----- Taker_8h_source.html | 470 -- Taker__test_8cpp_source.html | 1549 ------ annotated.html | 1334 +++--- ...d__associative__container__test__base.html | 2 +- classbeast_1_1unit__test_1_1suite.html | 4 +- classes.html | 8 +- classripple_1_1AMMBid.html | 2 +- classripple_1_1AMMClawback.html | 2 +- classripple_1_1AMMCreate.html | 2 +- classripple_1_1AMMDelete.html | 2 +- classripple_1_1AMMDeposit.html | 2 +- classripple_1_1AMMVote.html | 2 +- classripple_1_1AMMWithdraw.html | 2 +- classripple_1_1BasicTaker-members.html | 123 - classripple_1_1BasicTaker.html | 1345 ------ classripple_1_1BasicTaker__coll__graph.map | 13 - classripple_1_1BasicTaker__coll__graph.md5 | 1 - classripple_1_1BasicTaker__coll__graph.png | Bin 50732 -> 0 bytes classripple_1_1BasicTaker__inherit__graph.map | 5 - classripple_1_1BasicTaker__inherit__graph.md5 | 1 - classripple_1_1BasicTaker__inherit__graph.png | Bin 6027 -> 0 bytes classripple_1_1Batch.html | 2 +- classripple_1_1BridgeModify.html | 2 +- classripple_1_1CancelCheck.html | 2 +- classripple_1_1CancelOffer.html | 2 +- classripple_1_1CashCheck.html | 2 +- classripple_1_1Clawback.html | 2 +- classripple_1_1CreateCheck.html | 2 +- classripple_1_1CreateOffer-members.html | 83 +- classripple_1_1CreateOffer.html | 455 +- classripple_1_1CreateTicket.html | 2 +- classripple_1_1CredentialAccept.html | 2 +- classripple_1_1CredentialCreate.html | 2 +- classripple_1_1CredentialDelete.html | 2 +- classripple_1_1DIDDelete.html | 2 +- classripple_1_1DIDSet.html | 2 +- classripple_1_1DelegateSet.html | 2 +- classripple_1_1DeleteAccount.html | 2 +- classripple_1_1DeleteOracle.html | 2 +- classripple_1_1DepositPreauth.html | 2 +- classripple_1_1EscrowCancel.html | 2 +- classripple_1_1EscrowCreate.html | 2 +- classripple_1_1EscrowFinish.html | 2 +- classripple_1_1LedgerStateFix.html | 2 +- classripple_1_1MPTokenAuthorize.html | 2 +- classripple_1_1MPTokenIssuanceCreate.html | 2 +- classripple_1_1MPTokenIssuanceDestroy.html | 2 +- classripple_1_1MPTokenIssuanceSet.html | 2 +- classripple_1_1NFTokenAcceptOffer.html | 2 +- classripple_1_1NFTokenBurn.html | 2 +- classripple_1_1NFTokenCancelOffer.html | 2 +- classripple_1_1NFTokenCreateOffer.html | 2 +- classripple_1_1NFTokenMint.html | 2 +- classripple_1_1NFTokenModify.html | 2 +- classripple_1_1NodeStore_1_1TestBase.html | 2 +- classripple_1_1PayChanClaim.html | 2 +- classripple_1_1PayChanCreate.html | 2 +- classripple_1_1PayChanFund.html | 2 +- classripple_1_1Payment.html | 2 +- classripple_1_1PermissionedDomainDelete.html | 2 +- classripple_1_1PermissionedDomainSet.html | 2 +- classripple_1_1SetAccount.html | 2 +- classripple_1_1SetOracle.html | 2 +- classripple_1_1SetRegularKey.html | 2 +- classripple_1_1SetTrust.html | 2 +- classripple_1_1Taker-members.html | 143 - classripple_1_1Taker.html | 1948 -------- classripple_1_1Taker__coll__graph.map | 31 - classripple_1_1Taker__coll__graph.md5 | 1 - classripple_1_1Taker__coll__graph.png | Bin 164454 -> 0 bytes classripple_1_1Taker__inherit__graph.map | 4 - classripple_1_1Taker__inherit__graph.md5 | 1 - classripple_1_1Taker__inherit__graph.png | Bin 3127 -> 0 bytes classripple_1_1Taker__test-members.html | 131 - classripple_1_1Taker__test.html | 1589 ------- ...e_1_1Taker__test_1_1TestTaker-members.html | 129 - classripple_1_1Taker__test_1_1TestTaker.html | 1480 ------ ...1Taker__test_1_1TestTaker__coll__graph.map | 25 - ...1Taker__test_1_1TestTaker__coll__graph.md5 | 1 - ...1Taker__test_1_1TestTaker__coll__graph.png | Bin 117263 -> 0 bytes ...ker__test_1_1TestTaker__inherit__graph.map | 4 - ...ker__test_1_1TestTaker__inherit__graph.md5 | 1 - ...ker__test_1_1TestTaker__inherit__graph.png | Bin 3562 -> 0 bytes classripple_1_1Taker__test__coll__graph.map | 20 - classripple_1_1Taker__test__coll__graph.md5 | 1 - classripple_1_1Taker__test__coll__graph.png | Bin 67655 -> 0 bytes ...sripple_1_1Taker__test__inherit__graph.map | 4 - ...sripple_1_1Taker__test__inherit__graph.md5 | 1 - ...sripple_1_1Taker__test__inherit__graph.png | Bin 3269 -> 0 bytes classripple_1_1TestSuite.html | 2 +- classripple_1_1Transactor.html | 2 +- classripple_1_1VaultClawback.html | 2 +- classripple_1_1VaultCreate.html | 2 +- classripple_1_1VaultDelete.html | 2 +- classripple_1_1VaultDeposit.html | 2 +- classripple_1_1VaultSet.html | 2 +- classripple_1_1VaultWithdraw.html | 2 +- ..._1_1XChainAddAccountCreateAttestation.html | 2 +- classripple_1_1XChainAddClaimAttestation.html | 2 +- classripple_1_1XChainClaim.html | 2 +- classripple_1_1XChainCommit.html | 2 +- classripple_1_1XChainCreateAccountCommit.html | 2 +- classripple_1_1XChainCreateBridge.html | 2 +- classripple_1_1XChainCreateClaimID.html | 2 +- classripple_1_1test_1_1AccountInfo__test.html | 2 +- classripple_1_1test_1_1TestOutputSuite.html | 2 +- classripple_1_1test_1_1jtx_1_1AMMTest.html | 2 +- ...sripple_1_1test_1_1jtx_1_1AMMTestBase.html | 2 +- dir_7ab758b8a77751d62709b12ccae53e10.html | 2 - dir_7b1ffcd2aae1e871efc2e94c72e78699.html | 4 - functions_a.html | 39 +- functions_b.html | 10 +- functions_c.html | 37 +- functions_d.html | 18 +- functions_e.html | 14 +- functions_f.html | 19 +- functions_func.html | 31 +- functions_func_b.html | 6 +- functions_func_c.html | 49 +- functions_func_d.html | 11 +- functions_func_e.html | 12 +- functions_func_f.html | 23 +- functions_func_g.html | 19 +- functions_func_i.html | 10 +- functions_func_l.html | 5 +- functions_func_m.html | 2 +- functions_func_o.html | 30 +- functions_func_p.html | 24 +- functions_func_r.html | 24 +- functions_func_s.html | 66 +- functions_func_t.html | 22 +- functions_func_u.html | 4 +- functions_func_v.html | 12 +- functions_func_x.html | 2 +- functions_func_~.html | 2 - functions_g.html | 19 +- functions_i.html | 39 +- functions_j.html | 2 +- functions_l.html | 11 +- functions_m.html | 16 +- functions_n.html | 13 +- functions_o.html | 38 +- functions_p.html | 15 +- functions_q.html | 5 +- functions_r.html | 23 +- functions_s.html | 110 +- functions_t.html | 26 +- functions_u.html | 4 +- functions_v.html | 11 +- functions_vars.html | 2 +- functions_vars_b.html | 2 - functions_vars_c.html | 2 - functions_vars_d.html | 1 - functions_vars_f.html | 1 - functions_vars_i.html | 5 +- functions_vars_j.html | 2 +- functions_vars_m.html | 2 - functions_vars_o.html | 4 +- functions_vars_q.html | 2 +- functions_vars_r.html | 1 - functions_vars_s.html | 3 - functions_vars_t.html | 2 +- functions_vars_v.html | 2 +- functions_vars_x.html | 1 - functions_w.html | 8 +- functions_x.html | 7 +- functions_~.html | 2 - hierarchy.html | 3654 +++++++------- inherit_graph_1000.map | 4 +- inherit_graph_1000.md5 | 2 +- inherit_graph_1000.png | Bin 3774 -> 3746 bytes inherit_graph_1001.map | 8 +- inherit_graph_1001.md5 | 2 +- inherit_graph_1001.png | Bin 23274 -> 11164 bytes inherit_graph_1002.map | 4 +- inherit_graph_1002.md5 | 2 +- inherit_graph_1002.png | Bin 6025 -> 4571 bytes inherit_graph_1003.map | 4 +- inherit_graph_1003.md5 | 2 +- inherit_graph_1003.png | Bin 3746 -> 4347 bytes inherit_graph_1004.map | 21 +- inherit_graph_1004.md5 | 2 +- inherit_graph_1004.png | Bin 11164 -> 57980 bytes inherit_graph_1005.map | 26 +- inherit_graph_1005.md5 | 2 +- inherit_graph_1005.png | Bin 4571 -> 111738 bytes inherit_graph_1006.map | 6 +- inherit_graph_1006.md5 | 2 +- inherit_graph_1006.png | Bin 4347 -> 12078 bytes inherit_graph_1007.map | 21 +- inherit_graph_1007.md5 | 2 +- inherit_graph_1007.png | Bin 57980 -> 7487 bytes inherit_graph_1008.map | 26 +- inherit_graph_1008.md5 | 2 +- inherit_graph_1008.png | Bin 111738 -> 4332 bytes inherit_graph_1009.map | 6 +- inherit_graph_1009.md5 | 2 +- inherit_graph_1009.png | Bin 12078 -> 5454 bytes inherit_graph_1010.map | 13 +- inherit_graph_1010.md5 | 2 +- inherit_graph_1010.png | Bin 7487 -> 37543 bytes inherit_graph_1011.map | 5 +- inherit_graph_1011.md5 | 2 +- inherit_graph_1011.png | Bin 4332 -> 8135 bytes inherit_graph_1012.map | 16 +- inherit_graph_1012.md5 | 2 +- inherit_graph_1012.png | Bin 5454 -> 43699 bytes inherit_graph_1013.map | 16 +- inherit_graph_1013.md5 | 2 +- inherit_graph_1013.png | Bin 37543 -> 22241 bytes inherit_graph_1014.map | 5 +- inherit_graph_1014.md5 | 2 +- inherit_graph_1014.png | Bin 8135 -> 3127 bytes inherit_graph_1015.map | 15 +- inherit_graph_1015.md5 | 2 +- inherit_graph_1015.png | Bin 43699 -> 2348 bytes inherit_graph_1016.map | 9 +- inherit_graph_1016.md5 | 2 +- inherit_graph_1016.png | Bin 22241 -> 8451 bytes inherit_graph_1017.map | 4 +- inherit_graph_1017.md5 | 2 +- inherit_graph_1017.png | Bin 3127 -> 9534 bytes inherit_graph_1018.map | 3 +- inherit_graph_1018.md5 | 2 +- inherit_graph_1018.png | Bin 2348 -> 9125 bytes inherit_graph_1019.map | 5 +- inherit_graph_1019.md5 | 2 +- inherit_graph_1019.png | Bin 8451 -> 8391 bytes inherit_graph_1020.map | 4 +- inherit_graph_1020.md5 | 2 +- inherit_graph_1020.png | Bin 9534 -> 11456 bytes inherit_graph_1021.map | 4 +- inherit_graph_1021.md5 | 2 +- inherit_graph_1021.png | Bin 9125 -> 7948 bytes inherit_graph_1022.map | 4 +- inherit_graph_1022.md5 | 2 +- inherit_graph_1022.png | Bin 8391 -> 6714 bytes inherit_graph_1023.map | 8 +- inherit_graph_1023.md5 | 2 +- inherit_graph_1023.png | Bin 11456 -> 27916 bytes inherit_graph_1024.map | 8 +- inherit_graph_1024.md5 | 2 +- inherit_graph_1024.png | Bin 7948 -> 15693 bytes inherit_graph_1025.map | 3 +- inherit_graph_1025.md5 | 2 +- inherit_graph_1025.png | Bin 6714 -> 3207 bytes inherit_graph_1026.map | 8 +- inherit_graph_1026.md5 | 2 +- inherit_graph_1026.png | Bin 27916 -> 4581 bytes inherit_graph_1027.map | 8 +- inherit_graph_1027.md5 | 2 +- inherit_graph_1027.png | Bin 15693 -> 3834 bytes inherit_graph_1028.map | 21 +- inherit_graph_1028.md5 | 2 +- inherit_graph_1028.png | Bin 3207 -> 135659 bytes inherit_graph_1029.map | 4 +- inherit_graph_1029.md5 | 2 +- inherit_graph_1029.png | Bin 4581 -> 4173 bytes inherit_graph_1030.map | 18 +- inherit_graph_1030.md5 | 2 +- inherit_graph_1030.png | Bin 3834 -> 65131 bytes inherit_graph_1031.map | 22 +- inherit_graph_1031.md5 | 2 +- inherit_graph_1031.png | Bin 135659 -> 4970 bytes inherit_graph_1032.map | 3 +- inherit_graph_1032.md5 | 2 +- inherit_graph_1032.png | Bin 4173 -> 713 bytes inherit_graph_1033.map | 17 +- inherit_graph_1033.md5 | 2 +- inherit_graph_1033.png | Bin 65131 -> 849 bytes inherit_graph_1034.map | 5 +- inherit_graph_1034.md5 | 2 +- inherit_graph_1034.png | Bin 4970 -> 7463 bytes inherit_graph_1035.map | 3 - inherit_graph_1035.md5 | 1 - inherit_graph_1035.png | Bin 713 -> 0 bytes inherit_graph_1036.map | 3 - inherit_graph_1036.md5 | 1 - inherit_graph_1036.png | Bin 849 -> 0 bytes inherit_graph_1037.map | 5 - inherit_graph_1037.md5 | 1 - inherit_graph_1037.png | Bin 7463 -> 0 bytes inherit_graph_183.map | 4 +- inherit_graph_183.md5 | 2 +- inherit_graph_183.png | Bin 5023 -> 1681 bytes inherit_graph_184.map | 2 +- inherit_graph_184.md5 | 2 +- inherit_graph_184.png | Bin 2104 -> 1562 bytes inherit_graph_185.map | 2 +- inherit_graph_185.md5 | 2 +- inherit_graph_185.png | Bin 1681 -> 2312 bytes inherit_graph_186.map | 2 +- inherit_graph_186.md5 | 2 +- inherit_graph_186.png | Bin 1562 -> 1648 bytes inherit_graph_187.map | 2 +- inherit_graph_187.md5 | 2 +- inherit_graph_187.png | Bin 2312 -> 3653 bytes inherit_graph_188.map | 2 +- inherit_graph_188.md5 | 2 +- inherit_graph_188.png | Bin 1648 -> 1283 bytes inherit_graph_189.map | 2 +- inherit_graph_189.md5 | 2 +- inherit_graph_189.png | Bin 3653 -> 1220 bytes inherit_graph_190.map | 2 +- inherit_graph_190.md5 | 2 +- inherit_graph_190.png | Bin 1283 -> 2473 bytes inherit_graph_191.map | 2 +- inherit_graph_191.md5 | 2 +- inherit_graph_191.png | Bin 1220 -> 1939 bytes inherit_graph_192.map | 2 +- inherit_graph_192.md5 | 2 +- inherit_graph_192.png | Bin 2473 -> 2939 bytes inherit_graph_193.map | 2 +- inherit_graph_193.md5 | 2 +- inherit_graph_193.png | Bin 1939 -> 3904 bytes inherit_graph_194.map | 2 +- inherit_graph_194.md5 | 2 +- inherit_graph_194.png | Bin 2939 -> 2459 bytes inherit_graph_195.map | 2 +- inherit_graph_195.md5 | 2 +- inherit_graph_195.png | Bin 3904 -> 3913 bytes inherit_graph_196.map | 2 +- inherit_graph_196.md5 | 2 +- inherit_graph_196.png | Bin 2459 -> 1319 bytes inherit_graph_197.map | 2 +- inherit_graph_197.md5 | 2 +- inherit_graph_197.png | Bin 3913 -> 1861 bytes inherit_graph_198.map | 2 +- inherit_graph_198.md5 | 2 +- inherit_graph_198.png | Bin 1319 -> 1784 bytes inherit_graph_199.map | 2 +- inherit_graph_199.md5 | 2 +- inherit_graph_199.png | Bin 1861 -> 3199 bytes inherit_graph_200.map | 2 +- inherit_graph_200.md5 | 2 +- inherit_graph_200.png | Bin 1784 -> 2747 bytes inherit_graph_201.map | 2 +- inherit_graph_201.md5 | 2 +- inherit_graph_201.png | Bin 3199 -> 3074 bytes inherit_graph_202.map | 3 +- inherit_graph_202.md5 | 2 +- inherit_graph_202.png | Bin 2747 -> 2887 bytes inherit_graph_203.map | 2 +- inherit_graph_203.md5 | 2 +- inherit_graph_203.png | Bin 3074 -> 1940 bytes inherit_graph_204.map | 3 +- inherit_graph_204.md5 | 2 +- inherit_graph_204.png | Bin 2887 -> 2516 bytes inherit_graph_205.map | 2 +- inherit_graph_205.md5 | 2 +- inherit_graph_205.png | Bin 1940 -> 3062 bytes inherit_graph_206.map | 2 +- inherit_graph_206.md5 | 2 +- inherit_graph_206.png | Bin 2516 -> 3102 bytes inherit_graph_207.map | 2 +- inherit_graph_207.md5 | 2 +- inherit_graph_207.png | Bin 3062 -> 2750 bytes inherit_graph_208.map | 2 +- inherit_graph_208.md5 | 2 +- inherit_graph_208.png | Bin 3102 -> 1793 bytes inherit_graph_209.map | 2 +- inherit_graph_209.md5 | 2 +- inherit_graph_209.png | Bin 2750 -> 1929 bytes inherit_graph_210.map | 2 +- inherit_graph_210.md5 | 2 +- inherit_graph_210.png | Bin 1793 -> 3078 bytes inherit_graph_211.map | 2 +- inherit_graph_211.md5 | 2 +- inherit_graph_211.png | Bin 1929 -> 3666 bytes inherit_graph_212.map | 2 +- inherit_graph_212.md5 | 2 +- inherit_graph_212.png | Bin 3078 -> 3772 bytes inherit_graph_213.map | 2 +- inherit_graph_213.md5 | 2 +- inherit_graph_213.png | Bin 3666 -> 4479 bytes inherit_graph_214.map | 2 +- inherit_graph_214.md5 | 2 +- inherit_graph_214.png | Bin 3772 -> 3611 bytes inherit_graph_215.map | 2 +- inherit_graph_215.md5 | 2 +- inherit_graph_215.png | Bin 4479 -> 2601 bytes inherit_graph_216.map | 2 +- inherit_graph_216.md5 | 2 +- inherit_graph_216.png | Bin 3611 -> 1723 bytes inherit_graph_217.map | 2 +- inherit_graph_217.md5 | 2 +- inherit_graph_217.png | Bin 2601 -> 1570 bytes inherit_graph_218.map | 3 +- inherit_graph_218.md5 | 2 +- inherit_graph_218.png | Bin 1723 -> 4382 bytes inherit_graph_219.map | 3 +- inherit_graph_219.md5 | 2 +- inherit_graph_219.png | Bin 1570 -> 4670 bytes inherit_graph_220.map | 2 +- inherit_graph_220.md5 | 2 +- inherit_graph_220.png | Bin 4382 -> 4209 bytes inherit_graph_221.map | 4 +- inherit_graph_221.md5 | 2 +- inherit_graph_221.png | Bin 4670 -> 3797 bytes inherit_graph_222.map | 2 +- inherit_graph_222.md5 | 2 +- inherit_graph_222.png | Bin 4209 -> 4817 bytes inherit_graph_223.map | 2 +- inherit_graph_223.md5 | 2 +- inherit_graph_223.png | Bin 3797 -> 3959 bytes inherit_graph_224.map | 18 +- inherit_graph_224.md5 | 2 +- inherit_graph_224.png | Bin 4817 -> 60783 bytes inherit_graph_225.map | 7 +- inherit_graph_225.md5 | 2 +- inherit_graph_225.png | Bin 3959 -> 9341 bytes inherit_graph_226.map | 21 +- inherit_graph_226.md5 | 2 +- inherit_graph_226.png | Bin 60783 -> 15856 bytes inherit_graph_227.map | 7 +- inherit_graph_227.md5 | 2 +- inherit_graph_227.png | Bin 9341 -> 3555 bytes inherit_graph_228.map | 20 +- inherit_graph_228.md5 | 2 +- inherit_graph_228.png | Bin 15856 -> 48451 bytes inherit_graph_229.map | 2 +- inherit_graph_229.md5 | 2 +- inherit_graph_229.png | Bin 3555 -> 4104 bytes inherit_graph_230.map | 17 +- inherit_graph_230.md5 | 2 +- inherit_graph_230.png | Bin 48451 -> 4472 bytes inherit_graph_231.map | 2 +- inherit_graph_231.md5 | 2 +- inherit_graph_231.png | Bin 4104 -> 4052 bytes inherit_graph_232.map | 3 +- inherit_graph_232.md5 | 2 +- inherit_graph_232.png | Bin 4472 -> 2672 bytes inherit_graph_233.map | 2 +- inherit_graph_233.md5 | 2 +- inherit_graph_233.png | Bin 4052 -> 4280 bytes inherit_graph_234.map | 6 +- inherit_graph_234.md5 | 2 +- inherit_graph_234.png | Bin 2672 -> 13950 bytes inherit_graph_235.map | 2 +- inherit_graph_235.md5 | 2 +- inherit_graph_235.png | Bin 4280 -> 4242 bytes inherit_graph_236.map | 16 +- inherit_graph_236.md5 | 2 +- inherit_graph_236.png | Bin 13950 -> 41809 bytes inherit_graph_237.map | 2 +- inherit_graph_237.md5 | 2 +- inherit_graph_237.png | Bin 4242 -> 4878 bytes inherit_graph_238.map | 13 +- inherit_graph_238.md5 | 2 +- inherit_graph_238.png | Bin 41809 -> 5189 bytes inherit_graph_239.map | 34 +- inherit_graph_239.md5 | 2 +- inherit_graph_239.png | Bin 4878 -> 112964 bytes inherit_graph_240.map | 2 +- inherit_graph_240.md5 | 2 +- inherit_graph_240.png | Bin 5189 -> 4210 bytes inherit_graph_241.map | 34 +- inherit_graph_241.md5 | 2 +- inherit_graph_241.png | Bin 112964 -> 4633 bytes inherit_graph_242.map | 5 +- inherit_graph_242.md5 | 2 +- inherit_graph_242.png | Bin 4210 -> 8599 bytes inherit_graph_243.map | 3 +- inherit_graph_243.md5 | 2 +- inherit_graph_243.png | Bin 4633 -> 2086 bytes inherit_graph_244.map | 4 +- inherit_graph_244.md5 | 2 +- inherit_graph_244.png | Bin 8599 -> 2395 bytes inherit_graph_245.map | 2 +- inherit_graph_245.md5 | 2 +- inherit_graph_245.png | Bin 2086 -> 1740 bytes inherit_graph_246.map | 2 +- inherit_graph_246.md5 | 2 +- inherit_graph_246.png | Bin 2395 -> 2192 bytes inherit_graph_247.map | 2 +- inherit_graph_247.md5 | 2 +- inherit_graph_247.png | Bin 1740 -> 2487 bytes inherit_graph_248.map | 3 +- inherit_graph_248.md5 | 2 +- inherit_graph_248.png | Bin 2192 -> 4416 bytes inherit_graph_249.map | 2 +- inherit_graph_249.md5 | 2 +- inherit_graph_249.png | Bin 2487 -> 1505 bytes inherit_graph_250.map | 4 +- inherit_graph_250.md5 | 2 +- inherit_graph_250.png | Bin 4416 -> 4839 bytes inherit_graph_251.map | 2 +- inherit_graph_251.md5 | 2 +- inherit_graph_251.png | Bin 1505 -> 2829 bytes inherit_graph_252.map | 3 +- inherit_graph_252.md5 | 2 +- inherit_graph_252.png | Bin 4839 -> 1840 bytes inherit_graph_253.map | 2 +- inherit_graph_253.md5 | 2 +- inherit_graph_253.png | Bin 2829 -> 2906 bytes inherit_graph_254.map | 2 +- inherit_graph_254.md5 | 2 +- inherit_graph_254.png | Bin 1840 -> 2392 bytes inherit_graph_255.map | 2 +- inherit_graph_255.md5 | 2 +- inherit_graph_255.png | Bin 2906 -> 1845 bytes inherit_graph_256.map | 2 +- inherit_graph_256.md5 | 2 +- inherit_graph_256.png | Bin 2392 -> 1695 bytes inherit_graph_257.map | 2 +- inherit_graph_257.md5 | 2 +- inherit_graph_257.png | Bin 1845 -> 5592 bytes inherit_graph_258.map | 2 +- inherit_graph_258.md5 | 2 +- inherit_graph_258.png | Bin 1695 -> 3742 bytes inherit_graph_259.map | 2 +- inherit_graph_259.md5 | 2 +- inherit_graph_259.png | Bin 5592 -> 3725 bytes inherit_graph_260.map | 2 +- inherit_graph_260.md5 | 2 +- inherit_graph_260.png | Bin 3742 -> 3474 bytes inherit_graph_261.map | 2 +- inherit_graph_261.md5 | 2 +- inherit_graph_261.png | Bin 3725 -> 2270 bytes inherit_graph_262.map | 2 +- inherit_graph_262.md5 | 2 +- inherit_graph_262.png | Bin 3474 -> 2668 bytes inherit_graph_263.map | 2 +- inherit_graph_263.md5 | 2 +- inherit_graph_263.png | Bin 2270 -> 2253 bytes inherit_graph_264.map | 2 +- inherit_graph_264.md5 | 2 +- inherit_graph_264.png | Bin 2668 -> 2140 bytes inherit_graph_265.map | 2 +- inherit_graph_265.md5 | 2 +- inherit_graph_265.png | Bin 2253 -> 3361 bytes inherit_graph_266.map | 2 +- inherit_graph_266.md5 | 2 +- inherit_graph_266.png | Bin 2140 -> 2658 bytes inherit_graph_267.map | 2 +- inherit_graph_267.md5 | 2 +- inherit_graph_267.png | Bin 3361 -> 2135 bytes inherit_graph_268.map | 2 +- inherit_graph_268.md5 | 2 +- inherit_graph_268.png | Bin 2658 -> 2181 bytes inherit_graph_269.map | 2 +- inherit_graph_269.md5 | 2 +- inherit_graph_269.png | Bin 2135 -> 1904 bytes inherit_graph_270.map | 2 +- inherit_graph_270.md5 | 2 +- inherit_graph_270.png | Bin 2181 -> 2231 bytes inherit_graph_271.map | 2 +- inherit_graph_271.md5 | 2 +- inherit_graph_271.png | Bin 1904 -> 2760 bytes inherit_graph_272.map | 2 +- inherit_graph_272.md5 | 2 +- inherit_graph_272.png | Bin 2231 -> 2426 bytes inherit_graph_273.map | 2 +- inherit_graph_273.md5 | 2 +- inherit_graph_273.png | Bin 2760 -> 2157 bytes inherit_graph_274.map | 2 +- inherit_graph_274.md5 | 2 +- inherit_graph_274.png | Bin 2426 -> 1721 bytes inherit_graph_275.map | 2 +- inherit_graph_275.md5 | 2 +- inherit_graph_275.png | Bin 2157 -> 1982 bytes inherit_graph_276.map | 3 +- inherit_graph_276.md5 | 2 +- inherit_graph_276.png | Bin 1721 -> 3482 bytes inherit_graph_277.map | 2 +- inherit_graph_277.md5 | 2 +- inherit_graph_277.png | Bin 1982 -> 1868 bytes inherit_graph_278.map | 3 +- inherit_graph_278.md5 | 2 +- inherit_graph_278.png | Bin 3482 -> 3240 bytes inherit_graph_279.map | 2 +- inherit_graph_279.md5 | 2 +- inherit_graph_279.png | Bin 1868 -> 3720 bytes inherit_graph_280.map | 2 +- inherit_graph_280.md5 | 2 +- inherit_graph_280.png | Bin 3240 -> 1935 bytes inherit_graph_281.map | 2 +- inherit_graph_281.md5 | 2 +- inherit_graph_281.png | Bin 3720 -> 2481 bytes inherit_graph_282.map | 2 +- inherit_graph_282.md5 | 2 +- inherit_graph_282.png | Bin 1935 -> 2305 bytes inherit_graph_283.map | 2 +- inherit_graph_283.md5 | 2 +- inherit_graph_283.png | Bin 2481 -> 2107 bytes inherit_graph_284.map | 2 +- inherit_graph_284.md5 | 2 +- inherit_graph_284.png | Bin 2305 -> 2799 bytes inherit_graph_285.map | 3 +- inherit_graph_285.md5 | 2 +- inherit_graph_285.png | Bin 2107 -> 4311 bytes inherit_graph_286.map | 2 +- inherit_graph_286.md5 | 2 +- inherit_graph_286.png | Bin 2799 -> 4086 bytes inherit_graph_287.map | 4 +- inherit_graph_287.md5 | 2 +- inherit_graph_287.png | Bin 4311 -> 5022 bytes inherit_graph_288.map | 3 +- inherit_graph_288.md5 | 2 +- inherit_graph_288.png | Bin 4086 -> 4997 bytes inherit_graph_289.map | 3 +- inherit_graph_289.md5 | 2 +- inherit_graph_289.png | Bin 5022 -> 3615 bytes inherit_graph_290.map | 3 +- inherit_graph_290.md5 | 2 +- inherit_graph_290.png | Bin 4997 -> 2304 bytes inherit_graph_291.map | 2 +- inherit_graph_291.md5 | 2 +- inherit_graph_291.png | Bin 3615 -> 1654 bytes inherit_graph_292.map | 2 +- inherit_graph_292.md5 | 2 +- inherit_graph_292.png | Bin 2304 -> 2601 bytes inherit_graph_293.map | 2 +- inherit_graph_293.md5 | 2 +- inherit_graph_293.png | Bin 1654 -> 2633 bytes inherit_graph_294.map | 2 +- inherit_graph_294.md5 | 2 +- inherit_graph_294.png | Bin 2601 -> 1747 bytes inherit_graph_295.map | 2 +- inherit_graph_295.md5 | 2 +- inherit_graph_295.png | Bin 2633 -> 964 bytes inherit_graph_296.map | 2 +- inherit_graph_296.md5 | 2 +- inherit_graph_296.png | Bin 1747 -> 2065 bytes inherit_graph_297.map | 2 +- inherit_graph_297.md5 | 2 +- inherit_graph_297.png | Bin 964 -> 2861 bytes inherit_graph_298.map | 2 +- inherit_graph_298.md5 | 2 +- inherit_graph_298.png | Bin 2065 -> 2800 bytes inherit_graph_299.map | 2 +- inherit_graph_299.md5 | 2 +- inherit_graph_299.png | Bin 2861 -> 3375 bytes inherit_graph_300.map | 2 +- inherit_graph_300.md5 | 2 +- inherit_graph_300.png | Bin 2800 -> 1619 bytes inherit_graph_301.map | 2 +- inherit_graph_301.md5 | 2 +- inherit_graph_301.png | Bin 3375 -> 1861 bytes inherit_graph_302.map | 4 +- inherit_graph_302.md5 | 2 +- inherit_graph_302.png | Bin 1619 -> 6421 bytes inherit_graph_303.map | 2 +- inherit_graph_303.md5 | 2 +- inherit_graph_303.png | Bin 1861 -> 984 bytes inherit_graph_304.map | 4 +- inherit_graph_304.md5 | 2 +- inherit_graph_304.png | Bin 6421 -> 1272 bytes inherit_graph_305.map | 3 +- inherit_graph_305.md5 | 2 +- inherit_graph_305.png | Bin 984 -> 2023 bytes inherit_graph_306.map | 2 +- inherit_graph_306.md5 | 2 +- inherit_graph_306.png | Bin 1272 -> 1750 bytes inherit_graph_307.map | 3 +- inherit_graph_307.md5 | 2 +- inherit_graph_307.png | Bin 2023 -> 2013 bytes inherit_graph_308.map | 2 +- inherit_graph_308.md5 | 2 +- inherit_graph_308.png | Bin 1750 -> 1508 bytes inherit_graph_309.map | 3 +- inherit_graph_309.md5 | 2 +- inherit_graph_309.png | Bin 2013 -> 4133 bytes inherit_graph_310.map | 2 +- inherit_graph_310.md5 | 2 +- inherit_graph_310.png | Bin 1508 -> 1705 bytes inherit_graph_311.map | 3 +- inherit_graph_311.md5 | 2 +- inherit_graph_311.png | Bin 4133 -> 2149 bytes inherit_graph_312.map | 2 +- inherit_graph_312.md5 | 2 +- inherit_graph_312.png | Bin 1705 -> 2020 bytes inherit_graph_313.map | 4 +- inherit_graph_313.md5 | 2 +- inherit_graph_313.png | Bin 2149 -> 7348 bytes inherit_graph_314.map | 3 +- inherit_graph_314.md5 | 2 +- inherit_graph_314.png | Bin 2020 -> 2740 bytes inherit_graph_315.map | 4 +- inherit_graph_315.md5 | 2 +- inherit_graph_315.png | Bin 7348 -> 2199 bytes inherit_graph_316.map | 5 +- inherit_graph_316.md5 | 2 +- inherit_graph_316.png | Bin 2740 -> 4017 bytes inherit_graph_317.map | 2 +- inherit_graph_317.md5 | 2 +- inherit_graph_317.png | Bin 2199 -> 3563 bytes inherit_graph_318.map | 4 +- inherit_graph_318.md5 | 2 +- inherit_graph_318.png | Bin 4017 -> 2766 bytes inherit_graph_319.map | 2 +- inherit_graph_319.md5 | 2 +- inherit_graph_319.png | Bin 3563 -> 2650 bytes inherit_graph_320.map | 2 +- inherit_graph_320.md5 | 2 +- inherit_graph_320.png | Bin 2766 -> 1252 bytes inherit_graph_321.map | 2 +- inherit_graph_321.md5 | 2 +- inherit_graph_321.png | Bin 2650 -> 1033 bytes inherit_graph_322.map | 2 +- inherit_graph_322.md5 | 2 +- inherit_graph_322.png | Bin 1252 -> 1693 bytes inherit_graph_323.map | 2 +- inherit_graph_323.md5 | 2 +- inherit_graph_323.png | Bin 1033 -> 1513 bytes inherit_graph_324.map | 2 +- inherit_graph_324.md5 | 2 +- inherit_graph_324.png | Bin 1693 -> 1452 bytes inherit_graph_325.map | 2 +- inherit_graph_325.md5 | 2 +- inherit_graph_325.png | Bin 1513 -> 1629 bytes inherit_graph_326.map | 2 +- inherit_graph_326.md5 | 2 +- inherit_graph_326.png | Bin 1452 -> 2027 bytes inherit_graph_327.map | 2 +- inherit_graph_327.md5 | 2 +- inherit_graph_327.png | Bin 1629 -> 2109 bytes inherit_graph_328.map | 2 +- inherit_graph_328.md5 | 2 +- inherit_graph_328.png | Bin 2027 -> 1621 bytes inherit_graph_329.map | 2 +- inherit_graph_329.md5 | 2 +- inherit_graph_329.png | Bin 2109 -> 1571 bytes inherit_graph_330.map | 2 +- inherit_graph_330.md5 | 2 +- inherit_graph_330.png | Bin 1621 -> 1218 bytes inherit_graph_331.map | 2 +- inherit_graph_331.md5 | 2 +- inherit_graph_331.png | Bin 1571 -> 1494 bytes inherit_graph_332.map | 2 +- inherit_graph_332.md5 | 2 +- inherit_graph_332.png | Bin 1218 -> 1504 bytes inherit_graph_333.map | 2 +- inherit_graph_333.md5 | 2 +- inherit_graph_333.png | Bin 1494 -> 1457 bytes inherit_graph_334.map | 2 +- inherit_graph_334.md5 | 2 +- inherit_graph_334.png | Bin 1504 -> 2723 bytes inherit_graph_335.map | 3 +- inherit_graph_335.md5 | 2 +- inherit_graph_335.png | Bin 1457 -> 4967 bytes inherit_graph_336.map | 2 +- inherit_graph_336.md5 | 2 +- inherit_graph_336.png | Bin 2723 -> 3485 bytes inherit_graph_337.map | 3 +- inherit_graph_337.md5 | 2 +- inherit_graph_337.png | Bin 4967 -> 3568 bytes inherit_graph_338.map | 3 +- inherit_graph_338.md5 | 2 +- inherit_graph_338.png | Bin 3485 -> 4882 bytes inherit_graph_339.map | 3 +- inherit_graph_339.md5 | 2 +- inherit_graph_339.png | Bin 3568 -> 4308 bytes inherit_graph_340.map | 3 +- inherit_graph_340.md5 | 2 +- inherit_graph_340.png | Bin 4882 -> 2439 bytes inherit_graph_341.map | 3 +- inherit_graph_341.md5 | 2 +- inherit_graph_341.png | Bin 4308 -> 2652 bytes inherit_graph_342.map | 2 +- inherit_graph_342.md5 | 2 +- inherit_graph_342.png | Bin 2439 -> 2619 bytes inherit_graph_343.map | 2 +- inherit_graph_343.md5 | 2 +- inherit_graph_343.png | Bin 2652 -> 1590 bytes inherit_graph_344.map | 2 +- inherit_graph_344.md5 | 2 +- inherit_graph_344.png | Bin 2619 -> 2482 bytes inherit_graph_345.map | 2 +- inherit_graph_345.md5 | 2 +- inherit_graph_345.png | Bin 1590 -> 1251 bytes inherit_graph_346.map | 2 +- inherit_graph_346.md5 | 2 +- inherit_graph_346.png | Bin 2482 -> 1733 bytes inherit_graph_347.map | 2 +- inherit_graph_347.md5 | 2 +- inherit_graph_347.png | Bin 1251 -> 1434 bytes inherit_graph_348.map | 2 +- inherit_graph_348.md5 | 2 +- inherit_graph_348.png | Bin 1733 -> 1846 bytes inherit_graph_349.map | 2 +- inherit_graph_349.md5 | 2 +- inherit_graph_349.png | Bin 1434 -> 2391 bytes inherit_graph_350.map | 2 +- inherit_graph_350.md5 | 2 +- inherit_graph_350.png | Bin 1846 -> 2652 bytes inherit_graph_351.map | 2 +- inherit_graph_351.md5 | 2 +- inherit_graph_351.png | Bin 2391 -> 2252 bytes inherit_graph_352.map | 2 +- inherit_graph_352.md5 | 2 +- inherit_graph_352.png | Bin 2652 -> 1564 bytes inherit_graph_353.map | 2 +- inherit_graph_353.md5 | 2 +- inherit_graph_353.png | Bin 2252 -> 1715 bytes inherit_graph_354.map | 2 +- inherit_graph_354.md5 | 2 +- inherit_graph_354.png | Bin 1564 -> 2246 bytes inherit_graph_355.map | 2 +- inherit_graph_355.md5 | 2 +- inherit_graph_355.png | Bin 1715 -> 2571 bytes inherit_graph_356.map | 2 +- inherit_graph_356.md5 | 2 +- inherit_graph_356.png | Bin 2246 -> 1831 bytes inherit_graph_357.map | 2 +- inherit_graph_357.md5 | 2 +- inherit_graph_357.png | Bin 2571 -> 1377 bytes inherit_graph_358.map | 2 +- inherit_graph_358.md5 | 2 +- inherit_graph_358.png | Bin 1831 -> 1618 bytes inherit_graph_359.map | 2 +- inherit_graph_359.md5 | 2 +- inherit_graph_359.png | Bin 1377 -> 1671 bytes inherit_graph_360.map | 2 +- inherit_graph_360.md5 | 2 +- inherit_graph_360.png | Bin 1618 -> 1752 bytes inherit_graph_361.map | 2 +- inherit_graph_361.md5 | 2 +- inherit_graph_361.png | Bin 1671 -> 1621 bytes inherit_graph_362.map | 2 +- inherit_graph_362.md5 | 2 +- inherit_graph_362.png | Bin 1752 -> 2206 bytes inherit_graph_363.map | 2 +- inherit_graph_363.md5 | 2 +- inherit_graph_363.png | Bin 1621 -> 1446 bytes inherit_graph_364.map | 3 +- inherit_graph_364.md5 | 2 +- inherit_graph_364.png | Bin 2206 -> 2274 bytes inherit_graph_365.map | 2 +- inherit_graph_365.md5 | 2 +- inherit_graph_365.png | Bin 1446 -> 1985 bytes inherit_graph_366.map | 3 +- inherit_graph_366.md5 | 2 +- inherit_graph_366.png | Bin 2274 -> 1942 bytes inherit_graph_367.map | 5 +- inherit_graph_367.md5 | 2 +- inherit_graph_367.png | Bin 1985 -> 9372 bytes inherit_graph_368.map | 2 +- inherit_graph_368.md5 | 2 +- inherit_graph_368.png | Bin 1942 -> 1409 bytes inherit_graph_369.map | 5 +- inherit_graph_369.md5 | 2 +- inherit_graph_369.png | Bin 9372 -> 1501 bytes inherit_graph_370.map | 2 +- inherit_graph_370.md5 | 2 +- inherit_graph_370.png | Bin 1409 -> 1818 bytes inherit_graph_371.map | 2 +- inherit_graph_371.md5 | 2 +- inherit_graph_371.png | Bin 1501 -> 1439 bytes inherit_graph_372.map | 2 +- inherit_graph_372.md5 | 2 +- inherit_graph_372.png | Bin 1818 -> 1929 bytes inherit_graph_373.map | 2 +- inherit_graph_373.md5 | 2 +- inherit_graph_373.png | Bin 1439 -> 2038 bytes inherit_graph_374.map | 2 +- inherit_graph_374.md5 | 2 +- inherit_graph_374.png | Bin 1929 -> 1699 bytes inherit_graph_375.map | 2 +- inherit_graph_375.md5 | 2 +- inherit_graph_375.png | Bin 2038 -> 2220 bytes inherit_graph_376.map | 2 +- inherit_graph_376.md5 | 2 +- inherit_graph_376.png | Bin 1699 -> 2114 bytes inherit_graph_377.map | 2 +- inherit_graph_377.md5 | 2 +- inherit_graph_377.png | Bin 2220 -> 1347 bytes inherit_graph_378.map | 2 +- inherit_graph_378.md5 | 2 +- inherit_graph_378.png | Bin 2114 -> 2096 bytes inherit_graph_379.map | 2 +- inherit_graph_379.md5 | 2 +- inherit_graph_379.png | Bin 1347 -> 2851 bytes inherit_graph_380.map | 2 +- inherit_graph_380.md5 | 2 +- inherit_graph_380.png | Bin 2096 -> 1629 bytes inherit_graph_381.map | 2 +- inherit_graph_381.md5 | 2 +- inherit_graph_381.png | Bin 2851 -> 3249 bytes inherit_graph_382.map | 2 +- inherit_graph_382.md5 | 2 +- inherit_graph_382.png | Bin 1629 -> 3469 bytes inherit_graph_383.map | 2 +- inherit_graph_383.md5 | 2 +- inherit_graph_383.png | Bin 3249 -> 4082 bytes inherit_graph_384.map | 2 +- inherit_graph_384.md5 | 2 +- inherit_graph_384.png | Bin 3469 -> 3869 bytes inherit_graph_385.map | 2 +- inherit_graph_385.md5 | 2 +- inherit_graph_385.png | Bin 4082 -> 2773 bytes inherit_graph_386.map | 2 +- inherit_graph_386.md5 | 2 +- inherit_graph_386.png | Bin 3869 -> 3793 bytes inherit_graph_387.map | 2 +- inherit_graph_387.md5 | 2 +- inherit_graph_387.png | Bin 2773 -> 3596 bytes inherit_graph_388.map | 2 +- inherit_graph_388.md5 | 2 +- inherit_graph_388.png | Bin 3793 -> 4101 bytes inherit_graph_389.map | 2 +- inherit_graph_389.md5 | 2 +- inherit_graph_389.png | Bin 3596 -> 3262 bytes inherit_graph_390.map | 2 +- inherit_graph_390.md5 | 2 +- inherit_graph_390.png | Bin 4101 -> 1780 bytes inherit_graph_391.map | 2 +- inherit_graph_391.md5 | 2 +- inherit_graph_391.png | Bin 3262 -> 2179 bytes inherit_graph_392.map | 2 +- inherit_graph_392.md5 | 2 +- inherit_graph_392.png | Bin 1780 -> 2336 bytes inherit_graph_393.map | 2 +- inherit_graph_393.md5 | 2 +- inherit_graph_393.png | Bin 2179 -> 2103 bytes inherit_graph_394.map | 2 +- inherit_graph_394.md5 | 2 +- inherit_graph_394.png | Bin 2336 -> 2601 bytes inherit_graph_395.map | 3 +- inherit_graph_395.md5 | 2 +- inherit_graph_395.png | Bin 2103 -> 4734 bytes inherit_graph_396.map | 2 +- inherit_graph_396.md5 | 2 +- inherit_graph_396.png | Bin 2601 -> 2728 bytes inherit_graph_397.map | 6 +- inherit_graph_397.md5 | 2 +- inherit_graph_397.png | Bin 4734 -> 10335 bytes inherit_graph_398.map | 2 +- inherit_graph_398.md5 | 2 +- inherit_graph_398.png | Bin 2728 -> 3014 bytes inherit_graph_399.map | 5 +- inherit_graph_399.md5 | 2 +- inherit_graph_399.png | Bin 10335 -> 2774 bytes inherit_graph_400.map | 5 +- inherit_graph_400.md5 | 2 +- inherit_graph_400.png | Bin 3014 -> 10820 bytes inherit_graph_401.map | 2 +- inherit_graph_401.md5 | 2 +- inherit_graph_401.png | Bin 2774 -> 2339 bytes inherit_graph_402.map | 5 +- inherit_graph_402.md5 | 2 +- inherit_graph_402.png | Bin 10820 -> 2637 bytes inherit_graph_403.map | 2 +- inherit_graph_403.md5 | 2 +- inherit_graph_403.png | Bin 2339 -> 2192 bytes inherit_graph_404.map | 5 +- inherit_graph_404.md5 | 2 +- inherit_graph_404.png | Bin 2637 -> 9850 bytes inherit_graph_405.map | 2 +- inherit_graph_405.md5 | 2 +- inherit_graph_405.png | Bin 2192 -> 2179 bytes inherit_graph_406.map | 5 +- inherit_graph_406.md5 | 2 +- inherit_graph_406.png | Bin 9850 -> 2206 bytes inherit_graph_407.map | 3 +- inherit_graph_407.md5 | 2 +- inherit_graph_407.png | Bin 2179 -> 3101 bytes inherit_graph_408.map | 2 +- inherit_graph_408.md5 | 2 +- inherit_graph_408.png | Bin 2206 -> 2523 bytes inherit_graph_409.map | 3 +- inherit_graph_409.md5 | 2 +- inherit_graph_409.png | Bin 3101 -> 2178 bytes inherit_graph_410.map | 4 +- inherit_graph_410.md5 | 2 +- inherit_graph_410.png | Bin 2523 -> 8068 bytes inherit_graph_411.map | 2 +- inherit_graph_411.md5 | 2 +- inherit_graph_411.png | Bin 2178 -> 2213 bytes inherit_graph_412.map | 5 +- inherit_graph_412.md5 | 2 +- inherit_graph_412.png | Bin 8068 -> 4274 bytes inherit_graph_413.map | 2 +- inherit_graph_413.md5 | 2 +- inherit_graph_413.png | Bin 2213 -> 3920 bytes inherit_graph_414.map | 3 +- inherit_graph_414.md5 | 2 +- inherit_graph_414.png | Bin 4274 -> 2740 bytes inherit_graph_415.map | 2 +- inherit_graph_415.md5 | 2 +- inherit_graph_415.png | Bin 3920 -> 3025 bytes inherit_graph_416.map | 2 +- inherit_graph_416.md5 | 2 +- inherit_graph_416.png | Bin 2740 -> 3006 bytes inherit_graph_417.map | 2 +- inherit_graph_417.md5 | 2 +- inherit_graph_417.png | Bin 3025 -> 2049 bytes inherit_graph_418.map | 2 +- inherit_graph_418.md5 | 2 +- inherit_graph_418.png | Bin 3006 -> 1829 bytes inherit_graph_419.map | 2 +- inherit_graph_419.md5 | 2 +- inherit_graph_419.png | Bin 2049 -> 1198 bytes inherit_graph_420.map | 2 +- inherit_graph_420.md5 | 2 +- inherit_graph_420.png | Bin 1829 -> 1745 bytes inherit_graph_421.map | 2 +- inherit_graph_421.md5 | 2 +- inherit_graph_421.png | Bin 1198 -> 1748 bytes inherit_graph_422.map | 2 +- inherit_graph_422.md5 | 2 +- inherit_graph_422.png | Bin 1745 -> 1705 bytes inherit_graph_423.map | 2 +- inherit_graph_423.md5 | 2 +- inherit_graph_423.png | Bin 1748 -> 2359 bytes inherit_graph_424.map | 2 +- inherit_graph_424.md5 | 2 +- inherit_graph_424.png | Bin 1705 -> 1639 bytes inherit_graph_425.map | 2 +- inherit_graph_425.md5 | 2 +- inherit_graph_425.png | Bin 2359 -> 1547 bytes inherit_graph_426.map | 2 +- inherit_graph_426.md5 | 2 +- inherit_graph_426.png | Bin 1639 -> 1519 bytes inherit_graph_427.map | 2 +- inherit_graph_427.md5 | 2 +- inherit_graph_427.png | Bin 1547 -> 2478 bytes inherit_graph_428.map | 2 +- inherit_graph_428.md5 | 2 +- inherit_graph_428.png | Bin 1519 -> 2229 bytes inherit_graph_429.map | 2 +- inherit_graph_429.md5 | 2 +- inherit_graph_429.png | Bin 2478 -> 2007 bytes inherit_graph_430.map | 2 +- inherit_graph_430.md5 | 2 +- inherit_graph_430.png | Bin 2229 -> 2095 bytes inherit_graph_431.map | 2 +- inherit_graph_431.md5 | 2 +- inherit_graph_431.png | Bin 2007 -> 2209 bytes inherit_graph_432.map | 2 +- inherit_graph_432.md5 | 2 +- inherit_graph_432.png | Bin 2095 -> 1817 bytes inherit_graph_433.map | 2 +- inherit_graph_433.md5 | 2 +- inherit_graph_433.png | Bin 2209 -> 1928 bytes inherit_graph_434.map | 14 +- inherit_graph_434.md5 | 2 +- inherit_graph_434.png | Bin 1817 -> 38488 bytes inherit_graph_435.map | 2 +- inherit_graph_435.md5 | 2 +- inherit_graph_435.png | Bin 1928 -> 2322 bytes inherit_graph_436.map | 14 +- inherit_graph_436.md5 | 2 +- inherit_graph_436.png | Bin 38488 -> 2931 bytes inherit_graph_437.map | 2 +- inherit_graph_437.md5 | 2 +- inherit_graph_437.png | Bin 2322 -> 2230 bytes inherit_graph_438.map | 2 +- inherit_graph_438.md5 | 2 +- inherit_graph_438.png | Bin 2931 -> 1600 bytes inherit_graph_439.map | 2 +- inherit_graph_439.md5 | 2 +- inherit_graph_439.png | Bin 2230 -> 1568 bytes inherit_graph_440.map | 2 +- inherit_graph_440.md5 | 2 +- inherit_graph_440.png | Bin 1600 -> 3998 bytes inherit_graph_441.map | 2 +- inherit_graph_441.md5 | 2 +- inherit_graph_441.png | Bin 1568 -> 4453 bytes inherit_graph_442.map | 2 +- inherit_graph_442.md5 | 2 +- inherit_graph_442.png | Bin 3998 -> 4286 bytes inherit_graph_443.map | 2 +- inherit_graph_443.md5 | 2 +- inherit_graph_443.png | Bin 4453 -> 4530 bytes inherit_graph_444.map | 2 +- inherit_graph_444.md5 | 2 +- inherit_graph_444.png | Bin 4286 -> 4599 bytes inherit_graph_445.md5 | 2 +- inherit_graph_445.png | Bin 4530 -> 4676 bytes inherit_graph_446.md5 | 2 +- inherit_graph_446.png | Bin 4599 -> 4487 bytes inherit_graph_447.md5 | 2 +- inherit_graph_447.png | Bin 4676 -> 4960 bytes inherit_graph_448.md5 | 2 +- inherit_graph_448.png | Bin 4487 -> 4838 bytes inherit_graph_449.map | 2 +- inherit_graph_449.md5 | 2 +- inherit_graph_449.png | Bin 4960 -> 2446 bytes inherit_graph_450.map | 2 +- inherit_graph_450.md5 | 2 +- inherit_graph_450.png | Bin 4838 -> 2823 bytes inherit_graph_451.map | 2 +- inherit_graph_451.md5 | 2 +- inherit_graph_451.png | Bin 2446 -> 1687 bytes inherit_graph_452.map | 2 +- inherit_graph_452.md5 | 2 +- inherit_graph_452.png | Bin 2823 -> 1995 bytes inherit_graph_453.map | 2 +- inherit_graph_453.md5 | 2 +- inherit_graph_453.png | Bin 1687 -> 2208 bytes inherit_graph_454.map | 2 +- inherit_graph_454.md5 | 2 +- inherit_graph_454.png | Bin 1995 -> 2001 bytes inherit_graph_455.map | 2 +- inherit_graph_455.md5 | 2 +- inherit_graph_455.png | Bin 2208 -> 1779 bytes inherit_graph_456.map | 2 +- inherit_graph_456.md5 | 2 +- inherit_graph_456.png | Bin 2001 -> 1467 bytes inherit_graph_457.map | 2 +- inherit_graph_457.md5 | 2 +- inherit_graph_457.png | Bin 1779 -> 1215 bytes inherit_graph_458.map | 2 +- inherit_graph_458.md5 | 2 +- inherit_graph_458.png | Bin 1467 -> 2055 bytes inherit_graph_459.map | 2 +- inherit_graph_459.md5 | 2 +- inherit_graph_459.png | Bin 1215 -> 2316 bytes inherit_graph_460.map | 2 +- inherit_graph_460.md5 | 2 +- inherit_graph_460.png | Bin 2055 -> 2589 bytes inherit_graph_461.map | 2 +- inherit_graph_461.md5 | 2 +- inherit_graph_461.png | Bin 2316 -> 3069 bytes inherit_graph_462.map | 2 +- inherit_graph_462.md5 | 2 +- inherit_graph_462.png | Bin 2589 -> 2573 bytes inherit_graph_463.map | 2 +- inherit_graph_463.md5 | 2 +- inherit_graph_463.png | Bin 3069 -> 1974 bytes inherit_graph_464.map | 2 +- inherit_graph_464.md5 | 2 +- inherit_graph_464.png | Bin 2573 -> 2420 bytes inherit_graph_465.map | 2 +- inherit_graph_465.md5 | 2 +- inherit_graph_465.png | Bin 1974 -> 2032 bytes inherit_graph_466.map | 3 +- inherit_graph_466.md5 | 2 +- inherit_graph_466.png | Bin 2420 -> 3777 bytes inherit_graph_467.map | 2 +- inherit_graph_467.md5 | 2 +- inherit_graph_467.png | Bin 2032 -> 3335 bytes inherit_graph_468.map | 3 +- inherit_graph_468.md5 | 2 +- inherit_graph_468.png | Bin 3777 -> 3849 bytes inherit_graph_469.map | 2 +- inherit_graph_469.md5 | 2 +- inherit_graph_469.png | Bin 3335 -> 1680 bytes inherit_graph_470.map | 2 +- inherit_graph_470.md5 | 2 +- inherit_graph_470.png | Bin 3849 -> 1586 bytes inherit_graph_471.map | 2 +- inherit_graph_471.md5 | 2 +- inherit_graph_471.png | Bin 1680 -> 3085 bytes inherit_graph_472.map | 2 +- inherit_graph_472.md5 | 2 +- inherit_graph_472.png | Bin 1586 -> 4049 bytes inherit_graph_473.map | 2 +- inherit_graph_473.md5 | 2 +- inherit_graph_473.png | Bin 3085 -> 2580 bytes inherit_graph_474.map | 2 +- inherit_graph_474.md5 | 2 +- inherit_graph_474.png | Bin 4049 -> 3111 bytes inherit_graph_475.map | 2 +- inherit_graph_475.md5 | 2 +- inherit_graph_475.png | Bin 2580 -> 2507 bytes inherit_graph_476.map | 2 +- inherit_graph_476.md5 | 2 +- inherit_graph_476.png | Bin 3111 -> 2253 bytes inherit_graph_477.map | 2 +- inherit_graph_477.md5 | 2 +- inherit_graph_477.png | Bin 2507 -> 2398 bytes inherit_graph_478.map | 3 +- inherit_graph_478.md5 | 2 +- inherit_graph_478.png | Bin 2253 -> 2572 bytes inherit_graph_479.map | 2 +- inherit_graph_479.md5 | 2 +- inherit_graph_479.png | Bin 2398 -> 2258 bytes inherit_graph_480.map | 3 +- inherit_graph_480.md5 | 2 +- inherit_graph_480.png | Bin 2572 -> 2245 bytes inherit_graph_481.map | 4 +- inherit_graph_481.md5 | 2 +- inherit_graph_481.png | Bin 2258 -> 3764 bytes inherit_graph_482.map | 2 +- inherit_graph_482.md5 | 2 +- inherit_graph_482.png | Bin 2245 -> 2358 bytes inherit_graph_483.map | 6 +- inherit_graph_483.md5 | 2 +- inherit_graph_483.png | Bin 3764 -> 6848 bytes inherit_graph_484.map | 2 +- inherit_graph_484.md5 | 2 +- inherit_graph_484.png | Bin 2358 -> 2082 bytes inherit_graph_485.map | 4 +- inherit_graph_485.md5 | 2 +- inherit_graph_485.png | Bin 6848 -> 2894 bytes inherit_graph_486.map | 2 +- inherit_graph_486.md5 | 2 +- inherit_graph_486.png | Bin 2082 -> 1683 bytes inherit_graph_487.map | 2 +- inherit_graph_487.md5 | 2 +- inherit_graph_487.png | Bin 2894 -> 1890 bytes inherit_graph_488.map | 2 +- inherit_graph_488.md5 | 2 +- inherit_graph_488.png | Bin 1683 -> 1983 bytes inherit_graph_489.map | 5 +- inherit_graph_489.md5 | 2 +- inherit_graph_489.png | Bin 1890 -> 7115 bytes inherit_graph_490.map | 4 +- inherit_graph_490.md5 | 2 +- inherit_graph_490.png | Bin 1983 -> 6742 bytes inherit_graph_491.map | 5 +- inherit_graph_491.md5 | 2 +- inherit_graph_491.png | Bin 7115 -> 2007 bytes inherit_graph_492.map | 4 +- inherit_graph_492.md5 | 2 +- inherit_graph_492.png | Bin 6742 -> 3489 bytes inherit_graph_493.map | 2 +- inherit_graph_493.md5 | 2 +- inherit_graph_493.png | Bin 2007 -> 3557 bytes inherit_graph_494.map | 2 +- inherit_graph_494.md5 | 2 +- inherit_graph_494.png | Bin 3489 -> 1985 bytes inherit_graph_495.map | 4 +- inherit_graph_495.md5 | 2 +- inherit_graph_495.png | Bin 3557 -> 5834 bytes inherit_graph_496.map | 2 +- inherit_graph_496.md5 | 2 +- inherit_graph_496.png | Bin 1985 -> 2065 bytes inherit_graph_497.map | 4 +- inherit_graph_497.md5 | 2 +- inherit_graph_497.png | Bin 5834 -> 2414 bytes inherit_graph_498.map | 2 +- inherit_graph_498.md5 | 2 +- inherit_graph_498.png | Bin 2065 -> 2579 bytes inherit_graph_499.map | 2 +- inherit_graph_499.md5 | 2 +- inherit_graph_499.png | Bin 2414 -> 2746 bytes inherit_graph_500.map | 2 +- inherit_graph_500.md5 | 2 +- inherit_graph_500.png | Bin 2579 -> 1973 bytes inherit_graph_501.map | 2 +- inherit_graph_501.md5 | 2 +- inherit_graph_501.png | Bin 2746 -> 2228 bytes inherit_graph_502.map | 2 +- inherit_graph_502.md5 | 2 +- inherit_graph_502.png | Bin 1973 -> 1486 bytes inherit_graph_503.map | 2 +- inherit_graph_503.md5 | 2 +- inherit_graph_503.png | Bin 2228 -> 1127 bytes inherit_graph_504.map | 2 +- inherit_graph_504.md5 | 2 +- inherit_graph_504.png | Bin 1486 -> 2059 bytes inherit_graph_505.map | 2 +- inherit_graph_505.md5 | 2 +- inherit_graph_505.png | Bin 1127 -> 1825 bytes inherit_graph_506.map | 2 +- inherit_graph_506.md5 | 2 +- inherit_graph_506.png | Bin 2059 -> 1908 bytes inherit_graph_507.map | 2 +- inherit_graph_507.md5 | 2 +- inherit_graph_507.png | Bin 1825 -> 1849 bytes inherit_graph_508.map | 2 +- inherit_graph_508.md5 | 2 +- inherit_graph_508.png | Bin 1908 -> 1532 bytes inherit_graph_509.map | 2 +- inherit_graph_509.md5 | 2 +- inherit_graph_509.png | Bin 1849 -> 2060 bytes inherit_graph_510.map | 2 +- inherit_graph_510.md5 | 2 +- inherit_graph_510.png | Bin 1532 -> 2784 bytes inherit_graph_511.map | 2 +- inherit_graph_511.md5 | 2 +- inherit_graph_511.png | Bin 2060 -> 3059 bytes inherit_graph_512.map | 2 +- inherit_graph_512.md5 | 2 +- inherit_graph_512.png | Bin 2784 -> 3860 bytes inherit_graph_513.map | 2 +- inherit_graph_513.md5 | 2 +- inherit_graph_513.png | Bin 3059 -> 3561 bytes inherit_graph_514.map | 2 +- inherit_graph_514.md5 | 2 +- inherit_graph_514.png | Bin 3860 -> 3601 bytes inherit_graph_515.map | 2 +- inherit_graph_515.md5 | 2 +- inherit_graph_515.png | Bin 3561 -> 1696 bytes inherit_graph_516.map | 2 +- inherit_graph_516.md5 | 2 +- inherit_graph_516.png | Bin 3601 -> 2380 bytes inherit_graph_517.map | 2 +- inherit_graph_517.md5 | 2 +- inherit_graph_517.png | Bin 1696 -> 2084 bytes inherit_graph_518.map | 2 +- inherit_graph_518.md5 | 2 +- inherit_graph_518.png | Bin 2380 -> 1704 bytes inherit_graph_519.map | 2 +- inherit_graph_519.md5 | 2 +- inherit_graph_519.png | Bin 2084 -> 1797 bytes inherit_graph_520.map | 2 +- inherit_graph_520.md5 | 2 +- inherit_graph_520.png | Bin 1704 -> 1394 bytes inherit_graph_521.map | 2 +- inherit_graph_521.md5 | 2 +- inherit_graph_521.png | Bin 1797 -> 1643 bytes inherit_graph_522.map | 2 +- inherit_graph_522.md5 | 2 +- inherit_graph_522.png | Bin 1394 -> 2319 bytes inherit_graph_523.map | 2 +- inherit_graph_523.md5 | 2 +- inherit_graph_523.png | Bin 1643 -> 2021 bytes inherit_graph_524.map | 2 +- inherit_graph_524.md5 | 2 +- inherit_graph_524.png | Bin 2319 -> 2910 bytes inherit_graph_525.map | 2 +- inherit_graph_525.md5 | 2 +- inherit_graph_525.png | Bin 2021 -> 1974 bytes inherit_graph_526.map | 2 +- inherit_graph_526.md5 | 2 +- inherit_graph_526.png | Bin 2910 -> 2446 bytes inherit_graph_527.map | 2 +- inherit_graph_527.md5 | 2 +- inherit_graph_527.png | Bin 1974 -> 2859 bytes inherit_graph_528.map | 2 +- inherit_graph_528.md5 | 2 +- inherit_graph_528.png | Bin 2446 -> 3377 bytes inherit_graph_529.map | 2 +- inherit_graph_529.md5 | 2 +- inherit_graph_529.png | Bin 2859 -> 3549 bytes inherit_graph_530.map | 2 +- inherit_graph_530.md5 | 2 +- inherit_graph_530.png | Bin 3377 -> 3262 bytes inherit_graph_531.map | 2 +- inherit_graph_531.md5 | 2 +- inherit_graph_531.png | Bin 3549 -> 3018 bytes inherit_graph_532.map | 2 +- inherit_graph_532.md5 | 2 +- inherit_graph_532.png | Bin 3262 -> 3574 bytes inherit_graph_533.map | 2 +- inherit_graph_533.md5 | 2 +- inherit_graph_533.png | Bin 3018 -> 3400 bytes inherit_graph_534.map | 2 +- inherit_graph_534.md5 | 2 +- inherit_graph_534.png | Bin 3574 -> 3046 bytes inherit_graph_535.map | 2 +- inherit_graph_535.md5 | 2 +- inherit_graph_535.png | Bin 3400 -> 3632 bytes inherit_graph_536.map | 2 +- inherit_graph_536.md5 | 2 +- inherit_graph_536.png | Bin 3046 -> 3385 bytes inherit_graph_537.map | 4 +- inherit_graph_537.md5 | 2 +- inherit_graph_537.png | Bin 3632 -> 3771 bytes inherit_graph_538.map | 2 +- inherit_graph_538.md5 | 2 +- inherit_graph_538.png | Bin 3385 -> 2914 bytes inherit_graph_539.map | 4 +- inherit_graph_539.md5 | 2 +- inherit_graph_539.png | Bin 3771 -> 2993 bytes inherit_graph_540.map | 2 +- inherit_graph_540.md5 | 2 +- inherit_graph_540.png | Bin 2914 -> 3068 bytes inherit_graph_541.map | 2 +- inherit_graph_541.md5 | 2 +- inherit_graph_541.png | Bin 2993 -> 3407 bytes inherit_graph_542.map | 2 +- inherit_graph_542.md5 | 2 +- inherit_graph_542.png | Bin 3068 -> 2741 bytes inherit_graph_543.map | 2 +- inherit_graph_543.md5 | 2 +- inherit_graph_543.png | Bin 3407 -> 2772 bytes inherit_graph_544.map | 2 +- inherit_graph_544.md5 | 2 +- inherit_graph_544.png | Bin 2741 -> 2450 bytes inherit_graph_545.map | 2 +- inherit_graph_545.md5 | 2 +- inherit_graph_545.png | Bin 2772 -> 2139 bytes inherit_graph_546.map | 2 +- inherit_graph_546.md5 | 2 +- inherit_graph_546.png | Bin 2450 -> 1981 bytes inherit_graph_547.map | 2 +- inherit_graph_547.md5 | 2 +- inherit_graph_547.png | Bin 2139 -> 1808 bytes inherit_graph_548.map | 2 +- inherit_graph_548.md5 | 2 +- inherit_graph_548.png | Bin 1981 -> 2201 bytes inherit_graph_549.map | 2 +- inherit_graph_549.md5 | 2 +- inherit_graph_549.png | Bin 1808 -> 1814 bytes inherit_graph_550.map | 2 +- inherit_graph_550.md5 | 2 +- inherit_graph_550.png | Bin 2201 -> 2057 bytes inherit_graph_551.map | 2 +- inherit_graph_551.md5 | 2 +- inherit_graph_551.png | Bin 1814 -> 1865 bytes inherit_graph_552.map | 2 +- inherit_graph_552.md5 | 2 +- inherit_graph_552.png | Bin 2057 -> 2293 bytes inherit_graph_553.map | 2 +- inherit_graph_553.md5 | 2 +- inherit_graph_553.png | Bin 1865 -> 2475 bytes inherit_graph_554.map | 2 +- inherit_graph_554.md5 | 2 +- inherit_graph_554.png | Bin 2293 -> 2381 bytes inherit_graph_555.map | 2 +- inherit_graph_555.md5 | 2 +- inherit_graph_555.png | Bin 2475 -> 1450 bytes inherit_graph_556.map | 2 +- inherit_graph_556.md5 | 2 +- inherit_graph_556.png | Bin 2381 -> 1316 bytes inherit_graph_557.map | 2 +- inherit_graph_557.md5 | 2 +- inherit_graph_557.png | Bin 1450 -> 2864 bytes inherit_graph_558.map | 4 +- inherit_graph_558.md5 | 2 +- inherit_graph_558.png | Bin 1316 -> 7956 bytes inherit_graph_559.map | 2 +- inherit_graph_559.md5 | 2 +- inherit_graph_559.png | Bin 2864 -> 2813 bytes inherit_graph_560.map | 4 +- inherit_graph_560.md5 | 2 +- inherit_graph_560.png | Bin 7956 -> 2844 bytes inherit_graph_561.map | 2 +- inherit_graph_561.md5 | 2 +- inherit_graph_561.png | Bin 2813 -> 1664 bytes inherit_graph_562.map | 2 +- inherit_graph_562.md5 | 2 +- inherit_graph_562.png | Bin 2844 -> 1666 bytes inherit_graph_563.map | 2 +- inherit_graph_563.md5 | 2 +- inherit_graph_563.png | Bin 1664 -> 2572 bytes inherit_graph_564.map | 2 +- inherit_graph_564.md5 | 2 +- inherit_graph_564.png | Bin 1666 -> 2126 bytes inherit_graph_565.map | 2 +- inherit_graph_565.md5 | 2 +- inherit_graph_565.png | Bin 2572 -> 1940 bytes inherit_graph_566.map | 2 +- inherit_graph_566.md5 | 2 +- inherit_graph_566.png | Bin 2126 -> 2350 bytes inherit_graph_567.map | 2 +- inherit_graph_567.md5 | 2 +- inherit_graph_567.png | Bin 1940 -> 1759 bytes inherit_graph_568.map | 2 +- inherit_graph_568.md5 | 2 +- inherit_graph_568.png | Bin 2350 -> 2244 bytes inherit_graph_569.map | 2 +- inherit_graph_569.md5 | 2 +- inherit_graph_569.png | Bin 1759 -> 2110 bytes inherit_graph_570.map | 2 +- inherit_graph_570.md5 | 2 +- inherit_graph_570.png | Bin 2244 -> 2216 bytes inherit_graph_571.map | 2 +- inherit_graph_571.md5 | 2 +- inherit_graph_571.png | Bin 2110 -> 1597 bytes inherit_graph_572.map | 2 +- inherit_graph_572.md5 | 2 +- inherit_graph_572.png | Bin 2216 -> 1559 bytes inherit_graph_573.map | 2 +- inherit_graph_573.md5 | 2 +- inherit_graph_573.png | Bin 1597 -> 1185 bytes inherit_graph_574.map | 2 +- inherit_graph_574.md5 | 2 +- inherit_graph_574.png | Bin 1559 -> 1374 bytes inherit_graph_575.map | 2 +- inherit_graph_575.md5 | 2 +- inherit_graph_575.png | Bin 1185 -> 1531 bytes inherit_graph_576.map | 2 +- inherit_graph_576.md5 | 2 +- inherit_graph_576.png | Bin 1374 -> 2408 bytes inherit_graph_577.map | 2 +- inherit_graph_577.md5 | 2 +- inherit_graph_577.png | Bin 1531 -> 2064 bytes inherit_graph_578.map | 2 +- inherit_graph_578.md5 | 2 +- inherit_graph_578.png | Bin 2408 -> 2040 bytes inherit_graph_579.map | 2 +- inherit_graph_579.md5 | 2 +- inherit_graph_579.png | Bin 2064 -> 1996 bytes inherit_graph_580.map | 2 +- inherit_graph_580.md5 | 2 +- inherit_graph_580.png | Bin 2040 -> 2576 bytes inherit_graph_581.map | 2 +- inherit_graph_581.md5 | 2 +- inherit_graph_581.png | Bin 1996 -> 1593 bytes inherit_graph_582.map | 2 +- inherit_graph_582.md5 | 2 +- inherit_graph_582.png | Bin 2576 -> 2619 bytes inherit_graph_583.map | 2 +- inherit_graph_583.md5 | 2 +- inherit_graph_583.png | Bin 1593 -> 1455 bytes inherit_graph_584.map | 2 +- inherit_graph_584.md5 | 2 +- inherit_graph_584.png | Bin 2619 -> 1150 bytes inherit_graph_585.map | 2 +- inherit_graph_585.md5 | 2 +- inherit_graph_585.png | Bin 1455 -> 1766 bytes inherit_graph_586.map | 2 +- inherit_graph_586.md5 | 2 +- inherit_graph_586.png | Bin 1150 -> 2714 bytes inherit_graph_587.map | 2 +- inherit_graph_587.md5 | 2 +- inherit_graph_587.png | Bin 1766 -> 2371 bytes inherit_graph_588.map | 2 +- inherit_graph_588.md5 | 2 +- inherit_graph_588.png | Bin 2714 -> 2299 bytes inherit_graph_589.map | 2 +- inherit_graph_589.md5 | 2 +- inherit_graph_589.png | Bin 2371 -> 1767 bytes inherit_graph_590.map | 2 +- inherit_graph_590.md5 | 2 +- inherit_graph_590.png | Bin 2299 -> 1288 bytes inherit_graph_591.map | 2 +- inherit_graph_591.md5 | 2 +- inherit_graph_591.png | Bin 1767 -> 1281 bytes inherit_graph_592.map | 3 +- inherit_graph_592.md5 | 2 +- inherit_graph_592.png | Bin 1288 -> 3450 bytes inherit_graph_593.map | 2 +- inherit_graph_593.md5 | 2 +- inherit_graph_593.png | Bin 1281 -> 1615 bytes inherit_graph_594.map | 3 +- inherit_graph_594.md5 | 2 +- inherit_graph_594.png | Bin 3450 -> 2455 bytes inherit_graph_595.map | 2 +- inherit_graph_595.md5 | 2 +- inherit_graph_595.png | Bin 1615 -> 2003 bytes inherit_graph_596.map | 2 +- inherit_graph_596.md5 | 2 +- inherit_graph_596.png | Bin 2455 -> 2270 bytes inherit_graph_597.map | 3 +- inherit_graph_597.md5 | 2 +- inherit_graph_597.png | Bin 2003 -> 2490 bytes inherit_graph_598.map | 2 +- inherit_graph_598.md5 | 2 +- inherit_graph_598.png | Bin 2270 -> 2452 bytes inherit_graph_599.map | 3 +- inherit_graph_599.md5 | 2 +- inherit_graph_599.png | Bin 2490 -> 1563 bytes inherit_graph_600.map | 2 +- inherit_graph_600.md5 | 2 +- inherit_graph_600.png | Bin 2452 -> 2500 bytes inherit_graph_601.map | 2 +- inherit_graph_601.md5 | 2 +- inherit_graph_601.png | Bin 1563 -> 2514 bytes inherit_graph_602.map | 2 +- inherit_graph_602.md5 | 2 +- inherit_graph_602.png | Bin 2500 -> 2072 bytes inherit_graph_603.map | 2 +- inherit_graph_603.md5 | 2 +- inherit_graph_603.png | Bin 2514 -> 1840 bytes inherit_graph_604.map | 3 +- inherit_graph_604.md5 | 2 +- inherit_graph_604.png | Bin 2072 -> 2539 bytes inherit_graph_605.map | 2 +- inherit_graph_605.md5 | 2 +- inherit_graph_605.png | Bin 1840 -> 2984 bytes inherit_graph_606.map | 7 +- inherit_graph_606.md5 | 2 +- inherit_graph_606.png | Bin 2539 -> 14678 bytes inherit_graph_607.map | 2 +- inherit_graph_607.md5 | 2 +- inherit_graph_607.png | Bin 2984 -> 3409 bytes inherit_graph_608.map | 6 +- inherit_graph_608.md5 | 2 +- inherit_graph_608.png | Bin 14678 -> 2364 bytes inherit_graph_609.map | 2 +- inherit_graph_609.md5 | 2 +- inherit_graph_609.png | Bin 3409 -> 3171 bytes inherit_graph_610.map | 2 +- inherit_graph_610.md5 | 2 +- inherit_graph_610.png | Bin 2364 -> 3350 bytes inherit_graph_611.map | 2 +- inherit_graph_611.md5 | 2 +- inherit_graph_611.png | Bin 3171 -> 3105 bytes inherit_graph_612.map | 2 +- inherit_graph_612.md5 | 2 +- inherit_graph_612.png | Bin 3350 -> 2609 bytes inherit_graph_613.map | 4 +- inherit_graph_613.md5 | 2 +- inherit_graph_613.png | Bin 3105 -> 7080 bytes inherit_graph_614.map | 7 +- inherit_graph_614.md5 | 2 +- inherit_graph_614.png | Bin 2609 -> 14649 bytes inherit_graph_615.map | 4 +- inherit_graph_615.md5 | 2 +- inherit_graph_615.png | Bin 7080 -> 1645 bytes inherit_graph_616.map | 7 +- inherit_graph_616.md5 | 2 +- inherit_graph_616.png | Bin 14649 -> 1971 bytes inherit_graph_617.map | 2 +- inherit_graph_617.md5 | 2 +- inherit_graph_617.png | Bin 1645 -> 2590 bytes inherit_graph_618.map | 2 +- inherit_graph_618.md5 | 2 +- inherit_graph_618.png | Bin 1971 -> 2540 bytes inherit_graph_619.map | 2 +- inherit_graph_619.md5 | 2 +- inherit_graph_619.png | Bin 2590 -> 2963 bytes inherit_graph_620.map | 2 +- inherit_graph_620.md5 | 2 +- inherit_graph_620.png | Bin 2540 -> 2626 bytes inherit_graph_621.map | 2 +- inherit_graph_621.md5 | 2 +- inherit_graph_621.png | Bin 2963 -> 3206 bytes inherit_graph_622.map | 2 +- inherit_graph_622.md5 | 2 +- inherit_graph_622.png | Bin 2626 -> 1134 bytes inherit_graph_623.map | 2 +- inherit_graph_623.md5 | 2 +- inherit_graph_623.png | Bin 3206 -> 1615 bytes inherit_graph_624.map | 2 +- inherit_graph_624.md5 | 2 +- inherit_graph_624.png | Bin 1134 -> 1693 bytes inherit_graph_625.map | 2 +- inherit_graph_625.md5 | 2 +- inherit_graph_625.png | Bin 1615 -> 2080 bytes inherit_graph_626.map | 2 +- inherit_graph_626.md5 | 2 +- inherit_graph_626.png | Bin 1693 -> 1862 bytes inherit_graph_627.map | 2 +- inherit_graph_627.md5 | 2 +- inherit_graph_627.png | Bin 2080 -> 2252 bytes inherit_graph_628.map | 2 +- inherit_graph_628.md5 | 2 +- inherit_graph_628.png | Bin 1862 -> 1963 bytes inherit_graph_629.map | 2 +- inherit_graph_629.md5 | 2 +- inherit_graph_629.png | Bin 2252 -> 2979 bytes inherit_graph_630.map | 2 +- inherit_graph_630.md5 | 2 +- inherit_graph_630.png | Bin 1963 -> 1080 bytes inherit_graph_631.map | 2 +- inherit_graph_631.md5 | 2 +- inherit_graph_631.png | Bin 2979 -> 2987 bytes inherit_graph_632.map | 2 +- inherit_graph_632.md5 | 2 +- inherit_graph_632.png | Bin 1080 -> 3348 bytes inherit_graph_633.map | 2 +- inherit_graph_633.md5 | 2 +- inherit_graph_633.png | Bin 2987 -> 2843 bytes inherit_graph_634.map | 2 +- inherit_graph_634.md5 | 2 +- inherit_graph_634.png | Bin 3348 -> 2784 bytes inherit_graph_635.map | 2 +- inherit_graph_635.md5 | 2 +- inherit_graph_635.png | Bin 2843 -> 2449 bytes inherit_graph_636.map | 4 +- inherit_graph_636.md5 | 2 +- inherit_graph_636.png | Bin 2784 -> 9959 bytes inherit_graph_637.map | 2 +- inherit_graph_637.md5 | 2 +- inherit_graph_637.png | Bin 2449 -> 2405 bytes inherit_graph_638.map | 4 +- inherit_graph_638.md5 | 2 +- inherit_graph_638.png | Bin 9959 -> 2493 bytes inherit_graph_639.map | 2 +- inherit_graph_639.md5 | 2 +- inherit_graph_639.png | Bin 2405 -> 2367 bytes inherit_graph_640.map | 2 +- inherit_graph_640.md5 | 2 +- inherit_graph_640.png | Bin 2493 -> 1946 bytes inherit_graph_641.map | 2 +- inherit_graph_641.md5 | 2 +- inherit_graph_641.png | Bin 2367 -> 3121 bytes inherit_graph_642.map | 2 +- inherit_graph_642.md5 | 2 +- inherit_graph_642.png | Bin 1946 -> 6018 bytes inherit_graph_643.map | 2 +- inherit_graph_643.md5 | 2 +- inherit_graph_643.png | Bin 3121 -> 6330 bytes inherit_graph_644.map | 2 +- inherit_graph_644.md5 | 2 +- inherit_graph_644.png | Bin 6018 -> 6161 bytes inherit_graph_645.map | 2 +- inherit_graph_645.md5 | 2 +- inherit_graph_645.png | Bin 6330 -> 6182 bytes inherit_graph_646.map | 2 +- inherit_graph_646.md5 | 2 +- inherit_graph_646.png | Bin 6161 -> 3113 bytes inherit_graph_647.map | 2 +- inherit_graph_647.md5 | 2 +- inherit_graph_647.png | Bin 6182 -> 3284 bytes inherit_graph_648.map | 2 +- inherit_graph_648.md5 | 2 +- inherit_graph_648.png | Bin 3113 -> 3419 bytes inherit_graph_649.map | 2 +- inherit_graph_649.md5 | 2 +- inherit_graph_649.png | Bin 3284 -> 3561 bytes inherit_graph_650.map | 2 +- inherit_graph_650.md5 | 2 +- inherit_graph_650.png | Bin 3419 -> 3330 bytes inherit_graph_651.map | 2 +- inherit_graph_651.md5 | 2 +- inherit_graph_651.png | Bin 3561 -> 3417 bytes inherit_graph_652.map | 2 +- inherit_graph_652.md5 | 2 +- inherit_graph_652.png | Bin 3330 -> 3438 bytes inherit_graph_653.map | 2 +- inherit_graph_653.md5 | 2 +- inherit_graph_653.png | Bin 3417 -> 3613 bytes inherit_graph_654.map | 2 +- inherit_graph_654.md5 | 2 +- inherit_graph_654.png | Bin 3438 -> 1816 bytes inherit_graph_655.map | 2 +- inherit_graph_655.md5 | 2 +- inherit_graph_655.png | Bin 3613 -> 2734 bytes inherit_graph_656.map | 2 +- inherit_graph_656.md5 | 2 +- inherit_graph_656.png | Bin 1816 -> 3137 bytes inherit_graph_657.map | 2 +- inherit_graph_657.md5 | 2 +- inherit_graph_657.png | Bin 2734 -> 2890 bytes inherit_graph_658.map | 2 +- inherit_graph_658.md5 | 2 +- inherit_graph_658.png | Bin 2461 -> 2910 bytes inherit_graph_659.map | 2 +- inherit_graph_659.md5 | 2 +- inherit_graph_659.png | Bin 3137 -> 2280 bytes inherit_graph_660.map | 5 +- inherit_graph_660.md5 | 2 +- inherit_graph_660.png | Bin 2890 -> 8183 bytes inherit_graph_661.map | 2 +- inherit_graph_661.md5 | 2 +- inherit_graph_661.png | Bin 2910 -> 2930 bytes inherit_graph_662.map | 2 +- inherit_graph_662.md5 | 2 +- inherit_graph_662.png | Bin 2280 -> 2023 bytes inherit_graph_663.map | 5 +- inherit_graph_663.md5 | 2 +- inherit_graph_663.png | Bin 8183 -> 2237 bytes inherit_graph_664.map | 2 +- inherit_graph_664.md5 | 2 +- inherit_graph_664.png | Bin 2930 -> 2547 bytes inherit_graph_665.map | 2 +- inherit_graph_665.md5 | 2 +- inherit_graph_665.png | Bin 2023 -> 2269 bytes inherit_graph_666.map | 2 +- inherit_graph_666.md5 | 2 +- inherit_graph_666.png | Bin 2237 -> 2634 bytes inherit_graph_667.map | 2 +- inherit_graph_667.md5 | 2 +- inherit_graph_667.png | Bin 2547 -> 1843 bytes inherit_graph_668.map | 2 +- inherit_graph_668.md5 | 2 +- inherit_graph_668.png | Bin 2269 -> 2873 bytes inherit_graph_669.map | 2 +- inherit_graph_669.md5 | 2 +- inherit_graph_669.png | Bin 2634 -> 3135 bytes inherit_graph_670.map | 2 +- inherit_graph_670.md5 | 2 +- inherit_graph_670.png | Bin 1843 -> 2383 bytes inherit_graph_671.map | 2 +- inherit_graph_671.md5 | 2 +- inherit_graph_671.png | Bin 2873 -> 2838 bytes inherit_graph_672.map | 2 +- inherit_graph_672.md5 | 2 +- inherit_graph_672.png | Bin 3135 -> 2217 bytes inherit_graph_673.map | 2 +- inherit_graph_673.md5 | 2 +- inherit_graph_673.png | Bin 2383 -> 2117 bytes inherit_graph_674.map | 2 +- inherit_graph_674.md5 | 2 +- inherit_graph_674.png | Bin 2838 -> 2991 bytes inherit_graph_675.map | 2 +- inherit_graph_675.md5 | 2 +- inherit_graph_675.png | Bin 2217 -> 3564 bytes inherit_graph_676.map | 2 +- inherit_graph_676.md5 | 2 +- inherit_graph_676.png | Bin 2117 -> 3402 bytes inherit_graph_677.map | 2 +- inherit_graph_677.md5 | 2 +- inherit_graph_677.png | Bin 2991 -> 2197 bytes inherit_graph_678.map | 2 +- inherit_graph_678.md5 | 2 +- inherit_graph_678.png | Bin 3564 -> 3125 bytes inherit_graph_679.map | 2 +- inherit_graph_679.md5 | 2 +- inherit_graph_679.png | Bin 3402 -> 2032 bytes inherit_graph_680.map | 3 +- inherit_graph_680.md5 | 2 +- inherit_graph_680.png | Bin 2197 -> 3691 bytes inherit_graph_681.map | 2 +- inherit_graph_681.md5 | 2 +- inherit_graph_681.png | Bin 3125 -> 2052 bytes inherit_graph_682.map | 2 +- inherit_graph_682.md5 | 2 +- inherit_graph_682.png | Bin 2032 -> 2456 bytes inherit_graph_683.map | 3 +- inherit_graph_683.md5 | 2 +- inherit_graph_683.png | Bin 3691 -> 2519 bytes inherit_graph_684.map | 2 +- inherit_graph_684.md5 | 2 +- inherit_graph_684.png | Bin 2052 -> 2458 bytes inherit_graph_685.map | 2 +- inherit_graph_685.md5 | 2 +- inherit_graph_685.png | Bin 2456 -> 2623 bytes inherit_graph_686.map | 2 +- inherit_graph_686.md5 | 2 +- inherit_graph_686.png | Bin 2519 -> 3091 bytes inherit_graph_687.map | 2 +- inherit_graph_687.md5 | 2 +- inherit_graph_687.png | Bin 2458 -> 4498 bytes inherit_graph_688.map | 2 +- inherit_graph_688.md5 | 2 +- inherit_graph_688.png | Bin 2623 -> 3275 bytes inherit_graph_689.map | 2 +- inherit_graph_689.md5 | 2 +- inherit_graph_689.png | Bin 3091 -> 3573 bytes inherit_graph_690.map | 2 +- inherit_graph_690.md5 | 2 +- inherit_graph_690.png | Bin 4498 -> 2496 bytes inherit_graph_691.map | 2 +- inherit_graph_691.md5 | 2 +- inherit_graph_691.png | Bin 3275 -> 1930 bytes inherit_graph_692.map | 2 +- inherit_graph_692.md5 | 2 +- inherit_graph_692.png | Bin 3573 -> 3340 bytes inherit_graph_693.map | 2 +- inherit_graph_693.md5 | 2 +- inherit_graph_693.png | Bin 2496 -> 3021 bytes inherit_graph_694.map | 2 +- inherit_graph_694.md5 | 2 +- inherit_graph_694.png | Bin 1930 -> 2171 bytes inherit_graph_695.map | 2 +- inherit_graph_695.md5 | 2 +- inherit_graph_695.png | Bin 3340 -> 2201 bytes inherit_graph_696.map | 2 +- inherit_graph_696.md5 | 2 +- inherit_graph_696.png | Bin 3021 -> 1801 bytes inherit_graph_697.map | 2 +- inherit_graph_697.md5 | 2 +- inherit_graph_697.png | Bin 2171 -> 2125 bytes inherit_graph_698.map | 2 +- inherit_graph_698.md5 | 2 +- inherit_graph_698.png | Bin 2201 -> 2623 bytes inherit_graph_699.map | 2 +- inherit_graph_699.md5 | 2 +- inherit_graph_699.png | Bin 1801 -> 2231 bytes inherit_graph_700.map | 2 +- inherit_graph_700.md5 | 2 +- inherit_graph_700.png | Bin 2125 -> 2653 bytes inherit_graph_701.map | 2 +- inherit_graph_701.md5 | 2 +- inherit_graph_701.png | Bin 2623 -> 2330 bytes inherit_graph_702.map | 2 +- inherit_graph_702.md5 | 2 +- inherit_graph_702.png | Bin 2231 -> 2214 bytes inherit_graph_703.map | 2 +- inherit_graph_703.md5 | 2 +- inherit_graph_703.png | Bin 2653 -> 2084 bytes inherit_graph_704.map | 2 +- inherit_graph_704.md5 | 2 +- inherit_graph_704.png | Bin 2330 -> 1485 bytes inherit_graph_705.map | 2 +- inherit_graph_705.md5 | 2 +- inherit_graph_705.png | Bin 2214 -> 3023 bytes inherit_graph_706.map | 2 +- inherit_graph_706.md5 | 2 +- inherit_graph_706.png | Bin 2084 -> 1938 bytes inherit_graph_707.map | 2 +- inherit_graph_707.md5 | 2 +- inherit_graph_707.png | Bin 1485 -> 2673 bytes inherit_graph_708.map | 2 +- inherit_graph_708.md5 | 2 +- inherit_graph_708.png | Bin 3023 -> 2008 bytes inherit_graph_709.map | 2 +- inherit_graph_709.md5 | 2 +- inherit_graph_709.png | Bin 1938 -> 2585 bytes inherit_graph_710.map | 2 +- inherit_graph_710.md5 | 2 +- inherit_graph_710.png | Bin 2673 -> 2428 bytes inherit_graph_711.map | 2 +- inherit_graph_711.md5 | 2 +- inherit_graph_711.png | Bin 2008 -> 2927 bytes inherit_graph_712.map | 2 +- inherit_graph_712.md5 | 2 +- inherit_graph_712.png | Bin 2585 -> 2059 bytes inherit_graph_713.map | 2 +- inherit_graph_713.md5 | 2 +- inherit_graph_713.png | Bin 2428 -> 2591 bytes inherit_graph_714.map | 2 +- inherit_graph_714.md5 | 2 +- inherit_graph_714.png | Bin 2927 -> 1597 bytes inherit_graph_715.map | 2 +- inherit_graph_715.md5 | 2 +- inherit_graph_715.png | Bin 2059 -> 2328 bytes inherit_graph_716.map | 2 +- inherit_graph_716.md5 | 2 +- inherit_graph_716.png | Bin 2591 -> 2431 bytes inherit_graph_717.map | 2 +- inherit_graph_717.md5 | 2 +- inherit_graph_717.png | Bin 1597 -> 2012 bytes inherit_graph_718.map | 2 +- inherit_graph_718.md5 | 2 +- inherit_graph_718.png | Bin 2328 -> 2582 bytes inherit_graph_719.map | 2 +- inherit_graph_719.md5 | 2 +- inherit_graph_719.png | Bin 2431 -> 2487 bytes inherit_graph_720.map | 2 +- inherit_graph_720.md5 | 2 +- inherit_graph_720.png | Bin 2012 -> 3318 bytes inherit_graph_721.map | 2 +- inherit_graph_721.md5 | 2 +- inherit_graph_721.png | Bin 2582 -> 2472 bytes inherit_graph_722.map | 2 +- inherit_graph_722.md5 | 2 +- inherit_graph_722.png | Bin 2487 -> 1638 bytes inherit_graph_723.map | 2 +- inherit_graph_723.md5 | 2 +- inherit_graph_723.png | Bin 3318 -> 2785 bytes inherit_graph_724.map | 2 +- inherit_graph_724.md5 | 2 +- inherit_graph_724.png | Bin 2472 -> 2418 bytes inherit_graph_725.map | 2 +- inherit_graph_725.md5 | 2 +- inherit_graph_725.png | Bin 1638 -> 2469 bytes inherit_graph_726.map | 2 +- inherit_graph_726.md5 | 2 +- inherit_graph_726.png | Bin 2785 -> 3940 bytes inherit_graph_727.map | 2 +- inherit_graph_727.md5 | 2 +- inherit_graph_727.png | Bin 2418 -> 2089 bytes inherit_graph_728.map | 2 +- inherit_graph_728.md5 | 2 +- inherit_graph_728.png | Bin 2469 -> 2637 bytes inherit_graph_729.map | 2 +- inherit_graph_729.md5 | 2 +- inherit_graph_729.png | Bin 3940 -> 3238 bytes inherit_graph_730.map | 2 +- inherit_graph_730.md5 | 2 +- inherit_graph_730.png | Bin 2089 -> 3084 bytes inherit_graph_731.map | 2 +- inherit_graph_731.md5 | 2 +- inherit_graph_731.png | Bin 2637 -> 1509 bytes inherit_graph_732.map | 2 +- inherit_graph_732.md5 | 2 +- inherit_graph_732.png | Bin 3238 -> 2079 bytes inherit_graph_733.map | 2 +- inherit_graph_733.md5 | 2 +- inherit_graph_733.png | Bin 3084 -> 2396 bytes inherit_graph_734.map | 2 +- inherit_graph_734.md5 | 2 +- inherit_graph_734.png | Bin 1509 -> 1859 bytes inherit_graph_735.map | 2 +- inherit_graph_735.md5 | 2 +- inherit_graph_735.png | Bin 2079 -> 2392 bytes inherit_graph_736.map | 2 +- inherit_graph_736.md5 | 2 +- inherit_graph_736.png | Bin 2396 -> 2182 bytes inherit_graph_737.map | 2 +- inherit_graph_737.md5 | 2 +- inherit_graph_737.png | Bin 1859 -> 2657 bytes inherit_graph_738.map | 2 +- inherit_graph_738.md5 | 2 +- inherit_graph_738.png | Bin 2392 -> 3203 bytes inherit_graph_739.map | 2 +- inherit_graph_739.md5 | 2 +- inherit_graph_739.png | Bin 2182 -> 2446 bytes inherit_graph_740.map | 2 +- inherit_graph_740.md5 | 2 +- inherit_graph_740.png | Bin 2657 -> 2572 bytes inherit_graph_741.map | 2 +- inherit_graph_741.md5 | 2 +- inherit_graph_741.png | Bin 3203 -> 2633 bytes inherit_graph_742.map | 2 +- inherit_graph_742.md5 | 2 +- inherit_graph_742.png | Bin 2446 -> 1846 bytes inherit_graph_743.map | 5 +- inherit_graph_743.md5 | 2 +- inherit_graph_743.png | Bin 2572 -> 9873 bytes inherit_graph_744.map | 6 +- inherit_graph_744.md5 | 2 +- inherit_graph_744.png | Bin 2633 -> 12320 bytes inherit_graph_745.map | 2 +- inherit_graph_745.md5 | 2 +- inherit_graph_745.png | Bin 1846 -> 2965 bytes inherit_graph_746.map | 5 +- inherit_graph_746.md5 | 2 +- inherit_graph_746.png | Bin 9873 -> 2937 bytes inherit_graph_747.map | 7 +- inherit_graph_747.md5 | 2 +- inherit_graph_747.png | Bin 12320 -> 3933 bytes inherit_graph_748.map | 2 +- inherit_graph_748.md5 | 2 +- inherit_graph_748.png | Bin 2965 -> 1711 bytes inherit_graph_749.map | 2 +- inherit_graph_749.md5 | 2 +- inherit_graph_749.png | Bin 2937 -> 1791 bytes inherit_graph_750.map | 3 +- inherit_graph_750.md5 | 2 +- inherit_graph_750.png | Bin 3933 -> 1985 bytes inherit_graph_751.map | 2 +- inherit_graph_751.md5 | 2 +- inherit_graph_751.png | Bin 1711 -> 1880 bytes inherit_graph_752.map | 2 +- inherit_graph_752.md5 | 2 +- inherit_graph_752.png | Bin 1791 -> 1720 bytes inherit_graph_753.map | 2 +- inherit_graph_753.md5 | 2 +- inherit_graph_753.png | Bin 1985 -> 2113 bytes inherit_graph_754.map | 2 +- inherit_graph_754.md5 | 2 +- inherit_graph_754.png | Bin 1880 -> 3076 bytes inherit_graph_755.map | 2 +- inherit_graph_755.md5 | 2 +- inherit_graph_755.png | Bin 1720 -> 2176 bytes inherit_graph_756.map | 2 +- inherit_graph_756.md5 | 2 +- inherit_graph_756.png | Bin 2113 -> 2029 bytes inherit_graph_757.map | 2 +- inherit_graph_757.md5 | 2 +- inherit_graph_757.png | Bin 3076 -> 3009 bytes inherit_graph_758.map | 2 +- inherit_graph_758.md5 | 2 +- inherit_graph_758.png | Bin 2176 -> 2240 bytes inherit_graph_759.map | 2 +- inherit_graph_759.md5 | 2 +- inherit_graph_759.png | Bin 2029 -> 1656 bytes inherit_graph_760.map | 2 +- inherit_graph_760.md5 | 2 +- inherit_graph_760.png | Bin 3009 -> 2171 bytes inherit_graph_761.map | 2 +- inherit_graph_761.md5 | 2 +- inherit_graph_761.png | Bin 2240 -> 1843 bytes inherit_graph_762.map | 2 +- inherit_graph_762.md5 | 2 +- inherit_graph_762.png | Bin 1656 -> 2212 bytes inherit_graph_763.map | 2 +- inherit_graph_763.md5 | 2 +- inherit_graph_763.png | Bin 2171 -> 1924 bytes inherit_graph_764.map | 2 +- inherit_graph_764.md5 | 2 +- inherit_graph_764.png | Bin 1843 -> 1795 bytes inherit_graph_765.map | 3 +- inherit_graph_765.md5 | 2 +- inherit_graph_765.png | Bin 2212 -> 3374 bytes inherit_graph_766.map | 2 +- inherit_graph_766.md5 | 2 +- inherit_graph_766.png | Bin 1924 -> 1850 bytes inherit_graph_767.map | 2 +- inherit_graph_767.md5 | 2 +- inherit_graph_767.png | Bin 1795 -> 2141 bytes inherit_graph_768.map | 3 +- inherit_graph_768.md5 | 2 +- inherit_graph_768.png | Bin 3374 -> 2018 bytes inherit_graph_769.map | 2 +- inherit_graph_769.md5 | 2 +- inherit_graph_769.png | Bin 1850 -> 2085 bytes inherit_graph_770.map | 2 +- inherit_graph_770.md5 | 2 +- inherit_graph_770.png | Bin 2141 -> 2228 bytes inherit_graph_771.map | 2 +- inherit_graph_771.md5 | 2 +- inherit_graph_771.png | Bin 2018 -> 2341 bytes inherit_graph_772.map | 2 +- inherit_graph_772.md5 | 2 +- inherit_graph_772.png | Bin 2085 -> 2223 bytes inherit_graph_773.map | 2 +- inherit_graph_773.md5 | 2 +- inherit_graph_773.png | Bin 2228 -> 2037 bytes inherit_graph_774.map | 2 +- inherit_graph_774.md5 | 2 +- inherit_graph_774.png | Bin 2341 -> 2099 bytes inherit_graph_775.map | 2 +- inherit_graph_775.md5 | 2 +- inherit_graph_775.png | Bin 2223 -> 1958 bytes inherit_graph_776.map | 2 +- inherit_graph_776.md5 | 2 +- inherit_graph_776.png | Bin 2037 -> 1961 bytes inherit_graph_777.map | 2 +- inherit_graph_777.md5 | 2 +- inherit_graph_777.png | Bin 2099 -> 2993 bytes inherit_graph_778.map | 2 +- inherit_graph_778.md5 | 2 +- inherit_graph_778.png | Bin 1958 -> 2171 bytes inherit_graph_779.map | 2 +- inherit_graph_779.md5 | 2 +- inherit_graph_779.png | Bin 1961 -> 2044 bytes inherit_graph_780.map | 2 +- inherit_graph_780.md5 | 2 +- inherit_graph_780.png | Bin 2993 -> 2377 bytes inherit_graph_781.map | 4 +- inherit_graph_781.md5 | 2 +- inherit_graph_781.png | Bin 2171 -> 7071 bytes inherit_graph_782.map | 2 +- inherit_graph_782.md5 | 2 +- inherit_graph_782.png | Bin 2044 -> 1757 bytes inherit_graph_783.map | 2 +- inherit_graph_783.md5 | 2 +- inherit_graph_783.png | Bin 2377 -> 2162 bytes inherit_graph_784.map | 4 +- inherit_graph_784.md5 | 2 +- inherit_graph_784.png | Bin 7071 -> 1676 bytes inherit_graph_785.map | 2 +- inherit_graph_785.md5 | 2 +- inherit_graph_785.png | Bin 1757 -> 1892 bytes inherit_graph_786.map | 2 +- inherit_graph_786.md5 | 2 +- inherit_graph_786.png | Bin 2162 -> 2028 bytes inherit_graph_787.map | 2 +- inherit_graph_787.md5 | 2 +- inherit_graph_787.png | Bin 1676 -> 1764 bytes inherit_graph_788.map | 2 +- inherit_graph_788.md5 | 2 +- inherit_graph_788.png | Bin 1892 -> 1581 bytes inherit_graph_789.map | 2 +- inherit_graph_789.md5 | 2 +- inherit_graph_789.png | Bin 2028 -> 2250 bytes inherit_graph_790.map | 2 +- inherit_graph_790.md5 | 2 +- inherit_graph_790.png | Bin 1764 -> 2369 bytes inherit_graph_791.map | 2 +- inherit_graph_791.md5 | 2 +- inherit_graph_791.png | Bin 1581 -> 1779 bytes inherit_graph_792.map | 2 +- inherit_graph_792.md5 | 2 +- inherit_graph_792.png | Bin 2250 -> 2725 bytes inherit_graph_793.map | 2 +- inherit_graph_793.md5 | 2 +- inherit_graph_793.png | Bin 2369 -> 1805 bytes inherit_graph_794.map | 2 +- inherit_graph_794.md5 | 2 +- inherit_graph_794.png | Bin 1779 -> 2420 bytes inherit_graph_795.map | 2 +- inherit_graph_795.md5 | 2 +- inherit_graph_795.png | Bin 2725 -> 2257 bytes inherit_graph_796.map | 2 +- inherit_graph_796.md5 | 2 +- inherit_graph_796.png | Bin 1805 -> 2459 bytes inherit_graph_797.map | 2 +- inherit_graph_797.md5 | 2 +- inherit_graph_797.png | Bin 2420 -> 2508 bytes inherit_graph_798.map | 2 +- inherit_graph_798.md5 | 2 +- inherit_graph_798.png | Bin 2257 -> 1955 bytes inherit_graph_799.map | 2 +- inherit_graph_799.md5 | 2 +- inherit_graph_799.png | Bin 2459 -> 1442 bytes inherit_graph_800.map | 2 +- inherit_graph_800.md5 | 2 +- inherit_graph_800.png | Bin 2508 -> 2104 bytes inherit_graph_801.map | 2 +- inherit_graph_801.md5 | 2 +- inherit_graph_801.png | Bin 1955 -> 1679 bytes inherit_graph_802.map | 2 +- inherit_graph_802.md5 | 2 +- inherit_graph_802.png | Bin 1442 -> 1553 bytes inherit_graph_803.map | 2 +- inherit_graph_803.md5 | 2 +- inherit_graph_803.png | Bin 2104 -> 1417 bytes inherit_graph_804.map | 2 +- inherit_graph_804.md5 | 2 +- inherit_graph_804.png | Bin 1679 -> 1922 bytes inherit_graph_805.map | 2 +- inherit_graph_805.md5 | 2 +- inherit_graph_805.png | Bin 1553 -> 2102 bytes inherit_graph_806.map | 2 +- inherit_graph_806.md5 | 2 +- inherit_graph_806.png | Bin 1417 -> 1944 bytes inherit_graph_807.map | 2 +- inherit_graph_807.md5 | 2 +- inherit_graph_807.png | Bin 1922 -> 1637 bytes inherit_graph_808.map | 2 +- inherit_graph_808.md5 | 2 +- inherit_graph_808.png | Bin 2102 -> 2035 bytes inherit_graph_809.map | 2 +- inherit_graph_809.md5 | 2 +- inherit_graph_809.png | Bin 1944 -> 2004 bytes inherit_graph_810.map | 2 +- inherit_graph_810.md5 | 2 +- inherit_graph_810.png | Bin 1637 -> 2109 bytes inherit_graph_811.map | 2 +- inherit_graph_811.md5 | 2 +- inherit_graph_811.png | Bin 2035 -> 2078 bytes inherit_graph_812.map | 2 +- inherit_graph_812.md5 | 2 +- inherit_graph_812.png | Bin 2004 -> 2060 bytes inherit_graph_813.map | 2 +- inherit_graph_813.md5 | 2 +- inherit_graph_813.png | Bin 2109 -> 1989 bytes inherit_graph_814.map | 2 +- inherit_graph_814.md5 | 2 +- inherit_graph_814.png | Bin 2078 -> 1602 bytes inherit_graph_815.map | 2 +- inherit_graph_815.md5 | 2 +- inherit_graph_815.png | Bin 2060 -> 2337 bytes inherit_graph_816.map | 2 +- inherit_graph_816.md5 | 2 +- inherit_graph_816.png | Bin 1989 -> 2011 bytes inherit_graph_817.map | 2 +- inherit_graph_817.md5 | 2 +- inherit_graph_817.png | Bin 1602 -> 2113 bytes inherit_graph_818.map | 2 +- inherit_graph_818.md5 | 2 +- inherit_graph_818.png | Bin 2337 -> 2249 bytes inherit_graph_819.map | 2 +- inherit_graph_819.md5 | 2 +- inherit_graph_819.png | Bin 2011 -> 2102 bytes inherit_graph_820.map | 2 +- inherit_graph_820.md5 | 2 +- inherit_graph_820.png | Bin 2113 -> 1761 bytes inherit_graph_821.map | 2 +- inherit_graph_821.md5 | 2 +- inherit_graph_821.png | Bin 2249 -> 1936 bytes inherit_graph_822.map | 2 +- inherit_graph_822.md5 | 2 +- inherit_graph_822.png | Bin 2102 -> 1811 bytes inherit_graph_823.map | 2 +- inherit_graph_823.md5 | 2 +- inherit_graph_823.png | Bin 1761 -> 1665 bytes inherit_graph_824.map | 2 +- inherit_graph_824.md5 | 2 +- inherit_graph_824.png | Bin 1936 -> 1695 bytes inherit_graph_825.map | 2 +- inherit_graph_825.md5 | 2 +- inherit_graph_825.png | Bin 1811 -> 1701 bytes inherit_graph_826.map | 2 +- inherit_graph_826.md5 | 2 +- inherit_graph_826.png | Bin 1665 -> 2562 bytes inherit_graph_827.map | 2 +- inherit_graph_827.md5 | 2 +- inherit_graph_827.png | Bin 1695 -> 2089 bytes inherit_graph_828.map | 2 +- inherit_graph_828.md5 | 2 +- inherit_graph_828.png | Bin 1701 -> 2690 bytes inherit_graph_829.map | 2 +- inherit_graph_829.md5 | 2 +- inherit_graph_829.png | Bin 2562 -> 2541 bytes inherit_graph_830.map | 2 +- inherit_graph_830.md5 | 2 +- inherit_graph_830.png | Bin 2089 -> 2886 bytes inherit_graph_831.map | 2 +- inherit_graph_831.md5 | 2 +- inherit_graph_831.png | Bin 2690 -> 1930 bytes inherit_graph_832.map | 2 +- inherit_graph_832.md5 | 2 +- inherit_graph_832.png | Bin 2541 -> 1550 bytes inherit_graph_833.map | 2 +- inherit_graph_833.md5 | 2 +- inherit_graph_833.png | Bin 2886 -> 1743 bytes inherit_graph_834.map | 2 +- inherit_graph_834.md5 | 2 +- inherit_graph_834.png | Bin 1930 -> 2548 bytes inherit_graph_835.map | 2 +- inherit_graph_835.md5 | 2 +- inherit_graph_835.png | Bin 1550 -> 2370 bytes inherit_graph_836.map | 2 +- inherit_graph_836.md5 | 2 +- inherit_graph_836.png | Bin 1743 -> 2117 bytes inherit_graph_837.map | 2 +- inherit_graph_837.md5 | 2 +- inherit_graph_837.png | Bin 2548 -> 2134 bytes inherit_graph_838.map | 2 +- inherit_graph_838.md5 | 2 +- inherit_graph_838.png | Bin 2370 -> 2030 bytes inherit_graph_839.map | 2 +- inherit_graph_839.md5 | 2 +- inherit_graph_839.png | Bin 2117 -> 2371 bytes inherit_graph_840.map | 2 +- inherit_graph_840.md5 | 2 +- inherit_graph_840.png | Bin 2134 -> 2199 bytes inherit_graph_841.map | 2 +- inherit_graph_841.md5 | 2 +- inherit_graph_841.png | Bin 2030 -> 2686 bytes inherit_graph_842.map | 2 +- inherit_graph_842.md5 | 2 +- inherit_graph_842.png | Bin 2371 -> 1672 bytes inherit_graph_843.map | 2 +- inherit_graph_843.md5 | 2 +- inherit_graph_843.png | Bin 2199 -> 1765 bytes inherit_graph_844.map | 2 +- inherit_graph_844.md5 | 2 +- inherit_graph_844.png | Bin 2686 -> 2100 bytes inherit_graph_845.map | 2 +- inherit_graph_845.md5 | 2 +- inherit_graph_845.png | Bin 1672 -> 1455 bytes inherit_graph_846.map | 2 +- inherit_graph_846.md5 | 2 +- inherit_graph_846.png | Bin 1765 -> 1999 bytes inherit_graph_847.map | 2 +- inherit_graph_847.md5 | 2 +- inherit_graph_847.png | Bin 2100 -> 1467 bytes inherit_graph_848.map | 2 +- inherit_graph_848.md5 | 2 +- inherit_graph_848.png | Bin 1455 -> 1517 bytes inherit_graph_849.map | 2 +- inherit_graph_849.md5 | 2 +- inherit_graph_849.png | Bin 1999 -> 1894 bytes inherit_graph_850.map | 2 +- inherit_graph_850.md5 | 2 +- inherit_graph_850.png | Bin 1467 -> 2199 bytes inherit_graph_851.map | 2 +- inherit_graph_851.md5 | 2 +- inherit_graph_851.png | Bin 1517 -> 1651 bytes inherit_graph_852.map | 2 +- inherit_graph_852.md5 | 2 +- inherit_graph_852.png | Bin 1894 -> 1319 bytes inherit_graph_853.map | 2 +- inherit_graph_853.md5 | 2 +- inherit_graph_853.png | Bin 2199 -> 2036 bytes inherit_graph_854.map | 2 +- inherit_graph_854.md5 | 2 +- inherit_graph_854.png | Bin 1651 -> 1822 bytes inherit_graph_855.map | 2 +- inherit_graph_855.md5 | 2 +- inherit_graph_855.png | Bin 1319 -> 2169 bytes inherit_graph_856.map | 2 +- inherit_graph_856.md5 | 2 +- inherit_graph_856.png | Bin 2036 -> 1947 bytes inherit_graph_857.map | 2 +- inherit_graph_857.md5 | 2 +- inherit_graph_857.png | Bin 1822 -> 2162 bytes inherit_graph_858.map | 2 +- inherit_graph_858.md5 | 2 +- inherit_graph_858.png | Bin 2169 -> 2130 bytes inherit_graph_859.map | 2 +- inherit_graph_859.md5 | 2 +- inherit_graph_859.png | Bin 1947 -> 1944 bytes inherit_graph_860.map | 2 +- inherit_graph_860.md5 | 2 +- inherit_graph_860.png | Bin 2162 -> 2051 bytes inherit_graph_861.map | 2 +- inherit_graph_861.md5 | 2 +- inherit_graph_861.png | Bin 2130 -> 2045 bytes inherit_graph_862.map | 2 +- inherit_graph_862.md5 | 2 +- inherit_graph_862.png | Bin 1944 -> 1888 bytes inherit_graph_863.map | 2 +- inherit_graph_863.md5 | 2 +- inherit_graph_863.png | Bin 2051 -> 2008 bytes inherit_graph_864.map | 2 +- inherit_graph_864.md5 | 2 +- inherit_graph_864.png | Bin 2045 -> 1985 bytes inherit_graph_865.map | 2 +- inherit_graph_865.md5 | 2 +- inherit_graph_865.png | Bin 1888 -> 1800 bytes inherit_graph_866.map | 2 +- inherit_graph_866.md5 | 2 +- inherit_graph_866.png | Bin 2008 -> 2965 bytes inherit_graph_867.map | 2 +- inherit_graph_867.md5 | 2 +- inherit_graph_867.png | Bin 1985 -> 2598 bytes inherit_graph_868.map | 2 +- inherit_graph_868.md5 | 2 +- inherit_graph_868.png | Bin 1800 -> 2454 bytes inherit_graph_869.map | 2 +- inherit_graph_869.md5 | 2 +- inherit_graph_869.png | Bin 2965 -> 2627 bytes inherit_graph_870.map | 2 +- inherit_graph_870.md5 | 2 +- inherit_graph_870.png | Bin 2598 -> 2525 bytes inherit_graph_871.map | 2 +- inherit_graph_871.md5 | 2 +- inherit_graph_871.png | Bin 2454 -> 3063 bytes inherit_graph_872.map | 2 +- inherit_graph_872.md5 | 2 +- inherit_graph_872.png | Bin 2627 -> 2134 bytes inherit_graph_873.map | 2 +- inherit_graph_873.md5 | 2 +- inherit_graph_873.png | Bin 2525 -> 2703 bytes inherit_graph_874.map | 2 +- inherit_graph_874.md5 | 2 +- inherit_graph_874.png | Bin 3063 -> 1903 bytes inherit_graph_875.map | 2 +- inherit_graph_875.md5 | 2 +- inherit_graph_875.png | Bin 2134 -> 2430 bytes inherit_graph_876.map | 2 +- inherit_graph_876.md5 | 2 +- inherit_graph_876.png | Bin 2703 -> 1885 bytes inherit_graph_877.map | 2 +- inherit_graph_877.md5 | 2 +- inherit_graph_877.png | Bin 1903 -> 2458 bytes inherit_graph_878.map | 2 +- inherit_graph_878.md5 | 2 +- inherit_graph_878.png | Bin 2430 -> 1284 bytes inherit_graph_879.map | 2 +- inherit_graph_879.md5 | 2 +- inherit_graph_879.png | Bin 1885 -> 2130 bytes inherit_graph_880.map | 2 +- inherit_graph_880.md5 | 2 +- inherit_graph_880.png | Bin 2458 -> 1737 bytes inherit_graph_881.map | 2 +- inherit_graph_881.md5 | 2 +- inherit_graph_881.png | Bin 1284 -> 2037 bytes inherit_graph_882.map | 2 +- inherit_graph_882.md5 | 2 +- inherit_graph_882.png | Bin 2130 -> 2609 bytes inherit_graph_883.map | 2 +- inherit_graph_883.md5 | 2 +- inherit_graph_883.png | Bin 1737 -> 2149 bytes inherit_graph_884.map | 2 +- inherit_graph_884.md5 | 2 +- inherit_graph_884.png | Bin 2037 -> 2266 bytes inherit_graph_885.map | 2 +- inherit_graph_885.md5 | 2 +- inherit_graph_885.png | Bin 2609 -> 1381 bytes inherit_graph_886.map | 2 +- inherit_graph_886.md5 | 2 +- inherit_graph_886.png | Bin 2149 -> 1811 bytes inherit_graph_887.map | 2 +- inherit_graph_887.md5 | 2 +- inherit_graph_887.png | Bin 2266 -> 1639 bytes inherit_graph_888.map | 2 +- inherit_graph_888.md5 | 2 +- inherit_graph_888.png | Bin 1381 -> 2707 bytes inherit_graph_889.map | 2 +- inherit_graph_889.md5 | 2 +- inherit_graph_889.png | Bin 1811 -> 2336 bytes inherit_graph_890.map | 2 +- inherit_graph_890.md5 | 2 +- inherit_graph_890.png | Bin 1639 -> 2355 bytes inherit_graph_891.map | 2 +- inherit_graph_891.md5 | 2 +- inherit_graph_891.png | Bin 2707 -> 1946 bytes inherit_graph_892.map | 2 +- inherit_graph_892.md5 | 2 +- inherit_graph_892.png | Bin 2336 -> 2103 bytes inherit_graph_893.map | 2 +- inherit_graph_893.md5 | 2 +- inherit_graph_893.png | Bin 2355 -> 2089 bytes inherit_graph_894.map | 2 +- inherit_graph_894.md5 | 2 +- inherit_graph_894.png | Bin 1946 -> 1879 bytes inherit_graph_895.map | 2 +- inherit_graph_895.md5 | 2 +- inherit_graph_895.png | Bin 2103 -> 2566 bytes inherit_graph_896.map | 2 +- inherit_graph_896.md5 | 2 +- inherit_graph_896.png | Bin 2089 -> 2751 bytes inherit_graph_897.map | 2 +- inherit_graph_897.md5 | 2 +- inherit_graph_897.png | Bin 1879 -> 2595 bytes inherit_graph_898.map | 2 +- inherit_graph_898.md5 | 2 +- inherit_graph_898.png | Bin 2566 -> 2832 bytes inherit_graph_899.map | 2 +- inherit_graph_899.md5 | 2 +- inherit_graph_899.png | Bin 2751 -> 1760 bytes inherit_graph_900.map | 2 +- inherit_graph_900.md5 | 2 +- inherit_graph_900.png | Bin 2595 -> 2016 bytes inherit_graph_901.map | 2 +- inherit_graph_901.md5 | 2 +- inherit_graph_901.png | Bin 2832 -> 3019 bytes inherit_graph_902.map | 2 +- inherit_graph_902.md5 | 2 +- inherit_graph_902.png | Bin 1760 -> 2286 bytes inherit_graph_903.map | 2 +- inherit_graph_903.md5 | 2 +- inherit_graph_903.png | Bin 2016 -> 3095 bytes inherit_graph_904.map | 2 +- inherit_graph_904.md5 | 2 +- inherit_graph_904.png | Bin 3019 -> 3298 bytes inherit_graph_905.map | 2 +- inherit_graph_905.md5 | 2 +- inherit_graph_905.png | Bin 2286 -> 2735 bytes inherit_graph_906.map | 2 +- inherit_graph_906.md5 | 2 +- inherit_graph_906.png | Bin 3095 -> 3823 bytes inherit_graph_907.map | 2 +- inherit_graph_907.md5 | 2 +- inherit_graph_907.png | Bin 3298 -> 3116 bytes inherit_graph_908.map | 2 +- inherit_graph_908.md5 | 2 +- inherit_graph_908.png | Bin 2735 -> 2755 bytes inherit_graph_909.map | 3 +- inherit_graph_909.md5 | 2 +- inherit_graph_909.png | Bin 3823 -> 4619 bytes inherit_graph_910.map | 3 +- inherit_graph_910.md5 | 2 +- inherit_graph_910.png | Bin 3116 -> 4008 bytes inherit_graph_911.map | 2 +- inherit_graph_911.md5 | 2 +- inherit_graph_911.png | Bin 2755 -> 3217 bytes inherit_graph_912.map | 3 +- inherit_graph_912.md5 | 2 +- inherit_graph_912.png | Bin 4619 -> 2672 bytes inherit_graph_913.map | 3 +- inherit_graph_913.md5 | 2 +- inherit_graph_913.png | Bin 4008 -> 2655 bytes inherit_graph_914.map | 2 +- inherit_graph_914.md5 | 2 +- inherit_graph_914.png | Bin 3217 -> 1432 bytes inherit_graph_915.map | 2 +- inherit_graph_915.md5 | 2 +- inherit_graph_915.png | Bin 2672 -> 2201 bytes inherit_graph_916.map | 2 +- inherit_graph_916.md5 | 2 +- inherit_graph_916.png | Bin 2655 -> 2507 bytes inherit_graph_917.map | 2 +- inherit_graph_917.md5 | 2 +- inherit_graph_917.png | Bin 1432 -> 3156 bytes inherit_graph_918.map | 2 +- inherit_graph_918.md5 | 2 +- inherit_graph_918.png | Bin 2201 -> 3156 bytes inherit_graph_919.map | 5 +- inherit_graph_919.md5 | 2 +- inherit_graph_919.png | Bin 2507 -> 10427 bytes inherit_graph_920.map | 3 +- inherit_graph_920.md5 | 2 +- inherit_graph_920.png | Bin 3156 -> 4720 bytes inherit_graph_921.map | 3 +- inherit_graph_921.md5 | 2 +- inherit_graph_921.png | Bin 3156 -> 4177 bytes inherit_graph_922.map | 5 +- inherit_graph_922.md5 | 2 +- inherit_graph_922.png | Bin 10427 -> 3446 bytes inherit_graph_923.map | 3 +- inherit_graph_923.md5 | 2 +- inherit_graph_923.png | Bin 4720 -> 1868 bytes inherit_graph_924.map | 3 +- inherit_graph_924.md5 | 2 +- inherit_graph_924.png | Bin 4177 -> 2505 bytes inherit_graph_925.map | 2 +- inherit_graph_925.md5 | 2 +- inherit_graph_925.png | Bin 3446 -> 2804 bytes inherit_graph_926.map | 2 +- inherit_graph_926.md5 | 2 +- inherit_graph_926.png | Bin 1868 -> 1957 bytes inherit_graph_927.map | 2 +- inherit_graph_927.md5 | 2 +- inherit_graph_927.png | Bin 2505 -> 2588 bytes inherit_graph_928.map | 2 +- inherit_graph_928.md5 | 2 +- inherit_graph_928.png | Bin 2804 -> 2058 bytes inherit_graph_929.map | 2 +- inherit_graph_929.md5 | 2 +- inherit_graph_929.png | Bin 1957 -> 1880 bytes inherit_graph_930.map | 66 +- inherit_graph_930.md5 | 2 +- inherit_graph_930.png | Bin 2588 -> 421177 bytes inherit_graph_931.map | 2 +- inherit_graph_931.md5 | 2 +- inherit_graph_931.png | Bin 2058 -> 1925 bytes inherit_graph_932.map | 2 +- inherit_graph_932.md5 | 2 +- inherit_graph_932.png | Bin 1880 -> 2932 bytes inherit_graph_933.map | 66 +- inherit_graph_933.md5 | 2 +- inherit_graph_933.png | Bin 421177 -> 2794 bytes inherit_graph_934.map | 2 +- inherit_graph_934.md5 | 2 +- inherit_graph_934.png | Bin 1925 -> 1853 bytes inherit_graph_935.map | 2 +- inherit_graph_935.md5 | 2 +- inherit_graph_935.png | Bin 2932 -> 1693 bytes inherit_graph_936.map | 2 +- inherit_graph_936.md5 | 2 +- inherit_graph_936.png | Bin 2794 -> 2596 bytes inherit_graph_937.map | 2 +- inherit_graph_937.md5 | 2 +- inherit_graph_937.png | Bin 1853 -> 1493 bytes inherit_graph_938.map | 2 +- inherit_graph_938.md5 | 2 +- inherit_graph_938.png | Bin 1693 -> 1988 bytes inherit_graph_939.map | 2 +- inherit_graph_939.md5 | 2 +- inherit_graph_939.png | Bin 2596 -> 1370 bytes inherit_graph_94.map | 357 +- inherit_graph_94.md5 | 2 +- inherit_graph_94.png | Bin 2291122 -> 2278375 bytes inherit_graph_940.map | 2 +- inherit_graph_940.md5 | 2 +- inherit_graph_940.png | Bin 1493 -> 1938 bytes inherit_graph_941.map | 2 +- inherit_graph_941.md5 | 2 +- inherit_graph_941.png | Bin 1988 -> 1263 bytes inherit_graph_942.map | 2 +- inherit_graph_942.md5 | 2 +- inherit_graph_942.png | Bin 1370 -> 2018 bytes inherit_graph_943.map | 2 +- inherit_graph_943.md5 | 2 +- inherit_graph_943.png | Bin 1938 -> 1903 bytes inherit_graph_944.map | 2 +- inherit_graph_944.md5 | 2 +- inherit_graph_944.png | Bin 1263 -> 2751 bytes inherit_graph_945.map | 2 +- inherit_graph_945.md5 | 2 +- inherit_graph_945.png | Bin 2018 -> 1844 bytes inherit_graph_946.map | 2 +- inherit_graph_946.md5 | 2 +- inherit_graph_946.png | Bin 1903 -> 1834 bytes inherit_graph_947.map | 2 +- inherit_graph_947.md5 | 2 +- inherit_graph_947.png | Bin 2751 -> 2272 bytes inherit_graph_948.map | 2 +- inherit_graph_948.md5 | 2 +- inherit_graph_948.png | Bin 1844 -> 1668 bytes inherit_graph_949.map | 2 +- inherit_graph_949.md5 | 2 +- inherit_graph_949.png | Bin 1834 -> 1877 bytes inherit_graph_950.map | 2 +- inherit_graph_950.md5 | 2 +- inherit_graph_950.png | Bin 2272 -> 1986 bytes inherit_graph_951.map | 2 +- inherit_graph_951.md5 | 2 +- inherit_graph_951.png | Bin 1668 -> 1463 bytes inherit_graph_952.map | 3 +- inherit_graph_952.md5 | 2 +- inherit_graph_952.png | Bin 1877 -> 4824 bytes inherit_graph_953.map | 2 +- inherit_graph_953.md5 | 2 +- inherit_graph_953.png | Bin 1986 -> 1978 bytes inherit_graph_954.map | 2 +- inherit_graph_954.md5 | 2 +- inherit_graph_954.png | Bin 1463 -> 2648 bytes inherit_graph_955.map | 3 +- inherit_graph_955.md5 | 2 +- inherit_graph_955.png | Bin 4824 -> 1783 bytes inherit_graph_956.map | 2 +- inherit_graph_956.md5 | 2 +- inherit_graph_956.png | Bin 1978 -> 1604 bytes inherit_graph_957.map | 2 +- inherit_graph_957.md5 | 2 +- inherit_graph_957.png | Bin 2648 -> 2036 bytes inherit_graph_958.map | 2 +- inherit_graph_958.md5 | 2 +- inherit_graph_958.png | Bin 1783 -> 2647 bytes inherit_graph_959.map | 2 +- inherit_graph_959.md5 | 2 +- inherit_graph_959.png | Bin 1604 -> 3359 bytes inherit_graph_960.map | 2 +- inherit_graph_960.md5 | 2 +- inherit_graph_960.png | Bin 2036 -> 3178 bytes inherit_graph_961.map | 2 +- inherit_graph_961.md5 | 2 +- inherit_graph_961.png | Bin 2647 -> 3240 bytes inherit_graph_962.map | 2 +- inherit_graph_962.md5 | 2 +- inherit_graph_962.png | Bin 3359 -> 1979 bytes inherit_graph_963.map | 2 +- inherit_graph_963.md5 | 2 +- inherit_graph_963.png | Bin 3178 -> 2045 bytes inherit_graph_964.map | 2 +- inherit_graph_964.md5 | 2 +- inherit_graph_964.png | Bin 3240 -> 2332 bytes inherit_graph_965.map | 2 +- inherit_graph_965.md5 | 2 +- inherit_graph_965.png | Bin 1979 -> 1760 bytes inherit_graph_966.map | 2 +- inherit_graph_966.md5 | 2 +- inherit_graph_966.png | Bin 2045 -> 2869 bytes inherit_graph_967.map | 2 +- inherit_graph_967.md5 | 2 +- inherit_graph_967.png | Bin 2332 -> 2289 bytes inherit_graph_968.map | 2 +- inherit_graph_968.md5 | 2 +- inherit_graph_968.png | Bin 1760 -> 2831 bytes inherit_graph_969.map | 2 +- inherit_graph_969.md5 | 2 +- inherit_graph_969.png | Bin 2869 -> 2526 bytes inherit_graph_970.map | 2 +- inherit_graph_970.md5 | 2 +- inherit_graph_970.png | Bin 2289 -> 1818 bytes inherit_graph_971.map | 2 +- inherit_graph_971.md5 | 2 +- inherit_graph_971.png | Bin 2831 -> 2014 bytes inherit_graph_972.map | 2 +- inherit_graph_972.md5 | 2 +- inherit_graph_972.png | Bin 2526 -> 2528 bytes inherit_graph_973.map | 2 +- inherit_graph_973.md5 | 2 +- inherit_graph_973.png | Bin 1818 -> 2402 bytes inherit_graph_974.map | 2 +- inherit_graph_974.md5 | 2 +- inherit_graph_974.png | Bin 2014 -> 1844 bytes inherit_graph_975.map | 2 +- inherit_graph_975.md5 | 2 +- inherit_graph_975.png | Bin 2528 -> 2009 bytes inherit_graph_976.map | 2 +- inherit_graph_976.md5 | 2 +- inherit_graph_976.png | Bin 2402 -> 2083 bytes inherit_graph_977.map | 2 +- inherit_graph_977.md5 | 2 +- inherit_graph_977.png | Bin 1844 -> 2575 bytes inherit_graph_978.map | 2 +- inherit_graph_978.md5 | 2 +- inherit_graph_978.png | Bin 2009 -> 2193 bytes inherit_graph_979.map | 2 +- inherit_graph_979.md5 | 2 +- inherit_graph_979.png | Bin 2083 -> 2416 bytes inherit_graph_980.map | 2 +- inherit_graph_980.md5 | 2 +- inherit_graph_980.png | Bin 2575 -> 2465 bytes inherit_graph_981.map | 2 +- inherit_graph_981.md5 | 2 +- inherit_graph_981.png | Bin 2193 -> 3109 bytes inherit_graph_982.map | 2 +- inherit_graph_982.md5 | 2 +- inherit_graph_982.png | Bin 2416 -> 2382 bytes inherit_graph_983.map | 2 +- inherit_graph_983.md5 | 2 +- inherit_graph_983.png | Bin 2465 -> 1543 bytes inherit_graph_984.map | 4 +- inherit_graph_984.md5 | 2 +- inherit_graph_984.png | Bin 3109 -> 6535 bytes inherit_graph_985.map | 2 +- inherit_graph_985.md5 | 2 +- inherit_graph_985.png | Bin 2382 -> 2335 bytes inherit_graph_986.map | 3 +- inherit_graph_986.md5 | 2 +- inherit_graph_986.png | Bin 1543 -> 2157 bytes inherit_graph_987.map | 5 +- inherit_graph_987.md5 | 2 +- inherit_graph_987.png | Bin 6535 -> 4529 bytes inherit_graph_988.map | 2 +- inherit_graph_988.md5 | 2 +- inherit_graph_988.png | Bin 2335 -> 3142 bytes inherit_graph_989.map | 4 +- inherit_graph_989.md5 | 2 +- inherit_graph_989.png | Bin 2157 -> 5351 bytes inherit_graph_990.map | 4 +- inherit_graph_990.md5 | 2 +- inherit_graph_990.png | Bin 4529 -> 4492 bytes inherit_graph_991.map | 2 +- inherit_graph_991.md5 | 2 +- inherit_graph_991.png | Bin 3142 -> 2254 bytes inherit_graph_992.map | 3 +- inherit_graph_992.md5 | 2 +- inherit_graph_992.png | Bin 5351 -> 3158 bytes inherit_graph_993.map | 3 +- inherit_graph_993.md5 | 2 +- inherit_graph_993.png | Bin 4492 -> 2686 bytes inherit_graph_994.map | 2 +- inherit_graph_994.md5 | 2 +- inherit_graph_994.png | Bin 2254 -> 3316 bytes inherit_graph_995.map | 2 +- inherit_graph_995.md5 | 2 +- inherit_graph_995.png | Bin 3158 -> 2276 bytes inherit_graph_996.map | 2 +- inherit_graph_996.md5 | 2 +- inherit_graph_996.png | Bin 2686 -> 2177 bytes inherit_graph_997.map | 3 +- inherit_graph_997.md5 | 2 +- inherit_graph_997.png | Bin 3316 -> 3774 bytes inherit_graph_998.map | 6 +- inherit_graph_998.md5 | 2 +- inherit_graph_998.png | Bin 2276 -> 23274 bytes inherit_graph_999.map | 3 +- inherit_graph_999.md5 | 2 +- inherit_graph_999.png | Bin 2177 -> 6025 bytes inherits.html | 2030 ++++---- namespacemembers_b.html | 2 +- namespacemembers_c.html | 5 +- namespacemembers_enum.html | 1 - namespacemembers_f.html | 5 +- namespacemembers_func_b.html | 2 +- namespacemembers_func_f.html | 1 - namespacemembers_func_m.html | 3 +- namespacemembers_func_q.html | 2 - namespacemembers_m.html | 2 +- namespacemembers_q.html | 2 - namespacemembers_s.html | 2 +- namespaceripple.html | 332 +- namespaces.html | 1342 +++--- search/all_10.js | 778 +-- search/all_11.js | 1353 +++--- search/all_12.js | 89 +- search/all_13.js | 1007 ++-- search/all_14.js | 2400 +++++----- search/all_15.js | 4187 ++++++++--------- search/all_16.js | 651 ++- search/all_17.js | 525 ++- search/all_18.js | 183 +- search/all_19.js | 72 +- search/all_1a.js | 23 +- search/all_1b.js | 4 +- search/all_1c.js | 591 ++- search/all_2.js | 1420 +++--- search/all_3.js | 818 ++-- search/all_4.js | 1452 +++--- search/all_5.js | 630 +-- search/all_6.js | 515 +- search/all_7.js | 665 ++- search/all_8.js | 1297 +++-- search/all_9.js | 408 +- search/all_a.js | 1711 ++++--- search/all_b.js | 212 +- search/all_d.js | 501 +- search/all_e.js | 979 ++-- search/all_f.js | 288 +- search/classes_1.js | 105 +- search/classes_13.js | 287 +- search/classes_2.js | 31 +- search/classes_5.js | 97 +- search/enums_2.js | 3 +- search/enumvalues_18.js | 3 +- search/enumvalues_19.js | 5 +- search/enumvalues_2.js | 4 +- search/enumvalues_3.js | 4 +- search/enumvalues_9.js | 12 +- search/enumvalues_e.js | 8 +- search/enumvalues_f.js | 4 +- search/functions_1.js | 127 +- search/functions_10.js | 800 ++-- search/functions_11.js | 44 +- search/functions_12.js | 543 ++- search/functions_13.js | 1188 ++--- search/functions_14.js | 2938 ++++++------ search/functions_15.js | 205 +- search/functions_16.js | 60 +- search/functions_17.js | 4 +- search/functions_18.js | 6 +- search/functions_1a.js | 13 +- search/functions_1b.js | 591 ++- search/functions_2.js | 233 +- search/functions_3.js | 1023 ++-- search/functions_4.js | 541 ++- search/functions_5.js | 379 +- search/functions_6.js | 289 +- search/functions_7.js | 1199 +++-- search/functions_8.js | 4 +- search/functions_9.js | 886 ++-- search/functions_a.js | 6 +- search/functions_c.js | 106 +- search/functions_d.js | 59 +- search/functions_e.js | 231 +- search/functions_f.js | 122 +- search/typedefs_1.js | 4 +- search/typedefs_2.js | 53 +- search/typedefs_8.js | 57 +- search/typedefs_c.js | 4 +- search/variables_0.js | 4 +- search/variables_1.js | 54 +- search/variables_10.js | 2 +- search/variables_11.js | 189 +- search/variables_12.js | 449 +- search/variables_13.js | 18 +- search/variables_15.js | 10 +- search/variables_16.js | 6 +- search/variables_17.js | 13 +- search/variables_2.js | 46 +- search/variables_3.js | 101 +- search/variables_5.js | 11 +- search/variables_8.js | 97 +- search/variables_9.js | 6 +- search/variables_c.js | 954 ++-- search/variables_d.js | 8 +- search/variables_e.js | 50 +- ...tripple_1_1BasicTaker_1_1Flow-members.html | 92 - structripple_1_1BasicTaker_1_1Flow.html | 188 - ...test_1_1cross__attempt__offer-members.html | 91 - ...1Taker__test_1_1cross__attempt__offer.html | 179 - ..._1_1cross__attempt__offer__coll__graph.map | 5 - ..._1_1cross__attempt__offer__coll__graph.md5 | 1 - ..._1_1cross__attempt__offer__coll__graph.png | Bin 7158 -> 0 bytes 2840 files changed, 26205 insertions(+), 38261 deletions(-) delete mode 100644 Taker_8cpp_source.html delete mode 100644 Taker_8h_source.html delete mode 100644 Taker__test_8cpp_source.html delete mode 100644 classripple_1_1BasicTaker-members.html delete mode 100644 classripple_1_1BasicTaker.html delete mode 100644 classripple_1_1BasicTaker__coll__graph.map delete mode 100644 classripple_1_1BasicTaker__coll__graph.md5 delete mode 100644 classripple_1_1BasicTaker__coll__graph.png delete mode 100644 classripple_1_1BasicTaker__inherit__graph.map delete mode 100644 classripple_1_1BasicTaker__inherit__graph.md5 delete mode 100644 classripple_1_1BasicTaker__inherit__graph.png delete mode 100644 classripple_1_1Taker-members.html delete mode 100644 classripple_1_1Taker.html delete mode 100644 classripple_1_1Taker__coll__graph.map delete mode 100644 classripple_1_1Taker__coll__graph.md5 delete mode 100644 classripple_1_1Taker__coll__graph.png delete mode 100644 classripple_1_1Taker__inherit__graph.map delete mode 100644 classripple_1_1Taker__inherit__graph.md5 delete mode 100644 classripple_1_1Taker__inherit__graph.png delete mode 100644 classripple_1_1Taker__test-members.html delete mode 100644 classripple_1_1Taker__test.html delete mode 100644 classripple_1_1Taker__test_1_1TestTaker-members.html delete mode 100644 classripple_1_1Taker__test_1_1TestTaker.html delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__coll__graph.map delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__coll__graph.md5 delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__coll__graph.png delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__inherit__graph.map delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__inherit__graph.md5 delete mode 100644 classripple_1_1Taker__test_1_1TestTaker__inherit__graph.png delete mode 100644 classripple_1_1Taker__test__coll__graph.map delete mode 100644 classripple_1_1Taker__test__coll__graph.md5 delete mode 100644 classripple_1_1Taker__test__coll__graph.png delete mode 100644 classripple_1_1Taker__test__inherit__graph.map delete mode 100644 classripple_1_1Taker__test__inherit__graph.md5 delete mode 100644 classripple_1_1Taker__test__inherit__graph.png delete mode 100644 inherit_graph_1035.map delete mode 100644 inherit_graph_1035.md5 delete mode 100644 inherit_graph_1035.png delete mode 100644 inherit_graph_1036.map delete mode 100644 inherit_graph_1036.md5 delete mode 100644 inherit_graph_1036.png delete mode 100644 inherit_graph_1037.map delete mode 100644 inherit_graph_1037.md5 delete mode 100644 inherit_graph_1037.png delete mode 100644 structripple_1_1BasicTaker_1_1Flow-members.html delete mode 100644 structripple_1_1BasicTaker_1_1Flow.html delete mode 100644 structripple_1_1Taker__test_1_1cross__attempt__offer-members.html delete mode 100644 structripple_1_1Taker__test_1_1cross__attempt__offer.html delete mode 100644 structripple_1_1Taker__test_1_1cross__attempt__offer__coll__graph.map delete mode 100644 structripple_1_1Taker__test_1_1cross__attempt__offer__coll__graph.md5 delete mode 100644 structripple_1_1Taker__test_1_1cross__attempt__offer__coll__graph.png diff --git a/CreateOffer_8cpp_source.html b/CreateOffer_8cpp_source.html index 1cb1ce030d..ab27beaff0 100644 --- a/CreateOffer_8cpp_source.html +++ b/CreateOffer_8cpp_source.html @@ -104,9 +104,9 @@ $(function() {
26#include <xrpl/basics/base_uint.h>
27#include <xrpl/beast/utility/WrappedSink.h>
28#include <xrpl/protocol/Feature.h>
-
29#include <xrpl/protocol/Quality.h>
-
30#include <xrpl/protocol/STAmount.h>
-
31#include <xrpl/protocol/TER.h>
+
29#include <xrpl/protocol/STAmount.h>
+
30#include <xrpl/protocol/TER.h>
+
31#include <xrpl/protocol/TxFlags.h>
32#include <xrpl/protocol/st.h>
33
34namespace ripple {
@@ -389,1037 +389,644 @@ $(function() {
311 return tesSUCCESS;
312}
313
-
314bool
-
315CreateOffer::dry_offer(ApplyView& view, Offer const& offer)
-
316{
-
317 if (offer.fully_consumed())
-
318 return true;
-
319 auto const amount = accountFunds(
-
320 view,
-
321 offer.owner(),
-
322 offer.amount().out,
-
323 fhZERO_IF_FROZEN,
-
324 ctx_.app.journal("View"));
-
325 return (amount <= beast::zero);
-
326}
-
327
-
328std::pair<bool, Quality>
-
329CreateOffer::select_path(
-
330 bool have_direct,
-
331 OfferStream const& direct,
-
332 bool have_bridge,
-
333 OfferStream const& leg1,
-
334 OfferStream const& leg2)
-
335{
-
336 // If we don't have any viable path, why are we here?!
-
337 XRPL_ASSERT(
-
338 have_direct || have_bridge,
-
339 "ripple::CreateOffer::select_path : valid inputs");
-
340
-
341 // If there's no bridged path, the direct is the best by default.
-
342 if (!have_bridge)
-
343 return std::make_pair(true, direct.tip().quality());
-
344
-
345 Quality const bridged_quality(
-
346 composed_quality(leg1.tip().quality(), leg2.tip().quality()));
-
347
-
348 if (have_direct)
-
349 {
-
350 // We compare the quality of the composed quality of the bridged
-
351 // offers and compare it against the direct offer to pick the best.
-
352 Quality const direct_quality(direct.tip().quality());
-
353
-
354 if (bridged_quality < direct_quality)
-
355 return std::make_pair(true, direct_quality);
-
356 }
-
357
-
358 // Either there was no direct offer, or it didn't have a better quality
-
359 // than the bridge.
-
360 return std::make_pair(false, bridged_quality);
-
361}
-
362
-
363bool
-
364CreateOffer::reachedOfferCrossingLimit(Taker const& taker) const
-
365{
-
366 auto const crossings =
-
367 taker.get_direct_crossings() + (2 * taker.get_bridge_crossings());
-
368
-
369 // The crossing limit is part of the Ripple protocol and
-
370 // changing it is a transaction-processing change.
-
371 return crossings >= 850;
-
372}
-
373
-
374std::pair<TER, Amounts>
-
375CreateOffer::bridged_cross(
-
376 Taker& taker,
-
377 ApplyView& view,
-
378 ApplyView& view_cancel,
-
379 NetClock::time_point const when)
-
380{
-
381 auto const& takerAmount = taker.original_offer();
-
382
-
383 XRPL_ASSERT(
-
384 !isXRP(takerAmount.in) && !isXRP(takerAmount.out),
-
385 "ripple::CreateOffer::bridged_cross : neither is XRP");
-
386
-
387 if (isXRP(takerAmount.in) || isXRP(takerAmount.out))
-
388 Throw<std::logic_error>("Bridging with XRP and an endpoint.");
-
389
-
390 OfferStream offers_direct(
-
391 view,
-
392 view_cancel,
-
393 Book(taker.issue_in(), taker.issue_out(), std::nullopt),
-
394 when,
-
395 stepCounter_,
-
396 j_);
-
397
-
398 OfferStream offers_leg1(
-
399 view,
-
400 view_cancel,
-
401 Book(taker.issue_in(), xrpIssue(), std::nullopt),
-
402 when,
-
403 stepCounter_,
-
404 j_);
-
405
-
406 OfferStream offers_leg2(
-
407 view,
-
408 view_cancel,
-
409 Book(xrpIssue(), taker.issue_out(), std::nullopt),
-
410 when,
-
411 stepCounter_,
-
412 j_);
-
413
-
414 TER cross_result = tesSUCCESS;
-
415
-
416 // Note the subtle distinction here: self-offers encountered in the
-
417 // bridge are taken, but self-offers encountered in the direct book
-
418 // are not.
-
419 bool have_bridge = offers_leg1.step() && offers_leg2.step();
-
420 bool have_direct = step_account(offers_direct, taker);
-
421 int count = 0;
-
422
-
423 auto viewJ = ctx_.app.journal("View");
-
424
-
425 // Modifying the order or logic of the operations in the loop will cause
-
426 // a protocol breaking change.
-
427 while (have_direct || have_bridge)
-
428 {
-
429 bool leg1_consumed = false;
-
430 bool leg2_consumed = false;
-
431 bool direct_consumed = false;
-
432
-
433 auto const [use_direct, quality] = select_path(
-
434 have_direct, offers_direct, have_bridge, offers_leg1, offers_leg2);
-
435
-
436 // We are always looking at the best quality; we are done with
-
437 // crossing as soon as we cross the quality boundary.
-
438 if (taker.reject(quality))
-
439 break;
-
440
-
441 count++;
-
442
-
443 if (use_direct)
-
444 {
-
445 if (auto stream = j_.debug())
-
446 {
-
447 stream << count << " Direct:";
-
448 stream << " offer: " << offers_direct.tip();
-
449 stream << " in: " << offers_direct.tip().amount().in;
-
450 stream << " out: " << offers_direct.tip().amount().out;
-
451 stream << " owner: " << offers_direct.tip().owner();
-
452 stream << " funds: "
-
453 << accountFunds(
-
454 view,
-
455 offers_direct.tip().owner(),
-
456 offers_direct.tip().amount().out,
-
457 fhIGNORE_FREEZE,
-
458 viewJ);
-
459 }
-
460
-
461 cross_result = taker.cross(offers_direct.tip());
-
462
-
463 JLOG(j_.debug()) << "Direct Result: " << transToken(cross_result);
+
314std::pair<TER, Amounts>
+
315CreateOffer::flowCross(
+
316 PaymentSandbox& psb,
+
317 PaymentSandbox& psbCancel,
+
318 Amounts const& takerAmount,
+
319 std::optional<uint256> const& domainID)
+
320{
+
321 try
+
322 {
+
323 // If the taker is unfunded before we begin crossing there's nothing
+
324 // to do - just return an error.
+
325 //
+
326 // We check this in preclaim, but when selling XRP charged fees can
+
327 // cause a user's available balance to go to 0 (by causing it to dip
+
328 // below the reserve) so we check this case again.
+
329 STAmount const inStartBalance =
+
330 accountFunds(psb, account_, takerAmount.in, fhZERO_IF_FROZEN, j_);
+
331 if (inStartBalance <= beast::zero)
+
332 {
+
333 // The account balance can't cover even part of the offer.
+
334 JLOG(j_.debug()) << "Not crossing: taker is unfunded.";
+
335 return {tecUNFUNDED_OFFER, takerAmount};
+
336 }
+
337
+
338 // If the gateway has a transfer rate, accommodate that. The
+
339 // gateway takes its cut without any special consent from the
+
340 // offer taker. Set sendMax to allow for the gateway's cut.
+
341 Rate gatewayXferRate{QUALITY_ONE};
+
342 STAmount sendMax = takerAmount.in;
+
343 if (!sendMax.native() && (account_ != sendMax.getIssuer()))
+
344 {
+
345 gatewayXferRate = transferRate(psb, sendMax.getIssuer());
+
346 if (gatewayXferRate.value != QUALITY_ONE)
+
347 {
+
348 sendMax = multiplyRound(
+
349 takerAmount.in,
+
350 gatewayXferRate,
+
351 takerAmount.in.issue(),
+
352 true);
+
353 }
+
354 }
+
355
+
356 // Payment flow code compares quality after the transfer rate is
+
357 // included. Since transfer rate is incorporated compute threshold.
+
358 Quality threshold{takerAmount.out, sendMax};
+
359
+
360 // If we're creating a passive offer adjust the threshold so we only
+
361 // cross offers that have a better quality than this one.
+
362 std::uint32_t const txFlags = ctx_.tx.getFlags();
+
363 if (txFlags & tfPassive)
+
364 ++threshold;
+
365
+
366 // Don't send more than our balance.
+
367 if (sendMax > inStartBalance)
+
368 sendMax = inStartBalance;
+
369
+
370 // Always invoke flow() with the default path. However if neither
+
371 // of the takerAmount currencies are XRP then we cross through an
+
372 // additional path with XRP as the intermediate between two books.
+
373 // This second path we have to build ourselves.
+
374 STPathSet paths;
+
375 if (!takerAmount.in.native() && !takerAmount.out.native())
+
376 {
+
377 STPath path;
+
378 path.emplace_back(std::nullopt, xrpCurrency(), std::nullopt);
+
379 paths.emplace_back(std::move(path));
+
380 }
+
381 // Special handling for the tfSell flag.
+
382 STAmount deliver = takerAmount.out;
+
383 OfferCrossing offerCrossing = OfferCrossing::yes;
+
384 if (txFlags & tfSell)
+
385 {
+
386 offerCrossing = OfferCrossing::sell;
+
387 // We are selling, so we will accept *more* than the offer
+
388 // specified. Since we don't know how much they might offer,
+
389 // we allow delivery of the largest possible amount.
+
390 if (deliver.native())
+
391 deliver = STAmount{STAmount::cMaxNative};
+
392 else
+
393 // We can't use the maximum possible currency here because
+
394 // there might be a gateway transfer rate to account for.
+
395 // Since the transfer rate cannot exceed 200%, we use 1/2
+
396 // maxValue for our limit.
+
397 deliver = STAmount{
+
398 takerAmount.out.issue(),
+
399 STAmount::cMaxValue / 2,
+
400 STAmount::cMaxOffset};
+
401 }
+
402
+
403 // Call the payment engine's flow() to do the actual work.
+
404 auto const result = flow(
+
405 psb,
+
406 deliver,
+
407 account_,
+
408 account_,
+
409 paths,
+
410 true, // default path
+
411 !(txFlags & tfFillOrKill), // partial payment
+
412 true, // owner pays transfer fee
+
413 offerCrossing,
+
414 threshold,
+
415 sendMax,
+
416 domainID,
+
417 j_);
+
418
+
419 // If stale offers were found remove them.
+
420 for (auto const& toRemove : result.removableOffers)
+
421 {
+
422 if (auto otr = psb.peek(keylet::offer(toRemove)))
+
423 offerDelete(psb, otr, j_);
+
424 if (auto otr = psbCancel.peek(keylet::offer(toRemove)))
+
425 offerDelete(psbCancel, otr, j_);
+
426 }
+
427
+
428 // Determine the size of the final offer after crossing.
+
429 auto afterCross = takerAmount; // If !tesSUCCESS offer unchanged
+
430 if (isTesSuccess(result.result()))
+
431 {
+
432 STAmount const takerInBalance = accountFunds(
+
433 psb, account_, takerAmount.in, fhZERO_IF_FROZEN, j_);
+
434
+
435 if (takerInBalance <= beast::zero)
+
436 {
+
437 // If offer crossing exhausted the account's funds don't
+
438 // create the offer.
+
439 afterCross.in.clear();
+
440 afterCross.out.clear();
+
441 }
+
442 else
+
443 {
+
444 STAmount const rate{
+
445 Quality{takerAmount.out, takerAmount.in}.rate()};
+
446
+
447 if (txFlags & tfSell)
+
448 {
+
449 // If selling then scale the new out amount based on how
+
450 // much we sold during crossing. This preserves the offer
+
451 // Quality,
+
452
+
453 // Reduce the offer that is placed by the crossed amount.
+
454 // Note that we must ignore the portion of the
+
455 // actualAmountIn that may have been consumed by a
+
456 // gateway's transfer rate.
+
457 STAmount nonGatewayAmountIn = result.actualAmountIn;
+
458 if (gatewayXferRate.value != QUALITY_ONE)
+
459 nonGatewayAmountIn = divideRound(
+
460 result.actualAmountIn,
+
461 gatewayXferRate,
+
462 takerAmount.in.issue(),
+
463 true);
464
-
465 if (dry_offer(view, offers_direct.tip()))
-
466 {
-
467 direct_consumed = true;
-
468 have_direct = step_account(offers_direct, taker);
-
469 }
-
470 }
-
471 else
-
472 {
-
473 if (auto stream = j_.debug())
-
474 {
-
475 auto const owner1_funds_before = accountFunds(
-
476 view,
-
477 offers_leg1.tip().owner(),
-
478 offers_leg1.tip().amount().out,
-
479 fhIGNORE_FREEZE,
-
480 viewJ);
-
481
-
482 auto const owner2_funds_before = accountFunds(
-
483 view,
-
484 offers_leg2.tip().owner(),
-
485 offers_leg2.tip().amount().out,
-
486 fhIGNORE_FREEZE,
-
487 viewJ);
-
488
-
489 stream << count << " Bridge:";
-
490 stream << " offer1: " << offers_leg1.tip();
-
491 stream << " in: " << offers_leg1.tip().amount().in;
-
492 stream << " out: " << offers_leg1.tip().amount().out;
-
493 stream << " owner: " << offers_leg1.tip().owner();
-
494 stream << " funds: " << owner1_funds_before;
-
495 stream << " offer2: " << offers_leg2.tip();
-
496 stream << " in: " << offers_leg2.tip().amount().in;
-
497 stream << " out: " << offers_leg2.tip().amount().out;
-
498 stream << " owner: " << offers_leg2.tip().owner();
-
499 stream << " funds: " << owner2_funds_before;
-
500 }
-
501
-
502 cross_result = taker.cross(offers_leg1.tip(), offers_leg2.tip());
-
503
-
504 JLOG(j_.debug()) << "Bridge Result: " << transToken(cross_result);
-
505
-
506 if (view.rules().enabled(fixTakerDryOfferRemoval))
-
507 {
-
508 // have_bridge can be true the next time 'round only if
-
509 // neither of the OfferStreams are dry.
-
510 leg1_consumed = dry_offer(view, offers_leg1.tip());
-
511 if (leg1_consumed)
-
512 have_bridge &= offers_leg1.step();
-
513
-
514 leg2_consumed = dry_offer(view, offers_leg2.tip());
-
515 if (leg2_consumed)
-
516 have_bridge &= offers_leg2.step();
-
517 }
-
518 else
-
519 {
-
520 // This old behavior may leave an empty offer in the book for
-
521 // the second leg.
-
522 if (dry_offer(view, offers_leg1.tip()))
-
523 {
-
524 leg1_consumed = true;
-
525 have_bridge = (have_bridge && offers_leg1.step());
-
526 }
-
527 if (dry_offer(view, offers_leg2.tip()))
-
528 {
-
529 leg2_consumed = true;
-
530 have_bridge = (have_bridge && offers_leg2.step());
-
531 }
-
532 }
-
533 }
-
534
-
535 if (cross_result != tesSUCCESS)
-
536 {
-
537 cross_result = tecFAILED_PROCESSING;
-
538 break;
-
539 }
-
540
-
541 if (taker.done())
-
542 {
-
543 JLOG(j_.debug()) << "The taker reports he's done during crossing!";
-
544 break;
-
545 }
-
546
-
547 if (reachedOfferCrossingLimit(taker))
-
548 {
-
549 JLOG(j_.debug()) << "The offer crossing limit has been exceeded!";
-
550 break;
-
551 }
-
552
-
553 // Postcondition: If we aren't done, then we *must* have consumed at
-
554 // least one offer fully.
-
555 XRPL_ASSERT(
-
556 direct_consumed || leg1_consumed || leg2_consumed,
-
557 "ripple::CreateOffer::bridged_cross : consumed an offer");
-
558
-
559 if (!direct_consumed && !leg1_consumed && !leg2_consumed)
-
560 Throw<std::logic_error>(
-
561 "bridged crossing: nothing was fully consumed.");
-
562 }
-
563
-
564 return std::make_pair(cross_result, taker.remaining_offer());
-
565}
-
566
-
567std::pair<TER, Amounts>
-
568CreateOffer::direct_cross(
-
569 Taker& taker,
-
570 ApplyView& view,
-
571 ApplyView& view_cancel,
-
572 NetClock::time_point const when)
-
573{
-
574 OfferStream offers(
-
575 view,
-
576 view_cancel,
-
577 Book(taker.issue_in(), taker.issue_out(), std::nullopt),
-
578 when,
-
579 stepCounter_,
-
580 j_);
+
465 afterCross.in -= nonGatewayAmountIn;
+
466
+
467 // It's possible that the divRound will cause our subtract
+
468 // to go slightly negative. So limit afterCross.in to zero.
+
469 if (afterCross.in < beast::zero)
+
470 // We should verify that the difference *is* small, but
+
471 // what is a good threshold to check?
+
472 afterCross.in.clear();
+
473
+
474 afterCross.out = [&]() {
+
475 // Careful analysis showed that rounding up this
+
476 // divRound result could lead to placing a reduced
+
477 // offer in the ledger that blocks order books. So
+
478 // the fixReducedOffersV1 amendment changes the
+
479 // behavior to round down instead.
+
480 if (psb.rules().enabled(fixReducedOffersV1))
+
481 return divRoundStrict(
+
482 afterCross.in,
+
483 rate,
+
484 takerAmount.out.issue(),
+
485 false);
+
486
+
487 return divRound(
+
488 afterCross.in, rate, takerAmount.out.issue(), true);
+
489 }();
+
490 }
+
491 else
+
492 {
+
493 // If not selling, we scale the input based on the
+
494 // remaining output. This too preserves the offer
+
495 // Quality.
+
496 afterCross.out -= result.actualAmountOut;
+
497 XRPL_ASSERT(
+
498 afterCross.out >= beast::zero,
+
499 "ripple::CreateOffer::flowCross : minimum offer");
+
500 if (afterCross.out < beast::zero)
+
501 afterCross.out.clear();
+
502 afterCross.in = mulRound(
+
503 afterCross.out, rate, takerAmount.in.issue(), true);
+
504 }
+
505 }
+
506 }
+
507
+
508 // Return how much of the offer is left.
+
509 return {tesSUCCESS, afterCross};
+
510 }
+
511 catch (std::exception const& e)
+
512 {
+
513 JLOG(j_.error()) << "Exception during offer crossing: " << e.what();
+
514 }
+
515 return {tecINTERNAL, takerAmount};
+
516}
+
517
+
518std::string
+
519CreateOffer::format_amount(STAmount const& amount)
+
520{
+
521 std::string txt = amount.getText();
+
522 txt += "/";
+
523 txt += to_string(amount.issue().currency);
+
524 return txt;
+
525}
+
526
+
527TER
+
528CreateOffer::applyHybrid(
+
529 Sandbox& sb,
+
530 std::shared_ptr<STLedgerEntry> sleOffer,
+
531 Keylet const& offerKey,
+
532 STAmount const& saTakerPays,
+
533 STAmount const& saTakerGets,
+
534 std::function<void(SLE::ref, std::optional<uint256>)> const& setDir)
+
535{
+
536 if (!sleOffer->isFieldPresent(sfDomainID))
+
537 return tecINTERNAL; // LCOV_EXCL_LINE
+
538
+
539 // set hybrid flag
+
540 sleOffer->setFlag(lsfHybrid);
+
541
+
542 // if offer is hybrid, need to also place into open offer dir
+
543 Book const book{saTakerPays.issue(), saTakerGets.issue(), std::nullopt};
+
544
+
545 auto dir =
+
546 keylet::quality(keylet::book(book), getRate(saTakerGets, saTakerPays));
+
547 bool const bookExists = sb.exists(dir);
+
548
+
549 auto const bookNode = sb.dirAppend(dir, offerKey, [&](SLE::ref sle) {
+
550 // don't set domainID on the directory object since this directory is
+
551 // for open book
+
552 setDir(sle, std::nullopt);
+
553 });
+
554
+
555 if (!bookNode)
+
556 {
+
557 JLOG(j_.debug())
+
558 << "final result: failed to add hybrid offer to open book";
+
559 return tecDIR_FULL; // LCOV_EXCL_LINE
+
560 }
+
561
+
562 STArray bookArr(sfAdditionalBooks, 1);
+
563 auto bookInfo = STObject::makeInnerObject(sfBook);
+
564 bookInfo.setFieldH256(sfBookDirectory, dir.key);
+
565 bookInfo.setFieldU64(sfBookNode, *bookNode);
+
566 bookArr.push_back(std::move(bookInfo));
+
567
+
568 if (!bookExists)
+
569 ctx_.app.getOrderBookDB().addOrderBook(book);
+
570
+
571 sleOffer->setFieldArray(sfAdditionalBooks, bookArr);
+
572 return tesSUCCESS;
+
573}
+
574
+
575std::pair<TER, bool>
+
576CreateOffer::applyGuts(Sandbox& sb, Sandbox& sbCancel)
+
577{
+
578 using beast::zero;
+
579
+
580 std::uint32_t const uTxFlags = ctx_.tx.getFlags();
581
-
582 TER cross_result(tesSUCCESS);
-
583 int count = 0;
-
584
-
585 bool have_offer = step_account(offers, taker);
-
586
-
587 // Modifying the order or logic of the operations in the loop will cause
-
588 // a protocol breaking change.
-
589 while (have_offer)
-
590 {
-
591 bool direct_consumed = false;
-
592 auto& offer(offers.tip());
+
582 bool const bPassive(uTxFlags & tfPassive);
+
583 bool const bImmediateOrCancel(uTxFlags & tfImmediateOrCancel);
+
584 bool const bFillOrKill(uTxFlags & tfFillOrKill);
+
585 bool const bSell(uTxFlags & tfSell);
+
586 bool const bHybrid(uTxFlags & tfHybrid);
+
587
+
588 auto saTakerPays = ctx_.tx[sfTakerPays];
+
589 auto saTakerGets = ctx_.tx[sfTakerGets];
+
590 auto const domainID = ctx_.tx[~sfDomainID];
+
591
+
592 auto const cancelSequence = ctx_.tx[~sfOfferSequence];
593
-
594 // We are done with crossing as soon as we cross the quality boundary
-
595 if (taker.reject(offer.quality()))
-
596 break;
+
594 // Note that we we use the value from the sequence or ticket as the
+
595 // offer sequence. For more explanation see comments in SeqProxy.h.
+
596 auto const offerSequence = ctx_.tx.getSeqValue();
597
-
598 count++;
-
599
-
600 if (auto stream = j_.debug())
-
601 {
-
602 stream << count << " Direct:";
-
603 stream << " offer: " << offer;
-
604 stream << " in: " << offer.amount().in;
-
605 stream << " out: " << offer.amount().out;
-
606 stream << "quality: " << offer.quality();
-
607 stream << " owner: " << offer.owner();
-
608 stream << " funds: "
-
609 << accountFunds(
-
610 view,
-
611 offer.owner(),
-
612 offer.amount().out,
-
613 fhIGNORE_FREEZE,
-
614 ctx_.app.journal("View"));
-
615 }
-
616
-
617 cross_result = taker.cross(offer);
-
618
-
619 JLOG(j_.debug()) << "Direct Result: " << transToken(cross_result);
-
620
-
621 if (dry_offer(view, offer))
-
622 {
-
623 direct_consumed = true;
-
624 have_offer = step_account(offers, taker);
-
625 }
-
626
-
627 if (cross_result != tesSUCCESS)
-
628 {
-
629 cross_result = tecFAILED_PROCESSING;
-
630 break;
-
631 }
-
632
-
633 if (taker.done())
-
634 {
-
635 JLOG(j_.debug()) << "The taker reports he's done during crossing!";
-
636 break;
-
637 }
-
638
-
639 if (reachedOfferCrossingLimit(taker))
-
640 {
-
641 JLOG(j_.debug()) << "The offer crossing limit has been exceeded!";
-
642 break;
-
643 }
-
644
-
645 // Postcondition: If we aren't done, then we *must* have consumed the
-
646 // offer on the books fully!
-
647 XRPL_ASSERT(
-
648 direct_consumed,
-
649 "ripple::CreateOffer::direct_cross : consumed an offer");
-
650
-
651 if (!direct_consumed)
-
652 Throw<std::logic_error>(
-
653 "direct crossing: nothing was fully consumed.");
-
654 }
-
655
-
656 return std::make_pair(cross_result, taker.remaining_offer());
-
657}
-
658
-
659// Step through the stream for as long as possible, skipping any offers
-
660// that are from the taker or which cross the taker's threshold.
-
661// Return false if the is no offer in the book, true otherwise.
-
662bool
-
663CreateOffer::step_account(OfferStream& stream, Taker const& taker)
-
664{
-
665 while (stream.step())
-
666 {
-
667 auto const& offer = stream.tip();
-
668
-
669 // This offer at the tip crosses the taker's threshold. We're done.
-
670 if (taker.reject(offer.quality()))
-
671 return true;
-
672
-
673 // This offer at the tip is not from the taker. We're done.
-
674 if (offer.owner() != taker.account())
-
675 return true;
-
676 }
-
677
-
678 // We ran out of offers. Can't advance.
-
679 return false;
-
680}
-
681
-
682std::pair<TER, Amounts>
-
683CreateOffer::flowCross(
-
684 PaymentSandbox& psb,
-
685 PaymentSandbox& psbCancel,
-
686 Amounts const& takerAmount,
-
687 std::optional<uint256> const& domainID)
-
688{
-
689 try
-
690 {
-
691 // If the taker is unfunded before we begin crossing there's nothing
-
692 // to do - just return an error.
-
693 //
-
694 // We check this in preclaim, but when selling XRP charged fees can
-
695 // cause a user's available balance to go to 0 (by causing it to dip
-
696 // below the reserve) so we check this case again.
-
697 STAmount const inStartBalance =
-
698 accountFunds(psb, account_, takerAmount.in, fhZERO_IF_FROZEN, j_);
-
699 if (inStartBalance <= beast::zero)
-
700 {
-
701 // The account balance can't cover even part of the offer.
-
702 JLOG(j_.debug()) << "Not crossing: taker is unfunded.";
-
703 return {tecUNFUNDED_OFFER, takerAmount};
-
704 }
-
705
-
706 // If the gateway has a transfer rate, accommodate that. The
-
707 // gateway takes its cut without any special consent from the
-
708 // offer taker. Set sendMax to allow for the gateway's cut.
-
709 Rate gatewayXferRate{QUALITY_ONE};
-
710 STAmount sendMax = takerAmount.in;
-
711 if (!sendMax.native() && (account_ != sendMax.getIssuer()))
-
712 {
-
713 gatewayXferRate = transferRate(psb, sendMax.getIssuer());
-
714 if (gatewayXferRate.value != QUALITY_ONE)
-
715 {
-
716 sendMax = multiplyRound(
-
717 takerAmount.in,
-
718 gatewayXferRate,
-
719 takerAmount.in.issue(),
-
720 true);
-
721 }
-
722 }
-
723
-
724 // Payment flow code compares quality after the transfer rate is
-
725 // included. Since transfer rate is incorporated compute threshold.
-
726 Quality threshold{takerAmount.out, sendMax};
+
598 // This is the original rate of the offer, and is the rate at which
+
599 // it will be placed, even if crossing offers change the amounts that
+
600 // end up on the books.
+
601 auto uRate = getRate(saTakerGets, saTakerPays);
+
602
+
603 auto viewJ = ctx_.app.journal("View");
+
604
+
605 TER result = tesSUCCESS;
+
606
+
607 // Process a cancellation request that's passed along with an offer.
+
608 if (cancelSequence)
+
609 {
+
610 auto const sleCancel =
+
611 sb.peek(keylet::offer(account_, *cancelSequence));
+
612
+
613 // It's not an error to not find the offer to cancel: it might have
+
614 // been consumed or removed. If it is found, however, it's an error
+
615 // to fail to delete it.
+
616 if (sleCancel)
+
617 {
+
618 JLOG(j_.debug()) << "Create cancels order " << *cancelSequence;
+
619 result = offerDelete(sb, sleCancel, viewJ);
+
620 }
+
621 }
+
622
+
623 auto const expiration = ctx_.tx[~sfExpiration];
+
624
+
625 if (hasExpired(sb, expiration))
+
626 {
+
627 // If the offer has expired, the transaction has successfully
+
628 // done nothing, so short circuit from here.
+
629 //
+
630 // The return code change is attached to featureDepositPreauth as a
+
631 // convenience. The change is not big enough to deserve a fix code.
+
632 TER const ter{
+
633 sb.rules().enabled(featureDepositPreauth) ? TER{tecEXPIRED}
+
634 : TER{tesSUCCESS}};
+
635 return {ter, true};
+
636 }
+
637
+
638 bool const bOpenLedger = sb.open();
+
639 bool crossed = false;
+
640
+
641 if (result == tesSUCCESS)
+
642 {
+
643 // If a tick size applies, round the offer to the tick size
+
644 auto const& uPaysIssuerID = saTakerPays.getIssuer();
+
645 auto const& uGetsIssuerID = saTakerGets.getIssuer();
+
646
+
647 std::uint8_t uTickSize = Quality::maxTickSize;
+
648 if (!isXRP(uPaysIssuerID))
+
649 {
+
650 auto const sle = sb.read(keylet::account(uPaysIssuerID));
+
651 if (sle && sle->isFieldPresent(sfTickSize))
+
652 uTickSize = std::min(uTickSize, (*sle)[sfTickSize]);
+
653 }
+
654 if (!isXRP(uGetsIssuerID))
+
655 {
+
656 auto const sle = sb.read(keylet::account(uGetsIssuerID));
+
657 if (sle && sle->isFieldPresent(sfTickSize))
+
658 uTickSize = std::min(uTickSize, (*sle)[sfTickSize]);
+
659 }
+
660 if (uTickSize < Quality::maxTickSize)
+
661 {
+
662 auto const rate =
+
663 Quality{saTakerGets, saTakerPays}.round(uTickSize).rate();
+
664
+
665 // We round the side that's not exact,
+
666 // just as if the offer happened to execute
+
667 // at a slightly better (for the placer) rate
+
668 if (bSell)
+
669 {
+
670 // this is a sell, round taker pays
+
671 saTakerPays = multiply(saTakerGets, rate, saTakerPays.issue());
+
672 }
+
673 else
+
674 {
+
675 // this is a buy, round taker gets
+
676 saTakerGets = divide(saTakerPays, rate, saTakerGets.issue());
+
677 }
+
678 if (!saTakerGets || !saTakerPays)
+
679 {
+
680 JLOG(j_.debug()) << "Offer rounded to zero";
+
681 return {result, true};
+
682 }
+
683
+
684 uRate = getRate(saTakerGets, saTakerPays);
+
685 }
+
686
+
687 // We reverse pays and gets because during crossing we are taking.
+
688 Amounts const takerAmount(saTakerGets, saTakerPays);
+
689
+
690 JLOG(j_.debug()) << "Attempting cross: "
+
691 << to_string(takerAmount.in.issue()) << " -> "
+
692 << to_string(takerAmount.out.issue());
+
693
+
694 if (auto stream = j_.trace())
+
695 {
+
696 stream << " mode: " << (bPassive ? "passive " : "")
+
697 << (bSell ? "sell" : "buy");
+
698 stream << " in: " << format_amount(takerAmount.in);
+
699 stream << " out: " << format_amount(takerAmount.out);
+
700 }
+
701
+
702 // The amount of the offer that is unfilled after crossing has been
+
703 // performed. It may be equal to the original amount (didn't cross),
+
704 // empty (fully crossed), or something in-between.
+
705 Amounts place_offer;
+
706 PaymentSandbox psbFlow{&sb};
+
707 PaymentSandbox psbCancelFlow{&sbCancel};
+
708
+
709 std::tie(result, place_offer) =
+
710 flowCross(psbFlow, psbCancelFlow, takerAmount, domainID);
+
711 psbFlow.apply(sb);
+
712 psbCancelFlow.apply(sbCancel);
+
713
+
714 // We expect the implementation of cross to succeed
+
715 // or give a tec.
+
716 XRPL_ASSERT(
+
717 result == tesSUCCESS || isTecClaim(result),
+
718 "ripple::CreateOffer::applyGuts : result is tesSUCCESS or "
+
719 "tecCLAIM");
+
720
+
721 if (auto stream = j_.trace())
+
722 {
+
723 stream << "Cross result: " << transToken(result);
+
724 stream << " in: " << format_amount(place_offer.in);
+
725 stream << " out: " << format_amount(place_offer.out);
+
726 }
727
-
728 // If we're creating a passive offer adjust the threshold so we only
-
729 // cross offers that have a better quality than this one.
-
730 std::uint32_t const txFlags = ctx_.tx.getFlags();
-
731 if (txFlags & tfPassive)
-
732 ++threshold;
-
733
-
734 // Don't send more than our balance.
-
735 if (sendMax > inStartBalance)
-
736 sendMax = inStartBalance;
-
737
-
738 // Always invoke flow() with the default path. However if neither
-
739 // of the takerAmount currencies are XRP then we cross through an
-
740 // additional path with XRP as the intermediate between two books.
-
741 // This second path we have to build ourselves.
-
742 STPathSet paths;
-
743 if (!takerAmount.in.native() && !takerAmount.out.native())
-
744 {
-
745 STPath path;
-
746 path.emplace_back(std::nullopt, xrpCurrency(), std::nullopt);
-
747 paths.emplace_back(std::move(path));
-
748 }
-
749 // Special handling for the tfSell flag.
-
750 STAmount deliver = takerAmount.out;
-
751 OfferCrossing offerCrossing = OfferCrossing::yes;
-
752 if (txFlags & tfSell)
-
753 {
-
754 offerCrossing = OfferCrossing::sell;
-
755 // We are selling, so we will accept *more* than the offer
-
756 // specified. Since we don't know how much they might offer,
-
757 // we allow delivery of the largest possible amount.
-
758 if (deliver.native())
-
759 deliver = STAmount{STAmount::cMaxNative};
-
760 else
-
761 // We can't use the maximum possible currency here because
-
762 // there might be a gateway transfer rate to account for.
-
763 // Since the transfer rate cannot exceed 200%, we use 1/2
-
764 // maxValue for our limit.
-
765 deliver = STAmount{
-
766 takerAmount.out.issue(),
-
767 STAmount::cMaxValue / 2,
-
768 STAmount::cMaxOffset};
-
769 }
-
770
-
771 // Call the payment engine's flow() to do the actual work.
-
772 auto const result = flow(
-
773 psb,
-
774 deliver,
-
775 account_,
-
776 account_,
-
777 paths,
-
778 true, // default path
-
779 !(txFlags & tfFillOrKill), // partial payment
-
780 true, // owner pays transfer fee
-
781 offerCrossing,
-
782 threshold,
-
783 sendMax,
-
784 domainID,
-
785 j_);
+
728 if (result == tecFAILED_PROCESSING && bOpenLedger)
+
729 result = telFAILED_PROCESSING;
+
730
+
731 if (result != tesSUCCESS)
+
732 {
+
733 JLOG(j_.debug()) << "final result: " << transToken(result);
+
734 return {result, true};
+
735 }
+
736
+
737 XRPL_ASSERT(
+
738 saTakerGets.issue() == place_offer.in.issue(),
+
739 "ripple::CreateOffer::applyGuts : taker gets issue match");
+
740 XRPL_ASSERT(
+
741 saTakerPays.issue() == place_offer.out.issue(),
+
742 "ripple::CreateOffer::applyGuts : taker pays issue match");
+
743
+
744 if (takerAmount != place_offer)
+
745 crossed = true;
+
746
+
747 // The offer that we need to place after offer crossing should
+
748 // never be negative. If it is, something went very very wrong.
+
749 if (place_offer.in < zero || place_offer.out < zero)
+
750 {
+
751 JLOG(j_.fatal()) << "Cross left offer negative!"
+
752 << " in: " << format_amount(place_offer.in)
+
753 << " out: " << format_amount(place_offer.out);
+
754 return {tefINTERNAL, true};
+
755 }
+
756
+
757 if (place_offer.in == zero || place_offer.out == zero)
+
758 {
+
759 JLOG(j_.debug()) << "Offer fully crossed!";
+
760 return {result, true};
+
761 }
+
762
+
763 // We now need to adjust the offer to reflect the amount left after
+
764 // crossing. We reverse in and out here, since during crossing we
+
765 // were the taker.
+
766 saTakerPays = place_offer.out;
+
767 saTakerGets = place_offer.in;
+
768 }
+
769
+
770 XRPL_ASSERT(
+
771 saTakerPays > zero && saTakerGets > zero,
+
772 "ripple::CreateOffer::applyGuts : taker pays and gets positive");
+
773
+
774 if (result != tesSUCCESS)
+
775 {
+
776 JLOG(j_.debug()) << "final result: " << transToken(result);
+
777 return {result, true};
+
778 }
+
779
+
780 if (auto stream = j_.trace())
+
781 {
+
782 stream << "Place" << (crossed ? " remaining " : " ") << "offer:";
+
783 stream << " Pays: " << saTakerPays.getFullText();
+
784 stream << " Gets: " << saTakerGets.getFullText();
+
785 }
786
-
787 // If stale offers were found remove them.
-
788 for (auto const& toRemove : result.removableOffers)
-
789 {
-
790 if (auto otr = psb.peek(keylet::offer(toRemove)))
-
791 offerDelete(psb, otr, j_);
-
792 if (auto otr = psbCancel.peek(keylet::offer(toRemove)))
-
793 offerDelete(psbCancel, otr, j_);
-
794 }
-
795
-
796 // Determine the size of the final offer after crossing.
-
797 auto afterCross = takerAmount; // If !tesSUCCESS offer unchanged
-
798 if (isTesSuccess(result.result()))
-
799 {
-
800 STAmount const takerInBalance = accountFunds(
-
801 psb, account_, takerAmount.in, fhZERO_IF_FROZEN, j_);
-
802
-
803 if (takerInBalance <= beast::zero)
-
804 {
-
805 // If offer crossing exhausted the account's funds don't
-
806 // create the offer.
-
807 afterCross.in.clear();
-
808 afterCross.out.clear();
-
809 }
-
810 else
-
811 {
-
812 STAmount const rate{
-
813 Quality{takerAmount.out, takerAmount.in}.rate()};
+
787 // For 'fill or kill' offers, failure to fully cross means that the
+
788 // entire operation should be aborted, with only fees paid.
+
789 if (bFillOrKill)
+
790 {
+
791 JLOG(j_.trace()) << "Fill or Kill: offer killed";
+
792 if (sb.rules().enabled(fix1578))
+
793 return {tecKILLED, false};
+
794 return {tesSUCCESS, false};
+
795 }
+
796
+
797 // For 'immediate or cancel' offers, the amount remaining doesn't get
+
798 // placed - it gets canceled and the operation succeeds.
+
799 if (bImmediateOrCancel)
+
800 {
+
801 JLOG(j_.trace()) << "Immediate or cancel: offer canceled";
+
802 if (!crossed && sb.rules().enabled(featureImmediateOfferKilled))
+
803 // If the ImmediateOfferKilled amendment is enabled, any
+
804 // ImmediateOrCancel offer that transfers absolutely no funds
+
805 // returns tecKILLED rather than tesSUCCESS. Motivation for the
+
806 // change is here: https://github.com/ripple/rippled/issues/4115
+
807 return {tecKILLED, false};
+
808 return {tesSUCCESS, true};
+
809 }
+
810
+
811 auto const sleCreator = sb.peek(keylet::account(account_));
+
812 if (!sleCreator)
+
813 return {tefINTERNAL, false};
814
-
815 if (txFlags & tfSell)
-
816 {
-
817 // If selling then scale the new out amount based on how
-
818 // much we sold during crossing. This preserves the offer
-
819 // Quality,
-
820
-
821 // Reduce the offer that is placed by the crossed amount.
-
822 // Note that we must ignore the portion of the
-
823 // actualAmountIn that may have been consumed by a
-
824 // gateway's transfer rate.
-
825 STAmount nonGatewayAmountIn = result.actualAmountIn;
-
826 if (gatewayXferRate.value != QUALITY_ONE)
-
827 nonGatewayAmountIn = divideRound(
-
828 result.actualAmountIn,
-
829 gatewayXferRate,
-
830 takerAmount.in.issue(),
-
831 true);
-
832
-
833 afterCross.in -= nonGatewayAmountIn;
-
834
-
835 // It's possible that the divRound will cause our subtract
-
836 // to go slightly negative. So limit afterCross.in to zero.
-
837 if (afterCross.in < beast::zero)
-
838 // We should verify that the difference *is* small, but
-
839 // what is a good threshold to check?
-
840 afterCross.in.clear();
-
841
-
842 afterCross.out = [&]() {
-
843 // Careful analysis showed that rounding up this
-
844 // divRound result could lead to placing a reduced
-
845 // offer in the ledger that blocks order books. So
-
846 // the fixReducedOffersV1 amendment changes the
-
847 // behavior to round down instead.
-
848 if (psb.rules().enabled(fixReducedOffersV1))
-
849 return divRoundStrict(
-
850 afterCross.in,
-
851 rate,
-
852 takerAmount.out.issue(),
-
853 false);
-
854
-
855 return divRound(
-
856 afterCross.in, rate, takerAmount.out.issue(), true);
-
857 }();
-
858 }
-
859 else
-
860 {
-
861 // If not selling, we scale the input based on the
-
862 // remaining output. This too preserves the offer
-
863 // Quality.
-
864 afterCross.out -= result.actualAmountOut;
-
865 XRPL_ASSERT(
-
866 afterCross.out >= beast::zero,
-
867 "ripple::CreateOffer::flowCross : minimum offer");
-
868 if (afterCross.out < beast::zero)
-
869 afterCross.out.clear();
-
870 afterCross.in = mulRound(
-
871 afterCross.out, rate, takerAmount.in.issue(), true);
-
872 }
-
873 }
-
874 }
-
875
-
876 // Return how much of the offer is left.
-
877 return {tesSUCCESS, afterCross};
-
878 }
-
879 catch (std::exception const& e)
-
880 {
-
881 JLOG(j_.error()) << "Exception during offer crossing: " << e.what();
-
882 }
-
883 return {tecINTERNAL, takerAmount};
-
884}
-
885
-
886std::pair<TER, Amounts>
-
887CreateOffer::cross(
-
888 Sandbox& sb,
-
889 Sandbox& sbCancel,
-
890 Amounts const& takerAmount,
-
891 std::optional<uint256> const& domainID)
-
892{
-
893 PaymentSandbox psbFlow{&sb};
-
894 PaymentSandbox psbCancelFlow{&sbCancel};
-
895 auto const ret = flowCross(psbFlow, psbCancelFlow, takerAmount, domainID);
-
896 psbFlow.apply(sb);
-
897 psbCancelFlow.apply(sbCancel);
-
898 return ret;
-
899}
-
900
-
901std::string
-
902CreateOffer::format_amount(STAmount const& amount)
-
903{
-
904 std::string txt = amount.getText();
-
905 txt += "/";
-
906 txt += to_string(amount.issue().currency);
-
907 return txt;
-
908}
-
909
-
910void
-
911CreateOffer::preCompute()
-
912{
-
913 cross_type_ = CrossType::IouToIou;
-
914 bool const pays_xrp = ctx_.tx.getFieldAmount(sfTakerPays).native();
-
915 bool const gets_xrp = ctx_.tx.getFieldAmount(sfTakerGets).native();
-
916 if (pays_xrp && !gets_xrp)
-
917 cross_type_ = CrossType::IouToXrp;
-
918 else if (gets_xrp && !pays_xrp)
-
919 cross_type_ = CrossType::XrpToIou;
+
815 {
+
816 XRPAmount reserve =
+
817 sb.fees().accountReserve(sleCreator->getFieldU32(sfOwnerCount) + 1);
+
818
+
819 if (mPriorBalance < reserve)
+
820 {
+
821 // If we are here, the signing account had an insufficient reserve
+
822 // *prior* to our processing. If something actually crossed, then
+
823 // we allow this; otherwise, we just claim a fee.
+
824 if (!crossed)
+
825 result = tecINSUF_RESERVE_OFFER;
+
826
+
827 if (result != tesSUCCESS)
+
828 {
+
829 JLOG(j_.debug()) << "final result: " << transToken(result);
+
830 }
+
831
+
832 return {result, true};
+
833 }
+
834 }
+
835
+
836 // We need to place the remainder of the offer into its order book.
+
837 auto const offer_index = keylet::offer(account_, offerSequence);
+
838
+
839 // Add offer to owner's directory.
+
840 auto const ownerNode = sb.dirInsert(
+
841 keylet::ownerDir(account_), offer_index, describeOwnerDir(account_));
+
842
+
843 if (!ownerNode)
+
844 {
+
845 JLOG(j_.debug())
+
846 << "final result: failed to add offer to owner's directory";
+
847 return {tecDIR_FULL, true};
+
848 }
+
849
+
850 // Update owner count.
+
851 adjustOwnerCount(sb, sleCreator, 1, viewJ);
+
852
+
853 JLOG(j_.trace()) << "adding to book: " << to_string(saTakerPays.issue())
+
854 << " : " << to_string(saTakerGets.issue())
+
855 << (domainID ? (" : " + to_string(*domainID)) : "");
+
856
+
857 Book const book{saTakerPays.issue(), saTakerGets.issue(), domainID};
+
858
+
859 // Add offer to order book, using the original rate
+
860 // before any crossing occured.
+
861 //
+
862 // Regular offer - BookDirectory points to open directory
+
863 //
+
864 // Domain offer (w/o hyrbid) - BookDirectory points to domain
+
865 // directory
+
866 //
+
867 // Hybrid domain offer - BookDirectory points to domain directory,
+
868 // and AdditionalBooks field stores one entry that points to the open
+
869 // directory
+
870 auto dir = keylet::quality(keylet::book(book), uRate);
+
871 bool const bookExisted = static_cast<bool>(sb.peek(dir));
+
872
+
873 auto setBookDir = [&](SLE::ref sle,
+
874 std::optional<uint256> const& maybeDomain) {
+
875 sle->setFieldH160(sfTakerPaysCurrency, saTakerPays.issue().currency);
+
876 sle->setFieldH160(sfTakerPaysIssuer, saTakerPays.issue().account);
+
877 sle->setFieldH160(sfTakerGetsCurrency, saTakerGets.issue().currency);
+
878 sle->setFieldH160(sfTakerGetsIssuer, saTakerGets.issue().account);
+
879 sle->setFieldU64(sfExchangeRate, uRate);
+
880 if (maybeDomain)
+
881 sle->setFieldH256(sfDomainID, *maybeDomain);
+
882 };
+
883
+
884 auto const bookNode = sb.dirAppend(dir, offer_index, [&](SLE::ref sle) {
+
885 // sets domainID on book directory if it's a domain offer
+
886 setBookDir(sle, domainID);
+
887 });
+
888
+
889 if (!bookNode)
+
890 {
+
891 JLOG(j_.debug()) << "final result: failed to add offer to book";
+
892 return {tecDIR_FULL, true};
+
893 }
+
894
+
895 auto sleOffer = std::make_shared<SLE>(offer_index);
+
896 sleOffer->setAccountID(sfAccount, account_);
+
897 sleOffer->setFieldU32(sfSequence, offerSequence);
+
898 sleOffer->setFieldH256(sfBookDirectory, dir.key);
+
899 sleOffer->setFieldAmount(sfTakerPays, saTakerPays);
+
900 sleOffer->setFieldAmount(sfTakerGets, saTakerGets);
+
901 sleOffer->setFieldU64(sfOwnerNode, *ownerNode);
+
902 sleOffer->setFieldU64(sfBookNode, *bookNode);
+
903 if (expiration)
+
904 sleOffer->setFieldU32(sfExpiration, *expiration);
+
905 if (bPassive)
+
906 sleOffer->setFlag(lsfPassive);
+
907 if (bSell)
+
908 sleOffer->setFlag(lsfSell);
+
909 if (domainID)
+
910 sleOffer->setFieldH256(sfDomainID, *domainID);
+
911
+
912 // if it's a hybrid offer, set hybrid flag, and create an open dir
+
913 if (bHybrid)
+
914 {
+
915 auto const res = applyHybrid(
+
916 sb, sleOffer, offer_index, saTakerPays, saTakerGets, setBookDir);
+
917 if (res != tesSUCCESS)
+
918 return {res, true}; // LCOV_EXCL_LINE
+
919 }
920
-
921 return Transactor::preCompute();
-
922}
-
923
-
924TER
-
925CreateOffer::applyHybrid(
-
926 Sandbox& sb,
-
927 std::shared_ptr<STLedgerEntry> sleOffer,
-
928 Keylet const& offerKey,
-
929 STAmount const& saTakerPays,
-
930 STAmount const& saTakerGets,
-
931 std::function<void(SLE::ref, std::optional<uint256>)> const& setDir)
-
932{
-
933 if (!sleOffer->isFieldPresent(sfDomainID))
-
934 return tecINTERNAL; // LCOV_EXCL_LINE
-
935
-
936 // set hybrid flag
-
937 sleOffer->setFlag(lsfHybrid);
-
938
-
939 // if offer is hybrid, need to also place into open offer dir
-
940 Book const book{saTakerPays.issue(), saTakerGets.issue(), std::nullopt};
-
941
-
942 auto dir =
-
943 keylet::quality(keylet::book(book), getRate(saTakerGets, saTakerPays));
-
944 bool const bookExists = sb.exists(dir);
-
945
-
946 auto const bookNode = sb.dirAppend(dir, offerKey, [&](SLE::ref sle) {
-
947 // don't set domainID on the directory object since this directory is
-
948 // for open book
-
949 setDir(sle, std::nullopt);
-
950 });
-
951
-
952 if (!bookNode)
-
953 {
-
954 JLOG(j_.debug())
-
955 << "final result: failed to add hybrid offer to open book";
-
956 return tecDIR_FULL; // LCOV_EXCL_LINE
-
957 }
-
958
-
959 STArray bookArr(sfAdditionalBooks, 1);
-
960 auto bookInfo = STObject::makeInnerObject(sfBook);
-
961 bookInfo.setFieldH256(sfBookDirectory, dir.key);
-
962 bookInfo.setFieldU64(sfBookNode, *bookNode);
-
963 bookArr.push_back(std::move(bookInfo));
-
964
-
965 if (!bookExists)
-
966 ctx_.app.getOrderBookDB().addOrderBook(book);
-
967
-
968 sleOffer->setFieldArray(sfAdditionalBooks, bookArr);
-
969 return tesSUCCESS;
-
970}
-
971
-
972std::pair<TER, bool>
-
973CreateOffer::applyGuts(Sandbox& sb, Sandbox& sbCancel)
-
974{
-
975 using beast::zero;
-
976
-
977 std::uint32_t const uTxFlags = ctx_.tx.getFlags();
-
978
-
979 bool const bPassive(uTxFlags & tfPassive);
-
980 bool const bImmediateOrCancel(uTxFlags & tfImmediateOrCancel);
-
981 bool const bFillOrKill(uTxFlags & tfFillOrKill);
-
982 bool const bSell(uTxFlags & tfSell);
-
983 bool const bHybrid(uTxFlags & tfHybrid);
-
984
-
985 auto saTakerPays = ctx_.tx[sfTakerPays];
-
986 auto saTakerGets = ctx_.tx[sfTakerGets];
-
987 auto const domainID = ctx_.tx[~sfDomainID];
-
988
-
989 auto const cancelSequence = ctx_.tx[~sfOfferSequence];
-
990
-
991 // Note that we we use the value from the sequence or ticket as the
-
992 // offer sequence. For more explanation see comments in SeqProxy.h.
-
993 auto const offerSequence = ctx_.tx.getSeqValue();
-
994
-
995 // This is the original rate of the offer, and is the rate at which
-
996 // it will be placed, even if crossing offers change the amounts that
-
997 // end up on the books.
-
998 auto uRate = getRate(saTakerGets, saTakerPays);
-
999
-
1000 auto viewJ = ctx_.app.journal("View");
-
1001
-
1002 TER result = tesSUCCESS;
-
1003
-
1004 // Process a cancellation request that's passed along with an offer.
-
1005 if (cancelSequence)
-
1006 {
-
1007 auto const sleCancel =
-
1008 sb.peek(keylet::offer(account_, *cancelSequence));
-
1009
-
1010 // It's not an error to not find the offer to cancel: it might have
-
1011 // been consumed or removed. If it is found, however, it's an error
-
1012 // to fail to delete it.
-
1013 if (sleCancel)
-
1014 {
-
1015 JLOG(j_.debug()) << "Create cancels order " << *cancelSequence;
-
1016 result = offerDelete(sb, sleCancel, viewJ);
-
1017 }
-
1018 }
-
1019
-
1020 auto const expiration = ctx_.tx[~sfExpiration];
-
1021
-
1022 if (hasExpired(sb, expiration))
-
1023 {
-
1024 // If the offer has expired, the transaction has successfully
-
1025 // done nothing, so short circuit from here.
-
1026 //
-
1027 // The return code change is attached to featureDepositPreauth as a
-
1028 // convenience. The change is not big enough to deserve a fix code.
-
1029 TER const ter{
-
1030 sb.rules().enabled(featureDepositPreauth) ? TER{tecEXPIRED}
-
1031 : TER{tesSUCCESS}};
-
1032 return {ter, true};
-
1033 }
-
1034
-
1035 bool const bOpenLedger = sb.open();
-
1036 bool crossed = false;
-
1037
-
1038 if (result == tesSUCCESS)
-
1039 {
-
1040 // If a tick size applies, round the offer to the tick size
-
1041 auto const& uPaysIssuerID = saTakerPays.getIssuer();
-
1042 auto const& uGetsIssuerID = saTakerGets.getIssuer();
-
1043
-
1044 std::uint8_t uTickSize = Quality::maxTickSize;
-
1045 if (!isXRP(uPaysIssuerID))
-
1046 {
-
1047 auto const sle = sb.read(keylet::account(uPaysIssuerID));
-
1048 if (sle && sle->isFieldPresent(sfTickSize))
-
1049 uTickSize = std::min(uTickSize, (*sle)[sfTickSize]);
-
1050 }
-
1051 if (!isXRP(uGetsIssuerID))
-
1052 {
-
1053 auto const sle = sb.read(keylet::account(uGetsIssuerID));
-
1054 if (sle && sle->isFieldPresent(sfTickSize))
-
1055 uTickSize = std::min(uTickSize, (*sle)[sfTickSize]);
-
1056 }
-
1057 if (uTickSize < Quality::maxTickSize)
-
1058 {
-
1059 auto const rate =
-
1060 Quality{saTakerGets, saTakerPays}.round(uTickSize).rate();
-
1061
-
1062 // We round the side that's not exact,
-
1063 // just as if the offer happened to execute
-
1064 // at a slightly better (for the placer) rate
-
1065 if (bSell)
-
1066 {
-
1067 // this is a sell, round taker pays
-
1068 saTakerPays = multiply(saTakerGets, rate, saTakerPays.issue());
-
1069 }
-
1070 else
-
1071 {
-
1072 // this is a buy, round taker gets
-
1073 saTakerGets = divide(saTakerPays, rate, saTakerGets.issue());
-
1074 }
-
1075 if (!saTakerGets || !saTakerPays)
-
1076 {
-
1077 JLOG(j_.debug()) << "Offer rounded to zero";
-
1078 return {result, true};
-
1079 }
-
1080
-
1081 uRate = getRate(saTakerGets, saTakerPays);
-
1082 }
-
1083
-
1084 // We reverse pays and gets because during crossing we are taking.
-
1085 Amounts const takerAmount(saTakerGets, saTakerPays);
-
1086
-
1087 // The amount of the offer that is unfilled after crossing has been
-
1088 // performed. It may be equal to the original amount (didn't cross),
-
1089 // empty (fully crossed), or something in-between.
-
1090 Amounts place_offer;
-
1091
-
1092 JLOG(j_.debug()) << "Attempting cross: "
-
1093 << to_string(takerAmount.in.issue()) << " -> "
-
1094 << to_string(takerAmount.out.issue());
-
1095
-
1096 if (auto stream = j_.trace())
-
1097 {
-
1098 stream << " mode: " << (bPassive ? "passive " : "")
-
1099 << (bSell ? "sell" : "buy");
-
1100 stream << " in: " << format_amount(takerAmount.in);
-
1101 stream << " out: " << format_amount(takerAmount.out);
-
1102 }
-
1103
-
1104 std::tie(result, place_offer) =
-
1105 cross(sb, sbCancel, takerAmount, domainID);
-
1106
-
1107 // We expect the implementation of cross to succeed
-
1108 // or give a tec.
-
1109 XRPL_ASSERT(
-
1110 result == tesSUCCESS || isTecClaim(result),
-
1111 "ripple::CreateOffer::applyGuts : result is tesSUCCESS or "
-
1112 "tecCLAIM");
-
1113
-
1114 if (auto stream = j_.trace())
-
1115 {
-
1116 stream << "Cross result: " << transToken(result);
-
1117 stream << " in: " << format_amount(place_offer.in);
-
1118 stream << " out: " << format_amount(place_offer.out);
-
1119 }
-
1120
-
1121 if (result == tecFAILED_PROCESSING && bOpenLedger)
-
1122 result = telFAILED_PROCESSING;
-
1123
-
1124 if (result != tesSUCCESS)
-
1125 {
-
1126 JLOG(j_.debug()) << "final result: " << transToken(result);
-
1127 return {result, true};
-
1128 }
-
1129
-
1130 XRPL_ASSERT(
-
1131 saTakerGets.issue() == place_offer.in.issue(),
-
1132 "ripple::CreateOffer::applyGuts : taker gets issue match");
-
1133 XRPL_ASSERT(
-
1134 saTakerPays.issue() == place_offer.out.issue(),
-
1135 "ripple::CreateOffer::applyGuts : taker pays issue match");
-
1136
-
1137 if (takerAmount != place_offer)
-
1138 crossed = true;
-
1139
-
1140 // The offer that we need to place after offer crossing should
-
1141 // never be negative. If it is, something went very very wrong.
-
1142 if (place_offer.in < zero || place_offer.out < zero)
-
1143 {
-
1144 JLOG(j_.fatal()) << "Cross left offer negative!"
-
1145 << " in: " << format_amount(place_offer.in)
-
1146 << " out: " << format_amount(place_offer.out);
-
1147 return {tefINTERNAL, true};
-
1148 }
-
1149
-
1150 if (place_offer.in == zero || place_offer.out == zero)
-
1151 {
-
1152 JLOG(j_.debug()) << "Offer fully crossed!";
-
1153 return {result, true};
-
1154 }
-
1155
-
1156 // We now need to adjust the offer to reflect the amount left after
-
1157 // crossing. We reverse in and out here, since during crossing we
-
1158 // were the taker.
-
1159 saTakerPays = place_offer.out;
-
1160 saTakerGets = place_offer.in;
-
1161 }
-
1162
-
1163 XRPL_ASSERT(
-
1164 saTakerPays > zero && saTakerGets > zero,
-
1165 "ripple::CreateOffer::applyGuts : taker pays and gets positive");
-
1166
-
1167 if (result != tesSUCCESS)
-
1168 {
-
1169 JLOG(j_.debug()) << "final result: " << transToken(result);
-
1170 return {result, true};
-
1171 }
-
1172
-
1173 if (auto stream = j_.trace())
-
1174 {
-
1175 stream << "Place" << (crossed ? " remaining " : " ") << "offer:";
-
1176 stream << " Pays: " << saTakerPays.getFullText();
-
1177 stream << " Gets: " << saTakerGets.getFullText();
-
1178 }
-
1179
-
1180 // For 'fill or kill' offers, failure to fully cross means that the
-
1181 // entire operation should be aborted, with only fees paid.
-
1182 if (bFillOrKill)
-
1183 {
-
1184 JLOG(j_.trace()) << "Fill or Kill: offer killed";
-
1185 if (sb.rules().enabled(fix1578))
-
1186 return {tecKILLED, false};
-
1187 return {tesSUCCESS, false};
-
1188 }
-
1189
-
1190 // For 'immediate or cancel' offers, the amount remaining doesn't get
-
1191 // placed - it gets canceled and the operation succeeds.
-
1192 if (bImmediateOrCancel)
-
1193 {
-
1194 JLOG(j_.trace()) << "Immediate or cancel: offer canceled";
-
1195 if (!crossed && sb.rules().enabled(featureImmediateOfferKilled))
-
1196 // If the ImmediateOfferKilled amendment is enabled, any
-
1197 // ImmediateOrCancel offer that transfers absolutely no funds
-
1198 // returns tecKILLED rather than tesSUCCESS. Motivation for the
-
1199 // change is here: https://github.com/ripple/rippled/issues/4115
-
1200 return {tecKILLED, false};
-
1201 return {tesSUCCESS, true};
-
1202 }
-
1203
-
1204 auto const sleCreator = sb.peek(keylet::account(account_));
-
1205 if (!sleCreator)
-
1206 return {tefINTERNAL, false};
-
1207
-
1208 {
-
1209 XRPAmount reserve =
-
1210 sb.fees().accountReserve(sleCreator->getFieldU32(sfOwnerCount) + 1);
-
1211
-
1212 if (mPriorBalance < reserve)
-
1213 {
-
1214 // If we are here, the signing account had an insufficient reserve
-
1215 // *prior* to our processing. If something actually crossed, then
-
1216 // we allow this; otherwise, we just claim a fee.
-
1217 if (!crossed)
-
1218 result = tecINSUF_RESERVE_OFFER;
-
1219
-
1220 if (result != tesSUCCESS)
-
1221 {
-
1222 JLOG(j_.debug()) << "final result: " << transToken(result);
-
1223 }
-
1224
-
1225 return {result, true};
-
1226 }
-
1227 }
-
1228
-
1229 // We need to place the remainder of the offer into its order book.
-
1230 auto const offer_index = keylet::offer(account_, offerSequence);
-
1231
-
1232 // Add offer to owner's directory.
-
1233 auto const ownerNode = sb.dirInsert(
-
1234 keylet::ownerDir(account_), offer_index, describeOwnerDir(account_));
-
1235
-
1236 if (!ownerNode)
-
1237 {
-
1238 JLOG(j_.debug())
-
1239 << "final result: failed to add offer to owner's directory";
-
1240 return {tecDIR_FULL, true};
-
1241 }
-
1242
-
1243 // Update owner count.
-
1244 adjustOwnerCount(sb, sleCreator, 1, viewJ);
-
1245
-
1246 JLOG(j_.trace()) << "adding to book: " << to_string(saTakerPays.issue())
-
1247 << " : " << to_string(saTakerGets.issue())
-
1248 << (domainID ? (" : " + to_string(*domainID)) : "");
-
1249
-
1250 Book const book{saTakerPays.issue(), saTakerGets.issue(), domainID};
-
1251
-
1252 // Add offer to order book, using the original rate
-
1253 // before any crossing occured.
-
1254 //
-
1255 // Regular offer - BookDirectory points to open directory
-
1256 //
-
1257 // Domain offer (w/o hyrbid) - BookDirectory points to domain
-
1258 // directory
-
1259 //
-
1260 // Hybrid domain offer - BookDirectory points to domain directory,
-
1261 // and AdditionalBooks field stores one entry that points to the open
-
1262 // directory
-
1263 auto dir = keylet::quality(keylet::book(book), uRate);
-
1264 bool const bookExisted = static_cast<bool>(sb.peek(dir));
-
1265
-
1266 auto setBookDir = [&](SLE::ref sle,
-
1267 std::optional<uint256> const& maybeDomain) {
-
1268 sle->setFieldH160(sfTakerPaysCurrency, saTakerPays.issue().currency);
-
1269 sle->setFieldH160(sfTakerPaysIssuer, saTakerPays.issue().account);
-
1270 sle->setFieldH160(sfTakerGetsCurrency, saTakerGets.issue().currency);
-
1271 sle->setFieldH160(sfTakerGetsIssuer, saTakerGets.issue().account);
-
1272 sle->setFieldU64(sfExchangeRate, uRate);
-
1273 if (maybeDomain)
-
1274 sle->setFieldH256(sfDomainID, *maybeDomain);
-
1275 };
-
1276
-
1277 auto const bookNode = sb.dirAppend(dir, offer_index, [&](SLE::ref sle) {
-
1278 // sets domainID on book directory if it's a domain offer
-
1279 setBookDir(sle, domainID);
-
1280 });
-
1281
-
1282 if (!bookNode)
-
1283 {
-
1284 JLOG(j_.debug()) << "final result: failed to add offer to book";
-
1285 return {tecDIR_FULL, true};
-
1286 }
-
1287
-
1288 auto sleOffer = std::make_shared<SLE>(offer_index);
-
1289 sleOffer->setAccountID(sfAccount, account_);
-
1290 sleOffer->setFieldU32(sfSequence, offerSequence);
-
1291 sleOffer->setFieldH256(sfBookDirectory, dir.key);
-
1292 sleOffer->setFieldAmount(sfTakerPays, saTakerPays);
-
1293 sleOffer->setFieldAmount(sfTakerGets, saTakerGets);
-
1294 sleOffer->setFieldU64(sfOwnerNode, *ownerNode);
-
1295 sleOffer->setFieldU64(sfBookNode, *bookNode);
-
1296 if (expiration)
-
1297 sleOffer->setFieldU32(sfExpiration, *expiration);
-
1298 if (bPassive)
-
1299 sleOffer->setFlag(lsfPassive);
-
1300 if (bSell)
-
1301 sleOffer->setFlag(lsfSell);
-
1302 if (domainID)
-
1303 sleOffer->setFieldH256(sfDomainID, *domainID);
-
1304
-
1305 // if it's a hybrid offer, set hybrid flag, and create an open dir
-
1306 if (bHybrid)
-
1307 {
-
1308 auto const res = applyHybrid(
-
1309 sb, sleOffer, offer_index, saTakerPays, saTakerGets, setBookDir);
-
1310 if (res != tesSUCCESS)
-
1311 return {res, true}; // LCOV_EXCL_LINE
-
1312 }
-
1313
-
1314 sb.insert(sleOffer);
-
1315
-
1316 if (!bookExisted)
-
1317 ctx_.app.getOrderBookDB().addOrderBook(book);
-
1318
-
1319 JLOG(j_.debug()) << "final result: success";
-
1320
-
1321 return {tesSUCCESS, true};
-
1322}
-
1323
-
1324TER
-
1325CreateOffer::doApply()
-
1326{
-
1327 // This is the ledger view that we work against. Transactions are applied
-
1328 // as we go on processing transactions.
-
1329 Sandbox sb(&ctx_.view());
-
1330
-
1331 // This is a ledger with just the fees paid and any unfunded or expired
-
1332 // offers we encounter removed. It's used when handling Fill-or-Kill offers,
-
1333 // if the order isn't going to be placed, to avoid wasting the work we did.
-
1334 Sandbox sbCancel(&ctx_.view());
-
1335
-
1336 auto const result = applyGuts(sb, sbCancel);
-
1337 if (result.second)
-
1338 sb.apply(ctx_.rawView());
-
1339 else
-
1340 sbCancel.apply(ctx_.rawView());
-
1341 return result.first;
-
1342}
-
1343
-
1344} // namespace ripple
+
921 sb.insert(sleOffer);
+
922
+
923 if (!bookExisted)
+
924 ctx_.app.getOrderBookDB().addOrderBook(book);
+
925
+
926 JLOG(j_.debug()) << "final result: success";
+
927
+
928 return {tesSUCCESS, true};
+
929}
+
930
+
931TER
+
932CreateOffer::doApply()
+
933{
+
934 // This is the ledger view that we work against. Transactions are applied
+
935 // as we go on processing transactions.
+
936 Sandbox sb(&ctx_.view());
+
937
+
938 // This is a ledger with just the fees paid and any unfunded or expired
+
939 // offers we encounter removed. It's used when handling Fill-or-Kill offers,
+
940 // if the order isn't going to be placed, to avoid wasting the work we did.
+
941 Sandbox sbCancel(&ctx_.view());
+
942
+
943 auto const result = applyGuts(sb, sbCancel);
+
944 if (result.second)
+
945 sb.apply(ctx_.rawView());
+
946 else
+
947 sbCancel.apply(ctx_.rawView());
+
948 return result.first;
+
949}
+
950
+
951} // namespace ripple
A generic endpoint for log messages.
Definition: Journal.h:60
Stream fatal() const
Definition: Journal.h:352
@@ -1432,40 +1039,21 @@ $(function() {
ApplyView & view()
Definition: ApplyContext.h:78
Application & app
Definition: ApplyContext.h:71
STTx const & tx
Definition: ApplyContext.h:72
-
Writeable view to a ledger, for applying a transaction.
Definition: ApplyView.h:144
std::optional< std::uint64_t > dirAppend(Keylet const &directory, Keylet const &key, std::function< void(std::shared_ptr< SLE > const &)> const &describe)
Append an entry to a directory.
Definition: ApplyView.h:281
std::optional< std::uint64_t > dirInsert(Keylet const &directory, uint256 const &key, std::function< void(std::shared_ptr< SLE > const &)> const &describe)
Insert an entry to a directory.
Definition: ApplyView.h:318
-
bool done() const
Returns true if order crossing should not continue.
Definition: Taker.cpp:123
-
AccountID const & account() const noexcept
Returns the account identifier of the taker.
Definition: Taker.h:171
-
bool reject(Quality const &quality) const noexcept
Returns true if the quality does not meet the taker's requirements.
Definition: Taker.h:178
-
Issue const & issue_in() const
Returns the Issue associated with the input of the offer.
Definition: Taker.h:192
-
Amounts remaining_offer() const
Returns the amount remaining on the offer.
Definition: Taker.cpp:152
-
Amounts const & original_offer() const
Returns the amount that the offer was originally placed at.
Definition: Taker.cpp:185
-
Issue const & issue_out() const
Returns the Issue associated with the output of the offer.
Definition: Taker.h:199
Specifies an order book.
Definition: Book.h:36
-
std::pair< TER, Amounts > flowCross(PaymentSandbox &psb, PaymentSandbox &psbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
-
std::pair< TER, Amounts > bridged_cross(Taker &taker, ApplyView &view, ApplyView &view_cancel, NetClock::time_point const when)
-
OfferStream::StepCounter stepCounter_
Definition: CreateOffer.h:148
+
std::pair< TER, Amounts > flowCross(PaymentSandbox &psb, PaymentSandbox &psbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
static TER checkAcceptAsset(ReadView const &view, ApplyFlags const flags, AccountID const id, beast::Journal const j, Issue const &issue)
-
void preCompute() override
Gather information beyond what the Transactor base class gathers.
-
bool dry_offer(ApplyView &view, Offer const &offer)
static TER preclaim(PreclaimContext const &ctx)
Enforce constraints beyond those of the Transactor base class.
-
static bool step_account(OfferStream &stream, Taker const &taker)
-
static std::string format_amount(STAmount const &amount)
-
bool reachedOfferCrossingLimit(Taker const &taker) const
-
std::pair< TER, Amounts > direct_cross(Taker &taker, ApplyView &view, ApplyView &view_cancel, NetClock::time_point const when)
+
static std::string format_amount(STAmount const &amount)
static NotTEC preflight(PreflightContext const &ctx)
Enforce constraints beyond those of the Transactor base class.
Definition: CreateOffer.cpp:47
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
Definition: CreateOffer.cpp:36
-
TER applyHybrid(Sandbox &sb, std::shared_ptr< STLedgerEntry > sleOffer, Keylet const &offer_index, STAmount const &saTakerPays, STAmount const &saTakerGets, std::function< void(SLE::ref, std::optional< uint256 >)> const &setDir)
-
CrossType cross_type_
Definition: CreateOffer.h:145
-
TER doApply() override
Precondition: fee collection is likely.
-
std::pair< TER, bool > applyGuts(Sandbox &view, Sandbox &view_cancel)
-
static std::pair< bool, Quality > select_path(bool have_direct, OfferStream const &direct, bool have_bridge, OfferStream const &leg1, OfferStream const &leg2)
-
std::pair< TER, Amounts > cross(Sandbox &sb, Sandbox &sbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
+
TER applyHybrid(Sandbox &sb, std::shared_ptr< STLedgerEntry > sleOffer, Keylet const &offer_index, STAmount const &saTakerPays, STAmount const &saTakerGets, std::function< void(SLE::ref, std::optional< uint256 >)> const &setDir)
+
TER doApply() override
Precondition: fee collection is likely.
+
std::pair< TER, bool > applyGuts(Sandbox &view, Sandbox &view_cancel)
A currency issued by an account.
Definition: Issue.h:33
AccountID account
Definition: Issue.h:36
Currency currency
Definition: Issue.h:35
-
Presents and consumes the offers in an order book.
Definition: OfferStream.h:148
void addOrderBook(Book const &)
A wrapper which makes credits unavailable to balances.
A view into a ledger.
Definition: ReadView.h:52
@@ -1485,7 +1073,6 @@ $(function() {
bool native() const noexcept
Definition: STAmount.h:458
Definition: STArray.h:29
void push_back(STObject const &object)
Definition: STArray.h:212
-
STAmount const & getFieldAmount(SField const &field) const
Definition: STObject.cpp:665
bool isFieldPresent(SField const &field) const
Definition: STObject.cpp:484
static STObject makeInnerObject(SField const &name)
Definition: STObject.cpp:95
std::uint32_t getFlags() const
Definition: STObject.cpp:537
@@ -1497,21 +1084,10 @@ $(function() {
Discardable, editable view to a ledger.
Definition: Sandbox.h:35
void apply(RawView &to)
Definition: Sandbox.h:55
Definition: TER.h:411
-
bool step()
Advance to the next valid offer.
-
TOffer< TIn, TOut > & tip() const
Returns the offer at the tip of the order book.
Definition: OfferStream.h:108
-
Definition: Offer.h:53
-
Quality quality() const noexcept
Returns the quality of the offer.
Definition: Offer.h:78
-
AccountID const & owner() const
Returns the account id of the offer's owner.
Definition: Offer.h:85
-
TAmounts< TIn, TOut > const & amount() const
Returns the in and out amounts.
Definition: Offer.h:94
-
Definition: Taker.h:240
-
std::uint32_t get_bridge_crossings() const
Definition: Taker.h:273
-
std::uint32_t get_direct_crossings() const
Definition: Taker.h:267
-
TER cross(Offer &offer)
Perform a direct or bridged offer crossing as appropriate.
Definition: Taker.cpp:822
AccountID const account_
Definition: Transactor.h:143
ApplyView & view()
Definition: Transactor.h:159
beast::Journal const j_
Definition: Transactor.h:141
XRPAmount mPriorBalance
Definition: Transactor.h:144
-
virtual void preCompute()
Definition: Transactor.cpp:533
ApplyContext & ctx_
Definition: Transactor.h:140
Class describing the consequences to the account of applying a transaction if the transaction consume...
Definition: applySteps.h:59
Definition: XRPAmount.h:43
@@ -1526,7 +1102,6 @@ $(function() {
-
T make_pair(T... args)
T min(T... args)
Keylet quality(Keylet const &k, std::uint64_t q) noexcept
The initial directory page for a specific quality.
Definition: Indexes.cpp:280
Keylet line(AccountID const &id0, AccountID const &id1, Currency const &currency) noexcept
The index of a trust line for a given currency.
Definition: Indexes.cpp:244
@@ -1536,12 +1111,10 @@ $(function() {
Keylet offer(AccountID const &id, std::uint32_t seq) noexcept
An offer from an account.
Definition: Indexes.cpp:274
bool accountInDomain(ReadView const &view, AccountID const &account, Domain const &domainID)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:25
-
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
Definition: Issue.h:115
STAmount divide(STAmount const &amount, Rate const &rate)
Definition: Rate2.cpp:93
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
Definition: UintTypes.cpp:133
STAmount accountFunds(ReadView const &view, AccountID const &id, STAmount const &saDefault, FreezeHandling freezeHandling, beast::Journal j)
Definition: View.cpp:553
@ fhZERO_IF_FROZEN
Definition: View.h:78
-
@ fhIGNORE_FREEZE
Definition: View.h:78
bool isXRP(AccountID const &c)
Definition: AccountID.h:90
@ telFAILED_PROCESSING
Definition: TER.h:56
constexpr std::uint32_t tfOfferCreateMask
Definition: TxFlags.h:103
@@ -1571,7 +1144,6 @@ $(function() {
OfferCrossing
Definition: Steps.h:45
@ yes
Definition: Steps.h:45
@ sell
Definition: Steps.h:45
-
Quality composed_quality(Quality const &lhs, Quality const &rhs)
Definition: Quality.cpp:158
static bool adjustOwnerCount(ApplyContext &ctx, int count)
Definition: SetOracle.cpp:186
std::string transToken(TER code)
Definition: TER.cpp:264
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:160
@@ -1602,9 +1174,6 @@ $(function() {
@ terNO_AUTH
Definition: TER.h:218
@ terNO_LINE
Definition: TER.h:219
bool isTecClaim(TER x) noexcept
Definition: TER.h:680
-
@ XrpToIou
-
@ IouToIou
-
@ IouToXrp
bool isGlobalFrozen(ReadView const &view, AccountID const &issuer)
Definition: View.cpp:184
@ temBAD_ISSUER
Definition: TER.h:93
@ temBAD_AMOUNT
Definition: TER.h:89
@@ -1632,7 +1201,6 @@ $(function() {
STTx const & tx
Definition: Transactor.h:37
Represents a transfer rate.
Definition: Rate.h:40
T tie(T... args)
-
T what(T... args)
diff --git a/CreateOffer_8h_source.html b/CreateOffer_8h_source.html index 51df045260..fed2c265c0 100644 --- a/CreateOffer_8h_source.html +++ b/CreateOffer_8h_source.html @@ -98,9 +98,9 @@ $(function() {
20#ifndef RIPPLE_TX_CREATEOFFER_H_INCLUDED
21#define RIPPLE_TX_CREATEOFFER_H_INCLUDED
22
-
23#include <xrpld/app/tx/detail/OfferStream.h>
-
24#include <xrpld/app/tx/detail/Taker.h>
-
25#include <xrpld/app/tx/detail/Transactor.h>
+
23#include <xrpld/app/tx/detail/Transactor.h>
+
24
+
25#include <xrpl/protocol/Quality.h>
26
27namespace ripple {
28
@@ -112,172 +112,97 @@ $(function() {
35public:
36 static constexpr ConsequencesFactoryType ConsequencesFactory{Custom};
37
-
39 explicit CreateOffer(ApplyContext& ctx)
-
40 : Transactor(ctx), stepCounter_(1000, j_)
-
41 {
-
42 }
-
43
-
44 static TxConsequences
-
45 makeTxConsequences(PreflightContext const& ctx);
-
46
-
48 static NotTEC
-
49 preflight(PreflightContext const& ctx);
-
50
-
52 static TER
-
53 preclaim(PreclaimContext const& ctx);
-
54
-
56 void
-
57 preCompute() override;
-
58
-
60 TER
-
61 doApply() override;
-
62
-
63private:
-
64 std::pair<TER, bool>
-
65 applyGuts(Sandbox& view, Sandbox& view_cancel);
-
66
-
67 // Determine if we are authorized to hold the asset we want to get.
-
68 static TER
-
69 checkAcceptAsset(
-
70 ReadView const& view,
-
71 ApplyFlags const flags,
-
72 AccountID const id,
-
73 beast::Journal const j,
-
74 Issue const& issue);
-
75
-
76 bool
-
77 dry_offer(ApplyView& view, Offer const& offer);
+
39 explicit CreateOffer(ApplyContext& ctx) : Transactor(ctx)
+
40 {
+
41 }
+
42
+
43 static TxConsequences
+
44 makeTxConsequences(PreflightContext const& ctx);
+
45
+
47 static NotTEC
+
48 preflight(PreflightContext const& ctx);
+
49
+
51 static TER
+
52 preclaim(PreclaimContext const& ctx);
+
53
+
55 TER
+
56 doApply() override;
+
57
+
58private:
+
59 std::pair<TER, bool>
+
60 applyGuts(Sandbox& view, Sandbox& view_cancel);
+
61
+
62 // Determine if we are authorized to hold the asset we want to get.
+
63 static TER
+
64 checkAcceptAsset(
+
65 ReadView const& view,
+
66 ApplyFlags const flags,
+
67 AccountID const id,
+
68 beast::Journal const j,
+
69 Issue const& issue);
+
70
+
71 // Use the payment flow code to perform offer crossing.
+
72 std::pair<TER, Amounts>
+
73 flowCross(
+
74 PaymentSandbox& psb,
+
75 PaymentSandbox& psbCancel,
+
76 Amounts const& takerAmount,
+
77 std::optional<uint256> const& domainID);
78
-
79 static std::pair<bool, Quality>
-
80 select_path(
-
81 bool have_direct,
-
82 OfferStream const& direct,
-
83 bool have_bridge,
-
84 OfferStream const& leg1,
-
85 OfferStream const& leg2);
-
86
-
87 std::pair<TER, Amounts>
-
88 bridged_cross(
-
89 Taker& taker,
-
90 ApplyView& view,
-
91 ApplyView& view_cancel,
-
92 NetClock::time_point const when);
+
79 static std::string
+
80 format_amount(STAmount const& amount);
+
81
+
82 TER
+
83 applyHybrid(
+
84 Sandbox& sb,
+
85 std::shared_ptr<STLedgerEntry> sleOffer,
+
86 Keylet const& offer_index,
+
87 STAmount const& saTakerPays,
+
88 STAmount const& saTakerGets,
+
89 std::function<void(SLE::ref, std::optional<uint256>)> const& setDir);
+
90};
+
91
+
92using OfferCreate = CreateOffer;
93
-
94 std::pair<TER, Amounts>
-
95 direct_cross(
-
96 Taker& taker,
-
97 ApplyView& view,
-
98 ApplyView& view_cancel,
-
99 NetClock::time_point const when);
-
100
-
101 // Step through the stream for as long as possible, skipping any offers
-
102 // that are from the taker or which cross the taker's threshold.
-
103 // Return false if the is no offer in the book, true otherwise.
-
104 static bool
-
105 step_account(OfferStream& stream, Taker const& taker);
-
106
-
107 // True if the number of offers that have been crossed
-
108 // exceeds the limit.
-
109 bool
-
110 reachedOfferCrossingLimit(Taker const& taker) const;
-
111
-
112 // Use the payment flow code to perform offer crossing.
-
113 std::pair<TER, Amounts>
-
114 flowCross(
-
115 PaymentSandbox& psb,
-
116 PaymentSandbox& psbCancel,
-
117 Amounts const& takerAmount,
-
118 std::optional<uint256> const& domainID);
-
119
-
120 // Temporary
-
121 // This is a central location that invokes both versions of cross
-
122 // so the results can be compared. Eventually this layer will be
-
123 // removed once flowCross is determined to be stable.
-
124 std::pair<TER, Amounts>
-
125 cross(
-
126 Sandbox& sb,
-
127 Sandbox& sbCancel,
-
128 Amounts const& takerAmount,
-
129 std::optional<uint256> const& domainID);
-
130
-
131 static std::string
-
132 format_amount(STAmount const& amount);
-
133
-
134 TER
-
135 applyHybrid(
-
136 Sandbox& sb,
-
137 std::shared_ptr<STLedgerEntry> sleOffer,
-
138 Keylet const& offer_index,
-
139 STAmount const& saTakerPays,
-
140 STAmount const& saTakerGets,
-
141 std::function<void(SLE::ref, std::optional<uint256>)> const& setDir);
-
142
-
143private:
-
144 // What kind of offer we are placing
-
145 CrossType cross_type_;
-
146
-
147 // The number of steps to take through order books while crossing
-
148 OfferStream::StepCounter stepCounter_;
-
149};
-
150
-
151using OfferCreate = CreateOffer;
-
152
-
153} // namespace ripple
-
154
-
155#endif
+
94} // namespace ripple
+
95
+
96#endif
A generic endpoint for log messages.
Definition: Journal.h:60
State information when applying a tx.
Definition: ApplyContext.h:37
-
Writeable view to a ledger, for applying a transaction.
Definition: ApplyView.h:144
Transactor specialized for creating offers in the ledger.
Definition: CreateOffer.h:34
-
std::pair< TER, Amounts > flowCross(PaymentSandbox &psb, PaymentSandbox &psbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
-
std::pair< TER, Amounts > bridged_cross(Taker &taker, ApplyView &view, ApplyView &view_cancel, NetClock::time_point const when)
-
OfferStream::StepCounter stepCounter_
Definition: CreateOffer.h:148
+
std::pair< TER, Amounts > flowCross(PaymentSandbox &psb, PaymentSandbox &psbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
static TER checkAcceptAsset(ReadView const &view, ApplyFlags const flags, AccountID const id, beast::Journal const j, Issue const &issue)
CreateOffer(ApplyContext &ctx)
Construct a Transactor subclass that creates an offer in the ledger.
Definition: CreateOffer.h:39
-
void preCompute() override
Gather information beyond what the Transactor base class gathers.
-
bool dry_offer(ApplyView &view, Offer const &offer)
static TER preclaim(PreclaimContext const &ctx)
Enforce constraints beyond those of the Transactor base class.
-
static bool step_account(OfferStream &stream, Taker const &taker)
-
static std::string format_amount(STAmount const &amount)
+
static std::string format_amount(STAmount const &amount)
static constexpr ConsequencesFactoryType ConsequencesFactory
Definition: CreateOffer.h:36
-
bool reachedOfferCrossingLimit(Taker const &taker) const
-
std::pair< TER, Amounts > direct_cross(Taker &taker, ApplyView &view, ApplyView &view_cancel, NetClock::time_point const when)
static NotTEC preflight(PreflightContext const &ctx)
Enforce constraints beyond those of the Transactor base class.
Definition: CreateOffer.cpp:47
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
Definition: CreateOffer.cpp:36
-
TER applyHybrid(Sandbox &sb, std::shared_ptr< STLedgerEntry > sleOffer, Keylet const &offer_index, STAmount const &saTakerPays, STAmount const &saTakerGets, std::function< void(SLE::ref, std::optional< uint256 >)> const &setDir)
-
CrossType cross_type_
Definition: CreateOffer.h:145
-
TER doApply() override
Precondition: fee collection is likely.
-
std::pair< TER, bool > applyGuts(Sandbox &view, Sandbox &view_cancel)
-
static std::pair< bool, Quality > select_path(bool have_direct, OfferStream const &direct, bool have_bridge, OfferStream const &leg1, OfferStream const &leg2)
-
std::pair< TER, Amounts > cross(Sandbox &sb, Sandbox &sbCancel, Amounts const &takerAmount, std::optional< uint256 > const &domainID)
+
TER applyHybrid(Sandbox &sb, std::shared_ptr< STLedgerEntry > sleOffer, Keylet const &offer_index, STAmount const &saTakerPays, STAmount const &saTakerGets, std::function< void(SLE::ref, std::optional< uint256 >)> const &setDir)
+
TER doApply() override
Precondition: fee collection is likely.
+
std::pair< TER, bool > applyGuts(Sandbox &view, Sandbox &view_cancel)
A currency issued by an account.
Definition: Issue.h:33
-
Presents and consumes the offers in an order book.
Definition: OfferStream.h:148
A wrapper which makes credits unavailable to balances.
A view into a ledger.
Definition: ReadView.h:52
Definition: STAmount.h:50
Discardable, editable view to a ledger.
Definition: Sandbox.h:35
Definition: TER.h:411
-
Definition: Offer.h:53
-
Definition: Taker.h:240
Definition: Transactor.h:138
ConsequencesFactoryType
Definition: Transactor.h:153
@ Custom
Definition: Transactor.h:153
ApplyView & view()
Definition: Transactor.h:159
-
beast::Journal const j_
Definition: Transactor.h:141
Class describing the consequences to the account of applying a transaction if the transaction consume...
Definition: applySteps.h:59
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:25
ApplyFlags
Definition: ApplyView.h:31
-
CrossType
The flavor of an offer crossing.
Definition: Taker.h:35
A pair of SHAMap key and LedgerEntryType.
Definition: Keylet.h:39
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:79
State information when preflighting a tx.
Definition: Transactor.h:34
-